Dela via


Självstudie: Använda en Eventhouse som vektordatabas

I den här självstudien får du lära dig hur du använder en Eventhouse som vektordatabas för att lagra och fråga vektordata i Realtidsinformation. Allmän information om vektordatabaser finns i Vektordatabaser

Det givna scenariot omfattar användning av semantiska sökningar på Wikipedia-sidor för att hitta sidor med vanliga teman. Du använder en tillgänglig exempeldatauppsättning, som innehåller vektorer för tiotusentals Wikipedia-sidor. Dessa sidor har bäddades in med en OpenAI-modell för att skapa vektorer för varje sida. Vektorerna, tillsammans med vissa relevanta metadata som är relaterade till sidan, lagras sedan i ett Eventhouse. Du kan använda den här datamängden för att hitta sidor som liknar varandra eller för att hitta sidor som liknar något tema som du vill hitta. Anta till exempel att du vill slå upp "kända kvinnliga forskare från 1800-talet". Du kodar den här frasen med samma OpenAI-modell och kör sedan en vektorlikhetssökning över lagrade Wikipedia-siddata för att hitta sidorna med den högsta semantiska likheten.

Mer specifikt kommer du i den här självstudien att:

  • Förbered en tabell i Eventhouse med Vector16 kodning för vektorkolumnerna.
  • Lagra vektordata från en förinbäddad datauppsättning till ett Eventhouse.
  • Bädda in för en fråga med naturligt språk med hjälp av Open AI-modellen.
  • Använd funktionen series_cosine_similarity KQL för att beräkna likheterna mellan frågebäddningsvektorn och wiki-sidornas.
  • Visa rader med den högsta likheten för att hämta de wiki-sidor som är mest relevanta för din sökfråga.

Det här flödet kan visualiseras på följande sätt:

Schema för Eventhouse som vektordatabasarbetsflöde.

Förutsättningar

  • En arbetsyta med en Microsoft Fabric-aktiverad kapacitet
  • Ett eventhouse på din arbetsyta
  • En Azure OpenAI-resurs med modellen text-embedding-ada-002 (version 2) distribuerad. Den här modellen är för närvarande endast tillgänglig i vissa regioner. Mer information finns i Skapa en resurs.
    • Kontrollera att lokal autentisering är aktiverad på din Azure OpenAI-resurs.
  • Ladda ned exempelanteckningsboken från GitHub-lagringsplatsen

Kommentar

Även om den här självstudien använder Azure OpenAI kan du använda valfri inbäddningsmodellprovider för att generera vektorer för textdata.

Förbereda Eventhouse-miljön

I det här installationssteget skapar du en tabell i ett Eventhouse med nödvändiga kolumner och kodningsprinciper för att lagra vektordata.

  1. Bläddra till arbetsytans startsida i Realtidsinformation.

  2. Välj det Eventhouse som du skapade i förhandskraven.

  3. Välj den måldatabas där du vill lagra vektordata. Om du inte har någon databas kan du skapa en genom att välja Lägg till databas.

  4. Välj Utforska mina data. Kopiera/klistra in följande KQL-fråga för att skapa en tabell med nödvändiga kolumner:

    .create table Wiki (id:string,url:string,['title']:string,text:string,title_vector:dynamic,content_vector:dynamic,vector_id:long)
    
  5. Kopiera/klistra in följande kommandon för att ange kodningsprincipen för vektorkolumnerna. Kör dessa kommandon sekventiellt.

    .alter column Wiki.title_vector policy encoding type='Vector16'
    
    .alter column Wiki.content_vector policy encoding type='Vector16'
    

Skriva vektordata till ett Eventhouse

Följande steg används för att importera inbäddade Wikipedia-data och skriva dem i ett Eventhouse:

Importera notebook-fil

  1. Ladda ned exempelanteckningsboken från GitHub-lagringsplatsen.
  2. Bläddra till din Infrastrukturmiljö. I upplevelseväxlaren väljer du Fabric- och sedan din arbetsyta.
  3. Välj Importera>anteckningsbok>Från den här datorn>Ladda upp och välj sedan anteckningsboken som du laddade ned i ett tidigare steg.
  4. När importen är klar öppnar du den importerade anteckningsboken från arbetsytan.

Skriva data till Eventhouse

  1. Kör cellerna för att konfigurera din miljö.

    %%configure -f
    {"conf":
        {
            "spark.rpc.message.maxSize": "1024"
        }
    }
    
    %pip install wget
    
    %pip install openai
    
  2. Kör cellerna för att ladda ned de förberäknade inbäddningarna.

    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()
    
  3. Om du vill skriva till händelsehuset anger du din kluster-URI, som finns på systemöversiktssidan och namnet på databasen. Tabellen skapas i notebook-filen och refereras senare till i frågan.

    # replace with your Eventhouse Cluster URI, Database name, and Table name
    KUSTO_CLUSTER =  "Eventhouse Cluster URI"
    KUSTO_DATABASE = "Database name"
    KUSTO_TABLE = "Wiki"
    
  4. Kör de återstående cellerna för att skriva data till Eventhouse. Den här åtgärden kan ta lite tid att köra.

    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()
    

Visa data i Eventhouse

Nu kan du kontrollera att data har skrivits till händelsehuset genom att bläddra till sidan med databasinformation.

  1. Bläddra till arbetsytans startsida i Realtidsinformation.
  2. Välj det databasobjekt som angavs i föregående avsnitt. Du bör se en sammanfattning av de data som skrevs till wikitabellen.

Generera inbäddning för sökordet

Nu när du har lagrat inbäddade wiki-data i händelsehuset kan du använda dessa data som referens för att hitta sidor i en viss artikel. För att göra jämförelsen bäddar du in söktermen och gör sedan en jämförelse mellan söktermen och Wikipedia-sidorna.

Om du vill göra ett anrop mot Azure OpenAI behöver du ett slutpunkts-, nyckel- och distributions-ID.

Variabelnamn Värde
slutpunkt Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker resursen från Azure Portal. Du kan också hitta värdet i Azure AI Foundry> Playground > Code View. En exempelslutpunkt är: https://docs-test-001.openai.azure.com/.
API key Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker resursen från Azure Portal. Du kan använda antingen KEY1 eller KEY2.
distributions-ID Det här värdet finns i avsnittet Distributioner i Azure AI Foundry.

Använd informationen i tabellen när du kör Azure OpenAI-cellerna.

Viktigt!

Lokal autentisering måste aktiveras på din Azure Open AI-resurs för att kunna använda API-nyckeln.

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)

Fråga likheten

Frågan körs direkt från notebook-filen och använder den returnerade inbäddningen från föregående steg i en jämförelse med de inbäddade Wikipedia-sidorna som lagras i händelsehuset. Den här frågan använder cosinélikhetsfunktionen och returnerar de 10 mest liknande vektorerna.

Kör cellerna i notebook-filen för att se resultatet av frågan. Du kan ändra sökordet och köra frågan igen för att se olika resultat. Du kan också jämföra en befintlig post i Wiki-databasen för att hitta liknande poster.

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()

Skärmbild av att köra en cell med likhetsresultat.

Rensa resurser

När du är klar med självstudien kan du ta bort resurserna, som du har skapat för att undvika andra kostnader. Följ dessa steg för att ta bort resurserna:

  1. Bläddra till arbetsytans startsida.
  2. Ta bort anteckningsboken som skapades i den här självstudien.
  3. Ta bort händelsehuset eller databasen som används i den här självstudien.