Sdílet prostřednictvím


Kurz: Vyhledávání vektorů podobnosti ve službě Azure OpenAI pomocí služby Azure Cache for Redis

V tomto kurzu si projdete základní případ použití hledání podobnosti vektorů. K dotazování na datovou sadu filmů pro vyhledání nejrelevantnější shody použijete vkládání vygenerované službou Azure OpenAI Service a integrované funkce vektorového vyhledávání na podnikové úrovni azure Cache for Redis.

Tento kurz používá datovou sadu Video Plots wikipedie, která obsahuje popisy více než 35 000 filmů z Wikipedie, které pokrývají roky 1901 až 2017. Datová sada obsahuje souhrn vykreslení pro každý film a metadata, jako je rok vydání filmu, režie, hlavního obsazení a žánru. Postupujte podle kroků tohoto kurzu, abyste vygenerovali vkládání na základě souhrnu grafu a použili další metadata ke spouštění hybridních dotazů.

V tomto kurzu se naučíte:

  • Vytvoření instance Azure Cache for Redis nakonfigurované pro vektorové vyhledávání
  • Nainstalujte Azure OpenAI a další požadované knihovny Pythonu.
  • Stáhněte si datovou sadu videa a připravte ji na analýzu.
  • K vygenerování vkládání použijte model text-embedding-ada-002 (verze 2).
  • Vytvoření vektorového indexu ve službě Azure Cache for Redis
  • K řazení výsledků hledání použijte kosinusovou podobnost.
  • Funkce hybridního dotazu prostřednictvím RediSearch slouží k předfiltrování dat a zvýraznění vektorového vyhledávání.

Důležité

Tento kurz vás provede vytvořením aplikace Jupyter Notebook. Tento kurz můžete sledovat pomocí souboru kódu Pythonu (.py) a získat podobné výsledky, ale budete muset do souboru přidat všechny bloky kódu v tomto kurzu .py a spustit jednou, abyste viděli výsledky. Jinými slovy, Jupyter Notebooks při provádění buněk poskytují přechodné výsledky, ale při práci v souboru kódu Pythonu byste neměli očekávat toto chování.

Důležité

Pokud chcete pokračovat v dokončeném poznámkovém bloku Jupyter, stáhněte si soubor jupyter notebook s názvem tutorial.ipynb a uložte ho do nové složky redis-vector .

Požadavky

Vytvoření instance Azure Cache for Redis

  1. Postupujte podle rychlého startu : Vytvoření průvodce mezipamětí Redis Enterprise. Na stránce Upřesnit se ujistěte, že jste přidali modul RediSearch a zvolili jste zásady podnikového clusteru. Všechna ostatní nastavení můžou odpovídat výchozímu nastavení popsanému v rychlém startu.

    Vytvoření mezipaměti trvá několik minut. Mezitím můžete přejít k dalšímu kroku.

Snímek obrazovky znázorňující vyplněnou kartu Základy úrovně Enterprise

Nastavení vývojového prostředí

  1. V místním počítači vytvořte složku s názvem redis-vector v umístění, kam obvykle ukládáte projekty.

  2. Ve složce vytvořte nový soubor Pythonu (tutorial.py) nebo Jupyter Notebook (tutorial.ipynb).

  3. Nainstalujte požadované balíčky Pythonu:

    pip install "openai==1.6.1" num2words matplotlib plotly scipy scikit-learn pandas tiktoken redis langchain
    

Stažení datové sady

  1. Ve webovém prohlížeči přejděte na https://www.kaggle.com/datasets/jrobischon/wikipedia-movie-plots.

  2. Přihlaste se nebo se zaregistrujte pomocí Kaggle. K stažení souboru se vyžaduje registrace.

  3. Vyberte odkaz Stáhnout na Kaggle a stáhněte archive.zip soubor.

  4. Extrahujte soubor archive.zip a přesuňte wiki_movie_plots_deduped.csv do složky redis-vector.

Import knihoven a nastavení informací o připojení

K úspěšnému volání azure OpenAI potřebujete koncový bod a klíč. Potřebujete také koncový bod a klíč pro připojení ke službě Azure Cache for Redis.

  1. Na webu Azure Portal přejděte k prostředku Azure OpenAI.

  2. V části Správa prostředků vyhledejte koncový bod a klíče. Zkopírujte koncový bod a přístupový klíč, protože budete potřebovat obojí pro ověřování volání rozhraní API. Ukázkový koncový bod je: https://docs-test-001.openai.azure.com. Použít můžete předponu KEY1 nebo KEY2.

  3. Na webu Azure Portal přejděte na stránku Přehled vašeho prostředku Azure Cache for Redis. Zkopírujte koncový bod.

  4. Vyhledejte přístupové klíče v části Nastavení . Zkopírujte přístupový klíč. Použít můžete předponu Primary nebo Secondary.

  5. Do nové buňky kódu přidejte následující kód:

    # Code cell 2
    
    import re
    from num2words import num2words
    import os
    import pandas as pd
    import tiktoken
    from typing import List
    from langchain.embeddings import AzureOpenAIEmbeddings
    from langchain.vectorstores.redis import Redis as RedisVectorStore
    from langchain.document_loaders import DataFrameLoader
    
    API_KEY = "<your-azure-openai-key>"
    RESOURCE_ENDPOINT = "<your-azure-openai-endpoint>"
    DEPLOYMENT_NAME = "<name-of-your-model-deployment>"
    MODEL_NAME = "text-embedding-ada-002"
    REDIS_ENDPOINT = "<your-azure-redis-endpoint>"
    REDIS_PASSWORD = "<your-azure-redis-password>"
    
  6. Aktualizujte hodnotu API_KEY RESOURCE_ENDPOINT klíče a koncového bodu z nasazení Azure OpenAI. DEPLOYMENT_NAME mělo by být nastaveno na název nasazení pomocí text-embedding-ada-002 (Version 2) modelu vkládání a MODEL_NAME měl by se jednat o použitý konkrétní model vkládání.

  7. REDIS_PASSWORD Aktualizujte REDIS_ENDPOINT koncový bod a hodnotu klíče z instance Azure Cache for Redis.

    Důležité

    Důrazně doporučujeme použít proměnné prostředí nebo správce tajných kódů, jako je Azure Key Vault , a předat tak informace o klíči rozhraní API, koncovém bodu a názvu nasazení. Tyto proměnné jsou zde nastaveny v prostém textu kvůli jednoduchosti.

  8. Spusťte buňku kódu 2.

Import datové sady do knihovny pandas a zpracování dat

Potom soubor CSV přečtete do datového rámce pandas.

  1. Do nové buňky kódu přidejte následující kód:

    # Code cell 3
    
    df=pd.read_csv(os.path.join(os.getcwd(),'wiki_movie_plots_deduped.csv'))
    df
    
  2. Spusťte buňku kódu 3. Měl by se zobrazit následující výstup:

    Snímek obrazovky s výsledky z provádění buňky kódu 3 zobrazující osm sloupců a vzorkování 10 řádků dat

  3. Potom zpracujte data přidáním indexu id , odebráním mezer z názvů sloupců a vyfiltrujte filmy tak, aby se po roce 1970 a z anglicky mluvících zemí nebo oblastí chytly jenom filmy vytvořené po roce 1970. Tento krok filtrování snižuje počet filmů v datové sadě, což snižuje náklady a čas potřebný k vygenerování vkládání. Na základě vašich předvoleb můžete parametry filtru změnit nebo odebrat.

    Pokud chcete data filtrovat, přidejte do nové buňky kódu následující kód:

    # Code cell 4
    
    df.insert(0, 'id', range(0, len(df)))
    df['year'] = df['Release Year'].astype(int)
    df['origin'] = df['Origin/Ethnicity'].astype(str)
    del df['Release Year']
    del df['Origin/Ethnicity']
    df = df[df.year > 1970] # only movies made after 1970
    df = df[df.origin.isin(['American','British','Canadian'])] # only movies from English-speaking cinema
    df
    
  4. Spusťte buňku kódu 4. Měly by se vám zobrazit následující výsledky:

    Snímek obrazovky s výsledky spuštění buňky kódu 4 zobrazující devět sloupců a vzorkování 10 řádků dat

  5. Vytvořte funkci pro vyčištění dat odebráním prázdných znaků a interpunkce a pak ji použijte pro datový rámec obsahující graf.

    Do nové buňky kódu přidejte následující kód a spusťte ho:

    # Code cell 5
    
    pd.options.mode.chained_assignment = None
    
    # s is input text
    def normalize_text(s, sep_token = " \n "):
        s = re.sub(r'\s+',  ' ', s).strip()
        s = re.sub(r". ,","",s)
        # remove all instances of multiple spaces
        s = s.replace("..",".")
        s = s.replace(". .",".")
        s = s.replace("\n", "")
        s = s.strip()
    
        return s
    
    df['Plot']= df['Plot'].apply(lambda x : normalize_text(x))
    
  6. Nakonec odeberte všechny položky, které obsahují popisy grafu, které jsou pro model vkládání příliš dlouhé. (Jinými slovy, vyžadují více tokenů než limit 8192 tokenů.) a pak vypočítejte počet tokenů potřebných k vygenerování vkládání. To má vliv také na ceny pro generování vkládání.

    Do nové buňky kódu přidejte následující kód:

    # Code cell 6
    
    tokenizer = tiktoken.get_encoding("cl100k_base")
    df['n_tokens'] = df["Plot"].apply(lambda x: len(tokenizer.encode(x)))
    df = df[df.n_tokens<8192]
    print('Number of movies: ' + str(len(df)))
    print('Number of tokens required:' + str(df['n_tokens'].sum()))
    
  7. Spusťte buňku kódu 6. Měli byste vidět tento výstup:

    Number of movies: 11125
    Number of tokens required:7044844
    

    Důležité

    Projděte si ceny služby Azure OpenAI a vypočítejte náklady na generování vložených objektů na základě požadovaného počtu tokenů.

Načtení datového rámce do jazyka LangChain

Načtěte datový rámec do JazykChain pomocí DataFrameLoader třídy. Jakmile jsou data v dokumentech LangChain, je mnohem jednodušší používat knihovny LangChain ke generování vkládání a provádění vyhledávání podobností. Nastavte vykreslení jako hodnotu page_content_column , aby se v tomto sloupci vygenerovaly vložené hodnoty.

  1. Do nové buňky kódu přidejte následující kód a spusťte ho:

    # Code cell 7
    
    loader = DataFrameLoader(df, page_content_column="Plot" )
    movie_list = loader.load()
    

Generování vkládání a jejich načtení do Redis

Teď, když jsou data filtrovaná a načtená do LangChain, vytvoříte vkládání, abyste se mohli dotazovat na graf pro každý film. Následující kód nakonfiguruje Azure OpenAI, vygeneruje vkládání a načte vektory vkládání do Azure Cache for Redis.

  1. Přidejte následující kód nové buňky kódu:

    # Code cell 8
    
    embedding = AzureOpenAIEmbeddings(
        deployment=DEPLOYMENT_NAME,
        model=MODEL_NAME,
        azure_endpoint=RESOURCE_ENDPOINT,
        openai_api_type="azure",
        openai_api_key=API_KEY,
        openai_api_version="2023-05-15",
        show_progress_bar=True,
        chunk_size=16 # current limit with Azure OpenAI service. This will likely increase in the future.
        )
    
    # name of the Redis search index to create
    index_name = "movieindex"
    
    # create a connection string for the Redis Vector Store. Uses Redis-py format: https://redis-py.readthedocs.io/en/stable/connections.html#redis.Redis.from_url
    # This example assumes TLS is enabled. If not, use "redis://" instead of "rediss://
    redis_url = "rediss://:" + REDIS_PASSWORD + "@"+ REDIS_ENDPOINT
    
    # create and load redis with documents
    vectorstore = RedisVectorStore.from_documents(
        documents=movie_list,
        embedding=embedding,
        index_name=index_name,
        redis_url=redis_url
    )
    
    # save index schema so you can reload in the future without re-generating embeddings
    vectorstore.write_schema("redis_schema.yaml")
    
  2. Spusťte buňku kódu 8. Dokončení může trvat více než 30 minut. Vygeneruje redis_schema.yaml se také soubor. Tento soubor je užitečný, pokud se chcete připojit k indexu v instanci Azure Cache for Redis bez opětovného generování vkládání.

Důležité

Rychlost generování vkládání závisí na kvótě dostupné pro model Azure OpenAI. Při kvótě 240 tisíc tokenů za minutu bude zpracování 7M tokenů v sadě dat trvat přibližně 30 minut.

Spouštění vektorových vyhledávacích dotazů

Teď, když máte nastavenou datovou sadu, rozhraní API služby Azure OpenAI a instanci Redis, můžete vyhledávat pomocí vektorů. V tomto příkladu se vrátí prvních 10 výsledků pro daný dotaz.

  1. Do souboru kódu Pythonu přidejte následující kód:

    # Code cell 9
    
    query = "Spaceships, aliens, and heroes saving America"
    results = vectorstore.similarity_search_with_score(query, k=10)
    
    for i, j in enumerate(results):
        movie_title = str(results[i][0].metadata['Title'])
        similarity_score = str(round((1 - results[i][1]),4))
        print(movie_title + ' (Score: ' + similarity_score + ')')
    
  2. Spusťte buňku kódu 9. Měl by se zobrazit následující výstup:

    Independence Day (Score: 0.8348)
    The Flying Machine (Score: 0.8332)
    Remote Control (Score: 0.8301)
    Bravestarr: The Legend (Score: 0.83)
    Xenogenesis (Score: 0.8291)
    Invaders from Mars (Score: 0.8291)
    Apocalypse Earth (Score: 0.8287)
    Invasion from Inner Earth (Score: 0.8287)
    Thru the Moebius Strip (Score: 0.8283)
    Solar Crisis (Score: 0.828)
    

    Skóre podobnosti se vrátí spolu s pořadovým hodnocením filmů podle podobnosti. Všimněte si, že konkrétnější dotazy mají skóre podobnosti, rychleji se sníží v seznamu.

Hybridní vyhledávání

  1. Vzhledem k tomu, že RediSearch také nabízí bohaté funkce vyhledávání nad vektorovým vyhledáváním, je možné filtrovat výsledky podle metadat v datové sadě, jako je filmový žánr, přetypování, rok vydání nebo režisér. V tomto případě filtr na základě žánru comedy.

    Do nové buňky kódu přidejte následující kód:

    # Code cell 10
    
    from langchain.vectorstores.redis import RedisText
    
    query = "Spaceships, aliens, and heroes saving America"
    genre_filter = RedisText("Genre") == "comedy"
    results = vectorstore.similarity_search_with_score(query, filter=genre_filter, k=10)
    for i, j in enumerate(results):
        movie_title = str(results[i][0].metadata['Title'])
        similarity_score = str(round((1 - results[i][1]),4))
        print(movie_title + ' (Score: ' + similarity_score + ')')
    
  2. Spusťte buňku kódu 10. Měl by se zobrazit následující výstup:

    Remote Control (Score: 0.8301)
    Meet Dave (Score: 0.8236)
    Elf-Man (Score: 0.8208)
    Fifty/Fifty (Score: 0.8167)
    Mars Attacks! (Score: 0.8165)
    Strange Invaders (Score: 0.8143)
    Amanda and the Alien (Score: 0.8136)
    Suburban Commando (Score: 0.8129)
    Coneheads (Score: 0.8129)
    Morons from Outer Space (Score: 0.8121)
    

Se službou Azure Cache for Redis a Službou Azure OpenAI můžete do své aplikace přidat výkonné funkce vyhledávání pomocí vkládání a vektorové vyhledávání.

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

Pokud chcete dál používat prostředky, které jste vytvořili v tomto článku, ponechte skupinu prostředků.

Jinak pokud jste s prostředky hotovi, můžete odstranit skupinu prostředků Azure, kterou jste vytvořili, abyste se vyhnuli poplatkům.

Důležité

Odstranění skupiny prostředků je nevratné. Při odstranění skupiny prostředků se všechny prostředky, které obsahuje, trvale odstraní. Ujistěte se, že nechtěně neodstraníte nesprávnou skupinu prostředků nebo prostředky. Pokud jste prostředky vytvořili v existující skupině prostředků, která obsahuje prostředky, které chcete zachovat, můžete každý prostředek odstranit jednotlivě místo odstranění skupiny prostředků.

Odstranění skupiny prostředků

  1. Přihlaste se k portálu Azure Portal a potom vyberte Skupiny prostředků.

  2. Vyberte skupinu prostředků, kterou chcete odstranit.

    Pokud existuje mnoho skupin prostředků, použijte filtr pro jakékoli pole... zadejte název skupiny prostředků, kterou jste vytvořili pro tento článek. V seznamu výsledků vyberte skupinu prostředků.

    Snímek obrazovky se seznamem skupin prostředků, které se mají odstranit v pracovním podokně

  3. Vyberte Odstranit skupinu prostředků.

  4. Zobrazí se výzva k potvrzení odstranění skupiny prostředků. Potvrďte odstranění zadáním názvu vaší skupiny prostředků a vyberte Odstranit.

    Snímek obrazovky s formulářem, který vyžaduje název prostředku k potvrzení odstranění

Po chvíli se skupina prostředků včetně všech prostředků, které obsahuje, odstraní.