Udostępnij za pośrednictwem


Wykonywanie zapytań względem indeksu wyszukiwania wektorów

Na tej stronie opisano sposób wykonywania zapytań względem indeksu wyszukiwania wektorowego, w tym stronicowania, 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 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 jedynie przeszukiwać indeks wyszukiwania wektorowego za pomocą Python SDK, 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 uzyskać szczegółowe informacje na temat różnych algorytmów pobierania, zobacz Algorytmy pobierania.

  • 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 Używanie ponownego rankera 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. Zapytania pełnotekstowe są obsługiwane zarówno w przypadku standardowych, jak i zoptymalizowanych pod kątem magazynu punktów końcowych. W punktach końcowych zoptymalizowanych pod kątem pamięci można także utworzyć dedykowany indeks wyszukiwania pełnotekstowego bez użycia osadzeń. Zobacz Tworzenie indeksu wyszukiwania pełnotekstowego (beta).

standardowy punkt końcowy zestawu SDK Python

Aby uzyskać szczegółowe informacje, zobacz dokumentację zestawu SDK 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 końcowy zestawu SDK Python zoptymalizowany pod kątem przechowywania danych

Aby uzyskać szczegółowe informacje, zobacz dokumentację zestawu SDK 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ę.

Paginacja

Gdy zapytanie żąda więcej niż 1000 wyników, wyniki są automatycznie zwracane na stronach maksymalnie 1000. Maksymalna liczba wyników zwracanych przez pojedyncze zapytanie na wszystkich stronach wynosi 10 000. Zarówno standardowe, jak i zoptymalizowane pod kątem przechowywania punkty końcowe obsługują stronicowanie.

Stronicowanie działa ze wszystkimi typami zapytań.

zestaw SDK Python

SDK Python obsługuje stronicowanie przejrzyście. Po ustawieniu num_results wartości większej niż 1000 zestaw SDK automatycznie pobiera wszystkie strony i zwraca kompletny zestaw wyników. Nie jest wymagany dodatkowy kod.

# The SDK automatically paginates and returns all 5000 results
results = index.similarity_search(
    query_text="Greek myths",
    columns=["id", "text"],
    num_results=5000
)

interfejs API REST

W przypadku bezpośredniego korzystania z interfejsu API REST należy ręcznie obsługiwać stronicowanie. Jeśli dostępnych jest więcej wyników, odpowiedź zawiera next_page_token pole. Aby pobrać następną stronę wyników, przekaż ten token do punktu końcowego zapytania na następnej stronie.

Zobacz dokumentację referencyjną interfejsu API REST : 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>"}'

Kontynuuj wywoływanie punktu końcowego następnej strony zapytania z każdą odpowiedzią next_page_token , dopóki token nie będzie pusty lub nieobecny, co oznacza, że zostały zwrócone wszystkie wyniki.

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.

Uwaga / Notatka

W przypadku punktów końcowych zoptymalizowanych pod kątem przechowywania, wyniki są nadmiernie pobierane. Jeśli ustawisz num_results na k, zostanie pobranych więcej niż k wyników, a filtr zostanie zastosowany do pobranych wyników. Istnieje możliwość, że żadne wyniki nie zostaną zwrócone, nawet jeśli w zestawie danych są wyniki zgodne z warunkiem filtru, jeśli ocena tych dokumentów nie znajduje się wśród najwyższych.

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.
Zoptymalizowane pod kątem przechowywania: zobacz operator (znak "<").
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.
Zoptymalizowane pod kątem przechowywania: Zobacz like operator.
Zobacz Uwagi dotyczące użycia obiektu LIKE.
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')"

Uwagi dotyczące użycia LIKE

LIKE przykłady standardowych punktów końcowych

{"column LIKE": "apple"}: pasuje do ciągów "apple" i "apple pear", ale nie pasuje do "ananasa". Należy pamiętać, że nie pasuje do "ananasa", mimo że zawiera podciąg "jabłko" – szuka dokładnego dopasowania wśród tokenów oddzielonych białymi znakami, jak w "jabłko gruszka".

{"column NOT LIKE": "apple"} robi odwrotnie. Pasuje do "ananasa" i "gruszki", ale nie pasuje do "jabłka" ani "gruszki jabłkowej".

LIKE przykłady punktów końcowych optymalizowanych pod kątem przechowywania

Format Dopasowania
"column LIKE 'apple'" Odpowiednik operatora =. Zwraca tylko dokładne dopasowania.
"column LIKE 'apple%'" Zwraca wiersze, w których prefiks pasuje do apple, na przykład applepie.
"column LIKE '%apple'" Zwraca wiersze, w których sufiks pasuje do apple, na przykład pineapple.
"column LIKE '%apple%'" Zwraca wiersze, które mają podciąg pasujący do apple, na przykład pineapplecake.

Przykłady kodu

standardowy punkt końcowy zestawu SDK 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 końcowy zestawu SDK Python zoptymalizowany pod kątem przechowywania danych
# 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.

Korzystanie z ponownego rankera 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 rangowanie wiąże się z niewielkim opóźnieniem, ale może znacząco poprawić jakość wyszukiwania 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ć pełnego przeszeregowywania wyników 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 analizatora nie powiedzie się, te informacje są zawarte w wiadomości 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 rangowania przyjmuje kolumny w kolejności, w której są wymienione, i uwzględnia tylko pierwsze 2000 znalezionych znaków.

zestaw SDK 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.

Algorytmy pobierania

W tej sekcji opisano różne algorytmy pobierania lub typy zapytań oraz informacje o tym, kiedy mogą być używane. Użyj parametru , query_type aby określić algorytm pobierania do użycia. Aby automatycznie porównać wydajność różnych algorytmów dla indeksu, zobacz Ocenić jakość pobierania wyszukiwania wektorowego.

Strategia Jak to działa Najlepsze dla
ANN (przybliżony najbliższy sąsiad) Wyszukiwanie przy użyciu osadzania wektorów w celu znalezienia semantycznie podobnych dokumentów. Koncepcyjne i semantyczne zapytania, w których znaczenie ma większe znaczenie niż dokładne sformułowanie.
Pełny tekst Wyszukiwanie słów kluczowych pasujących do dokładnych terminów. Zapytania z określonymi terminami, imionami własnymi, identyfikatorami produktów lub żargonem technicznym.
Hybryda Łączy wyniki ANN i pełnotekstowe przy użyciu wzajemnego łączenia rangi (RRF). Wyszukiwanie ogólnego przeznaczenia Zalecany punkt początkowy dla większości przypadków użycia.
Hybryda + ponowne rankowanie Uruchamia wyszukiwanie hybrydowe, a następnie ocenia wyniki ponownie za pomocą modelu ponownego porządkowania z użyciem cross-encodera. Większa precyzja, gdy opóźnienie na to pozwala (dodatkowe około 1,5 sekundy na zapytanie).

Wyszukiwanie ANN konwertuje zapytanie na wektor osadzania i znajduje dokumenty, których osadzanie jest najbardziej podobne. Jest to skuteczne dla zrozumienia znaczenia. Na przykład zapytanie, takie jak "jak naprawić przerwaną rurę", pasuje do dokumentów dotyczących hydrauliki, nawet jeśli nie zawierają tych dokładnych słów.

  • Gdy ANN działa dobrze: Zapytania są koncepcyjne lub konwersacyjne, lub używają innego słownictwa niż dokumenty.
  • Gdy sieci neuronowe (ANN) mogą działać poniżej oczekiwań: zapytania polegają na dokładnych słowach kluczowych, nazwach własnych lub terminologii specyficznej dla domeny, której osadzenia mogą nie uchwycić precyzyjnie.

Wyszukiwanie pełnotekstowe pasuje do dokumentów zawierających terminy zapytania. Wyszukiwanie pełnotekstowe ma wysoką precyzję. Gdy użytkownicy wyszukują określone nazwy, kody lub terminy techniczne, dopasowanie słów kluczowych znajdzie dokładne trafienia, których wyszukiwanie wektorowe może przegapić.

  • Gdy pełny tekst działa dobrze: zapytania zawierają określone identyfikatory, nazwy produktów, kody błędów lub terminologię specyficzną dla domeny.
  • Gdy wyszukiwanie pełnotekstowe może niedziałać skutecznie: zapytania są sformułowane inaczej niż dokumenty lub używają synonimów i parafraz.

Wyszukiwanie hybrydowe uruchamia równolegle wyszukiwania ANN i pełnotekstowe, a następnie scala wyniki przy użyciu scalania rang wzajemnych (RRF). Łączy to semantyczną wiedzę na temat wyszukiwania wektorów z precyzją dopasowywania słów kluczowych.

  • Gdy wyszukiwanie hybrydowe działa dobrze: obciążenie zapytania jest kombinacją zapytań koncepcyjnych i kluczowych. Hybryda jest najbardziej niezawodną strategią ogólnego przeznaczenia.

Reranker

Reranker jest opcjonalnym drugim przebiegiem stosowanym w ramach dowolnej strategii. Po początkowym pobraniu model złożony z krosowanych enkoderów ponownie ocenia każdy wynik w kontekście zapytania, tworząc dokładniejszą kolejność istotności.

Reranker zwykle poprawia jakość o około 10%, ale zwiększa opóźnienie. Jest odpowiednia dla aplikacji, w których jakość jest najważniejsza, na przykład czatboty RAG, ale potencjalnie mniej odpowiednia dla aplikacji wyszukiwania o wysokiej przepływności i małych opóźnieniach.