分享方式:


建立向量索引

在 Azure AI 搜尋服務中,向量存放區具有定義向量和非向量欄位的索引結構描述、建立和壓縮內嵌空間的演算法向量設定,以及向量欄位定義上用於查詢要求的設定。

建立或更新索引 API 會建立向量存放區。 請遵循下列步驟來編製向量資料的索引:

  • 使用向量演算法和選擇性壓縮來定義結構描述
  • 新增向量欄位定義
  • 載入預先向量化的資料做為個別步驟,或使用整合向量化,在編製索引期間進行資料區塊化和編碼

本文說明工作流程,並使用 REST 提供圖例。 了解基本工作流程之後,繼續進行 azure-search-vector-samples 存放庫中 Azure SDK 程式碼範例,以取得在測試和生產程式碼中使用這些功能的指引。

提示

使用 Azure 入口網站建立向量索引,並嘗試整合式資料區塊化和向量化。

必要條件

  • Azure AI 搜尋,在任何區域和任何層級。 大部分現有的服務都支援向量搜尋。 對於在 2019 年 1 月之前建立的服務,有一個無法建立向量索引的小型子集。 在此情況下,必須建立新的服務。 如果您使用整合向量化 (呼叫 Azure AI 的技能集),Azure AI 搜尋必須位於與 Azure OpenAI 或 Azure AI 服務相同的區域中。

  • 預先存在的向量內嵌或使用整合向量化,其中會從索引管線呼叫內嵌模型。

  • 您應該知道用來建立內嵌的模型有何維度限制。 有效值是 2 到 3072 個維度。 在 Azure OpenAI 中,針對 text-embedding-ada-002,數值向量長度為 1536。 針對 text-embedding-3-smalltext-embedding-3-large,向量長度為 3072。

  • 您也應該知道支援的相似度計量為何。 針對 Azure OpenAI,相似度是使用 來計算 cosine

  • 您應知悉如何建立索引。 結構描述必須包含文件索引鍵的欄位、您想要搜尋或篩選的其他欄位,以及編製索引和查詢期間所需行為的其他設定。

準備文件以編製索引

在編制索引之前,請先組合文件承載,其中包含向量和非向量資料的欄位。 文件結構必須符合索引結構描述。

請確定您的文件:

  1. 提供可唯一識別每份文件的欄位或中繼資料屬性。 所有搜尋索引都需要文件索引鍵。 若要滿足文件索引鍵需求,來源文件必須具有一個可在索引中唯一識別其的欄位或屬性。 此來源欄位必須對應至搜尋索引中類型為 Edm.Stringkey=true 的索引欄位。

  2. 提供來源欄位中的向量資料 (單精度浮點數陣列)。

    向量欄位包含內嵌模型所產生的數位,每個欄位內嵌一個,其中欄位是上層欄位 (非巢狀或複雜類型的一部分)。 針對最簡易的整合,建議 Azure OpenAI 中的內嵌模型,例如 text-embedding-ada-002 用於文字文件,或影像擷取 REST API 用於影像。

    如果您可以相依於索引器和技能集,請考慮在編製索引期間使用整合向量化來編碼影像和英數字元內容。 您的欄位定義適用於向量欄位,但來源資料可以是文字或影像,在編製索引期間會建立向量陣列。

  3. 為查詢回應,以及在相同要求中包含全文檢索搜尋或語意排名的混合式查詢案例,提供其他欄位與人類可讀取的英數內容。

對於您想要支援的所有查詢案例,您的搜尋索引應該包含其欄位和內容。 假設您想要搜尋或篩選產品名稱、版本、中繼資料或位址。 在此情況下,相似度搜尋並不特別有用。 關鍵字搜尋、異地搜尋或篩選條件將是更好的選擇。 搜尋索引若包含向量和非向量資料的完整欄位集合,可為查詢建構和回應組合提供最大彈性。

本文的載入向量資料一節中有包含向量和非向量欄位的文件承載簡短範例。

新增向量搜尋設定

向量設定會指定在編製索引期間用來在向量節點之間建立「最接近像素」資訊的參數:

  • 階層式導覽小型世界 (HNSW)
  • 詳盡的 KNN

如果在欄位上選擇 HNSW,您可以在查詢時選擇詳盡的 KNN。 但另一個方向無法運作:如果您選擇詳盡,則稍後無法要求 HNSW 搜尋,因為啟用近似搜尋的額外資料結構不存在。

向量組態也會指定量化方法,以減少向量大小:

  • Scalar
  • 二進位 (僅適用於 2024-07-01,且適用於較新的 Azure SDK 套件)

如需如何移轉至最新版本的指示,請參閱 升級 REST API

2024-07-01 正式推出。 支援具有下列項目的向量設定:

  • vectorSearch.algorithms 支援 HNSW 和詳細的 KNN。
  • vectorSearch.compressions 支援純量和二進位量化、過度取樣,以及使用原始向量重新編列。
  • vectorSearch.profiles 提供適用於多個演算法和壓縮設定組合。

請務必具有將內容向量化的策略。 我們建議整合向量化查詢時間向量化程式,以內建編碼。

  1. 使用建立或更新索引 API 來建立索引。

  2. 在索引中新增 vectorSearch 區段,指定用來建立內嵌空間的搜尋演算法。

     "vectorSearch": {
         "compressions": [
             {
                 "name": "scalar-quantization",
                 "kind": "scalarQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
                     "scalarQuantizationParameters": {
                         "quantizedDataType": "int8"
                     }
             },
             {
                 "name": "binary-quantization",
                 "kind": "binaryQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
             }
         ],
         "algorithms": [
             {
                 "name": "hnsw-1",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 4,
                     "efConstruction": 400,
                     "efSearch": 500,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "hnsw-2",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 8,
                     "efConstruction": 800,
                     "efSearch": 800,
                     "metric": "hamming"
                 }
             },
             {
                 "name": "eknn",
                 "kind": "exhaustiveKnn",
                 "exhaustiveKnnParameters": {
                     "metric": "euclidean"
                 }
             }
    
         ],
         "profiles": [
           {
             "name": "vector-profile-hnsw-scalar",
             "compression": "scalar-quantization",
             "algorithm": "hnsw-1"
           }
         ]
     }
    

    重點︰

    • 針對索引內的類型,壓縮、演算法和設定檔的每個設定名稱必須是唯一。

    • vectorSearch.compressions.kind 可以是 scalarQuantizationbinaryQuantization

    • vectorSearch.compressions.rerankWithOriginalVectors 會使用原始未壓縮的向量來重新計算相似度,並將初始搜尋查詢所傳回的前幾個結果重新排名。 即使 stored 為 false,未壓縮的向量仍存在於搜尋索引中。 這個屬性為選擇性。 預設為 true。

    • vectorSearch.compressions.defaultOversampling 會考慮一組更廣泛的潛在結果,以克服量化資訊減少的問題。 潛在結果的公式包含查詢中的 k,以及過度取樣乘數。 例如,如果查詢指定 k (總計 5),且過度取樣為 20,則查詢會有效要求 100 份文件用於重新排名,並針對該目的使用原始未壓縮的向量。 只會傳回前 k 個重新排名的結果。 這個屬性為選擇性。 預設值為 4。

    • vectorSearch.compressions.scalarQuantizationParameters.quantizedDataType 必須設定為 int8。 這是目前唯一支援的基本資料類型。 這個屬性為選擇性。 預設值為 int8

    • vectorSearch.algorithms.kind 不是 "hnsw" 就是 "exhaustiveKnn"。 這些是用來在編製索引期間組織向量內容的近似最接近像素 (ANN) 演算法。

    • vectorSearch.algorithms.m 是雙定向連結數目。 預設值為 4。 範圍是 4 到 10。 較低的值應該會在結果中傳回較少的雜訊。

    • vectorSearch.algorithms.efConstruction 是編製索引期間使用的最接近像素數目。 預設值為 400。 範圍是 100 到 1,000。

    • "vectorSearch.algorithms.fSearch 是搜尋期間使用的最接近像素數目。 預設值為 500。 範圍是 100 到 1,000。

    • 如果您使用 Azure OpenAI,則 vectorSearch.algorithms.metric 應該是 "cosine",否則請使用與您所使用內嵌模型相關聯的相似度計量。 支援的值為 cosinedotProducteuclideanhamming (用於索引二進位資料)。

    • vectorSearch.profiles 會新增抽象層以容納更豐富的定義。 設定檔定義於 vectorSearch 中,然後依每個向量欄位上的名稱加以參考。 這是壓縮和演算法組態的組合。 這是您指派給向量欄位的屬性,其會決定欄位的演算法和壓縮。

將向量欄位新增至欄位集合

欄位集合必須包含文件索引鍵的欄位、向量欄位,以及混合式搜尋案例所需的任何其他欄位。

向量欄位的特點是其資料類型和用來輸出向量和向量設定檔的內嵌模型為基礎的 dimensions 屬性。

2024-07-01 正式推出。

  1. 使用建立或更新索引來建立索引。

  2. 使用下列屬性定義向量欄位。 您可以為每個欄位儲存一個產生的內嵌。 針對每個向量欄位:

    • type 必須是向量資料類型Collection(Edm.Single) 是內嵌模型中最常見的類型。
    • dimensions 是內嵌模型所產生的維度數目。 針對 text-embedding-ada-002,其為 1536。
    • vectorSearchProfile 是在索引中其他地方所定義的設定檔名稱。
    • searchable 必須是 true。
    • retrievable 可以是 true 或 false。 True 會以純文字傳回原始向量 (其中 1536 個),並取用儲存空間。 如果您要將向量結果傳遞至下游應用程式,請設定為 true。
    • stored 可以是 true 或 false。 其會判斷是否儲存額外的向量複本以供擷取。 如需詳細資訊,請參閱縮小向量大小
    • filterablefacetablesortable 必須是 false。
  3. 如果您想要在向量查詢上叫用預先篩選或後置篩選,請將可篩選的非向量欄位新增至集合,例如 filterable 設為 true 的 "title"。

  4. 新增其他欄位,為您要編製索引的文字內容定義其要旨和結構。 您至少需要一個文件索引鍵。

    您也應該在查詢或其回應中新增有用的欄位。 下列範例顯示標題和內容的向量欄位 ("titleVector"、"contentVector"),相當於向量。 其也會提供對等文字內容 ("title"、"content") 的欄位,有助於搜尋結果中的排序、篩選和讀取。

    下列範例顯示欄位集合:

    PUT https://my-search-service.search.windows.net/indexes/my-index?api-version=2024-07-01&allowIndexDowntime=true
    Content-Type: application/json
    api-key: {{admin-api-key}}
    {
        "name": "{{index-name}}",
        "fields": [
            {
                "name": "id",
                "type": "Edm.String",
                "key": true,
                "filterable": true
            },
            {
                "name": "title",
                "type": "Edm.String",
                "searchable": true,
                "filterable": true,
                "sortable": true,
                "retrievable": true
            },
            {
                "name": "titleVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "stored": true,
                "dimensions": 1536,
                "vectorSearchProfile": "vector-profile-1"
            },
            {
                "name": "content",
                "type": "Edm.String",
                "searchable": true,
                "retrievable": true
            },
            {
                "name": "contentVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": false,
                "stored": false,
                "dimensions": 1536,
                "vectorSearchProfile": "vector-profile-1"
            }
        ],
        "vectorSearch": {
            "algorithms": [
                {
                    "name": "hnsw-1",
                    "kind": "hnsw",
                    "hnswParameters": {
                        "m": 4,
                        "efConstruction": 400,
                        "efSearch": 500,
                        "metric": "cosine"
                    }
                }
            ],
            "profiles": [
                {
                    "name": "vector-profile-1",
                    "algorithm": "hnsw-1"
                }
            ]
        }
    }
    

載入用於編製索引的向量資料

您為了編制索引而提供的內容必須符合索引結構描述,並包含文件索引鍵的唯一字串值。 預先向量化的資料會載入至一或多個向量欄位,這些欄位可以與其他包含英數內容的欄位共存。

您可以使用推送或提取方法進行資料擷取。

使用 Documents - 索引,將向量和非向量資料載入索引中。 用於編製索引的推送 API 在所有穩定和預覽版本中皆相同。 使用下列任何 API 載入檔案:

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/index?api-version=2024-07-01

{
    "value": [
        {
            "id": "1",
            "title": "Azure App Service",
            "content": "Azure App Service is a fully managed platform for building, deploying, and scaling web apps. You can host web apps, mobile app backends, and RESTful APIs. It supports a variety of programming languages and frameworks, such as .NET, Java, Node.js, Python, and PHP. The service offers built-in auto-scaling and load balancing capabilities. It also provides integration with other Azure services, such as Azure DevOps, GitHub, and Bitbucket.",
            "category": "Web",
            "titleVector": [
                -0.02250031754374504,
                 . . . 
                        ],
            "contentVector": [
                -0.024740582332015038,
                 . . .
            ],
            "@search.action": "upload"
        },
        {
            "id": "2",
            "title": "Azure Functions",
            "content": "Azure Functions is a serverless compute service that enables you to run code on-demand without having to manage infrastructure. It allows you to build and deploy event-driven applications that automatically scale with your workload. Functions support various languages, including C#, F#, Node.js, Python, and Java. It offers a variety of triggers and bindings to integrate with other Azure services and external services. You only pay for the compute time you consume.",
            "category": "Compute",
            "titleVector": [
                -0.020159931853413582,
                . . .
            ],
            "contentVector": [
                -0.02780858241021633,
                 . . .
            ],
            "@search.action": "upload"
        }
        . . .
    ]
}

檢查您的索引以取得向量內容

基於驗證目的,您可以使用 Azure 入口網站中的搜尋總管或 REST API 呼叫來查詢索引。 由於 Azure AI 搜尋服務無法將向量轉換成人類可讀取的文字,因此請嘗試從相同文件中傳回提供相符項目辨識項的欄位。 例如,如果向量查詢以 "titleVector" 欄位為目標,您可以為搜尋結果選取 "title"。

欄位必須歸屬為 "retrievable",才能包含在結果中。

  • 檢閱搜尋管理>索引中的索引,以檢視索引大小和向量索引大小。 正向量索引大小表示具有向量。

  • 使用搜尋總管來查詢索引。 搜尋總管有兩個檢視:查詢檢視 (預設值) 和 JSON 檢視。

    • 設定查詢選項>隱藏搜尋結果中的向量值,以取得更易讀的結果。

    • 針對向量查詢使用 JSON 檢視。 如果您的索引具有向量指派,您可以貼上您想要執行的向量查詢 JSON 定義,或使用內建的文字到向量或影像到向量轉換。 如需影像搜尋的詳細資訊,請參閱快速入門:在搜尋總管中搜尋影像

    • 使用預設查詢檢視,快速確認索引包含向量。 查詢檢視適用於全文檢索搜尋。 雖然您無法將其用於向量查詢,但可以傳送空白搜尋 (search=*) 來檢查內容。 所有欄位的內容,包括向量欄位,都會以純文字形式傳回。

    • 如需詳細資訊,請參閱建立向量查詢

更新向量存放區

若要更新向量存放區,請修改結構描述,如有必要,重新載入文件以填入新的欄位。 結構描述更新的 API 包括建立或更新索引 (REST)、Azure SDK for .NET 中的 CreateOrUpdateIndex、Azure SDK for Python 中的 create_or_update_index,以及其他 Azure SDK 中的類似方法。

更新索引的標準指引涵蓋在更新或重建索引中。

重點包括:

  • 通常需要卸除和重建,才能更新和刪除現有欄位。

  • 不過,您可以使用下列修改來更新現有的結構描述,而不需要重建:

    • 將新欄位新增至欄位集合。
    • 新增向量設定,將其指派給新的欄位,但不指派給尚未向量化的現有欄位。
    • 變更現有欄位上的 "retrievable" (值為 true 或 false)。 向量欄位必須是可搜尋和可擷取的,但如果您想要在卸除和重建不可行的情況下停用對向量欄位的存取,您可以將 retrievable 設定為 false。

下一步

做為下一個步驟,我們建議在搜尋索引中查詢向量資料

azure-search-vector 存放庫中的程式碼範例示範端對端工作流程,其中包含結構描述定義、向量化、編製索引和查詢。

PythonC#JavaScript 的程式碼示範。