Diagnozowanie nieoczekiwanych wyników
Klasyfikuj tryby awarii: błędna odpowiedź, błędny format, odejście od tematu i halucynacja.
Diagnozowanie nieoczekiwanych wyników to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Prompt Engineering, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.
Gdy prompty zawodzą
Nawet starannie przygotowane prompty mogą prowadzić do błędnych wyników. Diagnozowanie problemów wymaga taksonomii — klasyfikacji rodzaju występującego błędu. Bez takiej klasyfikacji debugowanie opiera się na zgadywaniu. Cztery główne kategorie błędów to: błędna odpowiedź, nieprawidłowy format, odpowiedź nie na temat i halucynacja.
Typ błędu 1: Błędna odpowiedź
Błędna odpowiedź to błąd faktyczny — model udzielił odpowiedzi w prawidłowym formacie i na właściwy temat, ale jej treść jest niepoprawna.
Przykłady: daty, statystyki, nazwiska, kod zawierający błąd logiczny. Jest to najtrudniejszy błąd do automatycznego wykrycia, ponieważ wynik na pierwszy rzut oka wygląda poprawnie.
- Przyczyna: data graniczna danych treningowych, rzadki fakt lub błąd wieloetapowego rozumowania
- Wykrywanie: porównanie z prawidłową odpowiedzią, weryfikacja przez człowieka lub wywołanie LLM weryfikujące
# Example: wrong answer failure
prompt = 'What year was Python first released?'
response = 'Python was first released in 1994.' # Wrong — it was 1991
# Ground truth check
GROUND_TRUTH = '1991'
correct = GROUND_TRUTH in response
print(f'Correct: {correct}') # FalseTyp błędu 2: Nieprawidłowy format
Błąd nieprawidłowego formatu występuje, gdy model odpowiedział na właściwe pytanie, podając właściwe informacje, ale zignorował instrukcję dotyczącą formatowania.
Przykłady: zwrócenie zwykłego tekstu, gdy wymagany był JSON, dodanie markdownu, gdy wymagany był zwykły tekst, zwrócenie listy, gdy oczekiwano pojedynczej wartości.
- Przyczyna: instrukcja dotycząca formatowania ukryta w długim prompcie, sprzeczne instrukcje, ignorowanie przez model instrukcji o niskim priorytecie
- Wykrywanie: błąd parsowania JSON, niezgodność z wyrażeniem regularnym, niepowodzenie walidacji schematu
import json
response_text = 'Sure! Here is the result: {"name": "Alice", "age": 30}'
try:
data = json.loads(response_text)
print('Format OK:', data)
except json.JSONDecodeError as e:
print(f'FORMAT FAILURE: {e}')
# 'Sure! Here is the result:' prefix broke JSON parsingTyp błędu 3: Odpowiedź nie na temat
Błąd odpowiedzi nie na temat oznacza, że model odpowiedział na inne pytanie niż zadane. Odpowiedź może być faktycznie poprawna i mieć właściwy format, ale nie odnosi się do rzeczywistej intencji użytkownika.
Przykłady: prośba o funkcję w Pythonie, a otrzymanie funkcji w JavaScript; prośba o odpowiedź w jednym wierszu, a otrzymanie pełnego eseju; prośba o naprawienie błędu, a otrzymanie wyjaśnienia błędu zamiast poprawki.
- Przyczyna: niejednoznaczna instrukcja, sprzeczny kontekst, odejście od zadania w długich rozmowach
# Off-topic example
prompt = 'Write a Python function that reverses a list.'
response = '''
In JavaScript, you can reverse an array like this:
const reversed = arr.reverse();
'''
# Detection: check that output contains the correct language keyword
def check_language(response, expected_lang='def '):
if expected_lang not in response:
print(f'OFF-TOPIC FAILURE: expected {expected_lang} in response')
return False
return True
check_language(response) # False — no Python defTyp błędu 4: Halucynacja
Halucynacja to najniebezpieczniejszy błąd: model wymyśla fakty, które nie istnieją. Takie informacje wyglądają wiarygodnie i są przedstawiane z pewnością siebie, przez co trudno je zauważyć.
Przykłady: sfabrykowane cytowania (tytuł publikacji brzmi wiarygodnie, ale publikacja nie istnieje), wymyślone punkty końcowe API, fałszywe statystyki, nieistniejące osoby.
- Przyczyna: model wypełnia luki w wiedzy wiarygodnym tekstem dopasowanym do wzorców
- Wykrywanie: sprawdzenie faktów w wiarygodnych źródłach, porównanie cytowań z innymi źródłami, przetestowanie wywołań API
# Hallucination detection via external verification
import requests
def verify_doi(doi):
url = f'https://doi.org/{doi}'
resp = requests.head(url, allow_redirects=True, timeout=5)
return resp.status_code == 200
# Model claimed this paper exists:
fabricated_doi = '10.1234/fake.paper.2023.99999'
if not verify_doi(fabricated_doi):
print('HALLUCINATION DETECTED: DOI does not exist')Taksonomia błędów w praktyce
Po zaobserwowaniu błędu należy najpierw go sklasyfikować, a dopiero potem próbować go naprawić. Typ błędu określa strategię naprawy:
- Błędna odpowiedź: dodać kontekst, użyć wyszukiwania lub przełączyć się na bardziej zaawansowany model
- Nieprawidłowy format: wzmocnić instrukcję dotyczącą formatu, dodać przykłady wyników, użyć ustrukturyzowanych danych wyjściowych / wywoływania funkcji
- Odpowiedź nie na temat: przepisać instrukcję tak, aby była bardziej szczegółowa, uprościć prompt
- Halucynacja: dodać kontekst oparty na źródłach, poinstruować model, aby odpowiadał „Nie wiem”, włączyć cytowania
Ustrukturyzowane rejestrowanie błędów
Każdy błąd należy rejestrować wraz z jego klasyfikacją. Z czasem pojawiają się wzorce: określona sekcja promptu powoduje większość błędów formatu albo konkretny temat wywołuje częste halucynacje. Ustrukturyzowane logi umożliwiają debugowanie oparte na danych.
import json
from datetime import datetime
def log_failure(prompt, response, failure_type, details=''):
entry = {
'timestamp': datetime.utcnow().isoformat(),
'failure_type': failure_type, # wrong_answer | wrong_format | off_topic | hallucination
'prompt_hash': hash(prompt),
'response_snippet': response[:200],
'details': details
}
with open('prompt_failures.jsonl', 'a') as f:
f.write(json.dumps(entry) + '\n')
log_failure(
prompt=my_prompt,
response=bad_response,
failure_type='wrong_format',
details='JSON prefix text broke parsing'
)Automatyczna klasyfikacja błędów
W testach na dużą skalę można użyć wywołania LLM pełniącego funkcję klasyfikatora, aby automatycznie oznaczać każdą odpowiedź typem błędu. Umożliwia to wsadową ocenę setek przypadków testowych.
def classify_failure(prompt, expected, actual):
classification_prompt = (
f'You are a QA evaluator for LLM outputs.\n'
f'Prompt: {prompt}\n'
f'Expected behavior: {expected}\n'
f'Actual output: {actual}\n\n'
'Classify the failure as one of: CORRECT, WRONG_ANSWER, WRONG_FORMAT, OFF_TOPIC, HALLUCINATION.\n'
'Reply with only the label.'
)
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': classification_prompt}]
)
return resp.choices[0].message.content.strip()Macierz ważności
Nie wszystkie błędy mają taki sam wpływ. Macierz ważności pomaga ustalać priorytety napraw:
- Halucynacja w kontekście medycznym lub prawnym: krytyczna — naprawić natychmiast
- Nieprawidłowy format w narzędziu wewnętrznym: wysoka — uniemożliwia dalsze parsowanie
- Błędna odpowiedź w rzadkim przypadku brzegowym: średnia — monitorować częstotliwość
- Odpowiedź nie na temat przy niejednoznacznym wejściu: niska — akceptowalna, jeśli występuje rzadko
Należy śledzić tygodniowe wskaźniki błędów każdego typu. Nagły wzrost w dowolnej kategorii sygnalizuje regresję wymagającą uwagi.
Tworzenie pulpitu błędów
Prosty pulpit błędów odczytuje dziennik błędów i przedstawia liczbę błędów według typu oraz sekcji promptu:
import json
from collections import Counter
def failure_report(log_path='prompt_failures.jsonl'):
entries = []
with open(log_path) as f:
for line in f:
entries.append(json.loads(line))
counts = Counter(e['failure_type'] for e in entries)
total = len(entries)
print(f'Total failures: {total}')
for ftype, count in counts.most_common():
pct = 100 * count / total
print(f' {ftype}: {count} ({pct:.1f}%)')
failure_report()Proaktywne zapobieganie błędom
Strategie proaktywne ograniczające występowanie poszczególnych typów błędów:
- Błędna odpowiedź: podać w prompcie tekst źródłowy (RAG), poprosić model o wskazanie źródła
- Nieprawidłowy format: użyć trybu JSON lub wywoływania funkcji, podać w prompcie przykład formatu
- Odpowiedź nie na temat: umieścić zadanie w pierwszym zdaniu, unikać długich wstępów rozmywających intencję
- Halucynacja: poinstruować model: „Korzystaj wyłącznie z informacji podanych poniżej”, dodać: „Jeśli nie masz pewności, powiedz: «Nie wiem»”
Sprawdzenie wiedzy
Jaki typ błędu występuje, gdy model wymyśla nieistniejące fakty, na przykład fabrykuje cytowanie lub nieistniejący punkt końcowy API?
Powtórzenie: diagnozowanie nieoczekiwanych wyników
Cztery typy błędów LLM i ich najważniejsze cechy:
- Błędna odpowiedź: prawidłowy format, właściwy temat, niepoprawna treść — sprawdzić fakty względem prawidłowej odpowiedzi
- Nieprawidłowy format: poprawna treść, zignorowana instrukcja dotycząca formatu — wykrywane przez walidację schematu
- Odpowiedź nie na temat: prawidłowy format, odpowiedź na inne pytanie — sprawdzić zgodność języka i zadania
- Halucynacja: wymyślone fakty — zweryfikować w zewnętrznych źródłach
Należy rejestrować i klasyfikować każdy błąd. Warto śledzić wskaźniki poszczególnych typów w czasie. Następna lekcja: analiza przyczyn źródłowych w celu ustalenia, która część promptu spowodowała błąd.
Często zadawane pytania
Czy lekcja „Diagnozowanie nieoczekiwanych wyników” jest bezpłatna?
Tak — pełny tekst „Diagnozowanie nieoczekiwanych wyników” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Prompt Engineering, przejdź na CoddyKit PRO. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.
Co nauczysz się w „Diagnozowanie nieoczekiwanych wyników”?
Klasyfikuj tryby awarii: błędna odpowiedź, błędny format, odejście od tematu i halucynacja. Ćwiczysz AI Prompt Engineering z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Prompt Engineering?
Nie wymagamy żadnego doświadczenia. AI Prompt Engineering w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Diagnozowanie nieoczekiwanych wyników”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Prompt Engineering?
Tak. Każda lekcja AI Prompt Engineering zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Diagnozowanie nieoczekiwanych wyników
- Analiza przyczyn źródłowych promptów
- Systematyczne podejście do debugowania
- Strategie logowania i dokumentowania