Megosztás:


Vektorkeresési index lekérdezése

Ez a cikk leírja, hogyan kérdezhet le egy vektorkeresési indexet, beleértve a szűrők használatát és az újrarangsorolást.

A vektorkeresési végpontok és indexek létrehozását és lekérdezését szemléltető jegyzetfüzetek például a vektorkeresési példajegyzetfüzetekben láthatók. A referenciainformációkért tekintse meg a Python SDK-referenciát.

Installation

A vektorkeresési SDK használatához telepítenie kell azt a jegyzetfüzetbe. A csomag telepítéséhez használja a következő kódot:

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

Ezután a következő paranccsal importálja a VectorSearchClient:

from databricks.vector_search.client import VectorSearchClient

A hitelesítésről további információt az adatvédelem és a hitelesítés című témakörben talál.

Vektorkeresési index lekérdezése

A vektorkeresési indexet csak a Python SDK, a REST API vagy az SQL vector_search() AI függvény használatával kérdezheti le.

Megjegyzés:

Ha az indexet lekérdező felhasználó nem a vektorkeresési index tulajdonosa, a felhasználónak a következő UC-jogosultságokkal kell rendelkeznie:

  • USE CATALOG a vektorkeresési indexet tartalmazó katalógusban.
  • USE SCHEMA a vektorkeresési indexet tartalmazó sémán.
  • SELECT a vektorkeresési indexen.

Az alapértelmezett lekérdezéstípus a ann (megközelítőleg legközelebbi szomszéd). Ha hibrid kulcsszó-hasonlósági keresést szeretne végezni, állítsa a query_type paramétert hybridértékre. Hibrid keresés esetén a rendszer az összes szöveges metaadatoszlopot tartalmazza, és legfeljebb 200 találatot ad vissza.

A reranker lekérdezésben való használatához lásd : Reranker használata egy lekérdezésben.

Fontos

A teljes szöveges keresés bétaverzióként érhető el. Teljes szöveges keresés végrehajtásához állítsa a paramétert a következőre query_typeFULL_TEXT: . A teljes szöveges kereséssel akár 200 találatot is lekérhet kulcsszóegyeztetés alapján vektoros beágyazások használata nélkül.

Python SDK standard végpont

További részletekért tekintse meg a Python SDK-referenciát.

# 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 storage-optimalizált végpont

További részletekért tekintse meg a Python SDK-referenciát.

A meglévő szűrőfelületet a tárolóoptimalizált vektorkeresési indexekhez tervezték, hogy a standard vektorkeresési végpontokban használt szűrőszótár helyett SQL-szerű szűrősztringet alkalmazzanak.

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

Lásd a REST API referenciadokumentációját: POST /api/2.0/vector-search/indexes/{index_name}/query.

Éles alkalmazások esetében a Databricks szolgáltatásnevek használatát javasolja személyes hozzáférési jogkivonatok helyett. A jobb biztonság és hozzáférés-kezelés mellett a szolgáltatásnevek használata lekérdezésenként akár 100 msec-rel is javíthatja a teljesítményt.

Az alábbi példakód bemutatja, hogyan kérdezhet le egy indexet egy szolgáltatásnév használatával.

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

Az alábbi kódpélda bemutatja, hogyan kérdezhet le egy indexet személyes hozzáférési jogkivonat (PAT) használatával.

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

Fontos

A vector_search() AI-függvény nyilvános előnézetben van.

A AI-függvényhasználatához lásd: vector_search függvény.

Szűrők használata lekérdezéseken

A lekérdezések a Delta tábla bármely oszlopa alapján definiálhatnak szűrőket. similarity_search csak a megadott szűrőknek megfelelő sorokat adja vissza.

Az alábbi táblázat a támogatott szűrőket sorolja fel.

Megjegyzés:

A tárolóoptimalizált végpontok esetében az eredmények túltöltődnek. Ha az értéket num_results-ra állítja k, akkor több mint k eredményt olvas be a rendszer, és a szűrő az így lekérdezett eredményekre lesz alkalmazva. Előfordulhat, hogy a rendszer akkor sem ad vissza eredményt, ha az adathalmazban a szűrőfeltételnek megfelelő eredmények szerepelnek, ha a dokumentumok pontszáma nem szerepel az első helyen.

Szűrő operátor Magatartás Példák
NOT Standard: Negálja a szűrőt. A kulcsnak "NOT" végződéssel kell végződnie. Például a "color NOT" értéke "piros" egyezik meg olyan dokumentumokkal, ahol a szín nem piros.
Tárolóoptimalizált: Lásd a != (bangeq sign) operátort.
Standard: {"id NOT": 2}{“color NOT”: “red”}
Tárolóoptimalizált: "id != 2" "color != 'red'"
< Standard: Ellenőrzi, hogy a mező értéke kisebb-e a szűrőértéknél. A kulcsnak "<" végződéssel kell végződnie. A 200-as értékkel rendelkező "price <" például megegyezik azokkal a dokumentumokkal, ahol az ár kisebb, mint 200.
Tárolóoptimalizált: Lásd < az (lt sign) operátort.
Standard: {"id <": 200}
Tárolóoptimalizált: "id < 200"
<= Standard: Ellenőrzi, hogy a mező értéke kisebb vagy egyenlő-e a szűrőértéknél. A kulcsnak "<=" végződéssel kell végződnie. A 200-as értékkel rendelkező "price <=" például megegyezik azokkal a dokumentumokkal, ahol az ár kisebb vagy egyenlő 200-nál.
Tárolóoptimalizált: Lásd <= az (lt eq sign) operátort.
Standard: {"id <=": 200}
Tárolóoptimalizált: "id <= 200"
> Standard: Ellenőrzi, hogy a mező értéke nagyobb-e a szűrőértéknél. A kulcsnak ">" végződéssel kell végződnie. A 200-as értékkel rendelkező "price >" például megegyezik azokkal a dokumentumokkal, ahol az ár nagyobb, mint 200.
Tárolóoptimalizált: Lásd > a (gt sign) operátort.
Standard: {"id >": 200}
Tárolóoptimalizált: "id > 200"
>= Standard: Ellenőrzi, hogy a mező értéke nagyobb vagy egyenlő-e a szűrőértéknél. A kulcsnak ">=" végződéssel kell végződnie. A 200-as értékkel rendelkező "price >=" például megegyezik azokkal a dokumentumokkal, ahol az ár nagyobb vagy egyenlő 200-nál.
Tárolóoptimalizált: Lásd az >=(gt eq sign) operátort.
Standard: {"id >=": 200}
Tárolóoptimalizált: "id >= 200"
OR Standard: Ellenőrzi, hogy a mező értéke megfelel-e valamelyik szűrőértéknek. A kulcsnak OR kell tartalmaznia több alkulcs elkülönítéséhez. Például a color1 OR color2 értékkel rendelkező ["red", "blue"] akkor egyezik a dokumentumokkal, ha color1red, vagy color2blue.
Tárolásra optimalizált: Lásd a or operátort.
Standard: {"color1 OR color2": ["red", "blue"]}
Tárolóoptimalizált: "color1 = 'red' OR color2 = 'blue'"
LIKE Standard: Megfelel a szóközzel elválasztott tokeneknek egy karakterláncban.
Tárolásra optimalizált: Lásd a like operátort.
Lásd : Megjegyzések a használati adatokhoz LIKE.
Nincs megadva szűrőoperátor Standard: A szűrő pontos egyezést keres. Ha több érték van megadva, az bármelyik értéknek megfelel.
Tárolóoptimalizált: Lásd = az (eq sign) operátort és in a predikátumot.
Standard: {"id": 200}{"id": [200, 300]}
Tárolóoptimalizált: "id = 200""id IN (200, 300)"
to_timestamp (csak tárolóoptimalizált végpontok) Tárolóoptimalizált: Szűrés időbélyeg alapján. Lásd to_timestamp függvény Tárolóoptimalizált: "date > TO_TIMESTAMP('1995-01-01')"

A LIKE használatával kapcsolatos megjegyzések

LIKE példák standard végpontokra

{"column LIKE": "apple"}: megegyezik az "apple" és az "apple pear" sztringekkel, de nem egyezik az "ananász" sztringekkel. Vegye figyelembe, hogy nem egyezik az "ananász" kifejezéssel, annak ellenére, hogy egy "alma" alsztringet tartalmaz – szó szerinti egyezést keres csakis a külön szóközzel elválasztott kifejezésekkel, mint például az "alma körte".

{"column NOT LIKE": "apple"} az ellenkezőjét teszi. Az "ananász" és a "körte" megegyezik, de az "alma" vagy az "alma körte" nem felel meg.

LIKE példák a tárolás-optimalizált végpontok

Formátum Egyezések
"column LIKE 'apple'" Az operátorral = egyenértékű. Csak pontos egyezéseket ad vissza.
"column LIKE 'apple%'" Olyan sorokat ad vissza, ahol egy előtag egyezik apple, például applepie.
"column LIKE '%apple'" Olyan sorokat ad vissza, ahol egy utótag egyezik apple, például pineapple.
"column LIKE '%apple%'" Olyan sorokat ad vissza, amelyek egyező alsztringekkel applerendelkeznek, például pineapplecake.

Példakódok

Python SDK standard végpont
# 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 storage-optimalizált végpont
# 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

Lásd: POST /api/2.0/vector-search/indexes/{index_name}/query.

A reranker használata lekérdezésben

Az ügynök teljesítménye a lekérdezés legfontosabb információinak lekérésétől függ. A reranking egy olyan technika, amely javítja a lekérési minőséget azáltal, hogy kiértékeli a lekért dokumentumokat, hogy azonosítsa a szemantikailag legrelevánsabb dokumentumokat. A Databricks kifejlesztett egy kutatásalapú összetett AI-rendszert ezeknek a dokumentumoknak a azonosítására. Megadhatja azokat a metaadatokat tartalmazó oszlopokat is, amelyeket a reranker további környezethez szeretne használni, mivel az értékeli az egyes dokumentumok relevanciáját.

A reranking kis késéssel jár, de jelentősen javíthatja a lekérési minőséget és az ügynök teljesítményét. A Databricks azt javasolja, hogy próbálja ki az újrapróbálkozást minden RAG-ügynök használati esetnél.

Az ebben a szakaszban szereplő példák bemutatják, hogyan használható a vektorkeresési reranker. A reranker használata esetén az oszlopokat külön-külön adja vissza (columns) és a metaadatoszlopokat az újraküldéshez (columns_to_rerank). num_results a visszaadni kívánt eredmények végső száma. Ez nem befolyásolja az újraküldéshez használt eredmények számát.

A lekérdezés hibakeresési üzenete információkat tartalmaz arról, hogy mennyi ideig tartott az újraküldési lépés. Például:

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

Ha a reranker-hívás meghiúsul, a hibakeresési üzenet a következő információkat tartalmazza:

'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.'}]}

Megjegyzés:

Az oszlopok felsorolásának columns_to_rerank sorrendje fontos. A reranking számítás a lista szerinti sorrendbe veszi az oszlopokat, és csak az első 2000 karaktert veszi figyelembe.

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

A késési adatok lekérésének biztosítása érdekében állítsa debug_level be legalább 1 értékre.

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

Pontkeresések

Pontkereséshez használjon szűrőt bármely elsődleges kulcsoszlopon.