建立向量存放區

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

請遵循下列步驟來編製向量資料的索引:

  • 使用一或多個向量設定來定義結構描述,其會指定編製索引和搜尋的演算法
  • 新增一或多個向量欄位
  • 載入預先向量化的資料做為個別步驟,或使用整合向量化 (預覽),在編製索引期間進行資料區塊化和編碼。

本文適用於正式推出的非預覽版向量搜尋,其假設您的應用程式程式碼會呼叫外部資源進行區塊化和編碼。

注意

正在尋找來自 2023-07-01-preview 的移轉指引嗎? 請參閱升級 REST API

必要條件

  • Azure AI 搜尋服務,在任何區域和任何階層。 大部分現有的服務都支援向量搜尋。 對於在 2019 年 1 月之前建立的服務,有一個無法支援向量搜尋的小型子集。 如果包含向量欄位的索引無法建立或更新,這是一個指標。 在此情況下,必須建立新的服務。

  • 來源文件中預先存在的向量內嵌。 Azure AI 搜尋服務不會在正式推出的 Azure SDK 和 REST API 版本中產生向量。 建議您使用 Azure OpenAI 內嵌模型,但可以使用任何模型進行向量化。 如需詳細資訊,請參閱產生內嵌

  • 您應該知道用來建立內嵌的模型有何維度限制,以及計算相似度的方式。 在 Azure OpenAI 中,針對 text-embedding-ada-002,數值向量長度為 1536。 相似度是使用 cosine 來計算。 有效值是 2 到 3072 個維度。

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

準備文件以編製索引

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

請確定您的文件:

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

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

    向量欄位包含內嵌模型所產生的數值資料,每個欄位有一個內嵌。 建議 Azure OpenAI 中的內嵌模型,例如 text-embedding-ada-002 用於文字文件,或影像擷取 REST API 用於影像。 僅支援索引最上層向量字段:目前不支援向量子欄位。

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

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

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

新增向量搜尋設定

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

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

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

正在尋找預覽版到穩定版本的移轉指引嗎? 如需步驟,請參閱升級 REST API

REST API 版本 2023-11-01 支援具有下列項目的向量設定:

  • vectorSearch 演算法、hnswexhaustiveKnn 最接近像素,以及用於編製索引和評分的參數。
  • vectorProfiles,適用於多個演算法設定組合。

請務必具有將內容向量化的策略。 穩定版本不會為內建內嵌提供向量化工具

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

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

     "vectorSearch": {
         "algorithms": [
             {
                 "name": "my-hnsw-config-1",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 4,
                     "efConstruction": 400,
                     "efSearch": 500,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "my-hnsw-config-2",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 8,
                     "efConstruction": 800,
                     "efSearch": 800,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "my-eknn-config",
                 "kind": "exhaustiveKnn",
                 "exhaustiveKnnParameters": {
                     "metric": "cosine"
                 }
             }
    
         ],
         "profiles": [
           {
             "name": "my-default-vector-profile",
             "algorithm": "my-hnsw-config-2"
           }
         ]
     }
    

    重點︰

    • 設定的名稱。 名稱在索引內必須是唯一的。
    • profiles 會新增抽象層以容納更豐富的定義。 設定檔定義於 vectorSearch 中,然後依每個向量欄位上的名稱加以參考。
    • "hnsw""exhaustiveKnn" 是用來在編製索引期間組織向量內容的近似最接近像素 (ANN) 演算法。
    • "m" (雙向連結計數) 預設值為 4。 範圍是 4 到 10。 較低的值應該會在結果中傳回較少的雜訊。
    • "efConstruction" 預設值為 400。 範圍是 100 到 1,000。 這是編製索引期間使用的最接近像素數目。
    • "efSearch" 預設值為 500。 範圍是 100 到 1,000。 這是搜尋期間使用的最接近像素數目。
    • 如果您使用 Azure OpenAI,則 "metric" 應該是 "cosine",否則請使用與您所使用內嵌模型相關聯的相似度計量。 支援的值為 cosinedotProducteuclidean

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

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

向量欄位屬於類型 Collection(Edm.Single) 且為單精度浮點值。 此類型的欄位也有 dimensions 屬性,並指定向量設定。

如果您只想要正式推出的功能,請使用此版本。

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

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

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

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

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

    下列範例顯示欄位集合:

    PUT https://my-search-service.search.windows.net/indexes/my-index?api-version=2023-11-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,
                "dimensions": 1536,
                "vectorSearchProfile": "my-default-vector-profile"
            },
            {
                "name": "content",
                "type": "Edm.String",
                "searchable": true,
                "retrievable": true
            },
            {
                "name": "contentVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "dimensions": 1536,
                "vectorSearchProfile": "my-default-vector-profile"
            }
        ],
        "vectorSearch": {
            "algorithms": [
                {
                    "name": "my-hnsw-config-1",
                    "kind": "hnsw",
                    "hnswParameters": {
                        "m": 4,
                        "efConstruction": 400,
                        "efSearch": 500,
                        "metric": "cosine"
                    }
                }
            ],
            "profiles": [
                {
                    "name": "my-default-vector-profile",
                    "algorithm": "my-hnsw-config-1"
                }
            ]
        }
    }
    

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

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

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

使用編製文件索引 (2023-11-01)編製文件索引 (2023-10-01-Preview)新增、更新或刪除文件 (2023-07-01-Preview),以推送包含向量資料的文件。

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/index?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "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 的程式碼示範。