共用方式為


如何建立和查詢向量搜尋索引

本文說明如何使用 Mosaic AI 向量搜尋來建立和查詢向量搜尋索引。

使用 UI、Python SDKREST API,您可建立和管理向量搜尋元件,例如向量搜尋端點和向量搜尋索引。

需求

若要使用 SDK,您必須在筆記本中安裝它。 使用下列程式碼:

%pip install databricks-vectorsearch

dbutils.library.restartPython()

from databricks.vector_search.client import VectorSearchClient

建立向量搜尋端點

您可以使用 Databricks UI、Python SDK 或 API 來建立向量搜尋端點。

使用 UI 建立向量搜尋端點

請遵循下列步驟,使用 UI 建立向量搜尋端點。

  1. 在左側邊欄中,按一下 [計算]。

  2. 按一下 [向量搜尋] 索引標籤,然後再按一下 [建立]。

    建立端點表單

  3. [建立端點表單] 隨即開啟。 輸入此端點的名稱。

  4. 按一下 [確認]

使用 Python SDK 建立向量搜尋端點

下列範例會使用 create_endpoint() SDK 函數來建立向量搜尋端點。

# The following line automatically generates a PAT Token for authentication
client = VectorSearchClient()

# The following line uses the service principal token for authentication
# client = VectorSearch(service_principal_client_id=<CLIENT_ID>,service_principal_client_secret=<CLIENT_SECRET>)

client.create_endpoint(
    name="vector_search_endpoint_name",
    endpoint_type="STANDARD"
)

使用 REST API 建立向量搜尋端點

請參閱 REST API 參考檔: POST /api/2.0/vector-search/endpoints

(選用) 建立並設定端點來服務於內嵌模型

如果您選擇讓 Databricks 計算內嵌,可以使用預先設定的基礎模型 API 端點,或建立模型服務端點來服務於您選擇的內嵌模型。 如需指示,請參閱按權杖付費基礎模型 API建立生成式 AI 模型服務端點。 如需筆記本範例,請參閱呼叫內嵌模型的筆記本範例

設定內嵌端點時,Databricks 建議您移除預設選取的 [調整為零]。 服務端點可能需要幾分鐘的時間才能預熱,而具有縮小端點的索引上的初始查詢可能會逾時。

注意

如果未適當地為資料集設定內嵌端點,向量搜尋索引初始化可能會逾時。 應只能將 CPU 端點用於小型資料集和測試。 針對較大的資料集,請使用 GPU 端點以獲得最佳效能。

建立向量搜尋索引

您可以使用 UI、Python SDK 或 REST API 來建立向量搜尋索引。 UI 是最簡單的方法。

有兩種類型的索引:

  • 差異同步索引會自動與來源 Delta 資料表同步,並隨著 Delta 資料表中基礎資料的變更而自動且累加地更新索引。
  • 直接向量存取索引支援向量和中繼資料的直接讀取和寫入。 使用者須負責使用 REST API 或 Python SDK 來更新此資料表。 無法使用 UI 建立這種類型的索引。 必須使用 REST API 或 SDK。

使用 UI 建立索引

  1. 在左側邊欄中,按一下 [目錄] 以開啟目錄總管 UI。

  2. 瀏覽至您想要使用的 Delta 資料表。

  3. 按一下右上角的 [建立] 按鈕,然後從下拉式功能表中選取 [向量搜尋索引]。

    建立索引按鈕

  4. 使用對話方塊中的選取器來設定索引。

    建立索引對話方塊

    名稱:用於 Unity Catalog 中線上資料表的名稱。 名稱需要三層命名空間,<catalog>.<schema>.<name>。 只允許英數字元和底線。

    主索引鍵:用作主索引鍵的資料行。

    端點:選取您想要使用的向量搜尋端點。

    要同步的資料行:選取要與向量索引同步的資料行。 如果將此欄位保留為空白,來源資料表中的所有資料行都會與索引同步。 主索引鍵資料行和內嵌來源資料行或內嵌向量資料行始終同步。

    內嵌來源:指出您是否希望 Databricks 計算 Delta 資料表中文字資料行的內嵌 (計算內嵌),或者您的 Delta 資料表是否包含預先計算的內嵌 (使用現有的內嵌資料行)。

    • 如果選取 [計算內嵌],請選取您要計算內嵌的資料行,以及為內嵌模型提供服務的端點。 僅支援文字資料行。
    • 如果選取 [ 使用現有的內嵌資料行],請選取包含預先計算的內嵌和內嵌維度的資料行。 預先計算的內嵌資料行格式應該為 array[float]

    同步計算的內嵌:切換此設定,將生成的內嵌儲存至 Unity Catalog 資料表。 如需詳細資訊,請參閱儲存生成的內嵌資料表

    同步模式Continuous 可讓索引與延遲秒數保持同步。 不過,由於已佈建計算叢集以執行持續同步串流管線,因此其成本較高。 針對 ContinuousTriggered,更新為累加式,只會處理自上次同步後變更的資料。

    使用 觸發的 同步模式,您可以使用 Python SDK 或 REST API 來啟動同步處理。請參閱 更新差異同步索引

  5. 在完成設定索引之後,按一下 [建立]

使用 Python SDK 建立索引

下列範例會建立差異同步索引,其中內嵌由 Databricks 計算。

client = VectorSearchClient()

index = client.create_delta_sync_index(
  endpoint_name="vector_search_demo_endpoint",
  source_table_name="vector_search_demo.vector_search.en_wiki",
  index_name="vector_search_demo.vector_search.en_wiki_index",
  pipeline_type="TRIGGERED",
  primary_key="id",
  embedding_source_column="text",
  embedding_model_endpoint_name="e5-small-v2"
)

下列範例會建立具有自我管理內嵌的差異同步索引。 此範例也會示範如何使用選擇性參數 columns_to_sync,只選取索引中要使用的資料行子集。

client = VectorSearchClient()

index = client.create_delta_sync_index(
  endpoint_name="vector_search_demo_endpoint",
  source_table_name="vector_search_demo.vector_search.en_wiki",
  index_name="vector_search_demo.vector_search.en_wiki_index",
  pipeline_type="TRIGGERED",
  primary_key="id",
  embedding_dimension=1024,
  embedding_vector_column="text_vector"
)

根據預設,來源資料表中的所有資料行都會與索引同步。 若要只同步資料列的子集,請使用 columns_to_sync。 主索引鍵和內嵌資料行始終包含在索引中。

若要同步主索引鍵和內嵌資料行,您必須在 columns_to_sync 中指定它們,如下所示:

index = client.create_delta_sync_index(
  ...
  columns_to_sync=["id", "text_vector"] # to sync only the primary key and the embedding column
)

若要同步其他資料行,請指定它們,如下所示。 您不需要包含主索引鍵和內嵌資料行,因為它們始終會同步。

index = client.create_delta_sync_index(
  ...
  columns_to_sync=["revisionId", "text"] # to sync the `revisionId` and `text` columns in addition to the primary key and embedding column.
)

下列範例會建立直接向量存取索引。


client = VectorSearchClient()

index = client.create_direct_access_index(
  endpoint_name="storage_endpoint",
  index_name="{catalog_name}.{schema_name}.{index_name}",
  primary_key="id",
  embedding_dimension=1024,
  embedding_vector_column="text_vector",
  schema={
    "id": "int",
    "field2": "string",
    "field3": "float",
    "text_vector": "array<float>"}
)

使用 REST API 建立索引

請參閱 REST API 參考檔: POST /api/2.0/vector-search/indexes

儲存生成的內嵌資料表

如果 Databricks 生成內嵌,您可以將生成的內嵌儲存至 Unity Catalog 中的資料表。 此資料表會建立於與向量索引相同的結構描述中,並從向量索引頁面連結。

資料表的名稱是向量搜尋索引的名稱,後面附加有 _writeback_table。 此名稱不可編輯。

您可以像 Unity Catalog 中的任何其他資料表一樣存取和查詢資料表。 不過,您不應該卸除或修改資料表,因為它不適合手動更新。 如果刪除索引,會自動刪除資料表。

更新向量搜尋索引

更新差異同步索引

當來源 Delta 資料表變更時,使用連續同步模式建立的索引會自動更新。 如果您使用 觸發同步 模式,請使用 Python SDK 或 REST API 來啟動同步處理。

Python SDK

index.sync()

REST API

請參閱 REST API 參考檔: POST /api/2.0/vector-search/indexes/{index_name}/sync

更新直接向量存取索引

可以使用 Python SDK 或 REST API,在直接向量存取索引中插入、更新或刪除資料。

Python SDK

   index.upsert([{"id": 1,
       "field2": "value2",
       "field3": 3.0,
       "text_vector": [1.0, 2.0, 3.0]
       },
       {"id": 2,
        "field2": "value2",
        "field3": 3.0,
        "text_vector": [1.1, 2.1, 3.0]
        }
        ])

REST API

請參閱 REST API 參考檔: POST /api/2.0/vector-search/indexes

下列程式代碼範例說明如何使用個人存取令牌來更新索引(PAT)。

export TOKEN=...
export INDEX_NAME=...
export WORKSPACE_URL=https://...

# Upsert data into Vector Search index.
curl -X POST -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url $WORKSPACE_URL/api/2.0/vector-search/indexes/$INDEX_NAME/upsert-data --data '{"inputs_json": "..."}'

# Delete data from Vector Search index
curl -X DELETE -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url $WORKSPACE_URL/api/2.0/vector-search/indexes/$INDEX_NAME/delete-data --data '{"primary_keys": [...]}'

下列程式代碼範例說明如何使用服務主體更新索引。

export SP_CLIENT_ID=...
export SP_CLIENT_SECRET=...
export INDEX_NAME=...
export WORKSPACE_URL=https://...
export WORKSPACE_ID=...

# Set authorization details to generate OAuth token
export AUTHORIZATION_DETAILS='{"type":"unity_catalog_permission","securable_type":"table","securable_object_name":"'"$INDEX_NAME"'","operation": "WriteVectorIndex"}'

# Generate OAuth token
export TOKEN=$(curl -X POST --url $WORKSPACE_URL/oidc/v1/token -u "$SP_CLIENT_ID:$SP_CLIENT_SECRET" --data 'grant_type=client_credentials' --data 'scope=all-apis' --data-urlencode 'authorization_details=['"$AUTHORIZATION_DETAILS"']' | jq .access_token | tr -d '"')

# Get index URL
export INDEX_URL=$(curl -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url $WORKSPACE_URL/api/2.0/vector-search/indexes/$INDEX_NAME | jq -r '.status.index_url' | tr -d '"')

# Upsert data into Vector Search index.
curl -X POST -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url https://$INDEX_URL/upsert-data --data '{"inputs_json": "[...]"}'

# Delete data from Vector Search index
curl -X DELETE -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url https://$INDEX_URL/delete-data --data '{"primary_keys": [...]}'

查詢向量搜尋端點

您只能使用 Python SDK、REST API 或 SQL vector_search() AI 函數來查詢向量搜尋端點。

注意

如果查詢端點的使用者不是向量搜尋索引的擁有者,則使用者必須具有下列 UC 權限:

  • 包含向量搜尋索引的目錄上的 USE CATALOG 權限。
  • 包含向量搜尋索引的結構描述上的 USE SCHEMA 權限。
  • 向量搜尋索引上的 SELECT 權限。

若要執行混合式關鍵字相似性搜尋,請將參數 query_type 設定為 hybrid。 預設值為 ann (近似最近鄰)。

Python SDK

# Delta Sync Index with embeddings computed by Databricks
results = index.similarity_search(
    query_text="Greek myths",
    columns=["id", "text"],
    num_results=2
    )

# Delta Sync Index using hybrid search, with embeddings computed by Databricks
results3 = index.similarity_search(
    query_text="Greek myths",
    columns=["id", "text"],
    num_results=2,
    query_type="hybrid"
    )

# Delta Sync Index with pre-calculated embeddings
results2 = index.similarity_search(
    query_vector=[0.2, 0.33, 0.19, 0.52],
    columns=["id", "text"],
    num_results=2
    )

REST API

請參閱 REST API 參考檔: POST /api/2.0/vector-search/indexes/{index_name}/query

下列程式代碼範例說明如何使用個人存取令牌來查詢索引(PAT)。

export TOKEN=...
export INDEX_NAME=...
export WORKSPACE_URL=https://...

# Query Vector Search index with `query_vector`
curl -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url $WORKSPACE_URL/api/2.0/vector-search/indexes/$INDEX_NAME/query --data '{"num_results": 3, "query_vector": [...], "columns": [...], "debug_level": 1}'

# Query Vector Search index with `query_text`
curl -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url $WORKSPACE_URL/api/2.0/vector-search/indexes/$INDEX_NAME/query --data '{"num_results": 3, "query_text": "...", "columns": [...], "debug_level": 1}'

下列程式代碼範例說明如何使用服務主體查詢索引。

export SP_CLIENT_ID=...
export SP_CLIENT_SECRET=...
export INDEX_NAME=...
export WORKSPACE_URL=https://...
export WORKSPACE_ID=...

# Set authorization details to generate OAuth token
export AUTHORIZATION_DETAILS='{"type":"unity_catalog_permission","securable_type":"table","securable_object_name":"'"$INDEX_NAME"'","operation": "ReadVectorIndex"}'
# If you are using an route_optimized embedding model endpoint (TODO: link), then you need to have additional authorization details to invoke the serving endpoint
# export EMBEDDING_MODEL_SERVING_ENDPOINT_ID=...
# export AUTHORIZATION_DETAILS="$AUTHORIZATION_DETAILS"',{"type":"workspace_permission","object_type":"serving-endpoints","object_path":"/serving-endpoints/'"$EMBEDDING_MODEL_SERVING_ENDPOINT_ID"'","actions": ["query_inference_endpoint"]}'

# Generate OAuth token
export TOKEN=$(curl -X POST  --url $WORKSPACE_URL/oidc/v1/token -u "$SP_CLIENT_ID:$SP_CLIENT_SECRET" --data 'grant_type=client_credentials' --data 'scope=all-apis' --data-urlencode 'authorization_details=['"$AUTHORIZATION_DETAILS"']' | jq .access_token | tr -d '"')

# Get index URL
export INDEX_URL=$(curl -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url $WORKSPACE_URL/api/2.0/vector-search/indexes/$INDEX_NAME | jq -r '.status.index_url' | tr -d '"')

# Query Vector Search index.
curl -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url https://$INDEX_URL/query --data '{"num_results": 3, "query_vector": [...], "columns": [...], "debug_level": 1}'

# Query Vector Search index.
curl -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url https://$INDEX_URL/query --data '{"num_results": 3, "query_text": "...", "columns": [...], "debug_level": 1}'

SQL

重要

vector_search() AI 函數處於公開預覽狀態。

若要使用此 AI 函數,請參閱 vector_search 函數

在查詢上使用篩選

查詢可以根據 Delta 資料表中的任何資料行來定義篩選。 similarity_search 只會傳回符合指定篩選的資料列。 支援下列篩選條件:

篩選運算子 行為 範例
NOT 否定篩選條件。 索引鍵必須以 "NOT" 結尾。 例如,值為 "red" 的 "color NOT" 會比對不是紅色的文件。 {"id NOT": 2} {“color NOT”: “red”}
< 檢查欄位值是否小於篩選值。 索引鍵必須以 "<" 結尾。 例如,值為 200 的 "price <" 會比對價格小於 200 的文件。 {"id <": 200}
<= 檢查欄位值是否小於或等於篩選值。 索引鍵必須以 "<=" 結尾。 例如,值為 200 的 "price <=" 會比對價格小於或等於 200 的文件。 {"id <=": 200}
> 檢查欄位值是否大於篩選值。 索引鍵必須以 ">" 結尾。 例如,值為 200 的 "price >" 會比對價格大於 200 的文件。 {"id >": 200}
>= 檢查欄位值是否大於或等於篩選值。 索引鍵必須以 ">=" 結尾。 例如,值為 200 的 "price >=" 會比對價格大於或等於 200 的文件。 {"id >=": 200}
OR 檢查欄位值是否符合任何篩選值。 索引鍵必須包含 OR 才能分隔多個子索引鍵。 例如,值為 ["red", "blue"]color1 OR color2 會比對 color1redcolor2blue 的文件。 {"color1 OR color2": ["red", "blue"]}
LIKE 符合部分字串。 {"column LIKE": "hello"}
未指定篩選運算子 篩選會檢查是否完全符合。 如果指定了多個值,則會比對任何值。 {"id": 200} {"id": [200, 300]}

請參閱以下程式碼範例:

Python SDK

# Match rows where `title` exactly matches `Athena` or `Ares`
results = index.similarity_search(
    query_text="Greek myths",
    columns=["id", "text"],
    filters={"title": ["Ares", "Athena"]},
    num_results=2
    )

# Match rows where `title` or `id` exactly matches `Athena` or `Ares`
results = index.similarity_search(
    query_text="Greek myths",
    columns=["id", "text"],
    filters={"title OR id": ["Ares", "Athena"]},
    num_results=2
    )

# Match only rows where `title` is not `Hercules`
results = index.similarity_search(
    query_text="Greek myths",
    columns=["id", "text"],
    filters={"title NOT": "Hercules"},
    num_results=2
    )

REST API

請參閱 POST /api/2.0/vector-search/indexes/{index_name}/query

筆記本範例

本節中的範例示範向量搜尋 Python SDK 的使用方式。

LangChain 範例

請參閱如何搭配使用 LangChain 與 Mosaic AI 向量搜尋,以了解如何在與 LangChain 套件整合時使用 Mosaic AI 向量搜尋。

下列筆記本示範如何將相似性搜尋結果轉換成 LangChain 文件。

使用 Python SDK 筆記本進行向量搜尋

取得筆記本

呼叫內嵌模型的筆記本範例

下列筆記本示範如何設定 Mosaic AI 模型服務端點以生成內嵌。

使用 Mosaic AI Model Serving 筆記本呼叫 OpenAI 內嵌模型

取得筆記本

使用 Mosaic AI Model Serving 筆記本呼叫 GTE 內嵌模型

取得筆記本

註冊並提供 OSS 內嵌模型筆記本

取得筆記本