Compartir vía


Consulta de un índice de búsqueda vectorial

En este artículo se describe cómo consultar un índice de búsqueda vectorial, incluido cómo usar filtros y reranking.

Para obtener cuadernos de ejemplo que ilustran cómo crear y consultar puntos de conexión e índices de búsqueda vectorial, consulte Cuadernos de ejemplo de búsqueda vectorial. Para obtener información de referencia, consulte la referencia del SDK de Python.

Installation

Para usar el SDK de búsqueda vectorial, debe instalarlo en el cuaderno. Use el código siguiente para instalar el paquete:

%pip install databricks-vectorsearch
dbutils.library.restartPython()

A continuación, use el siguiente comando para importar VectorSearchClient:

from databricks.vector_search.client import VectorSearchClient

Para obtener información sobre la autenticación, consulte Protección y autenticación de datos.

Consulta de un índice de búsqueda vectorial

Solo puede consultar el índice de búsqueda vectorial mediante el SDK de Python, la API REST o la función de SQL vector_search() AI.

Nota:

Si el usuario que consulta el índice no es el propietario del índice de búsqueda vectorial, el usuario debe tener los siguientes privilegios de UC:

  • USE CATALOG en el catálogo que contiene el índice de búsqueda vectorial.
  • USE SCHEMA en el esquema que contiene el índice de búsqueda vectorial.
  • SELECT en el índice de búsqueda vectorial.

El tipo de consulta predeterminado es ann (vecino más cercano aproximado). Para realizar una búsqueda híbrida de similitud de palabras clave, establezca el parámetro en query_typehybrid. Con la búsqueda híbrida, se incluyen todas las columnas de metadatos de texto y se devuelve un máximo de 200 resultados.

Para usar el reranker en una consulta, consulte Uso del reranker en una consulta.

Importante

La búsqueda de texto completo está disponible como una característica beta. Para realizar una búsqueda de texto completo, establezca el parámetro query_type a FULL_TEXT. Con la búsqueda de texto completo, puede recuperar hasta 200 resultados en función de la coincidencia de palabras clave sin usar incrustaciones vectoriales.

Punto de conexión estándar del SDK de Python

Para más información, consulte la referencia del SDK de Python.

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

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

# Delta Sync Index using full-text search (Beta)
results4 = index.similarity_search(
    query_text="Greek myths",
    columns=["id", "field2"],
    num_results=2,
    query_type="FULL_TEXT"
    )

# Delta Sync Index with pre-calculated embeddings
results2 = index.similarity_search(
    query_vector=[0.9] * 1024,
    columns=["id", "text"],
    num_results=2
    )

Punto de conexión del SDK de Python optimizado para almacenamiento

Para más información, consulte la referencia del SDK de Python.

La interfaz de filtro existente se ha vuelto a diseñar para los índices de vector de búsqueda optimizados para almacenamiento para adoptar una cadena de filtro más similar a SQL en lugar del diccionario de filtros que se usa en los puntos de conexión de vector de búsqueda estándar.

client = VectorSearchClient()
index = client.get_index(index_name="vector_search_demo.vector_search.en_wiki_index")

# similarity search with query vector
results = index.similarity_search(
    query_vector=[0.2, 0.33, 0.19, 0.52],
    columns=["id", "text"],
    num_results=2
)

# similarity search with query vector and filter string
results = index.similarity_search(
    query_vector=[0.2, 0.33, 0.19, 0.52],
    columns=["id", "text"],
    # this is a single filter string similar to SQL WHERE clause syntax
    filters="language = 'en' AND country = 'us'",
    num_results=2
)

REST API

Consulte la documentación de referencia de la API REST: POST /api/2.0/vector-search/indexes/{index_name}/query.

Para las aplicaciones de producción, Databricks recomienda utilizar credenciales de servicio en lugar de tokens de acceso personal. Además de mejorar la administración de seguridad y acceso, el uso de entidades de servicio puede mejorar el rendimiento hasta 100 msec por consulta.

En el ejemplo de código siguiente se muestra cómo consultar un índice mediante un principal de servicio.

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, 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}'

En el ejemplo de código siguiente se muestra cómo consultar un índice mediante un token de acceso personal (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}'

SQL

Importante

La función de IA vector_search() se encuentra en Versión preliminar pública.

Para usar esta función de IA, consulte vector_search función .

Usar filtros en consultas

Una consulta puede definir filtros basados en cualquier columna de la tabla Delta. similarity_search devuelve solo las filas que coinciden con los filtros especificados.

En la tabla siguiente se enumeran los filtros admitidos.

Operador de filtro Comportamiento Examples
NOT Estándar: niega el filtro. La clave debe terminar con "NOT". Por ejemplo, "color NOT" con el valor "rojo" coincide con documentos donde el color no es rojo.
Optimizado para almacenamiento: consulte el operador != (signo de exclamación e igual que).
Estándar: {"id NOT": 2}{“color NOT”: “red”}
Optimizado para almacenamiento: "id != 2" "color != 'red'"
< Estándar: comprueba si el valor del campo es menor que el valor de filtro. La clave debe terminar con " <". Por ejemplo, "precio <" con el valor 200 coincide con documentos en los que el precio es menor que 200.
Optimizado para almacenamiento: consulte el operador < (signo menor que).
Estándar: {"id <": 200}
Optimizado para almacenamiento: "id < 200"
<= Estándar: comprueba si el valor del campo es menor o igual que el valor de filtro. La clave debe terminar con " <=". Por ejemplo, "price <=" con el valor 200 coincide con documentos donde el precio es menor o igual que 200.
Optimizado para almacenamiento: consulte el operador <= (signo menor o igual que).
Estándar: {"id <=": 200}
Optimizado para almacenamiento: "id <= 200"
> Estándar: comprueba si el valor del campo es mayor que el valor de filtro. La clave debe terminar con " >". Por ejemplo, "precio >" con el valor 200 coincide con documentos donde el precio es mayor que 200.
Optimizado para almacenamiento: consulte el operador > (signo mayor que).
Estándar: {"id >": 200}
Optimizado para almacenamiento: "id > 200"
>= Estándar: comprueba si el valor del campo es mayor o igual que el valor de filtro. La clave debe terminar con " >=". Por ejemplo, "price >=" con el valor 200 coincide con documentos donde el precio es mayor o igual que 200.
Optimizado para almacenamiento: consulte el operador >= (signo mayor o igual que).
Estándar: {"id >=": 200}
Optimizado para almacenamiento: "id >= 200"
OR Estándar: comprueba si el valor del campo coincide con cualquiera de los valores de filtro. La clave debe contener OR para separar varias subclaves. Por ejemplo, color1 OR color2 con el valor ["red", "blue"] coincide con documentos donde color1 es red o color2 es blue.
Optimizado para almacenamiento: consulte el operador or.
Estándar: {"color1 OR color2": ["red", "blue"]}
Optimizado para almacenamiento: "color1 = 'red' OR color2 = 'blue'"
LIKE Estándar: coincide con tokens separados por espacios en blanco en una cadena. Consulte los ejemplos de código siguientes.
Optimizado para almacenamiento: consulte el operador like.
Estándar: {"column LIKE": "hello"}
Optimizado para almacenamiento: "column LIKE 'hello'"
No se ha especificado ningún operador de filtro Estándar: Busca una coincidencia exacta. Si se especifican varios valores, coincide con cualquiera de los valores.
Optimizado para almacenamiento: consulte el operador = (signo igual que) y el predicado in.
Estándar: {"id": 200}{"id": [200, 300]}
Optimizado para almacenamiento: "id = 200""id IN (200, 300)"
to_timestamp (solo puntos de conexión optimizados para almacenamiento) Optimizado para almacenamiento: filtre por una marca de tiempo. Ver función to_timestamp Optimizado para almacenamiento: "date > TO_TIMESTAMP('1995-01-01')"

Consulte los ejemplos de código siguientes:

Punto de conexión estándar del SDK de Python

# 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
    )

Punto de conexión del SDK de Python optimizado para almacenamiento

# Match rows where `title` exactly matches `Athena` or `Ares`
results = index.similarity_search(
    query_text="Greek myths",
    columns=["id", "text"],
    filters='title IN ("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 = "Ares" OR id = "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 != "Hercules"',
    num_results=2
    )

REST API

Vea POST /api/2.0/vector-search/indexes/{index_name}/query.

ME GUSTA

LIKE Ejemplos

{"column LIKE": "apple"}: coincide con las cadenas "manzana" y "manzana pera", pero no coincide con "piña" o "pera". Tenga en cuenta que no coincide con "piña", aunque contiene la subcadena "manzana" --- busca una coincidencia exacta en los tokens separados por espacios en blanco, como en "manzana pera".

{"column NOT LIKE": "apple"} hace lo contrario. Coincide con "piña" y "pera", pero no con "manzana" ni "manzana pera".

Uso del reranker en una consulta

El rendimiento del agente depende de recuperar la información más relevante de una consulta. La reevaluación es una técnica que mejora la calidad de recuperación mediante la evaluación de los documentos recuperados para identificar los que son más relevantes semánticamente. Databricks ha desarrollado un sistema de inteligencia artificial compuesto basado en investigación para identificar estos documentos. También puede especificar columnas que contengan metadatos que desee que use el reranker para contexto adicional, ya que evalúa la relevancia de cada documento.

La reranking incurre en un pequeño retraso de latencia, pero puede mejorar significativamente la calidad de recuperación y el rendimiento del agente. Databricks recomienda probar la reranking para cualquier caso de uso del agente RAG.

Los ejemplos de esta sección muestran cómo usar el reranker de búsqueda vectorial. Cuando se usa el reranker, se establecen las columnas que se devuelven (columns) y las columnas de metadatos que se van a usar para el reranking (columns_to_rerank) por separado. num_results es el número final de resultados que se van a devolver. Esto no afecta al número de resultados utilizados para la reempleación.

El mensaje de depuración de consulta incluye información sobre el tiempo que ha llevado a cabo el paso de reranking. Por ejemplo:

'debug_info': {'response_time': 1647.0, 'ann_time': 29.0, 'reranker_time': 1573.0}

Si se produce un error en la llamada del reranker, esa información se incluye en el mensaje de depuración:

'debug_info': {'response_time': 587.0, 'ann_time': 331.0, 'reranker_time': 246.0, 'warnings': [{'status_code': 'RERANKER_TEMPORARILY_UNAVAILABLE', 'message': 'The reranker is temporarily unavailable. Results returned have not been processed by the reranker. Please try again later for reranked results.'}]}

Nota:

El orden en columns_to_rerank el que aparecen las columnas es importante. El cálculo de recálculo toma las columnas en el orden en que se muestran y solo tiene en cuenta los primeros 2000 caracteres que encuentra.

SDK de Python

# Install the most recent version.
# Databricks SDK version 0.57 or above is required to use the reranker.
%pip install databricks-vectorsearch --force-reinstall
dbutils.library.restartPython()
from databricks.vector_search.reranker import DatabricksReranker

results = index.similarity_search(
    query_text = "How to create a Vector Search index",
    columns = ["id", "text", "parent_doc_summary", "date"],
    num_results = 10,
    query_type = "hybrid",
    reranker=DatabricksReranker(columns_to_rerank=["text", "parent_doc_summary", "other_column"])
    )

REST API

Para asegurarse de obtener información de latencia, establezca debug_level en al menos 1.

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

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": 10, "query_text": "How to create a Vector Search index", "columns": ["id", "text", "parent_doc_summary", "date"], "reranker": {"model": "databricks_reranker",
             "parameters": {
               "columns_to_rerank":
                 ["text", "parent_doc_summary"]
              }
             },
"debug_level": 1}'

Búsquedas de puntos

Para realizar una búsqueda de puntos, use un filtro en cualquier columna de clave principal.