Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule opisano sposób wykonywania zapytań względem indeksu wyszukiwania wektorowego, w tym jak używać filtrów i ponownego rankingu.
Na przykład, aby zobaczyć, jak tworzyć i wykonywać zapytania dotyczące wektorowych punktów końcowych wyszukiwania i indeksów, zobacz Przykładowe notebooki wyszukiwania wektorów. Aby uzyskać informacje referencyjne, zobacz dokumentację zestawu SDK języka Python.
Instalacja
Aby użyć zestawu SDK wyszukiwania wektorowego, należy zainstalować go w notesie. Użyj następującego kodu, aby zainstalować pakiet:
%pip install databricks-vectorsearch
dbutils.library.restartPython()
Następnie użyj następującego polecenia, aby zaimportować VectorSearchClient:
from databricks.vector_search.client import VectorSearchClient
Aby uzyskać informacje na temat uwierzytelniania, zobacz Ochrona danych i uwierzytelnianie.
Jak wykonywać zapytania względem indeksu wyszukiwania wektorowego
Można korzystać z indeksu wyszukiwania wektorowego tylko przy użyciu Python SDK, interfejsu API REST lub funkcji SQL vector_search() AI.
Uwaga / Notatka
Jeśli użytkownik wykonujący zapytanie dotyczące indeksu nie jest właścicielem indeksu wyszukiwania wektorowego, użytkownik musi mieć następujące uprawnienia UC:
- USE CATALOG w katalogu zawierającym indeks wyszukiwania wektorów.
- USE SCHEMA na schemacie zawierającym indeks wyszukiwania wektorów.
- SELECT jest na indeksie wyszukiwania wektorowego.
Domyślny typ zapytania to ann (przybliżony najbliższy sąsiad). Aby przeprowadzić wyszukiwanie hybrydowego podobieństwa słów kluczowych, ustaw parametr query_type na wartość hybrid. W przypadku wyszukiwania hybrydowego uwzględniane są wszystkie kolumny metadanych tekstowych, a zwracane są maksymalnie 200 wyników.
Aby użyć funkcji reranker w zapytaniu, zobacz Use the reranker in a query (Używanie ponownegorankera w zapytaniu).
Ważne
Wyszukiwanie pełnotekstowe jest dostępne jako funkcja beta. Aby przeprowadzić wyszukiwanie pełnotekstowe, ustaw parametr query_type na FULL_TEXT. W przypadku wyszukiwania pełnotekstowego można pobrać maksymalnie 200 wyników na podstawie dopasowywania słów kluczowych bez użycia osadzania wektorów.
Standardowy punkt końcowy zestawu SDK języka Python
Aby uzyskać szczegółowe informacje, zobacz dokumentację zestawu SDK języka 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
)
Punkt dostępowy zoptymalizowany pod kątem przechowywania dla zestawu SDK języka Python
Aby uzyskać szczegółowe informacje, zobacz dokumentację zestawu SDK języka Python.
Istniejący interfejs filtrowania został ponownie zaprojektowany pod kątem indeksów wyszukiwania wektorów zoptymalizowanych pod kątem przechowywania danych, aby przyjąć ciąg filtrujący podobny do SQL zamiast słowników filtrów używanych w standardowych punktach końcowych wyszukiwania wektorów.
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
)
interfejs API REST
Zobacz dokumentację referencyjną interfejsu API REST: POST /api/2.0/vector-search/indexes/{index_name}/query.
W przypadku aplikacji produkcyjnych Databricks zaleca używanie pryncypałów serwisowych zamiast osobistych tokenów dostępu. Oprócz ulepszonego zarządzania bezpieczeństwem i dostępem korzystanie z zasad usługowych może zwiększyć wydajność nawet o 100 ms na zapytanie.
Poniższy przykład kodu ilustruje sposób, w jaki można wykonywać zapytania do indeksu przy użyciu jednostki usługi.
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}'
Poniższy przykład kodu ilustruje sposób wykonywania zapytań względem indeksu przy użyciu osobistego tokenu dostępu (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
Ważne
Funkcja AI vector_search() znajduje się w fazie Public Preview.
Aby użyć tej funkcji AI, zobacz vector_search funkcję.
Używanie filtrów w zapytaniach
Zapytanie może definiować filtry na podstawie dowolnej kolumny w tabeli delty.
similarity_search zwraca tylko wiersze zgodne z określonymi filtrami.
W poniższej tabeli wymieniono obsługiwane filtry.
| Operator filtru | Zachowanie | Przykłady |
|---|---|---|
NOT |
Standardowa: Neguje filtr. Klucz musi kończyć się słowem "NOT". Na przykład "color NOT" z wartością "red" pasuje do dokumentów, w których kolor nie jest czerwony. Zoptymalizowane pod kątem przechowywania: Zobacz != (znak !=) operator. |
Standardowa: {"id NOT": 2}{“color NOT”: “red”}Zoptymalizowane pod kątem przechowywania: "id != 2" "color != 'red'" |
< |
Standardowa: sprawdza, czy wartość pola jest mniejsza niż wartość filtru. Klucz musi kończyć się znakiem "<". Na przykład "price <" z wartością 200 pasuje do dokumentów, w których cena jest mniejsza niż 200. |
Standardowa: {"id <": 200}Zoptymalizowane pod kątem przechowywania: "id < 200" |
<= |
Standardowa: sprawdza, czy wartość pola jest mniejsza lub równa wartości filtru. Klucz musi kończyć się sekwencją " <=". Na przykład "price <=" z wartością 200 pasuje do dokumentów, w których cena jest mniejsza lub równa 200. Zoptymalizowane pod kątem magazynu: zobacz <= operator (lt eq sign). |
Standardowa: {"id <=": 200}Zoptymalizowane pod kątem przechowywania: "id <= 200" |
> |
Standardowa: sprawdza, czy wartość pola jest większa niż wartość filtru. Klucz musi kończyć się znakiem ">". Na przykład "price >" z wartością 200 pasuje do dokumentów, w których cena jest większa niż 200. Zoptymalizowane pod kątem magazynu: zobacz > operator (znak gt). |
Standardowa: {"id >": 200}Zoptymalizowane pod kątem przechowywania: "id > 200" |
>= |
Standardowa: sprawdza, czy wartość pola jest większa niż lub równa wartości filtru. Klucz musi kończyć się sekwencją " >=". Na przykład "price >=" z wartością 200 pasuje do dokumentów, w których cena jest większa lub równa 200. Zoptymalizowane pod kątem przechowywania: Zobacz >= (gt eq sign) operator. |
Standardowa: {"id >=": 200}Zoptymalizowane pod kątem przechowywania: "id >= 200" |
OR |
Standardowa: sprawdza, czy wartość pola jest zgodna z dowolną wartością filtru. Klucz musi zawierać OR, aby oddzielić wiele podkluczy. Na przykład color1 OR color2 z wartością ["red", "blue"] pasuje do dokumentów, w których color1 jest red lub color2 jest blue.Zoptymalizowane pod kątem przechowywania: Zobacz or operator. |
Standardowa: {"color1 OR color2": ["red", "blue"]}Zoptymalizowane pod kątem przechowywania: "color1 = 'red' OR color2 = 'blue'" |
LIKE |
Standardowa: Pasuje do tokenów rozdzielanych białymi znakami w ciągu. Zapoznaj się z poniższymi przykładami kodu. Zoptymalizowane pod kątem przechowywania: Zobacz like operator. |
Standardowa: {"column LIKE": "hello"}Zoptymalizowane pod kątem przechowywania: "column LIKE 'hello'" |
| Nie określono operatora filtru |
Standardowa: Filtr sprawdza dokładne dopasowanie. Jeśli określono wiele wartości, pasuje do dowolnej z wartości. Zoptymalizowane pod kątem przechowywania: zobacz = operator równania i in predykat. |
Standardowa: {"id": 200}{"id": [200, 300]}Zoptymalizowane pod kątem magazynu: "id = 200""id IN (200, 300)" |
to_timestamp (tylko punkty końcowe zoptymalizowane pod kątem przechowywania) |
Zoptymalizowane pod kątem przechowywania: filtrowanie według znacznika czasu. Zobacz funkcję to_timestamp |
Zoptymalizowane pod kątem przechowywania: "date > TO_TIMESTAMP('1995-01-01')" |
Zobacz następujące przykłady kodu:
Standardowy punkt końcowy zestawu SDK języka 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
)
Punkt dostępowy zoptymalizowany pod kątem przechowywania dla zestawu SDK języka Python
# 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
)
interfejs API REST
Zobacz POST /api/2.0/vector-search/indexes/{index_name}/query.
LIKE
przykłady LIKE
{"column LIKE": "apple"}: pasuje do ciągów "apple" i "apple pear", ale nie pasuje do "ananasa" lub "gruszki". Należy zauważyć, że nie pasuje do "ananasa", mimo że zawiera ciąg znaków "apple" --- szuka dokładnego dopasowania do tokenów oddzielonych białymi znakami, takich jak w "apple pear".
{"column NOT LIKE": "apple"} robi odwrotnie. Pasuje do "ananasa" i "gruszki", ale nie pasuje do "jabłka" ani "gruszki jabłkowej".
Korzystanie z ponownegorankera w zapytaniu
Wydajność agenta zależy od pobierania najbardziej odpowiednich informacji dotyczących zapytania. Reranking to technika, która poprawia jakość pobierania, oceniając pobrane dokumenty w celu zidentyfikowania tych, które są najbardziej istotne. Usługa Databricks opracowała oparty na badaniach system sztucznej inteligencji oparty na badaniach w celu zidentyfikowania tych dokumentów. Można również określić kolumny zawierające metadane, które mają być używane przez usługę do ponownego generowania w kontekście dodatkowym, ponieważ ocenia istotność każdego dokumentu.
Ponowne korbowanie wiąże się z małym opóźnieniem, ale może znacznie poprawić jakość pobierania i wydajność agenta. Usługa Databricks zaleca wypróbowanie ponownego korbowania dla każdego przypadku użycia agenta RAG.
W przykładach w tej sekcji pokazano, jak używać funkcji wyszukiwania wektorowego. W przypadku korzystania z funkcji ponownegorankera należy ustawić kolumny tak, aby zwracały wartość (columns) i kolumny metadanych, które mają być używane do ponownego korbowania (columns_to_rerank).
num_results jest końcową liczbą wyników do zwrócenia. Nie ma to wpływu na liczbę wyników używanych do ponownego korbowania.
Komunikat debugowania zapytania zawiera informacje o tym, jak długo trwał krok ponownego korbowania. Przykład:
'debug_info': {'response_time': 1647.0, 'ann_time': 29.0, 'reranker_time': 1573.0}
Jeśli wywołanie ponownego korekta nie powiedzie się, te informacje są zawarte w komunikacie debugowania:
'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.'}]}
Uwaga / Notatka
Kolejność, w columns_to_rerank którą wymieniono kolumny, jest ważna. Obliczenie ponownego korbowania przyjmuje kolumny w kolejności, w której są wymienione, i uwzględnia tylko pierwsze 2000 znalezione znaki.
Zestaw SDK dla języka 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"])
)
interfejs API REST
Aby upewnić się, że uzyskasz informacje o opóźnieniu, ustaw wartość debug_level co najmniej 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}'
Wyszukiwanie punktów
Aby wykonać wyszukiwanie punktów, użyj filtru w dowolnej kolumnie klucza podstawowego.