Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
På den här sidan beskrivs hur du frågar efter ett vektorsökindex, inklusive sidnumrering, filter och omrankning.
Exempelnotebooks som visar hur du skapar och söker efter slutpunkter och index för vektorsökning finns i Exempelnotebooks för vektorsökning. Referensinformation finns i Python SDK-referens.
Installation
Om du vill använda SDK för vektorsökning måste du installera det i din notebook. Använd följande kod för att installera paketet:
%pip install databricks-vectorsearch
dbutils.library.restartPython()
Använd sedan följande kommando för att importera VectorSearchClient:
from databricks.vector_search.client import VectorSearchClient
Information om autentisering finns i Dataskydd och autentisering.
Utföra frågor på ett vektorsökningsindex
Du kan bara köra frågor mot vektorsökningsindexet med hjälp av funktionen Python SDK, REST API eller SQL vector_search() AI.
Anmärkning
Om användaren som frågar indexet inte är ägare till vektorsökningsindexet måste användaren ha följande UC-behörigheter:
- USE CATALOG i katalogen som innehåller vektorsökningsindexet.
- USE SCHEMA i schemat som innehåller vektorsökningsindexet.
- SELECT på vektorsökningsindexet.
Standardfrågetypen är ann (ungefärlig närmaste granne). Mer information om de olika hämtningsalgoritmerna finns i Hämtningsalgoritmer.
- Om du vill utföra en hybridsökning med nyckelordslikhet anger du parametern
query_typetillhybrid. Med hybridsökning inkluderas alla textmetadatakolumner och högst 200 resultat returneras. - Information om hur du använder reranker i en fråga finns i Använda reranker i en fråga.
Viktigt!
Fulltextsökning är tillgänglig som en betafunktion. Om du vill utföra en fulltextsökning anger du parametern query_type till FULL_TEXT. Med fulltextsökning kan du hämta upp till 200 resultat baserat på nyckelordsmatchning utan att använda vektorinbäddningar. Fulltextfrågor stöds på både standard- och lagringsoptimerade slutpunkter. På lagringsoptimerade slutpunkter kan du också skapa ett dedikerat fulltextsökningsindex utan inbäddningar. Se Skapa ett fulltextsökningsindex (Beta).
Python standardslutpunkt för SDK
Mer information finns i Python SDK-referens.
# 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
)
Python SDK-lagringsoptimerad slutpunkt
Mer information finns i Python SDK-referens.
Det befintliga filtergränssnittet har utformats på nytt för lagringsoptimerade vektorsökningsindex för att införa en mer SQL-liknande filtersträng i stället för filterordlistan som används i standardvektorsökningsslutpunkter.
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
Se referensdokumentation för REST API: POST /api/2.0/vector-search/indexes/{index_name}/query.
För produktionsprogram rekommenderar Databricks att du använder tjänstens huvudnamn i stället för personliga åtkomsttoken. Förutom förbättrad säkerhets- och åtkomsthantering kan användning av tjänstens huvudnamn förbättra prestanda med upp till 100 msec per fråga.
Följande kodexempel illustrerar hur du gör förfrågningar mot ett index med hjälp av en tjänstprincip.
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}'
I följande kodexempel visas hur du kör frågor mot ett index med hjälp av en personlig åtkomsttoken (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
Viktigt!
Funktionen vector_search() AI finns i offentlig förhandsversion.
Information om hur du använder den här AI-funktionen finns i vector_search funktion.
Paginering
När en fråga begär mer än 1 000 resultat returneras resultatet automatiskt på sidor på upp till 1 000. Det maximala antalet resultat som en enskild fråga kan returnera på alla sidor är 10 000. Både standard- och lagringsoptimerade slutpunkter stöder sidnumrering.
Sidnumrering fungerar med alla frågetyper.
Python SDK
Python SDK hanterar paginering på ett osynligt sätt. När du anger num_results ett värde som är större än 1 000 hämtar SDK automatiskt alla sidor och returnerar den fullständiga resultatuppsättningen. Ingen ytterligare kod krävs.
# The SDK automatically paginates and returns all 5000 results
results = index.similarity_search(
query_text="Greek myths",
columns=["id", "text"],
num_results=5000
)
REST API
När du använder REST-API:et direkt måste du hantera sidnumrering manuellt. Om fler resultat är tillgängliga innehåller svaret ett next_page_token fält. Om du vill hämta nästa sida med resultat, skickar du denna token till slutpunkten för nästa sida av frågan.
Se över REST API-referensdokumentationen: POST /api/2.0/vector-search/indexes/{index_name}/query-next-page.
export TOKEN=...
export INDEX_NAME=...
export WORKSPACE_URL=https://...
# Initial query - if num_results exceeds 1000, the response includes next_page_token
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": 5000, "query_text": "...", "columns": ["id", "text"]}'
# Use next_page_token from the response to get the next page
curl -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" \
--url $WORKSPACE_URL/api/2.0/vector-search/indexes/$INDEX_NAME/query-next-page \
--data '{"page_token": "<next_page_token from previous response>"}'
Fortsätt att anropa slutpunkten för frågan nästa sida med next_page_token från varje svar tills token är tom eller frånvarande, vilket indikerar att alla resultat har returnerats.
Använda filter på frågor
En fråga kan definiera filter baserat på valfri kolumn i Delta-tabellen.
similarity_search returnerar endast rader som matchar de angivna filtren.
I följande tabell visas de filter som stöds.
Anmärkning
För lagringsoptimerade slutpunkter är resultaten överhämtade. Om du anger num_results till khämtas fler än k resultaten och filtret tillämpas på de hämtade resultaten. Det är möjligt att inga resultat returneras även om det finns resultat i datauppsättningen som matchar filtervillkoret, om poängen för dessa dokument inte finns bland de översta.
| Filteroperatorn | Beteende | Examples |
|---|---|---|
NOT |
Standard: Negerar filtret. Nyckeln måste sluta med "NOT". Till exempel matchar "color NOT" med värdet "red" dokument där färgen inte är röd. Lagringsoptimerad: Se != operatorn (bangeq-tecken). |
Standard: {"id NOT": 2}{“color NOT”: “red”}Lagringsoptimerad: "id != 2" "color != 'red'" |
< |
Standard: Kontrollerar om fältvärdet är mindre än filtervärdet. Nyckeln måste sluta med " <". Till exempel matchar "pris <" med värdet 200 dokument där priset är mindre än 200. Lagringsoptimerad: Se (lt sign) operatorn <. |
Standard: {"id <": 200}Lagringsoptimerad: "id < 200" |
<= |
Standard: Kontrollerar om fältvärdet är mindre än eller lika med filtervärdet. Nyckeln måste sluta med " <=". Till exempel matchar "pris <=" med värdet 200 dokument där priset är mindre än eller lika med 200. Lagringsoptimerad: Se <=. |
Standard: {"id <=": 200}Lagringsoptimerad: "id <= 200" |
> |
Standard: Kontrollerar om fältvärdet är större än filtervärdet. Nyckeln måste sluta med " >". Till exempel matchar "pris >" med värdet 200 dokument där priset är större än 200. Lagringsoptimerad: Se > operatorn (gt sign). |
Standard: {"id >": 200}Lagringsoptimerad: "id > 200" |
>= |
Standard: Kontrollerar om fältvärdet är större än eller lika med filtervärdet. Nyckeln måste sluta med " >=". Till exempel matchar "pris >=" med värdet 200 dokument där priset är större än eller lika med 200. Lagringsoptimerad: Se >=-operatorn (gt eq sign). |
Standard: {"id >=": 200}Lagringsoptimerad: "id >= 200" |
OR |
Standard: Kontrollerar om fältvärdet matchar något av filtervärdena. Nyckeln måste innehålla OR för att avgränsa flera undernycklar. Till exempel matchar color1 OR color2 med värdet ["red", "blue"] dokument där antingen color1 är red eller color2blue.Lagringsoptimerad: Se or operatorn. |
Standard: {"color1 OR color2": ["red", "blue"]}Lagringsoptimerad: "color1 = 'red' OR color2 = 'blue'" |
LIKE |
Standard: Matchar blankstegsavgränsade token i en sträng. Lagringsoptimerad: Se like operatorn. |
Se Anteckningar om användning av LIKE. |
| Ingen filteroperator är angiven. |
Standard: Filterkontrollerar för en exakt matchning. Om flera värden anges matchar det något av värdena. Lagringsoptimerad: Se = operatorn (eq sign) och in predikatet. |
Standard: {"id": 200}{"id": [200, 300]}Lagringsoptimerad: "id = 200""id IN (200, 300)" |
to_timestamp (endast lagringsoptimerade slutpunkter) |
Lagringsoptimerad: Filtrera på en tidsstämpel. Se to_timestamp funktion |
Lagringsoptimerad: "date > TO_TIMESTAMP('1995-01-01')" |
Anteckningar om användning av LIKE
LIKE exempel för standardslutpunkter
{"column LIKE": "apple"}: matchar strängarna "apple" och "apple pear" men matchar inte "ananas". Observera att den inte matchar "ananas" även om den innehåller ett substring "äpple" – det letar efter en exakt matchning över blankstegsavgränsade token som i "äppelpäron".
{"column NOT LIKE": "apple"} gör motsatsen. Den matchar "ananas" och "päron" men matchar inte "äpple" eller "äppelpäron".
LIKE exempel för lagringsoptimerade slutpunkter
| Format | Matcher |
|---|---|
"column LIKE 'apple'" |
= är motsvarigheten till operatorn. Returnerar endast exakta matchningar. |
"column LIKE 'apple%'" |
Returnerar rader där ett prefix matchar apple, till exempel applepie. |
"column LIKE '%apple'" |
Returnerar rader där ett suffix matchar apple, till exempel pineapple. |
"column LIKE '%apple%'" |
Returnerar rader som har en delsträng som matchar apple, till exempel pineapplecake. |
Kodexempel
Python standardslutpunkt för 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
)
Python SDK-lagringsoptimerad slutpunkt
# 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
Se POST /api/2.0/vector-search/indexes/{index_name}/query.
Använda rerankern i en fråga
Agentprestanda beror på hur du hämtar den mest relevanta informationen för en fråga. Reranking är en teknik som förbättrar hämtningskvaliteten genom att utvärdera de hämtade dokumenten för att identifiera de som är semantiskt mest relevanta. Databricks har utvecklat ett forskningsbaserat sammansatt AI-system för att identifiera dessa dokument. Du kan också ange kolumner som innehåller metadata som du vill att rerankern ska använda för ytterligare kontext när den utvärderar varje dokuments relevans.
Att ändra rangordning medför en liten fördröjning, men kan avsevärt förbättra hämtningskvaliteten och agentprestandan. Databricks rekommenderar att du provar att ändra rangordning för alla RAG-agentanvändningsfall.
Exemplen i det här avsnittet visar hur du använder vektorsökningsrerankern. När du använder reranker anger du att kolumnerna ska returnera (columns) och de metadatakolumner som ska användas för att ändra rangordning (columns_to_rerank) separat.
num_results är det slutliga antalet resultat som ska returneras. Detta påverkar inte antalet resultat som används för att ändra rangordning.
Frågefelsökningsmeddelandet innehåller information om hur lång tid det tog att ändra rangordning. Till exempel:
'debug_info': {'response_time': 1647.0, 'ann_time': 29.0, 'reranker_time': 1573.0}
Om reranker-anropet misslyckas inkluderas den informationen i felsökningsmeddelandet:
'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.'}]}
Anmärkning
Den ordning som kolumnerna visas i columns_to_rerank är viktig. Beräkningen för omrankning tar kolumnerna i den ordning de visas och tar endast hänsyn till de första 2 000 tecken som hittas.
Python SDK
# 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
För att säkerställa att du får svarstidsinformation anger du debug_level till minst 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}'
Punktsökningar
Om du vill göra en punktsökning använder du ett filter på valfri primärnyckelkolumn.
Hämtningsalgoritmer
I det här avsnittet beskrivs de olika hämtningsalgoritmerna eller frågetyperna och när var och en kan användas. Använd parametern query_type för att ange vilken hämtningsalgoritm som ska användas. Information om hur du automatiskt jämför prestanda för olika algoritmer för ditt index finns i Utvärdera vektorsökningens hämtningskvalitet.
| Strategi | Så här fungerar det | Passar bäst för |
|---|---|---|
| ANN (ungefärlig närmaste granne) | Söker med vektorbäddningar för att hitta semantiskt liknande dokument. | Begreppsmässiga och semantiska frågor där innebörden är viktigare än exakt formulering. |
| Fulltext | Nyckelordssökning som matchar exakta termer. | Frågor med specifika termer, lämpliga substantiv, produkt-ID:n eller teknisk jargong. |
| Hybrid | Kombinerar ANN- och fulltextresultat med Reciprocal Rank Fusion (RRF). | Allmän informationsåtervinning. Den rekommenderade startpunkten för de flesta användningsfall. |
| Hybrid + rangordnare | Kör hybridsökning och gör sedan om resultat med en rerankermodell mellan kodare. | Högre precision när svarstiden tillåter (~1,5s extra per fråga). |
ANN (vektorsökning)
ANN-sökning konverterar en fråga till en vektorinbäddning och hittar dokument vars inbäddningar är som mest lika. Detta är effektivt för att förstå innebörden. Till exempel matchar en fråga som "hur du åtgärdar ett trasigt rör" dokument om VVS även om de inte innehåller de exakta orden.
- När ANN fungerar bra: Frågor är konceptuella, konversationsmässiga eller använder andra ordförråd än dokumenten.
- När ANN kan underprestera: Frågor förlitar sig på exakta nyckelord, lämpliga substantiv eller domänspecifik terminologi som inbäddningar kanske inte samlar in exakt.
Fulltext (nyckelordssökning)
Fulltextsökning matchar dokument som innehåller frågetermerna. Fulltextsökning har hög precision. När användare söker efter specifika namn, koder eller tekniska termer hittar nyckelordsmatchning exakta träffar som vektorsökningen kan missa.
- När fulltext fungerar bra: Frågor innehåller specifika identifierare, produktnamn, felkoder eller domänspecifik terminologi.
- När fulltext kan underprestera: Frågor formuleras på ett annat sätt än dokumenten eller använder synonymer och parafraser.
Hybridsökning
Hybridsökningen kör både ANN- och fulltextsökningar parallellt och sammanfogar sedan resultaten med hjälp av Reciprocal Rank Fusion (RRF). Detta kombinerar den semantiska förståelsen av vektorsökning med precisionen för nyckelordsmatchning.
- När hybridsökningen fungerar bra: Frågearbetsbelastningen är en blandning av konceptuella och nyckelordsintensiva frågor. Hybrid är den mest robusta strategin för generell användning.
Reranker
En reranker är ett valfritt andra pass som tillämpas ovanpå vilken strategi som helst. Efter den inledande hämtningen utvärderar en korskodarmodell varje resultat i frågans kontext, vilket ger en mer exakt relevansordning.
Rerankern förbättrar vanligtvis kvaliteten med cirka 10% men lägger till svarstid. Den är lämplig för program där kvalitet är viktigast, till exempel RAG-chattrobotar, men potentiellt mindre lämplig för sökprogram med högt dataflöde och låg latens.