Samouczek: używanie usługi Eventhouse jako bazy danych wektorów
Z tego samouczka dowiesz się, jak używać usługi Eventhouse jako bazy danych wektorów do przechowywania danych wektorów zapytań w inteligencji w czasie rzeczywistym. Aby uzyskać ogólne informacje o bazach danych wektorów, zobacz Wektorowe bazy danych
Dany scenariusz obejmuje użycie semantycznych wyszukiwań na stronach Wikipedii w celu znalezienia stron z typowymi motywami. Używasz dostępnego przykładowego zestawu danych, który zawiera wektory dla dziesiątek tysięcy stron Wikipedii. Te strony zostały osadzone za pomocą modelu OpenAI w celu utworzenia wektorów dla każdej strony. Wektory wraz z niektórymi ważnymi metadanymi powiązanymi ze stroną są następnie przechowywane w magazynie zdarzeń. Możesz użyć tego zestawu danych, aby znaleźć strony podobne do siebie lub znaleźć strony podobne do niektórych motywów, które chcesz znaleźć. Załóżmy na przykład, że chcesz wyszukać "słynnych kobiet naukowców z XIX wieku". Zakodujesz tę frazę przy użyciu tego samego modelu OpenAI, a następnie uruchomisz wyszukiwanie podobieństwa wektorów na przechowywanych danych strony Wikipedii, aby znaleźć strony o największej podobieństwie semantycznej.
W szczególności w tym samouczku wykonasz następujące elementy:
- Przygotuj tabelę w usłudze Eventhouse z
Vector16
kodowaniem dla kolumn wektorów. - Przechowywanie danych wektorów ze wstępnie osadzonego zestawu danych do magazynu zdarzeń.
- Osadź zapytanie dla języka naturalnego przy użyciu modelu Open AI.
- Użyj funkcji series_cosine_similarity KQL, aby obliczyć podobieństwa między wektorem osadzania zapytania a stronami typu wiki.
- Wyświetl wiersze o najwyższej podobieństwie, aby uzyskać strony typu wiki, które są najbardziej istotne dla zapytania wyszukiwania.
Ten przepływ można wizualizować w następujący sposób:
Wymagania wstępne
- Obszar roboczy z pojemnością z włączoną usługą Microsoft Fabric
- Magazyn zdarzeń w obszarze roboczym
- Zasób usługi Azure OpenAI z wdrożonym modelem osadzania tekstu ada-002 (wersja 2). Ten model jest obecnie dostępny tylko w niektórych regionach. Aby uzyskać więcej informacji, zobacz Tworzenie zasobu.
- Upewnij się, że lokalne uwierzytelnianie jest włączone w zasobie usługi Azure OpenAI.
- Pobieranie przykładowego notesu z repozytorium GitHub
Uwaga
Chociaż w tym samouczku jest używana usługa Azure OpenAI, możesz użyć dowolnego dostawcy modelu osadzania do generowania wektorów dla danych tekstowych.
Przygotowywanie środowiska usługi Eventhouse
W tym kroku konfiguracji utworzysz tabelę w usłudze Eventhouse z niezbędnymi kolumnami i zasadami kodowania do przechowywania danych wektorowych.
Przejdź do strony głównej obszaru roboczego w analizie czasu rzeczywistego.
Wybierz usługę Eventhouse utworzoną w wymaganiach wstępnych.
Wybierz docelową bazę danych, w której chcesz przechowywać dane wektorowe. Jeśli nie masz bazy danych, możesz je utworzyć, wybierając pozycję Dodaj bazę danych.
Wybierz pozycję Eksploruj moje dane. Skopiuj/wklej następujące zapytanie KQL, aby utworzyć tabelę z niezbędnymi kolumnami:
.create table Wiki (id:string,url:string,['title']:string,text:string,title_vector:dynamic,content_vector:dynamic,vector_id:long)
Skopiuj/wklej następujące polecenia, aby ustawić zasady kodowania kolumn wektorów. Uruchom te polecenia sekwencyjnie.
.alter column Wiki.title_vector policy encoding type='Vector16' .alter column Wiki.content_vector policy encoding type='Vector16'
Zapisywanie danych wektorowych w magazynie zdarzeń
Poniższe kroki służą do importowania osadzonych danych Wikipedii i zapisywania ich w magazynie zdarzeń:
Importowanie notesu
- Pobierz przykładowy notes z repozytorium GitHub.
- Przejdź do środowiska sieci szkieletowej. W przełączniku środowiska wybierz pozycję Programowanie , a następnie obszar roboczy.
- Wybierz pozycję Importuj>notes>Przekaż, a następnie wybierz notes pobrany w poprzednim kroku.
- Po zakończeniu importowania otwórz zaimportowany notes z obszaru roboczego.
Zapisywanie danych w magazynie zdarzeń
Uruchom komórki, aby skonfigurować środowisko.
%%configure -f {"conf": { "spark.rpc.message.maxSize": "1024" } }
%pip install wget
%pip install openai
Uruchom komórki, aby pobrać wstępnie skompilowane osadzanie.
import wget embeddings_url = "https://cdn.openai.com/API/examples/data/vector_database_wikipedia_articles_embedded.zip" # The file is ~700 MB so it might take some time wget.download(embeddings_url)
import zipfile with zipfile.ZipFile("vector_database_wikipedia_articles_embedded.zip","r") as zip_ref: zip_ref.extractall("/lakehouse/default/Files/data")
import pandas as pd from ast import literal_eval article_df = pd.read_csv('/lakehouse/default/Files/data/vector_database_wikipedia_articles_embedded.csv') # Read vectors from strings back into a list article_df["title_vector"] = article_df.title_vector.apply(literal_eval) article_df["content_vector"] = article_df.content_vector.apply(literal_eval) article_df.head()
Aby zapisać w bazie zdarzeń, wprowadź identyfikator URI klastra, który można znaleźć na stronie przeglądu systemu i nazwę bazy danych. Tabela jest tworzona w notesie, a później przywoływała się w zapytaniu.
# replace with your Eventhouse Cluster URI, Database name, and Table name KUSTO_CLUSTER = "Eventhouse Cluster URI" KUSTO_DATABASE = "Database name" KUSTO_TABLE = "Wiki"
Uruchom pozostałe komórki, aby zapisać dane w magazynie zdarzeń. Wykonanie tej operacji może zająć trochę czasu.
kustoOptions = {"kustoCluster": KUSTO_CLUSTER, "kustoDatabase" :KUSTO_DATABASE, "kustoTable" : KUSTO_TABLE } access_token=mssparkutils.credentials.getToken(kustoOptions["kustoCluster"])
#Pandas data frame to spark dataframe sparkDF=spark.createDataFrame(article_df)
# Write data to a table in Eventhouse sparkDF.write. \ format("com.microsoft.kusto.spark.synapse.datasource"). \ option("kustoCluster",kustoOptions["kustoCluster"]). \ option("kustoDatabase",kustoOptions["kustoDatabase"]). \ option("kustoTable", kustoOptions["kustoTable"]). \ option("accessToken", access_token). \ option("tableCreateOptions", "CreateIfNotExist").\ mode("Append"). \ save()
Wyświetlanie danych w magazynie zdarzeń
Na tym etapie możesz sprawdzić, czy dane zostały zapisane w magazynie zdarzeń, przechodząc do strony szczegółów bazy danych.
- Przejdź do strony głównej obszaru roboczego w analizie czasu rzeczywistego.
- Wybierz element bazy danych podany w poprzedniej sekcji. Powinno zostać wyświetlone podsumowanie danych zapisanych w tabeli "Wiki".
Generowanie osadzania dla terminu wyszukiwania
Teraz, po zapisie osadzonych danych typu wiki w magazynie zdarzeń, możesz użyć tych danych jako odwołania do znajdowania stron w określonym artykule. Aby porównać, osadzasz termin wyszukiwania, a następnie wykonujesz porównanie między terminem wyszukiwania a stronami Wikipedii.
Aby pomyślnie wykonać wywołanie usługi Azure OpenAI, potrzebujesz punktu końcowego, klucza i identyfikatora wdrożenia.
Nazwa zmiennej | Wartość |
---|---|
endpoint | Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu w witrynie Azure Portal. Alternatywnie możesz znaleźć wartość w Azure AI Foundry> Playground > Code View. Przykładowy punkt końcowy to: https://docs-test-001.openai.azure.com/ . |
Klucz interfejsu API | Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu w witrynie Azure Portal. Możesz użyć klucza KEY1 lub KEY2. |
identyfikator wdrożenia | Tę wartość można znaleźć w sekcji Deployments w Azure AI Foundry. |
Użyj informacji w tabeli podczas uruchamiania komórek usługi Azure OpenAI.
Ważne
Aby można było używać klucza interfejsu API, należy włączyć uwierzytelnianie lokalne w zasobie usługi Azure Open AI.
import openai
openai.api_version = '2022-12-01'
openai.api_base = 'endpoint' # Add your endpoint here
openai.api_type = 'azure'
openai.api_key = 'api key' # Add your api key here
def embed(query):
# Creates embedding vector from user query
embedded_query = openai.Embedding.create(
input=query,
deployment_id="deployment id", # Add your deployment id here
chunk_size=1
)["data"][0]["embedding"]
return embedded_query
searchedEmbedding = embed("most difficult gymnastics moves in the olympics")
#print(searchedEmbedding)
Wykonywanie zapytań dotyczących podobieństwa
Zapytanie jest uruchamiane bezpośrednio z notesu i używa zwróconego osadzania z poprzedniego kroku w porównaniu z osadzonymi stronami Wikipedii przechowywanymi w magazynie zdarzeń. To zapytanie używa funkcji podobieństwa cosinus i zwraca 10 najbardziej podobnych wektorów.
Uruchom komórki w notesie, aby wyświetlić wyniki zapytania. Możesz zmienić termin wyszukiwania i ponownie uruchomić zapytanie, aby wyświetlić różne wyniki. Możesz również porównać istniejący wpis w bazie danych wiki, aby znaleźć podobne wpisy.
kustoQuery = "Wiki | extend similarity = series_cosine_similarity(dynamic("+str(searchedEmbedding)+"), content_vector) | top 10 by similarity desc"
accessToken = mssparkutils.credentials.getToken(KUSTO_CLUSTER)
kustoDf = spark.read\
.format("com.microsoft.kusto.spark.synapse.datasource")\
.option("accessToken", accessToken)\
.option("kustoCluster", KUSTO_CLUSTER)\
.option("kustoDatabase", KUSTO_DATABASE)\
.option("kustoQuery", kustoQuery).load()
# Example that uses the result data frame.
kustoDf.show()
Czyszczenie zasobów
Po ukończeniu samouczka możesz usunąć utworzone zasoby, aby uniknąć ponoszenia innych kosztów. Aby usunąć zasoby, wykonaj następujące kroki:
- Przejdź do strony głównej obszaru roboczego.
- Usuń notes utworzony w tym samouczku.
- Usuń bazę danych lub magazyn zdarzeń używany w tym samouczku.