Jak utworzyć indeks wyszukiwania wektorowego i wykonywać względem tego zapytania
W tym artykule opisano sposób tworzenia i wykonywania zapytań względem indeksu wyszukiwania wektorów przy użyciu wyszukiwania wektorowego usługi Databricks.
Możesz tworzyć składniki wyszukiwania wektorowego i zarządzać nimi, takie jak punkt końcowy wyszukiwania wektorów i indeksy wyszukiwania wektorów, przy użyciu interfejsu użytkownika, zestawu SDK języka Python lub interfejsu API REST.
Wymagania
- Obszar roboczy z obsługą wykazu aparatu Unity.
- Włączono bezserwerowe obliczenia.
- Tabela źródłowa musi mieć włączoną opcję Zmień źródło danych.
- Aby utworzyć indeks, musisz mieć uprawnienia CREATE TABLE w schematach katalogu, aby tworzyć indeksy. Aby wykonać zapytanie dotyczące indeksu należącego do innego użytkownika, musisz mieć dodatkowe uprawnienia. Zobacz Tworzenie zapytań wektorowego punktu końcowego wyszukiwania.
- Jeśli chcesz używać osobistych tokenów dostępu (niezalecane w przypadku obciążeń produkcyjnych), sprawdź, czy osobiste tokeny dostępu są włączone. Aby zamiast tego użyć tokenu jednostki usługi, przekaż go jawnie przy użyciu wywołań zestawu SDK lub interfejsu API.
Aby użyć zestawu SDK, należy zainstalować go w notesie. Użyj następującego kodu:
%pip install databricks-vectorsearch
dbutils.library.restartPython()
from databricks.vector_search.client import VectorSearchClient
Tworzenie punktu końcowego wyszukiwania wektorów
Punkt końcowy wyszukiwania wektorów można utworzyć przy użyciu interfejsu użytkownika usługi Databricks, zestawu SDK języka Python lub interfejsu API.
Tworzenie punktu końcowego wyszukiwania wektorów przy użyciu interfejsu użytkownika
Wykonaj następujące kroki, aby utworzyć punkt końcowy wyszukiwania wektorów przy użyciu interfejsu użytkownika.
Na lewym pasku bocznym kliknij pozycję Obliczenia.
Kliknij kartę Wyszukiwanie wektorowe i kliknij przycisk Utwórz.
Zostanie otwarty formularz Tworzenie punktu końcowego. Wprowadź nazwę tego punktu końcowego.
Kliknij przycisk Potwierdź.
Tworzenie punktu końcowego wyszukiwania wektorów przy użyciu zestawu SDK języka Python
W poniższym przykładzie użyto funkcji zestawu SDK create_endpoint() do utworzenia punktu końcowego wyszukiwania wektorowego.
# The following line automatically generates a PAT Token for authentication
client = VectorSearchClient()
# The following line uses the service principal token for authentication
# client = VectorSearch(service_principal_client_id=<CLIENT_ID>,service_principal_client_secret=<CLIENT_SECRET>)
client.create_endpoint(
name="vector_search_endpoint_name",
endpoint_type="STANDARD"
)
Tworzenie punktu końcowego wyszukiwania wektorów przy użyciu interfejsu API REST
Zobacz POST /api/2.0/vector-search/endpoints.
(Opcjonalnie) Tworzenie i konfigurowanie punktu końcowego w celu obsługi modelu osadzania
Jeśli zdecydujesz się, aby usługa Databricks obliczała osadzanie, musisz skonfigurować punkt końcowy obsługujący model w celu obsługi modelu osadzania. Aby uzyskać instrukcje, zobacz Tworzenie modelu podstawowego obsługującego punkty końcowe. Przykładowe notesy można znaleźć w temacie Przykłady notesów dotyczące wywoływania modelu osadzania.
Podczas konfigurowania punktu końcowego osadzania usługa Databricks zaleca usunięcie domyślnego wyboru opcji Skalowanie do zera. Obsługa punktów końcowych może potrwać kilka minut, a początkowe zapytanie dotyczące indeksu ze skalowanym w dół punktem końcowym może spowodować przekroczenie limitu czasu.
Uwaga
Inicjowanie indeksu wyszukiwania wektorowego może upłynął limit czasu, jeśli punkt końcowy osadzania nie został odpowiednio skonfigurowany dla zestawu danych. W przypadku małych zestawów danych i testów należy używać tylko punktów końcowych procesora CPU. W przypadku większych zestawów danych użyj punktu końcowego procesora GPU w celu uzyskania optymalnej wydajności.
Tworzenie indeksu wyszukiwania wektorów
Indeks wyszukiwania wektorowego można utworzyć przy użyciu interfejsu użytkownika, zestawu SDK języka Python lub interfejsu API REST. Interfejs użytkownika jest najprostszym podejściem.
Istnieją dwa typy indeksów:
- Indeks synchronizacji różnicowej automatycznie synchronizuje się ze źródłową tabelą różnicową, automatycznie i przyrostowo aktualizując indeks w miarę zmian danych bazowych w tabeli delty.
- Indeks bezpośredniego dostępu wektorowego obsługuje bezpośredni odczyt i zapis wektorów i metadanych. Użytkownik jest odpowiedzialny za zaktualizowanie tej tabeli przy użyciu interfejsu API REST lub zestawu SDK języka Python. Nie można utworzyć tego typu indeksu przy użyciu interfejsu użytkownika. Musisz użyć interfejsu API REST lub zestawu SDK.
Tworzenie indeksu przy użyciu interfejsu użytkownika
Na pasku bocznym po lewej stronie kliknij pozycję Wykaz , aby otworzyć interfejs użytkownika Eksploratora wykazu.
Przejdź do tabeli delty, której chcesz użyć.
Kliknij przycisk Utwórz w prawym górnym rogu i wybierz pozycję Indeks wyszukiwania wektorów z menu rozwijanego.
Użyj selektorów w oknie dialogowym, aby skonfigurować indeks.
Nazwa: nazwa do użycia dla tabeli online w wykazie aparatu Unity. Nazwa wymaga trzy-poziomowej przestrzeni nazw.
<catalog>.<schema>.<name>
Dozwolone są tylko znaki alfanumeryczne i podkreślenia.Klucz podstawowy: kolumna do użycia jako klucz podstawowy.
Punkt końcowy: wybierz punkt końcowy obsługujący model, którego chcesz użyć.
Źródło osadzania: określ, czy chcesz, aby usługa Databricks obliczała osadzanie dla kolumny tekstowej w tabeli delty (osadzanie obliczeniowe) lub jeśli tabela delta zawiera wstępnie skompilowane osadzanie (użyj istniejącej kolumny osadzania).
- W przypadku wybrania opcji Osadzanie obliczeniowe wybierz kolumnę, dla której mają zostać osadzone elementy, oraz punkt końcowy obsługujący model osadzania. Obsługiwane są tylko kolumny tekstowe.
- W przypadku wybrania opcji Użyj istniejącej kolumny osadzania wybierz kolumnę zawierającą wstępnie skompilowane osadzanie i wymiar osadzania. Format wstępnie skompilowanej kolumny osadzania powinien mieć wartość
array[float]
.
Synchronizowanie obliczonych osadzania: przełącz to ustawienie, aby zapisać wygenerowane osadzanie w tabeli wykazu aparatu Unity. Aby uzyskać więcej informacji, zobacz Zapisywanie wygenerowanej tabeli osadzania.
Tryb synchronizacji: ciągły zachowuje indeks w synchronizacji z sekundami opóźnienia. Jednak wiąże się z nim wyższy koszt, ponieważ klaster obliczeniowy jest aprowizowany w celu uruchomienia potoku przesyłania strumieniowego ciągłej synchronizacji. Wyzwalanie jest bardziej ekonomiczne, ale należy uruchomić ręcznie przy użyciu interfejsu API. Zarówno w przypadku operacji ciągłych, jak i wyzwalanych aktualizacja jest przyrostowa — tylko dane, które uległy zmianie od ostatniej synchronizacji, są przetwarzane.
Po zakończeniu konfigurowania indeksu kliknij przycisk Utwórz.
Tworzenie indeksu przy użyciu zestawu SDK języka Python
W poniższym przykładzie tworzony jest indeks synchronizacji różnicowej z osadzanymi elementami obliczonymi przez usługę Databricks.
client = VectorSearchClient()
index = client.create_delta_sync_index(
endpoint_name="vector_search_demo_endpoint",
source_table_name="vector_search_demo.vector_search.en_wiki",
index_name="vector_search_demo.vector_search.en_wiki_index",
pipeline_type='TRIGGERED',
primary_key="id",
embedding_source_column="text",
embedding_model_endpoint_name="e5-small-v2"
)
Poniższy przykład tworzy indeks dostępu bezpośredniego wektora.
client = VectorSearchClient()
index = client.create_direct_access_index(
endpoint_name="storage_endpoint",
index_name="{catalog_name}.{schema_name}.{index_name}",
primary_key="id",
embedding_dimension=1024,
embedding_vector_column="text_vector",
schema={
"id": "int",
"field2": "str",
"field3": "float",
"text_vector": "array<float>"}
)
Tworzenie indeksu przy użyciu interfejsu API REST
Zobacz POST /api/2.0/vector-search/indexes.
Zapisywanie wygenerowanej tabeli osadzania
Jeśli usługa Databricks generuje osadzanie, możesz zapisać wygenerowane osadzanie w tabeli w wykazie aparatu Unity. Ta tabela jest tworzona w tym samym schemacie co indeks wektorowy i jest połączona ze strony indeksu wektorowego.
Nazwa tabeli to nazwa indeksu wyszukiwania wektorów, dołączana przez _writeback_table
element . Nazwa nie jest edytowalna.
Możesz uzyskiwać dostęp do tabeli i wykonywać względem jej zapytania, podobnie jak każda inna tabela w wykazie aparatu Unity. Nie należy jednak usuwać ani modyfikować tabeli, ponieważ nie jest ona przeznaczona do ręcznej aktualizacji. Tabela zostanie usunięta automatycznie, jeśli indeks zostanie usunięty.
Aktualizowanie indeksu wyszukiwania wektorowego
Aktualizowanie indeksu synchronizacji różnicowej
Indeksy utworzone w trybie ciągłej synchronizacji są automatycznie aktualizowane po zmianie źródłowej tabeli delty. Jeśli używasz trybu synchronizacji wyzwolonej , możesz użyć zestawu SDK języka Python lub interfejsu API REST, aby rozpocząć synchronizację.
Zestaw Sdk języka Python
index.sync()
Interfejs API REST
Zobacz Interfejs API REST (POST /api/2.0/vector-search/indexes/{index_name}/sync).
Aktualizowanie indeksu dostępu wektorów bezpośrednich
Zestawu SDK języka Python lub interfejsu API REST można użyć do wstawiania, aktualizowania lub usuwania danych z indeksu dostępu wektorowego bezpośredniego.
Zestaw Sdk języka Python
index.upsert([{"id": 1,
"field2": "value2",
"field3": 3.0,
"text_vector": [1.0, 2.0, 3.0]
},
{"id": 2,
"field2": "value2",
"field3": 3.0,
"text_vector": [1.1, 2.1, 3.0]
}
])
Interfejs API REST
Zobacz Interfejs API REST (POST /api/2.0/vector-search/indexes).
Wykonywanie zapytań względem punktu końcowego wyszukiwania wektorowego
Punkt końcowy wyszukiwania wektorowego można wykonywać tylko za pomocą zestawu SDK języka Python lub interfejsu API REST.
Uwaga
Jeśli użytkownik wykonujący zapytanie dotyczące punktu końcowego nie jest właścicielem indeksu wyszukiwania wektorowego, użytkownik musi mieć następujące uprawnienia UC:
- UŻYJ KATALOGU w wykazie zawierającym indeks wyszukiwania wektorów.
- UŻYJ schematu w schemacie zawierającym indeks wyszukiwania wektorów.
- WYBIERZ w indeksie wyszukiwania wektorowego.
Zestaw Sdk języka Python
results = index.similarity_search(
query_text="Greek myths",
columns=["id", "text"],
num_results=2
)
results
Interfejs API REST
Zobacz POST /api/2.0/vector-search/indexes/{index_name}/query.
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. Obsługiwane są następujące filtry:
Operator filtru | Zachowanie | Przykłady |
---|---|---|
NOT |
Neguje filtr. Klucz musi kończyć się ciągiem "NOT". Na przykład "color NOT" z wartością "red" pasuje do dokumentów, w których kolor nie jest czerwony. | {"id NOT": 2} {“color NOT”: “red”} |
< |
Sprawdza, czy wartość pola jest mniejsza niż wartość filtru. Klucz musi kończyć się ciągiem " <". Na przykład "price <" z wartością 100 pasuje do dokumentów, w których cena jest mniejsza niż 100. | {"id <": 200} |
<= |
Sprawdza, czy wartość pola jest mniejsza lub równa wartości filtru. Klucz musi kończyć się ciągiem " <=". Na przykład "price <=" z wartością 100 pasuje do dokumentów, w których cena jest mniejsza lub równa 100. | {"id <=": 200} |
> |
Sprawdza, czy wartość pola jest większa niż wartość filtru. Klucz musi kończyć się ciągiem " >". Na przykład "price >" z wartością 100 pasuje do dokumentów, w których cena jest większa niż 100. | {"id >": 200} |
>= |
Sprawdza, czy wartość pola jest większa lub równa wartości filtru. Klucz musi kończyć się ciągiem " >=". Na przykład "price >=" z wartością 100 pasuje do dokumentów, w których cena jest większa lub równa 100. | {"id >=": 200} |
OR |
Sprawdza, czy wartość pola jest zgodna z dowolną wartością filtru. Klucz musi zawierać OR wiele podklucza. Na przykład wartość jest zgodna z dokumentami, color1 OR color2 w których color1 wartość to red lub color2 jest blue .["red", "blue"] |
{"color1 OR color2": ["red", "blue"]} |
LIKE |
Pasuje do ciągów częściowych. | {"column LIKE": "hello"} |
Nie określono operatora filtru | Sprawdzanie filtru pod kątem dokładnego dopasowania. Jeśli określono wiele wartości, pasuje do dowolnej z wartości. | {"id": 200} {"id": [200, 300]} |
Zobacz następujące przykłady kodu:
Zestaw 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
)
Interfejs API REST
Zobacz POST /api/2.0/vector-search/indexes/{index_name}/query.
Przykładowe notesy
W przykładach w tej sekcji pokazano użycie zestawu SDK języka Python wyszukiwania wektorowego.
Przykłady langchain
Zobacz How to use LangChain with Databricks Vector Search for using Databricks Vector Search as in integration with LangChain packages (Jak używać języka LangChain z wyszukiwaniem wektorów usługi Databricks).
W poniższym notesie pokazano, jak przekonwertować wyniki wyszukiwania podobieństwa na dokumenty LangChain.
Wyszukiwanie wektorowe za pomocą notesu zestawu SDK języka Python
Przykłady notesów do wywoływania modelu osadzania
W poniższych notesach pokazano, jak skonfigurować punkt końcowy obsługujący model usługi Databricks na potrzeby generowania osadzania.
Wywoływanie modelu osadzania OpenAI przy użyciu notesu obsługującego model usługi Databricks
Wywoływanie modelu osadzania BGE przy użyciu notesu obsługującego model usługi Databricks
Rejestrowanie i obsługa notesu modelu osadzania systemu operacyjnego
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla