Kiterjesztett generáció (RAG) lekérése az Azure AI Searchben

A beolvasási kiterjesztett generáció (RAG) egy olyan architektúra, amely egy olyan nagy méretű nyelvi modell (LLM) képességeit bővíti, mint a ChatGPT, egy olyan információlekérdezési rendszer hozzáadásával, amely földelő adatokat biztosít. Az információlekérdezési rendszer hozzáadásával szabályozhatja az LLM által a válasz megfogalmazásakor használt földelési adatokat. Vállalati megoldás esetén a RAG architektúra azt jelenti, hogy a vektorizált dokumentumokból és képekből, valamint más adatformátumokból származó vállalati tartalomra korlátozhatja a generatív AI-t, ha modelleket ágyaz be az adott tartalomhoz.

A döntés, hogy melyik információlekérdezési rendszert kell használni, kritikus fontosságú, mert meghatározza az LLM bemeneteit. Az információlekérési rendszernek a következő adatokat kell biztosítania:

  • Olyan indexelési stratégiák, amelyek nagy léptékben töltődnek be és frissülnek az összes tartalomhoz a kívánt gyakorisággal.

  • Lekérdezési képességek és relevanciahangolás. A rendszernek releváns eredményeket kell visszaadnia az LLM-bemenetek tokenhossz-követelményeinek teljesítéséhez szükséges rövid formátumú formátumban.

  • Adatok és műveletek biztonsága, globális elérése és megbízhatósága.

  • Integráció az indexelési modellek beágyazási modelljeivel, valamint a lekéréshez használt csevegőmodellekkel vagy nyelvfelismerési modellekkel.

Az Azure AI Search egy bevált megoldás a RAG-architektúrában történő információlekérésre . Indexelési és lekérdezési képességeket biztosít az Azure-felhő infrastruktúrájával és biztonságával. Kóddal és más összetevőkkel átfogó RAG-megoldást tervezhet, amely magában foglalja a generatív AI összes elemét a saját tulajdonú tartalmakon keresztül.

Feljegyzés

Új a copilot és a RAG fogalmai? Tekintse meg a vektorkeresést és a Generatív AI-alkalmazások korszerű lekérését.

A Microsoft számos beépített implementációval rendelkezik az Azure AI Search RAG-megoldásban való használatához.

A válogatott megközelítések megkönnyítik az első lépéseket, de az architektúra nagyobb mértékű szabályozásához egyéni megoldásra van szükség. Ezek a sablonok a következőkben hoznak létre végpontok közötti megoldásokat:

A cikk további része bemutatja, hogyan illeszkedik az Azure AI Search egy egyéni RAG-megoldásba.

A minta magas szintű összefoglalása a következőképpen néz ki:

  • Kezdje egy felhasználói kérdéssel vagy kéréssel (parancssor).
  • Küldje el az Azure AI Search szolgáltatásba, hogy releváns információkat találjon.
  • Küldje el a rangsorolt találatokat az LLM-nek.
  • Az LLM természetes nyelvi megértési és érvelési képességeivel választ hozhat létre a kezdeti kérdésre.

Az Azure AI Search bemeneteket biztosít az LLM-parancssorhoz, de nem tanítja be a modellt. A RAG architektúrában nincs további betanítás. Az LLM nyilvános adatokkal van előre betanolva, de olyan válaszokat hoz létre, amelyeket a lekérő információi bővítenek.

Az Azure AI Searcht tartalmazó RAG-minták az alábbi ábrán látható elemeket tartalmazzák.

Az információlekérés architektúradiagramja a kereséssel és a ChatGPT-vel.

  • App UX (webalkalmazás) a felhasználói élményhez
  • Alkalmazáskiszolgáló vagy vezénylő (integrációs és koordinációs réteg)
  • Azure AI Search (információlekérdezési rendszer)
  • Azure OpenAI (generatív AI-hez készült LLM)

A webalkalmazás biztosítja a felhasználói élményt, és biztosítja a bemutatót, a környezetet és a felhasználói interakciót. A felhasználótól érkező kérdések vagy kérdések itt kezdődnek. A bemenetek áthaladnak az integrációs rétegen, először az információk lekérésére a keresési eredmények lekéréséhez, de a környezet és a szándék beállításához az LLM-hez is eljutnak.

Az alkalmazáskiszolgáló vagy a vezénylő az az integrációs kód, amely koordinálja az információk lekérése és az LLM közötti átadást. Az egyik lehetőség a LangChain használata a munkafolyamat koordinálására. A LangChain integrálható az Azure AI Search szolgáltatással, így egyszerűbbé válik az Azure AI Search beolvasása a munkafolyamatba. A szemantikus kernel egy másik lehetőség.

Az információlekérdezési rendszer biztosítja a kereshető indexet, a lekérdezési logikát és a hasznos adatokat (lekérdezési válasz). A keresési index tartalmazhat vektorokat vagy nem aktortartalmakat. Bár a legtöbb minta és demó vektormezőket tartalmaz, ez nem követelmény. A lekérdezés az Azure AI Search meglévő keresőmotorjának használatával lesz végrehajtva, amely képes kezelni a kulcsszóval (vagy kifejezéssel) és vektoros lekérdezésekkel. Az index előre létrejön egy ön által definiált séma alapján, és betöltődik a fájlokból, adatbázisokból vagy tárolókból származó tartalommal.

Az LLM megkapja az eredeti kérést, valamint az Azure AI Search eredményeit. Az LLM elemzi az eredményeket, és választ fogalmaz meg. Ha az LLM ChatGPT, a felhasználói interakció egy oda-vissza beszélgetés lehet. Ha Davincit használ, a kérdés egy teljesen összeállított válasz lehet. Az Azure-megoldások valószínűleg az Azure OpenAI-t használják, de nincs szigorú függőség az adott szolgáltatástól.

Az Azure AI Search nem biztosít natív LLM-integrációt a parancssori folyamatokhoz vagy a csevegések megőrzéséhez, ezért olyan kódot kell írnia, amely kezeli a vezénylést és az állapotot. A bemutató forrását (Azure-Samples/azure-search-openai-demo) áttekintheti a teljes megoldásra vonatkozó tervért. Azt is javasoljuk, hogy az Azure AI Studio vagy az Azure OpenAI Studio ragalapú Azure AI Search-megoldásokat hozzon létre, amelyek integrálhatók az LLM-ekkel.

Az Azure AI Searchben az összes kereshető tartalom egy keresési indexben van tárolva, amely a keresési szolgáltatásban található. A keresési indexet ezredmásodpercnyi válaszidővel rendelkező gyors lekérdezésekhez tervezték, így a belső adatstruktúrák támogatják ezt a célkitűzést. Ennek érdekében a keresési indexek indexelt tartalmakat tárolnak, nem pedig teljes tartalomfájlokat, például teljes PDF-fájlokat vagy képeket. Belsőleg az adatstruktúrák közé tartoznak a jogkivonatos szövegek invertált indexei, a beágyazások vektorindexei és a nem módosított szövegek olyan esetekben, amikor szó szerinti egyeztetésre van szükség (például szűrőkben, homályos keresésekben, reguláris kifejezés-lekérdezésekben).

A RAG-megoldás adatainak beállításakor az indexet létrehozó és betöltő funkciókat használja az Azure AI Searchben. Az index olyan mezőket tartalmaz, amelyek a forrástartalmat duplikálják vagy jelölik. Az indexmező lehet egyszerű átvitel (egy forrásdokumentum címe vagy leírása cím vagy leírás lesz egy keresési indexben), vagy egy mező tartalmazhat egy külső folyamat kimenetét, például vektorizálást vagy képességfeldolgozást, amely egy kép ábrázolását vagy szöveges leírását hozza létre.

Mivel valószínűleg tudja, hogy milyen típusú tartalmat szeretne keresni, fontolja meg az egyes tartalomtípusokra vonatkozó indexelési funkciókat:

Tartalomtípus Indexelt Funkciók
text jogkivonatok, nem módosított szöveg Az indexelők egyszerű szöveget tudnak lekérni más Azure-erőforrásokból, például az Azure Storage-ból és a Cosmos DB-ből. Bármilyen JSON-tartalmat le is küldhet egy indexbe. A szöveg repülés közbeni módosításához elemzők és normalizálók használatával adjon hozzá lexikális feldolgozást az indexelés során. A szinonimák térképei akkor hasznosak, ha a forrásdokumentumokban hiányoznak a lekérdezésekben esetleg használt terminológia.
text vektorok 1 A szöveg külsőleg darabosítható és vektorizálható, majd vektormezőként indexelhető az indexben.
rendszerkép jogkivonatok, változatlan szöveg 2 Az OCR- és képelemzési képességek képesek feldolgozni a képeket a szövegfelismeréshez vagy a kép jellemzőihez. A rendszer a képadatokat kereshető szöveggé alakítja, és hozzáadja az indexhez. A készségeknek indexelő követelményük van.
rendszerkép vektorok 1 A képek külső vektorizálhatók a képtartalom matematikai ábrázolása érdekében, majd vektormezőkként indexelhetők az indexben. Az OpenAI CLIP-hez hasonló nyílt forráskód modellekkel vektorizálhatja a szöveget és a képeket ugyanabban a beágyazási térben.

1 A vektortámogatás általánosan elérhető funkcióihoz más kódtárakat vagy modelleket kell meghívni adattömbök és vektorizálás céljából. Az integrált vektorizálás (előzetes verzió) azonban beágyazza ezeket a lépéseket. A mindkét megközelítést bemutató kódmintákért tekintse meg az azure-search-vectors adattárat.

2A készségek beépített támogatást nyújtanak az AI-bővítéshez. Az OCR és a képelemzés esetében az indexelési folyamat belső hívást indít az Azure AI Vision API-khoz. Ezek a képességek egy kinyert rendszerképet adnak át az Azure AI-nak feldolgozás céljából, és az Azure AI Search által indexelt szövegként kapják meg a kimenetet.

A vektorok biztosítják a legjobb elhelyezést az eltérő tartalmakhoz (több fájlformátum és nyelv), mivel a tartalom általánosan matematikai ábrázolásokban van kifejezve. A vektorok a hasonlóság keresését is támogatják: a vektoros lekérdezéshez leginkább hasonló koordináták egyeztetése. A tokenizált kifejezésekre vonatkozó kulcsszókereséssel (vagy kifejezéskereséssel) összehasonlítva a hasonlóság keresése árnyaltabb. Jobb választás, ha kétértelműségi vagy értelmezési követelmények vannak a tartalomban vagy a lekérdezésekben.

Miután az adatok keresési indexbe kerülnek, az Azure AI Search lekérdezési képességeivel lekérheti a tartalmakat.

Nem RAG-minta esetén a lekérdezések egy keresési ügyfélből végeznek oda-vissza utazást. A lekérdezés elküldve, egy keresőmotoron fut, és az ügyfélalkalmazásnak visszaadott válasz. A válasz vagy keresési eredmények kizárólag az indexben található szó szerinti tartalomból állnak.

RAG-mintában a lekérdezések és válaszok a keresőmotor és az LLM között vannak koordinálva. A rendszer kéri a felhasználó kérdését vagy lekérdezését a keresőmotornak és az LLM-nek is. A keresési eredmények a keresőmotorból származnak, és egy LLM-hez lesznek átirányítva. A felhasználónak visszaadandó válasz egy generatív AI, amely az LLM összegzése vagy válasza.

Az Azure AI Searchben nincs olyan lekérdezéstípus – még szemantikai vagy vektoros keresés sem –, amely új válaszokat állít össze. Csak az LLM biztosít generatív AI-t. Az Azure AI Search funkciói a lekérdezések megfogalmazására szolgálnak:

Lekérdezési funkció Cél Mire használható
Egyszerű vagy teljes Lucene szintaxis Lekérdezés végrehajtása szövegen és nem adatfeltáró numerikus tartalomon keresztül A teljes szöveges keresés a legjobb a pontos egyezésekhez, nem pedig a hasonló egyezésekhez. A teljes szöveges keresési lekérdezések a BM25 algoritmussal vannak rangsorolva, és támogatják a relevancia finomhangolását a pontozási profilokon keresztül. Emellett szűrőket és aspektusokat is támogat.
Szűrők és aspektusok Csak szöveg- vagy numerikus (nem aktor) mezőkre vonatkozik. Csökkenti a keresési felület területét a befogadási vagy kizárási feltételek alapján. Pontosságot ad a lekérdezésekhez.
Szemantikai rangsorolás Egy BM25-eredménykészletet szemantikai modellek használatával rangsorol újra. Rövid formátumú képaláírás és válaszokat hoz létre, amelyek llM-bemenetként hasznosak. Egyszerűbb, mint a pontozási profilok, és a tartalomtól függően megbízhatóbb technika a relevanciahangoláshoz.
Vektoros keresés Lekérdezés végrehajtása vektormezőkön hasonlósági keresés céljából, ahol a lekérdezési sztring egy vagy több vektor. A vektorok bármilyen típusú tartalmat képviselhetnek bármilyen nyelven.
Hibrid keresés A fenti lekérdezési technikák bármelyikét vagy mindegyikét egyesíti. A vektor- és nemvektor-lekérdezések párhuzamosan futnak, és egységes eredményhalmazban jelennek meg. A pontosság és a visszahívás legjelentősebb nyeresége a hibrid lekérdezések.

A lekérdezési válasz strukturálása

A lekérdezés válasza megadja az LLM bemenetét, így a keresési eredmények minősége kritikus fontosságú a siker szempontjából. Az eredmények táblázatos sorkészletek. Az eredmények összetétele vagy szerkezete a következőtől függ:

  • Azon mezők, amelyek meghatározzák, hogy az index mely részei szerepelnek a válaszban.
  • Egyezést jelző sorok az indexből.

A mezők akkor jelennek meg a keresési eredményekben, ha az attribútum "lekérdezhető". Az indexséma meződefiníciója attribútumokkal rendelkezik, és ezek határozzák meg, hogy egy mező szerepel-e a válaszban. Csak a "beolvasható" mezők lesznek visszaadva teljes szöveges vagy vektoros lekérdezési eredményekben. Alapértelmezés szerint az összes "beolvasható" mező vissza lesz adva, de a "kiválasztás" használatával megadhat egy részhalmazt. A "beolvasható" mellett nincs korlátozás a mezőre. A mezők bármilyen hosszúságúak vagy típusúak lehetnek. A hossz tekintetében az Azure AI Searchben nincs maximális mezőhossz-korlát, de az API-kérések méretére vonatkozó korlátozások vannak érvényben.

A sorok egyeznek a lekérdezéssel, relevancia, hasonlóság vagy mindkettő szerint rangsorolva. Alapértelmezés szerint a találatok a teljes szöveges keresés 50 első 50 találatára, a vektorkereséshez pedig a k-legközelebbi szomszéd találatokra vannak leképezve. Módosíthatja az alapértelmezett értékeket, hogy legfeljebb 1000 dokumentumra növelje vagy csökkentse a korlátot. A lapozóparaméterek használatával lapszámozott eredmények sorozataként is lekérheti az eredményeket.

Rangsor relevancia szerint

Ha összetett folyamatokkal, nagy mennyiségű adattal és az ezredmásodpercre vonatkozó várakozásokkal dolgozik, kritikus fontosságú, hogy minden lépés értéket adjon hozzá, és javítsa a végeredmény minőségét. Az információlekérési oldalon a relevancia finomhangolása olyan tevékenység, amely javítja az LLM-nek küldött eredmények minőségét. Az eredményekben csak a legrelevánsabb vagy a leginkább hasonló egyező dokumentumokat kell szerepeltetni.

A relevancia a kulcsszókeresésre (nem aktor) és a hibrid lekérdezésekre vonatkozik (a nem Avector mezőkön keresztül). Az Azure AI Searchben nincs relevanciahangolás a hasonlósági kereséshez és a vektoros lekérdezésekhez. A BM25 rangsorolása a teljes szöveges keresés rangsorolási algoritmusa.

A relevanciahangolást a BM25 rangsorolását javító funkciók támogatják. Ezek a megközelítések a következők:

Az összehasonlítási és teljesítménymérési tesztek során a szöveges és vektormezőkkel rendelkező hibrid lekérdezések, a BM25 rangsorolt eredmények szemantikai rangsorolásával kiegészítve, a legrelevánsabb eredményeket eredményezik.

Azure AI Search-lekérdezés példakódja RAG-forgatókönyvekhez

A program a következő kódot másolja a retrievethenread.py fájlból egy bemutató webhelyről. Hibrid lekérdezési keresési eredményekből állítja elő content az LLM-et. Egyszerűbb lekérdezést is írhat, de ez a példa magában foglalja a vektorkeresést és a kulcsszókeresést szemantikai újraírással és helyesírás-ellenőrzéssel. A bemutatóban ez a lekérdezés a kezdeti tartalom lekérésére szolgál.

# Use semantic ranker if requested and if retrieval mode is text or hybrid (vectors + text)
if overrides.get("semantic_ranker") and has_text:
    r = await self.search_client.search(query_text,
                                  filter=filter,
                                  query_type=QueryType.SEMANTIC,
                                  query_language="en-us",
                                  query_speller="lexicon",
                                  semantic_configuration_name="default",
                                  top=top,
                                  query_caption="extractive|highlight-false" if use_semantic_captions else None,
                                  vector=query_vector,
                                  top_k=50 if query_vector else None,
                                  vector_fields="embedding" if query_vector else None)
else:
    r = await self.search_client.search(query_text,
                                  filter=filter,
                                  top=top,
                                  vector=query_vector,
                                  top_k=50 if query_vector else None,
                                  vector_fields="embedding" if query_vector else None)
if use_semantic_captions:
    results = [doc[self.sourcepage_field] + ": " + nonewlines(" . ".join([c.text for c in doc['@search.captions']])) async for doc in r]
else:
    results = [doc[self.sourcepage_field] + ": " + nonewlines(doc[self.content_field]) async for doc in r]
content = "\n".join(results)

Integrációs kód és LLM-k

Az Azure AI Searcht tartalmazó RAG-megoldásokhoz más összetevőkre és kódra van szükség a teljes megoldás létrehozásához. Míg az előző szakaszok az Azure AI Search használatával történő információlekérést, valamint a kereshető tartalmak létrehozásához és lekérdezéséhez használt funkciókat ismertetik, ez a szakasz bevezeti az LLM-integrációt és az interakciót.

A demó-adattárakban található jegyzetfüzetek nagyszerű kiindulópontot jelentenek, mivel mintákat mutatnak a keresési eredmények LLM-nek való átadásához. A RAG-megoldások legtöbb kódja az LLM-hez intézett hívásokból áll, ezért meg kell ismernie, hogyan működnek ezek az API-k, ami kívül esik a jelen cikk hatókörén.

A chat-read-retrieve-read.ipynb jegyzetfüzet következő cellablokkja egy csevegési munkamenet kontextusában jeleníti meg a keresési hívásokat:

# Execute this cell multiple times updating user_input to accumulate chat history
user_input = "Does my plan cover annual eye exams?"

# Exclude category, to simulate scenarios where there's a set of docs you can't see
exclude_category = None

if len(history) > 0:
    completion = openai.Completion.create(
        engine=AZURE_OPENAI_GPT_DEPLOYMENT,
        prompt=summary_prompt_template.format(summary="\n".join(history), question=user_input),
        temperature=0.7,
        max_tokens=32,
        stop=["\n"])
    search = completion.choices[0].text
else:
    search = user_input

# Alternatively simply use search_client.search(q, top=3) if not using semantic ranking
print("Searching:", search)
print("-------------------")
filter = "category ne '{}'".format(exclude_category.replace("'", "''")) if exclude_category else None
r = search_client.search(search, 
                         filter=filter,
                         query_type=QueryType.SEMANTIC, 
                         query_language="en-us", 
                         query_speller="lexicon", 
                         semantic_configuration_name="default", 
                         top=3)
results = [doc[KB_FIELDS_SOURCEPAGE] + ": " + doc[KB_FIELDS_CONTENT].replace("\n", "").replace("\r", "") for doc in r]
content = "\n".join(results)

prompt = prompt_prefix.format(sources=content) + prompt_history + user_input + turn_suffix

completion = openai.Completion.create(
    engine=AZURE_OPENAI_CHATGPT_DEPLOYMENT, 
    prompt=prompt, 
    temperature=0.7, 
    max_tokens=1024,
    stop=["<|im_end|>", "<|im_start|>"])

prompt_history += user_input + turn_suffix + completion.choices[0].text + "\n<|im_end|>" + turn_prefix
history.append("user: " + user_input)
history.append("assistant: " + completion.choices[0].text)

print("\n-------------------\n".join(history))
print("\n-------------------\nPrompt:\n" + prompt)

Az első lépések

  • Tekintse át az indexelési fogalmakat és stratégiákat az adatok betöltésének és frissítésének módjának meghatározásához. Döntse el, hogy vektorkeresést, kulcsszókeresést vagy hibrid keresést használ-e. A keresendő tartalom típusa és a futtatni kívánt lekérdezések típusa határozza meg az indexek kialakítását.

  • Tekintse át a lekérdezések létrehozását a keresési kérelmek szintaxisának és követelményeinek további megismeréséhez.

Feljegyzés

Az Azure AI Search egyes funkciói emberi interakcióra szolgálnak, és ragmintában nem hasznosak. Konkrétan kihagyhatja az automatikus kiegészítést és a javaslatokat. Más funkciók, például az aspektusok és az orderby hasznosak lehetnek, de rag forgatókönyvekben nem gyakoriak.

Lásd még