Podręcznik uczestnika z objaśnieniami, przykładami i ćwiczeniami do samodzielnej nauki do Modułu 6
4. R3. Ranking i metryki wyszukiwania
4.2. Ręczna ocena fragmentów i kontekstu
ENHANCER+ · Moduł 6 · Ewaluacja RAG · Podrozdział
Metryka oparta na identyfikatorach jest szybka, ale nie rozumie treści. Ręczna ocena odpowiada na pytanie, dlaczego dany fragment pomaga albo przeszkadza. Przeczytaj wszystkie pozycje top-k, także odrzucone przez próg. Inaczej nie ustalisz, czy filtr usunął szum, czy ważny dowód.
Pięć klas przydatności
| Klasa | Jak rozpoznać | Przykład dla pytania o nieudane uruchomienie |
|---|---|---|
| relevant | Zawiera wymagany fakt | Przywrócenie zatwierdzonej kopii i zgłoszenie administratorowi |
| supporting | Uzupełnia temat, lecz nie jest wymaganym dowodem | Dodatkowa informacja diagnostyczna, jeśli kontrakt jej nie wymaga |
| topical_insufficient | Ten sam temat, brak potrzebnego kroku | Zwykły restart bez postępowania po niepowodzeniu |
| irrelevant | Nie wnosi informacji do zadania | Tekst kontrolny polskich znaków |
| conflicting_or_outdated | Jest sprzeczny lub dotyczy innej obowiązującej wersji | Nieaktualna procedura przecząca aktualnej instrukcji |
Ostatni przykład opisuje klasę, a nie dodatkowy dokument w dostarczonym korpusie. Nie wymyślaj nieaktualnego źródła w wynikach. Jeżeli budujesz kontrolowany przykład sprzeczności, nadaj mu osobną etykietę demonstracyjną.
Zapis klasyfikacji może mieć postać dodatkowego pliku chunk_reviews.jsonl: result_id, pozycja, chunk_id, klasa i uzasadnienie. Ten plik uzupełnia ocenę całego kontekstu. Uzasadnienie powinno wymieniać konkretny obecny albo brakujący fakt, np. „brak instrukcji przywrócenia kopii”, zamiast „fragment słaby”.
Rubryka kontekstu
| Kryterium | 0 | 1 | 2 |
|---|---|---|---|
| trafnosc | Większość poza zadaniem | Wynik mieszany | Fragmenty odpowiadają na pytanie |
| pokrycie | Brak kluczowych faktów | Część faktów | Wszystkie fakty wymagane kontraktem |
| wystarczalnosc | Konieczne istotne domysły | Drobne braki | Odpowiedź możliwa wprost ze źródeł |
| niski_szum | Dominują zbędne treści | Część treści zbędna | Prawie cały kontekst użyteczny |
| spojnosc | Sprzeczne fragmenty | Niejasne wersje lub warunki | Brak sprzeczności |
| identyfikowalnosc | Brak identyfikatorów | Metadane częściowe | Źródła i lokalizacje można odtworzyć |
Każde kryterium opisuje inny aspekt. Kontekst może mieć pełne metadane i niskie pokrycie. W przykładzie T004 można uzasadnić profil 1, 0, 0, 1, 2, 2: część treści jest tematycznie związana, kluczowej procedury brak, występuje szum, ale nie ma jawnej sprzeczności i źródła są identyfikowalne. Jest to propozycja kalibracji, nie automatyczny wynik programu.
N/D oraz ocena jeszcze niewypełniona
W tekście używamy N/D, w JSON "ND". Wartość null w formularzu oznacza, że człowiek jeszcze nie wystawił oceny. Nie jest synonimem N/D ani zera. O tym, które kryterium dotyczy testu, decyduje kontrakt w applicable_criteria.context, a nie wygoda oceniającego po zobaczeniu wyniku.
W pakiecie przypadki bez oczekiwanych źródeł mają pustą listę właściwych kryteriów kontekstu. Możesz mimo tego zapisać klasyfikację fragmentów i obserwację o pozornej podstawie odpowiedzi. Jeśli chcesz nadać im liczbową rubrykę, zdefiniuj taką regułę przed pomiarem i nadaj nową wersję kontraktu.
Utwórz formularz, a potem go uzupełnij
Notebook warsztatu · przykład wywołania
chosen = [r for r in retrieval_results
if r['test_id'] in ('M6-T001', 'M6-T004', 'M6-T020')]
context_drafts = [
ref.review_template(r, contracts[(r['test_id'], r['turn_id'])], 'context')
for r in chosen
]
draft_path = E / 'retrieval_reviews_draft.json'
if not draft_path.exists():
ref.save_json(draft_path, context_drafts)
else:
saved_ids = {v['result_id'] for v in ref.read_json(draft_path)}
assert saved_ids == {r['result_id'] for r in chosen}, (
'Formularz dotyczy innego przebiegu. Zachowaj go i wybierz właściwe wyniki.')
# Otwórz plik i uzupełnij oceny, autora, uzasadnienia oraz decyzję.
SAVE_CONTEXT_REVIEWS = False
if SAVE_CONTEXT_REVIEWS:
by_id = {r['result_id']: r for r in retrieval_results}
for review in ref.read_json(E / 'retrieval_reviews_draft.json'):
r = by_id[review['result_id']]
ref.save_review(E / 'retrieval_reviews.jsonl', review, r,
contracts[(r['test_id'], r['turn_id'])])
Ponowne wykonanie komórki nie nadpisuje istniejącego formularza. Jeśli uruchomisz nową serię R3, identyfikatory się zmienią: zachowaj poprzednią pracę i użyj nowego katalogu albo wróć do wyników właściwego przebiegu.
Szablon nie wpisuje sam ocen 2. Wybierz minimum trzy różne konteksty, np. T001, T004 i T020. Dla każdego oceń wszystkie właściwe kryteria, uzasadnij N/D, sprawdź warunki krytyczne i nadaj verdict. Nie oznaczaj jako ukończonego formularza, który nadal zawiera null lub pusty komentarz.
Funkcja pakietowa save_review kontroluje spójność formularza. W R4 zbudujesz własną dodatkową kontrolę rodzaju wyniku. Wyniki i recenzje połączysz przez result_id oraz zgodny contract_hash. Plik retrieval_results.jsonl jest odtwarzalnym widokiem tego połączenia. Surowe retrieval_runs.jsonl pozostają bez zmian.
Małe zadanie kalibracyjne
Oceń dwa konteksty: pierwszy zawiera tylko wymaganą procedurę, drugi tę samą procedurę i trzy długie fragmenty poboczne. Wyjaśnij, dlaczego pokrycie może pozostać równe 2, a niski szum spaść. Następnie porównaj oceny z drugą osobą. Różnicę rozstrzygnij przez wskazanie konkretnych zdań, a nie przez uśrednienie dwóch liczb bez dyskusji.
Lokalne chatboty, agenci i systemy RAG z własną bazą wiedzy · Moduł 6 · Wydanie 29.09.2026