共用方式為


向量查詢中的篩選

您可以在向量查詢上設定向量篩選模式 (部分機器翻譯),以指定您要在查詢執行之前或之後進行篩選。

篩選會決定向量查詢的範圍。 篩選會在索引中屬性為 filterable 的非向量字串和數值欄位上設定並逐一查看,但篩選的目的會決定向量查詢執行所在的「目標」:整個可搜尋的空間,或是某個搜尋結果的內容。

本文說明每個篩選模式,並提供每個篩選模式之使用時機的指導方針。

預先篩選模式

預先篩選會在查詢執行之前套用篩選,進而減少向量搜尋演算法尋找類似內容的搜尋介面區。 在向量查詢中,preFilter 是預設值。

Diagram of prefilters.

後置篩選模式

後置篩選會在查詢執行之後套用篩選,進而縮小搜尋結果。

Diagram of post-filters.

向量篩選模式的基準測試

為了了解這些篩選模式在各種環境中的效能差異,我們執行了一系列測試,以評估其針對小型、中型和大型索引的查詢結果。

  • 小型 (100,000 份文件、2.5 GB 索引、1536 個維度)
  • 中型 (1 百萬份文件、25 GB 索引、1536 個維度)
  • 大型 (10 億份文件、1.9 TB 索引、96 個維度)

針對小型和中型工作負載,我們使用標準 2 (S2) 服務搭配一個分割區和一個複本。 針對大型工作負載,我們使用標準 3 (S3) 服務搭配 12 個分割區和一個複本。

索引具有相同的建構:一個索引欄位、一個向量欄位、一個文字欄位,以及一個數值可篩選欄位。 下列索引是使用 2023-07-01-preview 語法來定義。

def get_index_schema(self, index_name, dimensions):
    return {
        "name": index_name,
        "fields": [
            {"name": "id", "type": "Edm.String", "key": True, "searchable": True},
            {"name": "content_vector", "type": "Collection(Edm.Single)", "dimensions": dimensions,
              "searchable": True, "retrievable": True, "filterable": False, "facetable": False, "sortable": False,
              "vectorSearchConfiguration": "defaulthnsw"},
            {"name": "text", "type": "Edm.String", "searchable": True, "filterable": False, "retrievable": True,
              "sortable": False, "facetable": False},
            {"name": "score", "type": "Edm.Double", "searchable": False, "filterable": True,
              "retrievable": True, "sortable": True, "facetable": True}
        ],
        "vectorSearch":
        {
            "algorithmConfigurations": [
                {"name": "defaulthnsw", "kind": "hnsw", "hnswParameters": {"metric": "euclidean"}}
            ]
        }
    }

在查詢中,我們針對預先篩選和後置篩選作業使用相同的篩選。 我們使用簡單的篩選來確保效能的變化是源自於篩選模式的不同,而不是篩選複雜度。

結果是以每秒查詢次數 (QPS) 來測量。

重要心得

  • 預先篩選幾乎一律比後置篩選還要慢,但針對小型索引除外,在該情況下兩種篩選的效能大致相等。

  • 針對較大的資料集,預先篩選的速度慢上非常多。

  • 那麼,如果預先篩選幾乎總是比較慢,為什麼會將其作為預設值? 預先篩選能確保系統會在 k 個結果存在於索引的情況下將其傳回,其中偏差會偏向重新叫用和精確度,而非速度。

  • 後置篩選適用於下列客戶:

    • 重視速度大於選取項目 (後置篩選可能會傳回少於 k 個結果)
    • 使用不具過度選擇性的篩選
    • 索引的大小大到無法接受預先篩選的效能

詳細資料

  • 以位於 1536 個維度之 100,000 個向量的資料集為例:

    • 篩選超過 30% 的資料集時,預先篩選和後置篩選的速度是相當的。
    • 篩選少於 0.1% 的資料集時,預先篩選的速度會比後置篩選慢 50%。
  • 以位於 1536 個維度之 1 百萬個向量的資料集為例:

    • 篩選多於 30% 的資料集時,預先篩選的速度會慢 30%。
    • 篩選少於 2% 的資料集時,預先篩選的速度會慢七倍。
  • 以位於 96 個維度之 10 億個向量的資料集為例:

    • 篩選多於 5% 的資料集時,預先篩選的速度會慢 50%。
    • 篩選少於 10% 的資料集時,預先篩選的速度會慢七倍。

下圖顯示預先篩選相對 QPS,其是以預先篩選 QPS 除以後置篩選 QPS 來計算。

Chart showing QPS performance for small, medium, and large indexes for relative QPS.

垂直軸是預先篩選的 QPS 除以後置篩選的 QPS。 例如,0.0 的值表示預先篩選的速度慢 100%,垂直軸上的 0.5 表示預先篩選的速度慢 50%,1.0 表示預先篩選和後置篩選的速度相當。

水平軸代表篩選速率,也就是套用篩選後的候選文件百分比。 例如,1.00% 表示篩選準則選取搜尋主體的百分之一。