Zapobieganie halucynacjom u chatbotów: RAG, wyszukiwanie wektorowe, dzielenie danych na fragmenty oraz zasady ograniczające.
Rozwiązanie projektowe systemu dla chatbota obsługi klienta, który tworzy zasady: RAG, embeddingi i wyszukiwanie w sieciach neuronowych, rozmiar fragmentów danych, prompty uzupełniające informacje, ograniczenia kontekstu oraz monitorowanie.
Bot czatowy obsługi klienta zostaje zapytany o politykę zwrotów firmy i wymyśla taką. Polityka ta w rzeczywistości nie istnieje, ale klient ją stosuje, a firma ostatecznie musi ją wypełnić. To jest problem halucynacji w jego najdroższej formie i stanowi ulubiony temat na rozmowy kwalifikacyjne z zakresu projektowania systemów, ponieważ łączy infrastrukturę AI z klasyczną architekturą.
Dlaczego modele coś wymyślają
Wielki model językowy to generator tekstu oparty na prawdopodobieństwie. Nie zna faktów, lecz przewiduje następny najbardziej prawdopodobny token. Gdy odpowiedź nie znajduje się w jego danych treningowych ani w kontekście, generuje coś, co brzmi sensownie, ale tak naprawdę nie jest prawdziwe. Jeśli tekst treningowy zawiera wiele polityk zwrotów innych firm, model wygeneruje taką, która pasuje do wzorca, nawet jeśli jest błędna dla danej firmy.
To nie tyle błąd, co skutek sposobu działania tej technologii. Samo dopasowanie modelu również tego nie naprawia, ponieważ nie można uwzględnić wszystkich możliwych faktów w jego wagach. Głównym rozwiązaniem jest generowanie wzbogacone pobieraniem danych, czyli RAG: zamiast prosić model o odpowiedź na podstawie swoich parametrów, najpierw pobiera się odpowiednie dokumenty i umieszcza je w instrukcji dla modelu.
Przykład zastosowania to chatbot obsługi klienta, który odpowiada na pytania dotyczące produktów, zasad oraz rozwiązywania problemów. Odpowiada pewnie, ale czasami twierdzi, że dany produkt posiada funkcję, której w rzeczywistości nie ma, lub wymyśla jakąś zasadę. Jak zapewnić, by jego odpowiedzi były oparte na rzeczywistej dokumentacji?
Tematy, które warto omówić w dobrej odpowiedzi, to:
- dlaczego modele tworzą iluzje i dlaczego samo dopasowanie modelu nie wystarcza
- proces RAG polegający na pobieraniu kontekstu, a następnie generowaniu odpowiedzi
- bazy danych wektorowych i wyszukiwanie semantyczne oparte na embeddingach
Jak RAG zmniejsza halucynacje
Dzięki RAG system najpierw pobiera istotne materiały z bazy wiedzy i wstawia je do promptu jako kontekst. Bez tego model zgaduje na podstawie swoich parametrów. Z jego pomocą model czyta odpowiedź z dostarczonych dokumentów. Nadal generuje tokeny, ale kontekst to ogranicza. Jeśli w dokumentach jest napisane, że zwrotów nie ma, model nie wymyśli 30-dniowego okna na zwrot.
Bazy danych wektorowych i embeddingi
Jak system znajduje odpowiednie dokumenty? Każdy dokument jest przekształcany w wektorowe embeddingi, wysoko wymiarową numeryczną reprezentację jego znaczenia, a zapytanie jest traktowane w ten sam sposób. Baza danych wektorowych zwraca dokumenty, których embeddingi znajdują się najbliżej embeddingów zapytania.
Pracę tę wykonują cztery komponenty:
- Model embeddingów. Mapuje tekst na wektory tak, aby podobne teksty generowały podobne wektory. Do dostępnych opcji należą model text-embedding-3-small od OpenAI, który ma 1536 wymiarów, oraz modele otwartej kodu takie jak BGE czy E5.
- Baza danych wektorowych. Przechowuje embeddingi i umożliwia wyszukiwanie w przybliżeniu najbliższego sąsiada (ANN). Do wyboru są zarządzane rozwiązania takie jak Pinecone, a także Weaviate, Qdrant, pgvector (rozszerzenie PostgreSQL) i Milvus.
Dzielenie na fragmenty
Dokument polityczny składający się z 50 stron nie może zostać wyodrębniony w całości, więc musi zostać podzielony. Rozmiar fragmentów wpływa zarówno na dokładność wyodrębniania informacji, jak i na efektywne wykorzystanie okna kontekstowego.
- Kawałek tekstu zbyt mały traci kontekst. Może zawierać np. „Przedmioty uszkodzone podczas transportu nie są” wraz z resztą zdania w następnym kawałku, co uniemożliwia modelowi prawidłową odpowiedź.
- Kawałek tekstu zbyt duży rozcieńcza istotne informacje nieistotnym tekstem i wypełnia okno danymi szumowymi.
- Nadmiar tekstu pomiędzy kawałkami chroni przed utratą informacji na granicach. Okno przesuwane z 10 do 20 procentami nakładania się zapobiega wypadnięciu informacji pomiędzy poszczególnymi kawałkami.
Rozsądnym standardem w dokumentacji jest dzielenie tekstu na sekcje, ograniczanie długości kawałków do około 500–1000 tokenów oraz umieszczanie sąsiednich kawałków w odległości 50–100 tokenów od siebie. Każdy kawałek powinien być samodzielny, stanowić kompletną myśl.
Projektowanie promptów jako druga linia obrony
Nawet przy odzyskiwaniu informacji model może zignorować kontekst i mimo to tworzyć błędne informacje, dlatego prompt musi mocno powiązać go z dostarczonym materiałem. Kluczowe elementy to:
- Rola. Stwierdzenie w stylu „Jesteś asystentem obsługi klienta” określa postać modelu.
- Ograniczenie do kontekstu. Instrukcja, by odpowiadać wyłącznie na podstawie dostarczonego kontekstu, zapobiega korzystaniu przez model z tego, co zapamiętał.
- Rozwiązanie na wypadek niepewności. Polecenie modelowi, by powiedział, że nie może odpowiedzieć, gdy w kontekście brakuje odpowiedzi, jest najważniejszą instrukcją. Bez niej model zgaduje.
- Cytaty. Wymaganie podania źródeł dokumentów zmusza model do odnoszenia się do konkretnych źródeł, co utrudnia tworzenie fałszywych informacji.
- Zakaz wiedzy z zewnątrz. Wyraźny zakaz korzystania z informacji poza kontekstem wzmacnia zasadę ograniczenia do tego, co jest dostępne.
Zarządzanie oknem kontekstowym
A co, jeśli istotne fragmenty nie mieszczą się w dostępnym obszarze lub pytanie składa się z kilku części wymagających wielu fragmentów? Współczesne modele mają duże okna kontekstowe – na przykład 128K tokenów w przypadku GPT-4o i nawet do 1M w przypadku Gemini – ale wypełnianie ich mniej istotnymi danymi obniża jakość odpowiedzi. Pomagają cztery taktyki:
- Klasyfikuj według istotności. Pobierz dziesięć fragmentów, uporządkuj je według oceny i dodawaj od najlepszych do najgorszych, aż wyczerpie się budżet tokenów, usuwając najgorsze jako pierwsze.
- Rozbierz zapytanie. W przypadku pytania typu „Opowiedz mi o polityce zwrotów i czasach dostawy” podziel je na podzapytania, pobierz informacje do każdego z nich i udziel odpowiedzi na oba w jednej wiadomości.
- Streszcz duże tematy. Gdy dany temat obejmuje wiele fragmentów, poproś model o ich streszczenie, a następnie użyj tego streszczenia jako kontekstu do ostatecznej odpowiedzi.
Pełna architektura
Podsumowując, główne decyzje dotyczą następujących kwestii:
- Semantyczne dzielenie na fragmenty. Dzielenie odbywa się przy naturalnych granicach, takich jak nagłówki i akapity, przy użyciu fragmentów składających się z około 500 tokenów oraz 50 tokenów nakładania się, przy czym każdy fragment jest samodzielny.
- Dwuetapowe wyszukiwanie. Wyszukiwanie za pomocą ANN dostarcza 20 kandydatów, a narzędzie cross-encoder wybiera najlepsze 3 z nich.
- Niska temperatura. Ustawienie na poziomie około 0,2 w skali od 0 do 2 sprawia, że model jest mniej kreatywny i rzadziej tworzy fałszywe informacje.
Co należy monitorować
- Częstotliwość halucynacji. Udział odpowiedzi zawierających informacje nieobecne w dostarczonym kontekście, mierzony za pomocą automatycznej ewaluacji lub przeglądu przez człowieka. Rozsądnym celem jest poziom poniżej 1 procenta.
Cztery warstwy ochrony
Halucynacje nie są oznaką uszkodzenia sztucznej inteligencji – to problem projektowy. Model bez ograniczeń zawsze wybiera wiarygodność zamiast dokładności, ponieważ tak został nauczony. Aby temu zaradzić, stosuje się cztery warstwy:
- Pobieranie danych. Dostarczanie istotnych dokumentów, dzięki którym model może odpowiadać na podstawie nich, a nie z pamięci.
- Kierowanie modelu. Ograniczanie modelu do danego kontekstu, nakazywanie mu przyznawania, że nie wie, oraz wymaganie podawania źródeł.
- Zasady bezpieczeństwa. Filtrowanie wyników, sprawdzanie źródeł oraz obliczanie wskaźników pewności, odrzucając wszystko, co nie da się zweryfikować w kontekście.
Najważniejsza zasada: chatbot, który pewnie mówi „Nie wiem”, jest o wiele lepszy od tego, który pewnie wymyśla odpowiedź.