Como criar e consultar um índice de pesquisa vetorial
Este artigo descreve como criar e consultar um índice de pesquisa vetorial usando Mosaic AI Vector Search.
O senhor pode criar e gerenciar componentes de pesquisa vetorial, como um endpoint de pesquisa vetorial e índices de pesquisa vetorial, usando a interface do usuário, o Python SDK ou a API REST.
Requisitos
- Workspace habilitado para o Unity Catalog.
- sem servidor compute ativado. Para obter instruções, consulte Conectar-se a serverless compute .
- A tabela de origem deve ter a opção Alterar feed de dados ativada. Para obter instruções, consulte Usar o feed de dados de alteração do Delta Lake no Databricks.
- Para criar um índice de pesquisa vetorial, o senhor deve ter privilégios de CREATE TABLE no esquema de catálogo em que o índice será criado.
- Para consultar um índice que pertence a outro usuário, você deve ter privilégios adicionais. Consulte Consultar uma pesquisa vetorial endpoint.
A permissão para criar e gerenciar o ponto de extremidade de pesquisa vetorial é configurada usando listas de controle de acesso. Consulte Pesquisa de vetores endpoint ACLs.
Instalação
Para usar a pesquisa vetorial SDK, o senhor deve instalá-la em seu Notebook. Use o código a seguir para instalar o pacote:
%pip install databricks-vectorsearch
dbutils.library.restartPython()
Em seguida, use o seguinte comando para importar VectorSearchClient
:
from databricks.vector_search.client import VectorSearchClient
Autenticação
Consulte Proteção e autenticação de dados.
Criar uma pesquisa vetorial endpoint
O senhor pode criar um endpoint de pesquisa vetorial usando a interface do usuário do Databricks, o Python SDK ou a API.
Criar uma pesquisa vetorial endpoint usando a interface do usuário
Siga estas etapas para criar um endpoint de pesquisa vetorial usando a interface do usuário.
-
Na barra lateral esquerda, clique em computar .
-
Clique em Vector Search tab e clique em Create .
-
O formulário Criar endpoint é aberto. Digite um nome para esse endpoint.
-
Clique em Confirmar .
Criar um endpoint de pesquisa vetorial usando o Python SDK
O exemplo a seguir usa a função create_endpoint() do SDK para criar um endpoint de pesquisa vetorial.
# The following line automatically generates a PAT Token for authentication
client = VectorSearchClient()
# The following line uses the service principal token for authentication
# client = VectorSearchClient(service_principal_client_id=<CLIENT_ID>,service_principal_client_secret=<CLIENT_SECRET>)
client.create_endpoint(
name="vector_search_endpoint_name",
endpoint_type="STANDARD"
)
Criar um endpoint de pesquisa vetorial usando a API REST
Consulte a documentação de referência REST API : POST /api/2.0/vector-search/endpoint.
(Opcional) Crie e configure um site endpoint para servir o modelo de incorporação
Se o senhor optar por ter Databricks compute os embeddings, poderá usar um Foundation Model pré-configurado APIs endpoint ou criar um modelo de serviço endpoint para servir o modelo de embedding de sua escolha. Consulte Pay-per-tokens Foundation Model APIs ou Create foundation servindo modelo endpoint para obter instruções. Para obter um exemplo do Notebook, consulte Notebook examples for calling an embeddings model.
Ao configurar um embedding endpoint, Databricks recomenda que o senhor remova a seleção default de escala para zero . O endpoint de atendimento pode levar alguns minutos para aquecer, e a consulta inicial em um índice com um endpoint reduzido pode ter um tempo limite.
A inicialização do índice de pesquisa de vetores pode demorar um pouco se a incorporação endpoint não estiver configurada adequadamente para o dataset. O senhor só deve usar o endpoint da CPU para pequenos conjuntos de dados e testes. Para conjuntos de dados maiores, use uma GPU endpoint para obter o desempenho ideal.
Crie um índice de pesquisa vetorial
O senhor pode criar um índice de pesquisa vetorial usando a interface do usuário, o Python SDK ou a API REST. A interface do usuário é a abordagem mais simples.
Há dois tipos de índices:
- O Delta Sync Index é sincronizado automaticamente com uma tabela Delta de origem, atualizando o índice de forma automática e incremental à medida que os dados subjacentes na tabela Delta são alterados.
- O Direct Vector Access Index suporta leitura e gravação diretas de vetores e metadados. O usuário é responsável por atualizar essa tabela usando a API REST ou o Python SDK. Esse tipo de índice não pode ser criado usando a interface do usuário. O senhor deve usar a API REST ou o SDK.
Crie um índice usando a interface do usuário
-
Na barra lateral esquerda, clique em Catálogo para abrir a interface do Catalog Explorer.
-
Navegue até a tabela Delta que o senhor deseja usar.
-
Clique no botão Criar no canto superior direito e selecione Índice de pesquisa vetorial no menu suspenso.
-
Use os seletores na caixa de diálogo para configurar o índice.
Name (Nome ): Nome a ser usado para a tabela on-line no Unity Catalog. O nome exige um namespace de três níveis,
<catalog>.<schema>.<name>
. Somente caracteres alfanuméricos e sublinhados são permitidos.Primary key : Coluna a ser usada como primária key.
endpoint : Selecione a pesquisa vetorial endpoint que o senhor deseja usar.
Colunas a serem sincronizadas : selecione as colunas a serem sincronizadas com o índice vetorial. Se você deixar esse campo em branco, todas as colunas da tabela de origem serão sincronizadas com o índice. A coluna key primária e a coluna de origem de incorporação ou a coluna de vetor de incorporação estão sempre sincronizadas.
Embedding source (Fonte de incorporação ): Indique se o senhor deseja que o site Databricks faça compute embeddings para uma coluna de texto na tabela Delta (compute embeddings ) ou se a tabela Delta contém embeddings pré-computados (Use existing embedding column ).
- Se tiver selecionado computar embeddings , selecione a coluna para a qual deseja computar embeddings e o site endpoint que está servindo o modelo de embedding. Somente colunas de texto são suportadas.
- Se você selecionou Usar coluna de incorporação existente , selecione a coluna que contém as incorporações pré-calculadas e a dimensão de incorporação. O formato da coluna de incorporação pré-computada deve ser
array[float]
.
Sync compute embeddings : Alterne essa configuração para salvar os embeddings gerados em uma tabela Unity Catalog. Para obter mais informações, consulte Salvar tabela de incorporação gerada.
Modo de sincronização : contínuo mantém o índice sincronizado com segundos de latência. No entanto, ele tem um custo maior associado, pois um compute clustering é provisionamento para executar a transmissão de sincronização contínua pipeline. Tanto para Contínua quanto para Acionada , a atualização é incremental — somente os dados que foram alterados desde a última sincronização são processados.
No modo de sincronização acionada , o senhor usa o Python SDK ou o REST API para iniciar a sincronização. Consulte Atualizar um índice Delta Sync.
-
Quando terminar de configurar o índice, clique em Criar .
Criar índice usando o Python SDK
O exemplo a seguir cria um Delta Sync Index com embeddings computados por 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"
)
O exemplo a seguir cria um Delta Sync Index com embeddings autogerenciáveis. Esse exemplo também mostra o uso do parâmetro opcional columns_to_sync
para selecionar somente um subconjunto de colunas a serem usadas no índice.
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"
)
Em default, todas as colunas da tabela de origem são sincronizadas com o índice. Para sincronizar somente um subconjunto de colunas, use columns_to_sync
. As colunas primárias key e de incorporação são sempre incluídas no índice.
Para sincronizar apenas o key primário e a coluna de incorporação, o senhor deve especificá-los em columns_to_sync
, conforme mostrado:
index = client.create_delta_sync_index(
...
columns_to_sync=["id", "text_vector"] # to sync only the primary key and the embedding column
)
Para sincronizar colunas adicionais, especifique-as conforme mostrado. O senhor não precisa incluir o key primário e a coluna de incorporação, pois eles são sempre sincronizados.
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.
)
O exemplo a seguir cria um Índice de Acesso Vetorial Direto.
client = VectorSearchClient()
index = client.create_direct_access_index(
endpoint_name="storage_endpoint",
index_name=f"{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>"}
)
Criar índice usando a API REST
Consulte a documentação de referência da API REST: POST /api/2.0/vector-search/indexes.
Salvar tabela de incorporação gerada
Se o Databricks gerar as incorporações, o senhor poderá salvar as incorporações geradas em uma tabela no Unity Catalog. Essa tabela é criada no mesmo esquema do índice vetorial e é vinculada a partir da página de índice vetorial.
O nome da tabela é o nome do índice de pesquisa vetorial, anexado por _writeback_table
. O nome não é editável.
O senhor pode acessar e consultar a tabela como qualquer outra tabela no Unity Catalog. No entanto, você não deve descartar ou modificar a tabela, pois ela não deve ser atualizada manualmente. A tabela é excluída automaticamente se o índice for excluído.
Atualizar um índice de pesquisa vetorial
Atualizar um índice Delta Sync
Os índices criados com o modo de sincronização contínua são atualizados automaticamente quando a tabela Delta de origem é alterada. Se estiver usando o modo de sincronização acionada , use o Python SDK ou o REST API para iniciar a sincronização.
- Python SDK
- REST API
index.sync()
See the REST API reference documentation: POST /api/2.0/vector-search/indexes/{index_name}/sync.
Atualizar um índice de acesso direto a vetores
O senhor pode usar o Python SDK ou a API REST para inserir, atualizar ou excluir dados de um Direct Vector Access Index.
- Python SDK
- REST API
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]
}
])
See the REST API reference documentation: POST /api/2.0/vector-search/indexes.
For production applications, Databricks recommends using service principals instead of personal access tokens. Performance can be improved by up to 100 msec per query.
The following code example illustrates how to update an index using a service principal.
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": [...]}'
The following code example illustrates how to update an index using a personal access token (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": [...]}'
Consultar uma pesquisa vetorial endpoint
O senhor só pode consultar o endpoint de pesquisa de vetores usando o Python SDK, a API REST ou a função SQL vector_search()
AI.
Se o usuário que estiver consultando o endpoint não for o proprietário do índice de pesquisa vetorial, ele deverá ter os seguintes privilégios de UC:
- USE CATALOG no catálogo que contém o índice de pesquisa vetorial.
- USE SCHEMA no esquema que contém o índice de pesquisa vetorial.
- SELECIONE no índice de pesquisa vetorial.
Para realizar uma pesquisa híbrida de similaridade de palavras-chave, defina o parâmetro query_type
como hybrid
. O valor de default é ann
(vizinho mais próximo aproximado).
- Python SDK
- REST API
- SQL
# 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
)
See the REST API reference documentation: POST /api/2.0/vector-search/indexes/{index_name}/query.
For production applications, Databricks recommends using service principals instead of personal access tokens. In addition to improved security and access management, using service principals can improve performance by up to 100 msec per query.
The following code example illustrates how to query an index using a service principal.
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}'
The following code example illustrates how to query an index using a personal access token (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}'
The vector_search()
AI function is in Public Preview.
To use this AI function, see vector_search
function.
Use filtros em consultas
Uma consulta pode definir filtros com base em qualquer coluna da tabela Delta. similarity_search
retorna somente as linhas que correspondem aos filtros especificados. Os seguintes filtros são suportados:
Operador de filtro | Comportamento | Exemplos |
---|---|---|
| Nega o filtro. O endereço key deve terminar com "NOT". Por exemplo, “cor NÃO” com valor “vermelho” corresponde a documentos em que a cor não é vermelha. |
|
| Verifica se o valor do campo é menor que o valor do filtro. O endereço key deve terminar com " <". Por exemplo, “price <” com valor 200 corresponde a documentos em que o preço é menor que 200. |
|
| Verifica se o valor do campo é menor ou igual ao valor do filtro. O endereço key deve terminar com " <=". Por exemplo, “price <=” com valor 200 corresponde a documentos em que o preço é menor ou igual a 200. |
|
| Verifica se o valor do campo é maior que o valor do filtro. O endereço key deve terminar com " >". Por exemplo, “preço >” com valor 200 corresponde a documentos em que o preço é maior que 200. |
|
| Verifica se o valor do campo é maior ou igual ao valor do filtro. O endereço key deve terminar com " >=". Por exemplo, “price > =” com valor 200 corresponde a documentos em que o preço é maior ou igual a 200. |
|
| Verifica se o valor do campo corresponde a algum dos valores do filtro. O endereço key deve conter |
|
| Corresponde a tokens separado por espaços em branco em uma cadeia de caracteres. Veja os exemplos de código abaixo. |
|
Nenhum operador de filtro especificado | O filtro verifica a correspondência exata. Se vários valores forem especificados, ele corresponderá a qualquer um dos valores. |
|
Veja os seguintes exemplos de código:
- Python SDK
- REST API
- LIKE
# 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
)
LIKE
examples
{"column LIKE": "apple"}
: matches the strings "apple" and "apple pear" but does not match "pineapple" or "pear". Note that it does not match "pineapple" even though it contains a substring "apple" --- it looks for an exact match over whitespace separated tokens like in "apple pear".
{"column NOT LIKE": "apple"}
does the opposite. It matches "pineapple" and "pear" but does not match "apple" or "apple pear".
Exemplo de notebook
Os exemplos desta seção demonstram o uso do Python SDK de pesquisa vetorial.
Exemplos de LangChain
Consulte Como usar LangChain com Mosaic AI Vector Search para usar Mosaic AI Vector Search como uma integração com o pacote LangChain.
O Notebook a seguir mostra como converter os resultados da pesquisa de similaridade em documentos do site LangChain.
Pesquisa vetorial com o notebook Python SDK
Notebook exemplos para chamar um modelo de embeddings
O seguinte Notebook demonstra como configurar um Mosaic AI Model Serving endpoint para a geração de embeddings.