Načítání rozšířené generace (RAG) ve službě Azure AI Search

Načítání rozšířené generace (RAG) je architektura, která rozšiřuje možnosti rozsáhlého jazykového modelu (LLM), jako je ChatGPT, přidáním systému načítání informací, který poskytuje základní data. Když přidáte systém načítání informací, budete mít kontrolu nad uzemněním dat používaných LLM, když formuluje odpověď. U podnikového řešení architektura RAG znamená, že můžete omezit generování umělé inteligence na podnikový obsah zdrojový z vektorizovaných dokumentů a obrázků a dalších formátů dat, pokud pro tento obsah vkládáte modely.

Rozhodnutí o tom, který systém načítání informací se má použít, je kritický, protože určuje vstupy do LLM. Systém načítání informací by měl poskytovat:

  • Strategie indexování, které se načítají a aktualizují ve velkém měřítku pro veškerý obsah, s frekvencí, kterou potřebujete.

  • Možnosti dotazů a ladění relevance Systém by měl vrátit relevantní výsledky v krátkých formátech nezbytných pro splnění požadavků na délku tokenu vstupů LLM.

  • Zabezpečení, globální dosah a spolehlivost dat i operací

  • Integrace s vloženými modely pro indexování a modely chatu nebo jazykové modely pro načítání

Azure AI Search je osvědčené řešení pro načítání informací v architektuře RAG. Poskytuje možnosti indexování a dotazů s infrastrukturou a zabezpečením cloudu Azure. Prostřednictvím kódu a dalších komponent můžete navrhnout komplexní řešení RAG, které obsahuje všechny prvky pro generování umělé inteligence pro váš proprietární obsah.

Poznámka:

Začínáte s koncepty copilotu a RAG? Sledujte vektorové vyhledávání a nejmodernější načítání pro aplikace Generative AI.

Microsoft má několik integrovaných implementací pro použití služby Azure AI Search v řešení RAG.

Kurátorované přístupy usnadňují začátek, ale pro větší kontrolu nad architekturou potřebujete vlastní řešení. Tyto šablony vytvářejí ucelená řešení v:

Ve zbývající části tohoto článku se dozvíte, jak Azure AI Search zapadá do vlastního řešení RAG.

Souhrnný přehled vzoru vypadá takto:

  • Začněte dotazem nebo požadavkem uživatele (výzva).
  • Odešlete ho do služby Azure AI Search a najděte relevantní informace.
  • Odešlete výsledky hledání s nejvyšším pořadím do LLM.
  • K vygenerování odpovědi na počáteční výzvu použijte porozumění přirozenému jazyku a možnosti odůvodnění LLM.

Azure AI Search poskytuje vstupy do výzvy LLM, ale nenatrénuje model. V architektuře RAG neexistuje žádné další školení. LLM je předem natrénovaný pomocí veřejných dat, ale generuje odpovědi, které jsou rozšířeny informacemi z retrieveru.

Vzory RAG, které zahrnují Azure AI Search, mají prvky uvedené na následujícím obrázku.

Diagram architektury načítání informací s vyhledáváním a protokolem ChatGPT

  • Uživatelské prostředí aplikace (webová aplikace) pro uživatelské prostředí
  • Aplikační server nebo orchestrátor (integrační a koordinační vrstva)
  • Azure AI Search (systém načítání informací)
  • Azure OpenAI (LLM pro generování AI)

Webová aplikace poskytuje uživatelské prostředí, které poskytuje prezentaci, kontext a interakci uživatele. Dotazy nebo výzvy od uživatele začínají tady. Vstupy procházejí vrstvou integrace a nejprve načítají informace, aby získaly výsledky hledání, ale také přejděte do LLM a nastavte kontext a záměr.

Aplikační server nebo orchestrátor je integrační kód, který koordinuje předání informací mezi načtením informací a LLM. Jednou z možností je použití jazyka LangChain ke koordinaci pracovního postupu. LangChain se integruje se službou Azure AI Search, což usnadňuje zahrnutí služby Azure AI Search jako načítáče do pracovního postupu. Další možností je sémantické jádro .

Systém načítání informací poskytuje prohledávatelný index, logiku dotazu a datovou část (odpověď dotazu). Index vyhledávání může obsahovat vektory nebo obsah nevectoru. I když většina ukázek a ukázek obsahuje vektorová pole, není to požadavek. Dotaz se spustí pomocí existujícího vyhledávacího webu ve službě Azure AI Search, který dokáže zpracovat klíčové slovo (nebo termín) a vektorové dotazy. Index se vytvoří předem na základě schématu, které definujete, a načte se obsahem, který je zdrojem ze souborů, databází nebo úložiště.

LLM obdrží původní výzvu a výsledky služby Azure AI Search. LLM analyzuje výsledky a formuluje odpověď. Pokud je LLM ChatGPT, může interakce uživatele představovat konverzaci tam a zpět. Pokud používáte Davinci, může být dotaz plně složenou odpovědí. Řešení Azure s největší pravděpodobností používá Azure OpenAI, ale na této konkrétní službě není žádná pevná závislost.

Azure AI Search neposkytuje nativní integraci LLM pro toky výzvy nebo zachování chatu, takže potřebujete napsat kód, který zpracovává orchestraci a stav. Ukázkový zdroj (Azure-Samples/azure-search-openai-demo) najdete v podrobném plánu, který zahrnuje kompletní řešení. K vytváření řešení Azure AI Search založených na RAG, která se integrují s LLMs, také doporučujeme Azure AI Studio nebo Azure OpenAI Studio .

Ve službě Azure AI Search se veškerý prohledávatelný obsah uloží do indexu vyhledávání, který je hostovaný ve vaší vyhledávací službě. Index vyhledávání je určený pro rychlé dotazy s dobou odezvy milisekund, takže její interní datové struktury existují pro podporu tohoto cíle. Index vyhledávání proto ukládá indexovaný obsah, ne celý obsah, jako jsou celé soubory PDF nebo obrázky. Datové struktury interně zahrnují invertované indexy tokenizovaného textu, vektorové indexy pro vkládání a nealterovaný text pro případy, kdy se vyžaduje doslovné porovnávání (například ve filtrech, přibližné vyhledávání, dotazy regulárních výrazů).

Při nastavování dat pro vaše řešení RAG použijete funkce, které vytvářejí a načítají index ve službě Azure AI Search. Index obsahuje pole, která duplikují nebo představují váš zdrojový obsah. Pole indexu může být jednoduchý přenos (název nebo popis ve zdrojovém dokumentu se stane názvem nebo popisem v indexu vyhledávání) nebo pole může obsahovat výstup externího procesu, jako je vektorizace nebo zpracování dovedností, které generuje reprezentaci nebo textový popis obrázku.

Vzhledem k tomu, že pravděpodobně víte, jaký druh obsahu chcete prohledávat, zvažte funkce indexování, které platí pro jednotlivé typy obsahu:

Typ obsahu Indexováno jako Funkce
text tokeny, nealterovaný text Indexery můžou načíst prostý text z jiných prostředků Azure, jako je Azure Storage a Cosmos DB. Do indexu můžete také odeslat libovolný obsah JSON. Pokud chcete upravit text v letu, použijte analyzátory a normalizátory k přidání lexikálního zpracování během indexování. Mapy synonym jsou užitečné, pokud ve zdrojových dokumentech chybí terminologie, která by se mohla použít v dotazu.
text vektory 1 Text může být externě blokovaný a vektorizovaný a pak indexován jako vektorová pole v indexu.
image tokeny, nealterovaný text 2 Dovednosti pro OCR a analýzu obrázků můžou zpracovávat obrázky pro rozpoznávání textu nebo charakteristiky obrázků. Informace o obrázku se převedou na prohledávatelný text a přidají se do indexu. Dovednosti mají požadavek indexeru.
image vektory 1 Obrázky lze vektorizovat externě pro matematickou reprezentaci obsahu obrázku a pak indexovat jako vektorová pole v indexu. K vektorizaci textu a obrázků ve stejném prostoru pro vložení můžete použít opensourcový model, jako je OpenAI C sada LIP.

1 Obecně dostupná funkce podpory vektorů vyžaduje, abyste volali jiné knihovny nebo modely pro blokování a vektorizaci dat. Integrované vektorizace (Preview) ale vkládá tyto kroky. Ukázky kódu zobrazující oba přístupy najdete v úložišti azure-search-vectors.

2Dovednosti jsou integrovanou podporou rozšiřování AI. V případě analýzy OCR a image kanál indexování provádí interní volání rozhraní API služby Azure AI Vision. Tyto dovednosti předávají extrahovaný obrázek do Azure AI ke zpracování a dostanou výstup jako text indexovaný službou Azure AI Search.

Vektory poskytují nejlepší ubytování pro rozdílný obsah (více formátů souborů a jazyků), protože obsah je vyjádřen univerzálně v matematických reprezentacích. Vektory také podporují vyhledávání podobnosti: porovnávání souřadnic, které jsou nejvíce podobné vektorovém dotazu. Ve srovnání s vyhledáváním klíčových slov (nebo vyhledáváním termínů), které odpovídá tokenizovaným termínům, je vyhledávání podobnosti více nuancí. Je lepší volbou, pokud obsah nebo dotazy obsahuje nejednoznačnost nebo požadavky na interpretaci.

Jakmile jsou vaše data v indexu vyhledávání, použijete k načtení obsahu možnosti dotazu služby Azure AI Search.

V případě jiného vzoru než RAG provede dotazy odezvu z vyhledávacího klienta. Dotaz se odešle, spustí se na vyhledávacím webu a odpověď vrácená klientské aplikaci. Odpověď nebo výsledky hledání se skládají výhradně z doslovného obsahu nalezeného v indexu.

V modelu RAG jsou dotazy a odpovědi sladěné mezi vyhledávacím webem a LLM. Dotaz nebo dotaz uživatele se přepošla do vyhledávacího webu i do LLM jako výzva. Výsledky hledání se vrátí z vyhledávacího webu a přesměrují se do LLM. Odpověď, která ji vrátí zpět uživateli, je generovat umělou inteligenci, a to buď sumaci, nebo odpověď z LLM.

Ve službě Azure AI Search neexistuje žádný typ dotazu , ani sémantické nebo vektorové vyhledávání, které kompozuje nové odpovědi. Pouze LLM poskytuje generování umělé inteligence. Tady jsou možnosti ve službě Azure AI Search, které se používají k formulaci dotazů:

Funkce dotazu Účel Proč ho použít
Jednoduchá nebo úplná syntaxe Lucene Provádění dotazů u textového a nevectoru číselného obsahu Fulltextové vyhledávání je nejvhodnější pro přesnou shodu místo podobných shod. Fulltextové vyhledávací dotazy jsou seřazené pomocí algoritmu BM25 a podporují ladění relevance prostřednictvím hodnoticích profilů. Podporuje také filtry a omezující vlastnosti.
Filtry a omezující vlastnosti Platí jenom pro textová nebo číselná pole (nevector). Zmenšuje oblast hledání na základě kritérií zahrnutí nebo vyloučení. Přidává přesnost k dotazům.
Sémantické řazení Znovu seřadí sadu výsledků BM25 pomocí sémantických modelů. Vytvoří stručné popis a odpovědi, které jsou užitečné jako vstupy LLM. Snadnější než bodovací profily a v závislosti na obsahu je spolehlivější technika optimalizace relevance.
Vektorové vyhledávání Provádění dotazu u vektorových polí pro vyhledávání podobnosti, kde řetězec dotazu je jeden nebo více vektorů. Vektory můžou představovat všechny typy obsahu v libovolném jazyce.
Hybridní vyhledávání Kombinuje všechny výše uvedené techniky dotazu. Vektorové a nevectorové dotazy se provádějí paralelně a vrací se ve sjednocené sadě výsledků. Nejvýznamnějším nárůstem přesnosti a úplnosti jsou hybridní dotazy.

Strukturování odpovědi dotazu

Odpověď dotazu poskytuje vstup do LLM, takže kvalita výsledků hledání je pro úspěch důležitá. Výsledky jsou tabulková sada řádků. Složení nebo struktura výsledků závisí na:

  • Pole, která určují, které části indexu jsou součástí odpovědi.
  • Řádky, které představují shodu z indexu

Pole se zobrazí ve výsledcích hledání, pokud je atribut "retrievable". Definice pole ve schématu indexu má atributy a ty určují, jestli se pole používá v odpovědi. Ve výsledcích dotazu na celý text nebo vektorový dotaz se vrátí pouze pole s možností načtení. Ve výchozím nastavení se vrátí všechna pole s možností načítání, ale k zadání podmnožině můžete použít možnost "select". Kromě možnosti "načítání" nejsou v poli žádná omezení. Pole můžou mít libovolnou délku nebo typ. Pokud jde o délku, ve službě Azure AI Search neexistuje limit maximální délky pole, ale existuje omezení velikosti požadavku rozhraní API.

Řádky jsou shodné s dotazem, seřazené podle relevance, podobnosti nebo obojího. Ve výchozím nastavení jsou výsledky omezeny na prvních 50 shod pro fulltextové vyhledávání nebo shody k-nejbližšího souseda pro vektorové vyhledávání. Výchozí hodnoty můžete změnit tak, aby se limit zvýšil nebo snížil až na 1 000 dokumentů. K načtení výsledků jako řady stránkovaných výsledků můžete použít také horní a přeskočení parametrů stránkování.

Pořadí podle relevance

Při práci se složitými procesy je důležité, aby každý krok přidal hodnotu a zlepšil kvalitu konečného výsledku. Na straně načítání informací je optimalizace relevance aktivitou, která zlepšuje kvalitu výsledků odeslaných do LLM. Ve výsledcích by měly být zahrnuty pouze ty nejrelevavantnější nebo nejpodobnější odpovídající dokumenty.

Relevance se vztahuje na vyhledávání klíčových slov (nevector) a na hybridní dotazy (nad poli nevectoru). Ve službě Azure AI Search neexistuje žádné ladění relevance pro vyhledávání podobnosti a vektorové dotazy. Řazení BM25 je algoritmus řazení pro fulltextové vyhledávání.

Ladění relevance je podporováno prostřednictvím funkcí, které vylepšují hodnocení BM25. Mezi tyto přístupy patří:

  • Bodovací profily , které zvyšují skóre hledání, pokud jsou nalezeny shody v určitém vyhledávacím poli nebo v jiných kritériích.
  • Sémantické řazení, které změní pořadí sady výsledků BM25 pomocí sémantických modelů z Bingu, aby se výsledky pro lepší sémantické přizpůsobení původnímu dotazu přeřadily.

V porovnání a srovnávacím testování mají hybridní dotazy s textovými a vektorovými poli doplněné sémantickým hodnocením oproti výsledkům seřazeným BM25 nejrelevavantnější výsledky.

Ukázkový kód dotazu Azure AI Search pro scénáře RAG

Následující kód se zkopíruje ze souboru retrievethenread.py z ukázkového webu. content Vytvoří pro LLM z výsledků hledání hybridních dotazů. Můžete napsat jednodušší dotaz, ale tento příklad je inkluzivním vyhledáváním vektorů a hledáním klíčových slov sémantickou rerankací a kontrolou pravopisu. V ukázce se tento dotaz používá k získání počátečního obsahu.

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

Integrační kód a LLM

Řešení RAG, které zahrnuje Azure AI Search, vyžaduje k vytvoření kompletního řešení další komponenty a kód. Zatímco předchozí části zahrnovaly načítání informací prostřednictvím služby Azure AI Search a které funkce se používají k vytváření a dotazování prohledávatelného obsahu, tato část představuje integraci a interakci LLM.

Poznámkové bloky v úložištích demo představují skvělý výchozí bod, protože zobrazují vzory pro předávání výsledků hledání do LLM. Většina kódu v řešení RAG se skládá z volání LLM, takže potřebujete vyvinout pochopení, jak tato rozhraní API fungují, což je mimo rozsah tohoto článku.

Následující blok buňky v poznámkovém bloku chat-read-retrieve-read.ipynb zobrazuje volání hledání v kontextu chatovací relace:

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

Jak začít

  • K vytvoření indexu vyhledávání použijte Azure AI Studio.

  • Pomocí nástroje Azure OpenAI Studio a "přineste si vlastní data" můžete experimentovat s výzvami na existujícím indexu vyhledávání v dětském hřišti. Tento krok vám pomůže rozhodnout, jaký model použít, a ukáže vám, jak dobře funguje váš existující index ve scénáři RAG.

  • Akcelerátor řešení "Chat s daty" vytvořený týmem Azure AI Search vám pomůže vytvořit vlastní řešení RAG.

  • Šablony podnikových chatovacích aplikací nasazují prostředky, kód a ukázková podkladová data Azure pomocí fiktivních dokumentů plánu stavu pro Contoso a Northwind. Toto ucelené řešení poskytuje provozní chatovací aplikaci za 15 minut. Kód pro tyto šablony je azure-search-openai-demo doporučený v několika prezentacích. Následující odkazy poskytují jazykově specifické verze:

  • Projděte si koncepty a strategie indexování a určete, jak chcete ingestovat a aktualizovat data. Rozhodněte se, jestli chcete použít vektorové vyhledávání, vyhledávání klíčových slov nebo hybridní vyhledávání. Druh obsahu, který potřebujete vyhledat, a typ dotazů, které chcete spustit, určuje návrh indexu.

  • Projděte si vytváření dotazů a získejte další informace o syntaxi a požadavcích na žádosti o vyhledávání.

Poznámka:

Některé funkce Azure AI Search jsou určené pro lidskou interakci a nejsou užitečné ve vzoru RAG. Konkrétně můžete přeskočit automatické dokončování a návrhy. Další funkce, jako jsou omezující vlastnosti a řazení, můžou být užitečné, ale ve scénáři RAG by byly neobvyklé.

Viz také