0Pricing
AI Prompt Engineering · Lekcja

Pętle naprawy i walidacji

Naprawianie nieprawidłowych danych wyjściowych

Pętle naprawy i walidacji to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 4 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.

Dlaczego istnieją pętle naprawcze

Nawet w przypadku użycia schematów wynik może być nieprawidłowy: obcięty JSON z powodu limitu tokenów, nieistniejące dodatkowe pola, tekst zamiast wymaganej liczby albo naruszenie reguły biznesowej. Pętla naprawcza wykrywa błąd i przekazuje go z powrotem do modelu, aby ten go poprawił.

To siatka bezpieczeństwa, która pozwala zwiększyć skuteczność z 98% do 99,9%.

Cykl walidacji i naprawy

Standardowa pętla wygląda następująco: wygenerować wynik, przeprowadzić walidację, a jeśli wynik jest nieprawidłowy — ponowić prompt z konkretnym błędem, maksymalnie określoną liczbę razy.

def generate_valid(prompt, schema, max_tries=3):
    msgs = [{'role': 'user', 'content': prompt}]
    for _ in range(max_tries):
        out = call_model(msgs)
        ok, err = validate(out, schema)
        if ok:
            return out
        msgs.append({'role': 'assistant', 'content': out})
        msgs.append({'role': 'user',
                     'content': 'Invalid. Fix this error and resend JSON only: ' + err})
    raise ValueError('repair budget exhausted')

Konkretne błędy są lepsze od ogólnych

Jakość naprawy zależy od precyzji informacji zwrotnej. „Nieprawidłowy JSON” niewiele pomaga; „Pole rating musi być liczbą całkowitą od 1 do 5, otrzymano 7” niemal zawsze pozwala naprawić problem w jednej turze.

Należy przekazywać modelowi dokładny komunikat o błędzie z walidatora, obejmujący ścieżkę i przyczynę.

def validate(obj, schema):
    v = jsonschema.Draft202012Validator(schema)
    errs = sorted(v.iter_errors(obj), key=lambda e: e.path)
    if not errs:
        return True, None
    msg = '; '.join(f"{list(e.path)}: {e.message}" for e in errs)
    return False, msg

Walidacja warstwowa

Walidacja ma kilka poziomów; należy najpierw sprawdzać te najtańsze:

  • Składniowa — czy wynik można sparsować jako JSON?
  • Strukturalna — czy wynik jest zgodny ze schematem?
  • Semantyczna — czy wartości spełniają reguły biznesowe i niezmienniki dotyczące wielu pól?

Rabat nie może przekraczać sumy częściowej, nawet jeśli obie wartości są poprawnymi liczbami; jest to kontrola semantyczna.

def semantic_ok(o):
    return o['discount'] <= o['subtotal'] and o['total'] == o['subtotal'] - o['discount']

Deterministyczne poprawki wstępne

Zanim zostanie wykonane wywołanie modelu, należy spróbować zastosować proste, deterministyczne poprawki typowych błędów:

  • Usunąć znaczniki bloków kodu Markdown.
  • Wyodrębnić najbardziej zewnętrzny obiekt JSON z otaczającego go tekstu.
  • Usunąć końcowe przecinki.

Do naprawy przez model należy przejść dopiero wtedy, gdy deterministyczne czyszczenie się nie powiedzie.

def extract_json(text):
    text = text.strip().removeprefix('json').strip()
    start, end = text.find('{'), text.rfind('}')
    if start != -1 and end != -1:
        return text[start:end + 1]
    return text

Obsługa obcięcia

Jeśli finish_reason == 'length', JSON został obcięty; naprawianie fragmentu nie ma sensu. Zamiast tego należy zwiększyć max_tokens, zmniejszyć żądany rozmiar danych albo użyć strumieniowania i poprosić o kontynuację. Należy odróżniać obcięcie od nieprawidłowego formatu, ponieważ wymagają one przeciwnych reakcji.

if resp.choices[0].finish_reason == 'length':
    # do NOT feed truncated JSON back; regenerate with more room
    return retry_with(max_tokens=resp_max * 2)

Ograniczanie pętli

Nieograniczona naprawa zwiększa koszty i opóźnienia, a zablokowany model może zapętlić się na zawsze. Należy zawsze ograniczać liczbę prób, ustalać budżet dla pojedynczego żądania i definiować rozwiązanie awaryjne: łagodne ograniczenie funkcjonalności, przekazanie sprawy do kolejki w celu weryfikacji przez człowieka albo zwrócenie bezpieślnej wartości domyślnej.

try:
    data = generate_valid(prompt, schema, max_tries=3)
except ValueError:
    log_for_review(prompt)
    data = SAFE_DEFAULT

Naprawa w wywołaniach narzędzi

W przypadku wywoływania funkcji kanałem naprawy jest wynik narzędzia. Należy zwrócić ustrukturyzowany błąd, a model sam skoryguje wynik w następnej turze — nie jest potrzebna osobna pętla.

msgs.append({'role': 'tool', 'tool_call_id': call.id,
  'content': json.dumps({'error': 'amount must be positive', 'got': args['amount']})})
# next model turn will re-issue the call with a corrected argument

Idempotencja i skutki uboczne

Gdy pętla naprawcza obejmuje działanie, a nie tylko generowanie, należy zadbać o idempotencję ponowień. Należy używać kluczy idempotencji, aby ponowione wywołanie nie spowodowało podwójnego obciążenia ani zduplikowania rekordu. Walidację należy przeprowadzać przed zatwierdzeniem skutków ubocznych, nigdy po nim.

Monitorowanie odsetka napraw

Odsetek napraw jest wczesnym wskaźnikiem jakości. Jego wzrost oznacza regresję promptu, zbyt rygorystyczny schemat albo dryf modelu. Należy rejestrować liczbę prób przypadających na sukces oraz najczęstsze ścieżki błędów i generować alerty, gdy ich wartości gwałtownie wzrosną.

metrics.histogram('llm.repair.attempts', tries)
metrics.increment('llm.repair.error', tags={'path': top_error_path})

Łączenie ograniczeń z naprawą

Najskuteczniejszy potok łączy kilka warstw zabezpieczeń: dekodowanie z ograniczeniami lub rygorystyczny tryb schematu, aby zminimalizować liczbę błędów; deterministyczne czyszczenie w przypadku tanich poprawek oraz ograniczoną pętlę naprawy przez model dla rzadkich pozostałych błędów. Żadna pojedyncza warstwa nie jest wystarczająca.

Szybki test

API zwraca wartość length w polu finish_reason, a JSON jest obcięty. Jaka jest prawidłowa reakcja?

Podsumowanie

Solidne potoki naprawcze:

  • Przeprowadzają walidację warstwowo: składniową, strukturalną i semantyczną.
  • Przekazują modelowi precyzyjne błędy dotyczące konkretnych ścieżek.
  • Przed opłaceniem wywołania modelu próbują deterministycznego czyszczenia.
  • Wykrywają obcięcie osobno i ponownie generują wynik.
  • Ograniczają liczbę prób, zapewniają idempotencję i monitorują odsetek napraw.

Ukończyli Państwo generowanie ustrukturyzowanych danych. Następny kurs: mechanizmy ochronne i walidacja wyników.

Często zadawane pytania

Czy lekcja „Pętle naprawy i walidacji” jest bezpłatna?

Tak — pełny tekst „Pętle naprawy i walidacji” 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 „Pętle naprawy i walidacji”?

Naprawianie nieprawidłowych danych wyjściowych Ć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 4 z 4.

Ile czasu zajmuje lekcja „Pętle naprawy i walidacji”?

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

  1. Dlaczego warto używać ustrukturyzowanych danych wyjściowych
  2. JSON Schema w promptach
  3. Schematy narzędzi i funkcji
  4. Pętle naprawy i walidacji
← Powrót do AI Prompt Engineering