Projektowanie promptów pod odpowiedzi z dokumentów, nie kreatywne
Budowa asystenta retrieval augmented, który odpowiada na podstawie dokumentów firmy, oznacza walkę z odruchami samego modelu. Zostawiony sam sobie, zapełnia luki wiedzą z pretreningu i pisze to dokładnie tym samym pewnym siebie tonem co fragmenty oparte na źródłach. Dlatego to w projekcie promptu decyduje się, czy odpowiedź należy do dokumentów, czy do modelu. Oto zestaw, którego używam, kiedy wymóg brzmi: każde zdanie da się sprowadzić do fragmentu, który czytelnik może naprawdę otworzyć.
Dlaczego domyślne zachowanie modelu działa przeciwko tobie
Bazowy model językowy jest dostrojony do produkowania prawdopodobnej odpowiedzi. Nigdy do ogłaszania, że pobrany kontekst był ubogi. A ciekawa awaria w układzie opartym na źródłach to nie oczywisty błąd faktograficzny - takie wyłapujemy. To płynna mieszanka treści z dokumentów i wiedzy ogólnej, na tyle gładka, że nikt jej potem nie zweryfikuje. Zachowanie kreatywne i zachowanie oparte na źródłach wymagają innych instrukcji, a nie innej dawki uprzejmości. To, co tu optymalizujesz, jest wąskie: każde twierdzenie ma prowadzić do fragmentu, który możesz pokazać czytelnikowi.
Oddzielenie pobranego kontekstu od instrukcji
Trzymaj prompt systemowy, pobrane fragmenty i pytanie użytkownika w osobnych, wyraźnie oddzielonych blokach. Najlepiej działają ograniczniki, które nie pojawiają się w zwykłych dokumentach, a znaczniki w stylu XML sprawdzają się bez zarzutu, bo model wie dokładnie, gdzie materiał dowodowy się zaczyna i kończy. Każdy fragment opisz identyfikatorem, który model może przytoczyć - cytowanie staje się wtedy zadaniem formatowania, a nie zadaniem z pamięci. Nie parafrazuj ani nie streszczaj fragmentów wcześniej w łańcuchu. To tylko drugie miejsce, w którym może wkraść się przekłamanie. Instrukcje zadania umieść przed kontekstem i krótko powtórz po nim, bo generowanie odbywa się najbliżej końca promptu.
Sformułowania, które przypinają odpowiedź do źródeł
Instrukcja pozytywna bije zakaz. Powiedzenie modelowi, czego ma użyć, działa lepiej niż lista rzeczy do unikania, a prośba o odpowiedź zbudowaną z ponumerowanych fragmentów bije prośbę o odpowiedź „dokładną" czy „zgodną z faktami". Te przymiotniki nie znaczą operacyjnie nic.
- Wprost dopuść pustą odpowiedź i nadaj jej stały kształt, żeby odmowa była poprawnym zakończeniem, a nie stanem awarii.
- Zablokuj asekuracyjny język, który zaciera granicę między materiałem cytowanym a wnioskiem.
- Wymagaj wyraźnego oznaczenia, kiedy model łączy dwa fragmenty w wniosek, którego żaden z nich nie wypowiada.
Cytowania jako wymóg strukturalny
Proś o identyfikator fragmentu bezpośrednio przy każdym twierdzeniu. Bibliografia doklejona na końcu nie weryfikuje niczego, bo żaden czytelnik nie przypisze jej sobie zdanie po zdaniu. Żaden. Ustrukturyzowane wyjście - JSON z polem odpowiedzi i tablicą źródeł - pozwala odrzucić odpowiedź programowo, kiedy twierdzenie nie ma identyfikatora. Sprawdzaj każdy identyfikator względem zbioru faktycznie wysłanego w prompcie: zmyślone cytowanie wyłapuje się banalnie i sporo mówi o jakości promptu. Cytowanie, które czytelnik może otworzyć w oryginalnym dokumencie, odróżnia demo od czegoś, co przyjmie audytor.
Co robić, gdy wyszukiwanie nic nie zwraca albo zwraca sprzeczności
Prompt powinien rozróżniać trzy stany: dowodów wystarczy, dowody są częściowe, brak istotnych dowodów. Przy częściowych dowodach proś o tę część, na którą da się odpowiedzieć, plus nazwaną lukę, zamiast odpowiedzi wyglądającej na kompletną z cichą dziurą w środku. A kiedy dwa dokumenty się nie zgadzają? Pokaż oba wraz ze źródłami, zamiast pozwalać modelowi po cichu wybrać nowszy albo dłuższy. Metadane z wersją i datą obowiązywania, niesione razem z każdym fragmentem, pozwalają powiedzieć, która zasada obowiązywała kiedy - a to zwykle i tak jest prawdziwe pytanie.
Wskazówka: przypadek braku dowodów kieruj do stałego szablonu odpowiedzi, zamiast pozwalać modelowi za każdym razem układać odmowę od nowa.
Ustawienia dekodowania i wybór modelu też są częścią promptu
Niska temperatura to najtańsza interwencja na rzecz oparcia w źródłach, jaką masz, i pierwsza rzecz do sprawdzenia, kiedy odpowiedzi zaczynają błądzić. Mniejszy model dobrze wykonujący instrukcje, który trzyma się kontekstu, często bije większy z własnymi mocnymi poglądami. Widziałem to nieraz. Wdrożenia on-premise przypinają wersję modelu, co usuwa całą klasę cichych regresji wywołanych aktualizacjami po stronie dostawcy. Długość kontekstu traktuj jak budżet, a nie jak cel: każdy dodatkowy fragment podnosi ryzyko, że któryś nie na temat ściągnie odpowiedź w bok.
Wskazówka: trzymaj prompt, identyfikator modelu i parametry dekodowania razem w kontroli wersji, bo zmiana któregokolwiek z nich unieważnia wyniki ewaluacji.
Jak sprawdzić, czy prompt faktycznie trzyma się źródeł
Zbuduj stały zestaw pytań z prawdziwych pytań użytkowników i świadomie wrzuć takie, na które korpus nie potrafi odpowiedzieć. Ten negatywny zestaw liczy się bardziej niż pozytywny, bo prompt, który odpowiada na wszystko, to prompt, który zmyśla.
- Test sabotażowy: usuń fragment zawierający odpowiedź i sprawdź, czy model odmawia, zamiast recytować ją z pretreningu.
- Sprawdzaj ręcznie, przynajmniej na początku, czy każde cytowanie prowadzi do fragmentu, który potwierdza sąsiadujące z nim zdanie.
- Przepuszczaj cały zestaw ponownie po każdej zmianie promptu, zmianie modelu i przebudowie indeksu.
Zmiana promptu to zmiana kodu. Traktuj ją tym samym przeglądem.
FAQ
Czy surowszy prompt czyni asystenta mniej użytecznym?
Czyni go węższym, i o to chodzi. Użytkownicy ufają asystentowi, który przyznaje się do niewiedzy, o wiele bardziej niż takiemu, który dwa razy w tygodniu z przekonaniem się myli.
Czy sam projekt promptu zatrzyma halucynacje?
Nie. Mocno zbija ich częstotliwość, ale resztę ciężaru biorą na siebie jakość wyszukiwania, chunking i walidacja cytowań.
Czy te techniki przenoszą się między modelami?
Zasady tak, dokładne sformułowania nie. Po każdej zamianie, łącznie z podbiciem wersji pomocniczej, przepuść zestaw ewaluacyjny od nowa.
Co z tego masz
Oparcie w źródłach to ograniczenie projektowe nałożone na prompt, wyszukiwanie, dekodowanie i walidację. A nie zdanie doklejone do wiadomości systemowej. Prompt jest umową stwierdzającą, że odpowiedzi należą do dokumentów, a nie do modelu. Oddziel kontekst, dopuść pustą odpowiedź, wymagaj cytowań, które da się rozwiązać, trzymaj niską temperaturę i testuj na pytaniach, na które twój korpus naprawdę nie potrafi odpowiedzieć. A potem traktuj każdą zmianę promptu jak zmianę, która wymaga ponownego przepuszczenia zestawu ewaluacyjnego, zanim trafi do użytkowników.