RAG systémy: Jak rerankery zvyšují přesnost odpovědí velkých jazykových modelů
Velké jazykové modely (LLM) prokazují působivé schopnosti v generování textu, avšak jejich sklon k „halucinacím“ – tedy k produkci falešných nebo nepodložených informací – zůstává vážným problémem. K řešení tohoto úkolu se aktivně využívá architektura Retrieval-Augmented Generation (RAG). Ta umožňuje LLM spoléhat se na externí, ověřené zdroje dat, čímž výrazně zvyšuje spolehlivost a relevanci generovaných odpovědí. Tento článek se podrobně zabývá principi fungování RAG, zkoumá klíčové komponenty, jako jsou embeddingy, vektorové databáze, retrievry, a obzvláště detailně – roli rerankerů při dosahování rovnováhy mezi rychlostí vyhledávání a přesností poskytovaných informací.
Základy RAG: Od halucinací k faktům
Problém halucinací LLM pramení z toho, že modely jsou trénovány na obrovských datových souborech a jsou schopny generovat text, který zní věrohodně, i když nemají konkrétní znalosti o dotazovaném tématu. RAG systémy to řeší tím, že modelu poskytují přístup k aktuálním a relevantním informacím z externí znalostní báze. Proces zahrnuje dvě hlavní fáze: vyhledávání (Retrieval) a generování (Generation). Ve fázi vyhledávání systém extrahuje z databáze textové fragmenty, které nejlépe odpovídají uživatelskému dotazu, a poté je předá LLM jako dodatečný kontext pro generování odpovědi.
Pro efektivní využití externích dat je nutné je připravit. Dlouhé dokumenty se rozdělují na menší smysluplné fragmenty, neboli čanky (chunks). To je nezbytné, protože LLM mají omezené kontextové okno, tedy maximální objem textu, který mohou zpracovat najednou. Pro zachování souvislosti informací mezi sousedními čanky se používá technika překrytí (overlap), kdy se malá část předchozího fragmentu zahrne na začátek následujícího. To pomáhá modelu lépe porozumět kontextu při práci s jednotlivými částmi textu.
Vektorové databáze a embeddingy: Sémantické vyhledávání
Srdcem RAG systému je mechanismus pro vyhledávání relevantních datových fragmentů. Počítače nejsou schopny přímo chápat význam slov, operují s čísly. Proto se texty převádějí na číselné reprezentace, nazývané embeddingy (embeddings) nebo vektory. Embedding je vícerozměrný vektor (posloupnost čísel), který kóduje sémantický význam slova, fráze nebo celého textového fragmentu. Slova nebo fráze, které jsou si významově podobné, budou mít vektory umístěné blízko sebe ve vícerozměrném prostoru.
Proces vytváření embeddingů se provádí pomocí specializovaných embeddingových modelů, které jsou trénovány na obrovských textových korpusech. Tyto modely se učí přiřazovat slovům a jejich kontextu unikátní číselné reprezentace. Například, pokud vezmeme vektory pro slova „král“, „muž“ a „žena“, pak vektor „královna“ bude velmi blízký výsledku operace „vektor(král) - vektor(muž) + vektor(žena)“. To demonstruje schopnost embeddingů zachytit složité sémantické a syntaktické vztahy v jazyce.
Získané embeddingy se ukládají do vektorových databází. Tyto databáze jsou optimalizovány pro rychlé vyhledávání nejbližších vektorů. Když uživatel položí otázku, jeho dotaz je také převeden na embedding, a poté vektorová databáze najde textové fragmenty, jejichž embeddingy jsou maximálně podobné embeddingu dotazu. Podobnost vektorů se obvykle měří pomocí metrik, jako je kosinová podobnost.
Zde je příklad Python kódu, demonstrující vytvoření embeddingu pomocí API OpenAI:
# Pro spuštění příkladu je nutné nainstalovat knihovnu openai a získat API klíč
from openai import OpenAI
import os
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
text = "Kocour Mňouk Mnohobajtovič rád vypráví o ceylonských mniších"
response = client.embeddings.create(
model="text-embedding-3-small",
input=text,
dimensions=768 # explicitně nastavíme dimenzi
)
vector = response.data[0].embedding
print(f"Dimenze vektoru: {len(vector)}") # vypíše 768
print("Prvních 20 čísel:", vector[:20])
print("... a tak dále až do 768. čísla")
Tento kód převádí textovou frázi na číselný vektor o 768 prvků, který pak může být použit pro vyhledávání ve vektorové databázi.
Retrievry a škálování: Výzvy výkonu
Retriever je komponenta RAG systému, která je zodpovědná za extrakci počáteční sady relevantních dokumentů nebo fragmentů z vektorové databáze. Využívá embedding uživatelského dotazu k nalezení nejpodobnějších embeddingů uložených čanků. U malých kolekcí dokumentů může retriever provádět úplné prohledávání, porovnáváním embeddingu dotazu se všemi uloženými vektory. Avšak s růstem objemu dat (miliardy fragmentů) se takový přístup stává neefektivním a příliš pomalým.
K řešení problému škálování se používají různé algoritmy přibližného vyhledávání nejbližších sousedů (Approximate Nearest Neighbor, ANN). Tyto algoritmy vytvářejí speciální indexy, jako jsou IVF (Inverted File Index), HNSW (Hierarchical Navigable Small World) nebo LSH (Locality Sensitive Hashing). ANN indexy umožňují výrazně urychlit vyhledávání, přičemž obětují zanedbatelnou část přesnosti. Nenacházejí sice absolutně přesné, ale velmi blízké sousedy za mnohem kratší dobu. Tímto způsobem vzniká kompromis mezi recall (úplností, tj. schopností najít všechny relevantní prvky) a latency (latencí, tj. rychlostí odpovědi).
Navzdory optimalizaci rychlosti nejsou výsledky vrácené retrieverem vždy ideální. Retrievry mohou extrahovat fragmenty, které jsou sémanticky blízké dotazu, ale nejsou nejrelevantnější nebo nejpřesnější pro vytvoření konečné odpovědi. To souvisí s tím, že embeddingy používané pro vyhledávání jsou často jednostranné (bi-encoder), což znamená, že dotaz a dokumenty jsou kódovány nezávisle a poté jsou jejich vektory porovnávány. To je efektivní pro rychlé vyhledávání, ale může to opomíjet jemné kontextové souvislosti.
Zvýšení přesnosti pomocí rerankerů
K překonání omezení retrieverů a zvýšení přesnosti odpovědí RAG systémů se používají rerankery. Reranker je dodatečná komponenta, která od retrieveru obdrží malou sadu (například 10-100) potenciálně relevantních fragmentů a přeuspořádá je na základě hlubšího hodnocení relevance. Funguje jako filtr, který odstraňuje méně užitečné výsledky a posouvá ty nejvýznamnější nahoru.
Na rozdíl od embeddingových modelů používaných retrievry, rerankery často využívají cross-encodery. Cross-encodery přijímají na vstup páry „dotaz-dokument“ a společně je zpracovávají, přičemž hodnotí jejich vzájemnou relevanci. To jim umožňuje zachytit složitější a jemnější interakce mezi dotazem a kontextem než pouhé porovnávání vektorů. Ačkoli jsou cross-encodery výrazně pomalejší než bi-encoder embeddingové modely, aplikují se na již filtrovanou, malou sadu dokumentů, což činí jejich použití výpočetně přijatelným.
Tímto způsobem rerankery pomáhají najít optimální rovnováhu mezi rychlostí a přesností. Rychlý retriever s ANN indexy operativně vybere širokou škálu potenciálně relevantních čanků, a poté pomalejší, ale přesnější reranker přehodnotí tuto omezenou sadu, čímž zajistí, že LLM obdrží nejkvalitnější kontext pro generování odpovědi. Tento vícestupňový přístup výrazně zlepšuje kvalitu a spolehlivost informací poskytovaných RAG systémem, minimalizuje riziko halucinací a zvyšuje celkovou spokojenost uživatele.
Co je důležité
- RAG systémy umožňují LLM využívat externí data pro generování přesných a spolehlivých odpovědí, čímž bojují proti problému „halucinací“.
- Embeddingy převádějí text na číselné vektory, které kódují sémantický význam, což umožňuje vyhledávání na základě podobnosti ve vektorových databázích.
- Retrievry používají embeddingy a ANN indexy pro rychlou extrakci počáteční sady relevantních fragmentů, čímž zajišťují kompromis mezi rychlostí a úplností (recall).
- Rerankery (často na bázi cross-encoderů) přehodnocují výsledky retrieveru, filtrují méně relevantní fragmenty a zvyšují přesnost kontextu pro LLM.
- Kombinace rychlého retrieveru a přesného rerankeru umožňuje dosáhnout optimální rovnováhy mezi výkonem a kvalitou v RAG systémech.
— Editorial Team
Zatím žádné komentáře.