Oktatóanyag: Vektoros hasonlósági keresés végrehajtása Azure OpenAI-beágyazásokon az Azure Cache for Redis használatával
Ebben az oktatóanyagban egy alapvető vektor-hasonlósági keresési használati esetet fog végigvezetni. Az Azure OpenAI Service által létrehozott beágyazásokkal és az Azure Cache for Redis nagyvállalati rétegének beépített vektorkeresési képességeivel lekérdezheti a filmek adatkészletét, hogy megtalálja a leginkább releváns egyezést.
Az oktatóanyag a Wikipedia Movie Plots adatkészletét használja, amely több mint 35 000 film ábrázolását tartalmazza a Wikipédiából az 1901 és 2017 közötti évekre vonatkozóan. Az adatkészlet minden filmhez tartalmaz egy ábrázolás összegzését, valamint olyan metaadatokat, mint a film megjelenésének éve, a rendező(k), a fő szereplők és a műfaj. Az oktatóanyag lépéseit követve beágyazásokat hozhat létre a diagram összegzése alapján, és a többi metaadat használatával hibrid lekérdezéseket futtathat.
Ebben az oktatóanyagban az alábbiakkal fog megismerkedni:
- Vektorkereséshez konfigurált Azure Cache for Redis-példány létrehozása
- Telepítse az Azure OpenAI-t és más szükséges Python-kódtárakat.
- Töltse le a filmadatkészletet, és készítse elő elemzésre.
- Beágyazások létrehozásához használja a text-embedding-ada-002 (2. verzió) modellt.
- Vektorindex létrehozása az Azure Cache for Redisben
- A találatok rangsorolásához használjon koszin hasonlóságot.
- A RediSearch hibrid lekérdezési funkciójának használatával előszűrheti az adatokat, és még hatékonyabbá teheti a vektorkeresést.
Fontos
Ez az oktatóanyag végigvezeti a Jupyter Notebook létrehozásának lépésein. Ezt az oktatóanyagot egy Python-kódfájllal (.py) követheti, és hasonló eredményeket kaphat, de az oktatóanyag összes kódblokkját hozzá kell adnia a fájlhoz, és egyszer végre kell hajtania az .py
eredményeket. Más szóval a Jupyter-jegyzetfüzetek köztes eredményeket biztosítanak a cellák végrehajtása során, de ez nem elvárható a Python-kódfájlok használatakor.
Fontos
Ha inkább egy befejezett Jupyter-jegyzetfüzetben szeretné követni a műveletet, töltse le a tutorial.ipynb nevű Jupyter-jegyzetfüzetfájlt, és mentse az új redis-vector mappába.
Előfeltételek
- Azure-előfizetés – Ingyenes létrehozás
- A kívánt Azure-előfizetésben az Azure OpenAI számára biztosított hozzáférés jelenleg az Azure OpenAI-hoz való hozzáférésre van szükség. Az Azure OpenAI-hoz való hozzáférésre a következő https://aka.ms/oai/accessűrlap kitöltésével jelentkezhet: .
- Python 3.7.1 vagy újabb verzió
- Jupyter notebookok (nem kötelező)
- Azure OpenAI-erőforrás a text-embedding-ada-002 (2. verzió) üzembe helyezett modellel. Ez a modell jelenleg csak bizonyos régiókban érhető el. A modell üzembe helyezésére vonatkozó útmutatásért tekintse meg az erőforrás-telepítési útmutatót .
Azure Cache for Redis-példány létrehozása
Kövesse a rövid útmutatót: Redis Enterprise-gyorsítótár létrehozása útmutató. A Speciális lapon győződjön meg arról, hogy hozzáadta a RediSearch modult, és a vállalati fürtszabályzatot választotta. Minden más beállítás megfelelhet a rövid útmutatóban ismertetett alapértelmezett beállításnak.
A gyorsítótár létrehozása néhány percet vesz igénybe. Addig is továbbléphet a következő lépésre.
A fejlesztési környezet beállítása
Hozzon létre egy redis-vector nevű mappát a helyi számítógépen azon a helyen, ahol általában menti a projekteket.
Hozzon létre egy új Python-fájlt (tutorial.py) vagy Jupyter-jegyzetfüzetet (tutorial.ipynb) a mappában.
Telepítse a szükséges Python-csomagokat:
pip install "openai==1.6.1" num2words matplotlib plotly scipy scikit-learn pandas tiktoken redis langchain
Az adathalmaz letöltése
Egy webböngészőben keresse meg a következőt https://www.kaggle.com/datasets/jrobischon/wikipedia-movie-plots: .
Jelentkezzen be vagy regisztráljon a Kaggle-ban. A fájl letöltéséhez regisztráció szükséges.
A archive.zip fájl letöltéséhez válassza a Kaggle letöltésihivatkozását.
Bontsa ki a archive.zip fájlt, és helyezze át a wiki_movie_plots_deduped.csv a redis-vector mappába.
Kódtárak importálása és kapcsolati adatok beállítása
Az Azure OpenAI-ra való sikeres híváshoz egy végpontra és egy kulcsra van szükség. Egy végpontra és egy kulcsra is szüksége van az Azure Cache for Redishez való csatlakozáshoz.
Nyissa meg az Azure OpenAI-erőforrást az Azure Portalon.
Keresse meg a végpontot és a kulcsokat az Erőforrás-kezelés szakaszban. Másolja ki a végpontot és a hozzáférési kulcsot, mivel mindkettőre szüksége lesz az API-hívások hitelesítéséhez. Példavégpont:
https://docs-test-001.openai.azure.com
. A következők bármelyikét használhatja:KEY1
vagyKEY2
.Nyissa meg az Azure Cache for Redis-erőforrás áttekintési oldalát az Azure Portalon. Másolja ki a végpontot.
Keresse meg a hozzáférési kulcsokat a Gépház szakaszban. Másolja ki a hozzáférési kulcsot. A következők bármelyikét használhatja:
Primary
vagySecondary
.Adja hozzá a következő kódot egy új kódcellához:
# 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>"
Frissítse az Azure OpenAI-üzemelő példány kulcs-
API_KEY
RESOURCE_ENDPOINT
és végpontértékeit.DEPLOYMENT_NAME
A beágyazási modell használatávaltext-embedding-ada-002 (Version 2)
az üzembe helyezés nevére kell állítani, ésMODEL_NAME
a használt beágyazási modellnek kell lennie.Frissítse
REDIS_ENDPOINT
azREDIS_PASSWORD
Azure Cache for Redis-példány végpontját és kulcsértékét.Fontos
Határozottan javasoljuk, hogy környezeti változókat vagy egy titkos kulcskezelőt, például az Azure Key Vaultot használva adja át az API-kulcs, a végpont és az üzembehelyezési név adatait. Ezek a változók egyszerű szövegben vannak beállítva az egyszerűség kedvéért.
A 2. kódcella végrehajtása.
Adathalmaz importálása pandasba és adatok feldolgozása
Ezután beolvassa a csv-fájlt egy pandas DataFrame-be.
Adja hozzá a következő kódot egy új kódcellához:
# Code cell 3 df=pd.read_csv(os.path.join(os.getcwd(),'wiki_movie_plots_deduped.csv')) df
Hajtsa végre a 3. kódcellát. A következő kimenetnek kell megjelennie:
Ezután feldolgozhatja az adatokat egy
id
index hozzáadásával, szóközök eltávolításával az oszlopcímekből, és szűri a filmeket, hogy csak az 1970 után készült filmeket és az angolul beszélő országokból származó filmeket készítsenek. Ez a szűrési lépés csökkenti az adathalmazban lévő filmek számát, ami csökkenti a beágyazások létrehozásához szükséges költségeket és időt. A beállítások alapján szabadon módosíthatja vagy eltávolíthatja a szűrőparamétereket.Az adatok szűréséhez adja hozzá a következő kódot egy új kódcellához:
# 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
Hajtsa végre a 4. kódcellát. A következő eredményeket kell látnia:
Hozzon létre egy függvényt az adatok megtisztításához a térköz és az írásjelek eltávolításával, majd használja a diagramot tartalmazó adatkereten.
Adja hozzá a következő kódot egy új kódcellához, és hajtsa végre:
# 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))
Végül távolítsa el azokat a bejegyzéseket, amelyek túl hosszúak a beágyazási modellhez. (Más szóval a 8192-nél több jogkivonatra van szükség.) majd számítsa ki a beágyazások létrehozásához szükséges jogkivonatok számát. Ez hatással van a beágyazási generáció díjszabására is.
Adja hozzá a következő kódot egy új kódcellához:
# 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()))
Hajtsa végre a 6. kódcellát. A következő kimenetnek kell megjelennie:
Number of movies: 11125 Number of tokens required:7044844
Fontos
Tekintse meg az Azure OpenAI szolgáltatás díjszabását , amely a szükséges jogkivonatok száma alapján határozza meg a beágyazások létrehozásának költségeit.
DataFrame betöltése a LangChainbe
Töltse be a DataFrame-et a LangChainbe az DataFrameLoader
osztály használatával. Ha az adatok a LangChain-dokumentumokban lesznek, sokkal egyszerűbb a LangChain-kódtárak használata beágyazások létrehozására és hasonlósági keresések elvégzésére. Állítsa be a page_content_column
diagramot úgy, hogy a beágyazások létre legyenek hozva ezen az oszlopon.
Adja hozzá a következő kódot egy új kódcellához, és hajtsa végre:
# Code cell 7 loader = DataFrameLoader(df, page_content_column="Plot" ) movie_list = loader.load()
Beágyazások létrehozása és betöltése a Redisbe
Most, hogy az adatokat szűrte és betöltötte a LangChainbe, beágyazásokat fog létrehozni, hogy lekérdezhesse az egyes filmek ábrázolását. Az alábbi kód konfigurálja az Azure OpenAI-t, beágyazásokat hoz létre, és betölti a beágyazási vektorokat az Azure Cache for Redisbe.
Adjon hozzá egy új kódcellát a következő kódhoz:
# 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")
Hajtsa végre a 8. kódcellát. Ez több mint 30 percet vehet igénybe. A rendszer létrehoz egy
redis_schema.yaml
fájlt is. Ez a fájl akkor hasznos, ha az Indexhez szeretne csatlakozni az Azure Cache for Redis-példányban anélkül, hogy újra létrehozna beágyazásokat.
Fontos
A beágyazások létrehozásának sebessége az Azure OpenAI-modell számára elérhető kvótától függ. A percenként 240 ezer jogkivonatot tartalmazó kvótával körülbelül 30 perc alatt feldolgozhatja az adathalmaz 7 M-jogkivonatait.
Vektorkeresési lekérdezések futtatása
Most, hogy beállította az adathalmazt, az Azure OpenAI szolgáltatás API-t és a Redis-példányt, vektorokkal kereshet. Ebben a példában egy adott lekérdezés első 10 találata lesz visszaadva.
Adja hozzá a következő kódot a Python-kódfájlhoz:
# 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 + ')')
Hajtsa végre a 9. kódcellát. A következő kimenetnek kell megjelennie:
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)
A hasonlósági pontszámot a filmek sorrendi rangsorával együtt a hasonlóság adja vissza. Figyelje meg, hogy az adott lekérdezések hasonlósági pontszámai gyorsabban csökkennek a listában.
Hibrid keresések
Mivel a RediSearch a vektoros keresés mellett gazdag keresési funkciókat is kínál, az adathalmaz metaadatai, például a film műfaja, a szereposztás, a megjelenés éve vagy a rendező alapján is szűrheti az eredményeket. Ebben az esetben szűrjön a műfaj
comedy
alapján.Adja hozzá a következő kódot egy új kódcellához:
# 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 + ')')
Hajtsa végre a 10. kódcellát. A következő kimenetnek kell megjelennie:
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)
Az Azure Cache for Redis és az Azure OpenAI service használatával beágyazásokkal és vektorkereséssel hatékony keresési képességeket adhat az alkalmazáshoz.
Az erőforrások eltávolítása
Ha továbbra is használni szeretné a cikkben létrehozott erőforrásokat, tartsa meg az erőforráscsoportot.
Ellenkező esetben, ha végzett az erőforrásokkal, törölheti a létrehozott Azure-erőforráscsoportot a díjak elkerülése érdekében.
Fontos
Az erőforráscsoport törlése nem vonható vissza. Az erőforráscsoport törlésekor a benne foglalt összes erőforrás véglegesen törlődik. Figyeljen arra, hogy ne töröljön véletlenül erőforráscsoportot vagy erőforrásokat. Ha olyan meglévő erőforráscsoportban hozta létre az erőforrásokat, amely a megtartani kívánt erőforrásokat tartalmazza, az erőforráscsoport törlése helyett egyenként törölheti az egyes erőforrásokat.
Erőforráscsoport törlése
Jelentkezzen be az Azure Portalra, és válassza az Erőforráscsoportok elemet.
Válassza ki a törölni kívánt erőforráscsoportot.
Ha sok erőforráscsoport van, használja a Szűrő bármely mezőhöz... mezőt, írja be a cikkhez létrehozott erőforráscsoport nevét. Válassza ki az erőforráscsoportot az eredménylistában.
Válassza az Erőforráscsoport törlése elemet.
A rendszer az erőforráscsoport törlésének megerősítését kéri. A megerősítéshez írja be az erőforráscsoport nevét, és válassza a Törlést.
A rendszer néhány pillanaton belül törli az erőforráscsoportot és annak erőforrásait.
Kapcsolódó tartalom
- További információ az Azure Cache for Redisről
- További információ az Azure Cache for Redis vektorkeresési képességeiről
- További információ az Azure OpenAI Szolgáltatás által létrehozott beágyazásokról
- További információ a koszinusz hasonlóságáról
- Megtudhatja, hogyan hozhat létre AI-alapú alkalmazást az OpenAI és a Redis használatával
- Q&A-alkalmazás létrehozása szemantikai válaszokkal
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: