Wyjaśnienie retrieval-Augmented Generation: naprawa luk w wiedzy modeli LLM
Dlaczego modele językowe generują halucynacje i tracą aktualność, oraz jak generacja wzbogacona o wyszukiwanie rozwiązuje ten problem krok po kroku: dzielenie na fragmenty, embeddingi, wyszukiwanie informacji i wzbogacanie promptu.
Źródła: What LLMs Often Get Wrong At, And How RAG Cures That
Gdzie modele językowe popełniają błędy
Pomyśl o końcowych egzaminach ustnych. Uczy się wszystkiego w noc przed egzaminem, wchodzi do sali, mówi pewnie z egzaminatorem i ma nadzieję, że wszystko pójdzie dobrze. Wtedy egzaminator pyta: „Dlaczego wybrałeś właśnie tę metodę w swoim projekcie?”. Nagle w pomieszczeniu zapada cisza.
Modele językowe napotykają ten sam problem.
Są zaprojektowane tak, by generować odpowiedzi brzmiące przekonująco. To oznacza, że często nie wiedzą, jak przyznać się do tego, że „nie wiem”.
Istnieje też problem przestarzałej wiedzy.
Załóżmy, że ten sam egzaminator pyta:
„Dlaczego wybrałeś tę metodę, skoro teraz istnieje lepsza?”
Będziesz w kropce.
Modele językowe napotykają dokładnie ten problem, gdy fakty, na których zostały wytrenowane, już nie odzwierciedlają rzeczywistości.
Zatem prawdziwe pytanie brzmi: Jak dostarczyć modelowi językowemu właściwe fakty dokładnie wtedy, gdy ich potrzebuje?
Wejście w generację wzbogaconą o wyszukiwanie
Niech nazwa cię nie przestraszy. To w rzeczywistości prosty proces: znajdź odpowiednie informacje, przekaż je modelowi i pozwól mu przekształcić je w odpowiedź.
To cała idea.
Rozważmy, co tak naprawdę dzieje się za tym opisem.
Sformułowanie problemu
Załóżmy, że tworzysz wewnętrznego asystenta AI dla firmy.
Firma ta ma mnóstwo dokumentów: podręcznik pracownika, wewnętrzne FAQ, zasady bezpieczeństwa i tak dalej.
Gdy asystent zostanie uruchomiony, ludzie naturalnie zaczną z nim eksperymentować. Ktoś wpisuje:
">Ile dni urlopu rodzicielskiego mam prawo otrzymać?"
Problem polega na tym, że model nie posiada wbudowanej świadomości specyficznych zasad twojej firmy. Nie można po prostu włożyć setek długich dokumentów do promptu i oczekiwać klarownej odpowiedzi — takie postępowanie niesie ryzyko przeładowania okna kontekstowego, dezorientacji modelu oraz innych problemów.
Jak faktycznie działa RAG
Zamiast polegać na wewnętrznej wiedzy LLM do udzielania odpowiedzi, najpierw pobieramy istotne materiały z naszej własnej bazy wiedzy. Następnie te materiały są przekazywane LLM.
LLM wykorzystuje te dostarczone informacje do sformułowania swojej odpowiedzi.
Innymi słowy, model nie musi zapamiętywać wszystkiego. Potrzebuje jedynie poprawnych informacji dostarczonych w odpowiednim momencie.
To rodzi kolejne pytanie: jak w ogóle zdecydować, co jest istotne?
Pobieranie danych
Wysyłanie każdego dokumentu do modelu LLM przy każdym pytaniu byłoby marnotrawstwem czasu i zasobów. Dlatego należy najpierw wyodrębnić istotne fragmenty, ponieważ skanowanie wszystkiego za każdym razem jest kosztowne i nieefektywne.
Aby to osiągnąć, dokumenty dzieli się na mniejsze części zwane chunkami. Jeden chunk może dotyczyć zasad urlopu rodzicielskiego, inny – procedur bezpieczeństwa, a jeszcze inny – sposobu zwrotu kosztów.
Znalezienie odpowiedniego chunka
Użytkownik może sformułować swoje pytanie w ten sposób: ">Ile czasu wolnego mogę mieć po urodzeniu dziecka?"
Tymczasem sam dokument może zawierać informację: ">Pracownicy mają prawo do 26 tygodni urlopu rodzicielskiego."
Sformułowanie się różni, ale znaczenie jest identyczne. Aby przezwyciężyć tę różnicę, systemy RAG polegają na embeddingach.
Czym są embeddingi
Embedding przekształca fragment tekstu w zbiór liczb, które kodują jego znaczenie. Teksty o podobnym znaczeniu znajdują się blisko siebie w tym przestrzeni liczbowej — mierzonej za pomocą tak zwanego odległości wektorowej, która jest w istocie sposobem na określenie, jak daleko od siebie znajdują się dwa wektory.
Te embeddingi znajdują się wewnątrz bazy danych wektorowych. Gdy pojawia się nowe pytanie, ono również jest przekształcane w embedding, a system szuka najbliższych odpowiadających fragmentów.
Rezultatem jest zbiór istotnych fragmentów, które następnie są przekazywane do LLM jako kontekst wspierający.
Wzmacnianie
Gdy już zidentyfikowano istotne fragmenty, kolejnym krokiem jest ich połączenie.
Są one wstawiane do okna kontekstowego LLM razem z oryginalnym pytaniem:
Context:
Employees are entitled to 26 weeks of parental leave.
Question:
How long can I stay away from work after having a baby?
W tym momencie LLM ma wszystko, co jest potrzebne do dokładnej odpowiedzi.
Generowanie
Następuje teraz ta część, w której LLM doskonale radzi sobie: wytwarzanie rzeczywistej odpowiedzi.
Czyta zarówno pytanie użytkownika, jak i pobrany kontekst, a następnie generuje odpowiedź:
"Masz prawo do 26 tygodni urlopu rodzicielskiego.
I to zamyka cykl: Pobierz → Wzbogać → Zgeneruj.
Haczyk
LLM może rozumować tylko na podstawie tego kontekstu, który został pobrany. Jeśli zostanie pobraany niewłaściwy fragment, ostateczna odpowiedź może nadal być błędna, mimo że proces przebiegł prawidłowo.
Rozważmy następujący scenariusz:
Pytanie: „Jak długo trwa urlop rodzicielski?”
Pobrany fragment: „Poinformuj swojego kierownika 30 dni przed rozpoczęciem urlopu rodzicielskiego.”
Otrzymana odpowiedź: asystent informuje pracownika, że musi poinformować kierownika z pełnym miesiącem wyprzedzeniem o rozpoczęciu urlopu rodzicielskiego — co jest technicznie związane z tematem, ale w rzeczywistości nie odpowiada na pytanie o długość urlopu.
Poprawa jakości wydobywania informacji
Jak więc zapewnić, że krok wydobywania pokaże odpowiednie materiały?
Tutaj istotne są kilka czynników:
Strategia dzielenia na fragmenty: sposób podziału dokumentów wpływa na to, czy powiązany kontekst pozostaje nienaruszony w obrębie jednego fragmentu.
Jakość embeddingów: silniejsze embeddingi ułatwiają dopasowanie pytania użytkownika do treści, która rzeczywiście na nie odpowiada.
Technika wyszukiwania: Połączenie wyszukiwania opartego na podobieństwie semantycznym z tradycyjnym wyszukiwaniem według słów kluczowych pomaga uwzględnić zarówno znaczenie, jak i dokładne sformułowanie.
Ponowna klasyfikacja: Najpierw pobiera się początkową grupę kandydujących fragmentów, a następnie stosuje się drugi etap klasyfikacji, aby wyłonić te najbardziej przydatne.
Podstawowy cel pozostaje prosty: umieścić właściwy kontekst przed modelem LLM.
Podsumowanie
RAG to nie jakiś magiczny trik.
Znajdź odpowiednie informacje, przekaż je modelowi LLM i pozwól mu wygenerować odpowiedź.
To jest cały mechanizm.
Model LLM nigdy nie musiał znać wszystkiego od razu.
Potrzebuje jedynie właściwego kontekstu, dostarczonego w odpowiednim czasie.
I to jest podstawowa zasada RAG: złe dane prowadzą do złych wyników, a wysokiej jakości dane zapewniają wysoką jakość wyników.
Teraz, za każdym razem, gdy ktoś wspomni „RAG to, RAG tamto”, będziesz dokładnie wiedział, o czym mówi.
Literatura pokrewna
- RAG wyjaśnione: Jak systemy AI zdobywają nową wiedzę na zamówienie — Dowiedz się, jak działa Retrieval-Augmented Generation, od dzielenia na fragmenty i embeddingów po wyszukiwanie wektorowe, aby modele AI mogły odpowiadać na pytania bez ponownego szkolenia.
- Drugi mózg: Przekształcanie transkrypcji spotkań w graf wiedzy dostępny do zapytań — Wyjaśnia, jak system agentowy wydobywa entity z transkrypcji spotkań i przechowuje je w Cosmos DB, umożliwiając odzyskiwanie informacji w języku naturalnym i eksplorację grafu wiedzy.