向量查詢中的篩選

您可以在向量查詢上設定向量篩選模式,以指定您要在查詢執行之前或之後進行篩選。

篩選會決定向量查詢的範圍。 篩選會設定為 on,並逐一查看索引中屬性為 filterable 的非vector 字串和數值字段,但篩選的用途會 決定向量查詢執行的動作 :整個可搜尋的空間,或搜尋結果的內容。

本文說明每個篩選模式,並提供何時使用每個篩選模式的指引。

預先篩選模式

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

Diagram of prefilters.

後置篩選模式

篩選後會在查詢執行之後套用篩選,縮小搜尋結果的範圍。

Diagram of post-filters.

向量篩選模式的基準檢驗

為了瞭解其中一個篩選模式執行比另一個篩選模式更好的條件,我們執行了一系列測試,以評估小型、中型和大型索引的查詢結果。

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

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

索引的建構相同:一個索引欄位、一個向量欄位、一個文字欄位和一個數值可篩選欄位。 下列索引是使用 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 維度上指定具有 100 萬向量的數據集:

    • 篩選超過 30% 的數據集時,預先篩選的速度大約為 30%。
    • 篩選少於 2% 的數據集時,預先篩選的速度大約是 7 倍。
  • 在 96 個維度上指定具有 10 億向量的數據集:

    • 篩選超過 5% 的數據集時,預先篩選的速度大約為 50%。
    • 篩選不到 10% 的數據集時,預先篩選的速度大約是 7 倍。

下圖顯示預篩選相對 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% 表示篩選準則已選取搜尋主體的百分比。