Sdílet prostřednictvím


Kurz: Použití eventhouse jako vektorové databáze

V tomto kurzu se naučíte používat Eventhouse jako vektorovou databázi k ukládání a dotazování vektorových dat v reálném čase. Obecné informace o vektorových databázích naleznete v tématu Vektorové databáze

Daný scénář zahrnuje použití sémantických hledání na stránkách Wikipedie k vyhledání stránek se společnými motivy. Použijete dostupnou ukázkovou datovou sadu, která obsahuje vektory pro desítky tisíc stránek Wikipedie. Tyto stránky byly vloženy s modelem OpenAI pro vytváření vektorů pro každou stránku. Vektory spolu s některými relevantními metadaty souvisejícími se stránkou se pak ukládají do eventhouse. Tuto datovou sadu můžete použít k vyhledání stránek, které jsou podobné sobě, nebo k vyhledání stránek podobných nějakému motivu, který chcete najít. Řekněme například, že chcete vyhledat "slavné ženské vědce z 19. století". Tuto frázi zakódujete pomocí stejného modelu OpenAI a potom spustíte hledání vektorové podobnosti na uložených datech stránky Wikipedie, abyste našli stránky s nejvyšší sémantickou podobností.

Konkrétně v tomto kurzu:

  • Připravte tabulku v Eventhouse s kódováním Vector16 pro vektorové sloupce.
  • Uložte vektorová data z předem vložené datové sady do eventhouse.
  • Vložení dotazu přirozeného jazyka pomocí modelu Open AI
  • Pomocí funkce series_cosine_similarity KQL můžete vypočítat podobnosti mezi vektorem vkládání dotazu a stránkami wikiwebu.
  • Zobrazte řádky nejvyšší podobnosti, abyste získali stránky wikiwebu, které jsou pro váš vyhledávací dotaz nejrelevantní.

Tento tok lze vizualizovat následujícím způsobem:

Schéma pracovního postupu eventhouse jako vektorové databáze

Požadavky

Poznámka:

I když tento kurz používá Azure OpenAI, můžete k vygenerování vektorů textových dat použít libovolného zprostředkovatele modelu vkládání.

Příprava prostředí Eventhouse

V tomto kroku nastavení vytvoříte tabulku v Eventhouse s potřebnými sloupci a zásadami kódování pro uložení vektorových dat.

  1. Přejděte na domovskou stránku pracovního prostoru v reálném čase.

  2. Vyberte eventhouse, který jste vytvořili v požadavcích.

  3. Vyberte cílovou databázi, do které chcete uložit vektorová data. Pokud databázi nemáte, můžete ji vytvořit výběrem možnosti Přidat databázi.

  4. Vyberte Prozkoumat moje data. Zkopírujte nebo vložte následující dotaz KQL a vytvořte tabulku s potřebnými sloupci:

    .create table Wiki (id:string,url:string,['title']:string,text:string,title_vector:dynamic,content_vector:dynamic,vector_id:long)
    
  5. Zkopírujte nebo vložte následující příkazy a nastavte zásady kódování vektorových sloupců. Tyto příkazy spusťte postupně.

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

Zápis vektorových dat do eventhouse

Následující kroky slouží k importu vložených dat Wikipedie a jejich zápisu do eventhouse:

Import poznámkového bloku

  1. Stáhněte si ukázkový poznámkový blok z úložiště GitHub.
  2. Přejděte do prostředí Fabric. V přepínači prostředí zvolte Vývoj a potom pracovní prostor.
  3. Vyberte Importovat>a pak zvolte poznámkový blok, který jste stáhli v předchozím kroku.
  4. Po dokončení importu otevřete importovaný poznámkový blok z pracovního prostoru.

Zápis dat do eventhouse

  1. Spuštěním buněk nastavte prostředí.

    %%configure -f
    {"conf":
        {
            "spark.rpc.message.maxSize": "1024"
        }
    }
    
    %pip install wget
    
    %pip install openai
    
  2. Spuštěním buněk stáhněte předem vypočítané vložené objekty.

    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. Pokud chcete zapisovat do centra událostí, zadejte identifikátor URI clusteru, který najdete na stránce přehledu systému a název databáze. Tabulka se vytvoří v poznámkovém bloku a později se na tuto tabulku odkazuje v dotazu.

    # replace with your Eventhouse Cluster URI, Database name, and Table name
    KUSTO_CLUSTER =  "Eventhouse Cluster URI"
    KUSTO_DATABASE = "Database name"
    KUSTO_TABLE = "Wiki"
    
  4. Spuštěním zbývajících buněk zapište data do eventhouse. Provedení této operace může nějakou dobu trvat.

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

Zobrazení dat v eventhouse

V tomto okamžiku můžete ověřit, že data byla zapsána do centra událostí tak, že přejdete na stránku s podrobnostmi databáze.

  1. Přejděte na domovskou stránku pracovního prostoru v reálném čase.
  2. Vyberte položku databáze, která byla uvedena v předchozí části. Měli byste vidět souhrn dat, která byla zapsána do tabulky "Wiki".

Generování vkládání pro hledaný termín

Teď, když jste uložili vložená data wikiwebu do centra událostí, můžete tato data použít jako odkaz na vyhledání stránek v konkrétním článku. Chcete-li provést porovnání, vložíte hledaný termín a pak provedete porovnání mezi hledaný termín a stránkami Wikipedie.

K úspěšnému volání azure OpenAI potřebujete koncový bod, klíč a ID nasazení.

Název proměnné Hodnota
endpoint Tuto hodnotu najdete v části Klíče a koncový bod při zkoumání prostředku na webu Azure Portal. Případně můžete hodnotu najít v Azure AI Foundry> Playground > Zobrazení kódu. Ukázkový koncový bod je: https://docs-test-001.openai.azure.com/.
Klíč rozhraní API Tuto hodnotu najdete v části Klíče a koncový bod při zkoumání prostředku na webu Azure Portal. Můžete použít klíč 1 nebo KLÍČ2.
ID nasazení Tuto hodnotu najdete v části Nasazení v Azure AI Foundry.

Při spouštění buněk Azure OpenAI použijte informace v tabulce.

Důležité

Aby bylo možné použít klíč rozhraní API, musí být ve vašem prostředku Azure Open AI povolené místní ověřování.

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)

Dotaz na podobnost

Dotaz se spustí přímo z poznámkového bloku a použije vrácené vkládání z předchozího kroku v porovnání s vloženými stránkami Wikipedie uloženými ve vašem eventhouse. Tento dotaz používá funkci kosinus podobnosti a vrátí prvních 10 nejvíce podobných vektorů.

Spuštěním buněk v poznámkovém bloku zobrazíte výsledky dotazu. Můžete změnit hledaný termín a znovu spustit dotaz, aby se zobrazily různé výsledky. Můžete také porovnat existující položku v databázi wikiwebu a najít podobné položky.

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

Snímek obrazovky se spuštěnou buňkou s výsledky podobnosti

Vyčištění prostředků

Po dokončení kurzu můžete odstranit prostředky, které jste vytvořili, abyste se vyhnuli dalším nákladům. Pokud chcete prostředky odstranit, postupujte takto:

  1. Přejděte na domovskou stránku pracovního prostoru.
  2. Odstraňte poznámkový blok vytvořený v tomto kurzu.
  3. Odstraňte eventhouse nebo databázi použitou v tomto kurzu.