0Pricing
AI Engineering Academy · Pelajaran

Memvalidasi dan Mencoba Ulang Keluaran yang Buruk

Terapkan lapisan validasi yang memeriksa data hasil ekstraksi berdasarkan aturan bisnis, secara otomatis mencoba ulang dengan umpan balik korektif saat validasi gagal, serta mencatat pola kegagalan.

Memvalidasi dan Mencoba Ulang Keluaran yang Buruk adalah pelajaran AI Engineering Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.

Mengapa Keluaran LLM Memerlukan Validasi

Bahkan dengan keluaran terstruktur dan skema Pydantic, ekstraksi LLM dapat menghasilkan keluaran yang valid secara sintaksis tetapi salah secara semantik. Skor keyakinan 1.5 (di luar rentang 0-1), harga -99.99, string tanggal yang tidak dapat diuraikan, atau nomor telepon yang mengandung huruf—semuanya lolos penguraian JSON tetapi melanggar aturan bisnis Anda.

Validasi merupakan hal yang terpisah dari ekstraksi. Ekstraksi bertanya: 'Apakah kita mendapatkan data terstruktur?' Validasi bertanya: 'Apakah data terstruktur tersebut benar dan dapat digunakan?' Kedua lapisan diperlukan untuk alur bermutu produksi. Anggaplah ini sebagai penyaring dua tahap: LLM mengekstrak, validator Anda menerima atau menolak.

Lapisan-Lapisan Validasi

Sistem validasi keluaran yang tangguh beroperasi pada beberapa tingkat:

  1. Validasi skema (Pydantic): jenis bidang yang benar, bidang wajib tersedia, enumerasi sesuai dengan nilai yang diizinkan—ditangani secara otomatis oleh keluaran terstruktur
  2. Validasi format: nomor telepon sesuai dengan regex, email valid, tanggal dapat diuraikan, jumlah berada dalam rentang yang realistis
  3. Validasi logika bisnis: total faktur sama dengan jumlah item baris, tanggal akhir setelah tanggal mulai, kuantitas berupa bilangan bulat positif
  4. Validasi lintas bidang: nilai suatu bidang bergantung pada nilai bidang lain (misalnya, persentase diskon tidak boleh melebihi 100)
  5. Validasi semantik: nama perusahaan yang diekstrak cocok dengan perusahaan yang dikenal dalam basis data Anda

Validator Pydantic untuk Pemeriksaan Format

Dekorator Pydantic field_validator memungkinkan Anda menambahkan logika validasi khusus yang dijalankan saat model dibuat. Gunakan ini untuk pemeriksaan tingkat format seperti validasi regex pada nomor telepon dan email, penguraian tanggal, serta pemeriksaan rentang pada bidang numerik.

from pydantic import BaseModel, Field, field_validator
from typing import Optional
import re
from datetime import datetime

class ExtractedInvoice(BaseModel):
    vendor: str
    invoice_number: Optional[str]
    amount: float = Field(gt=0, description='Must be positive')
    currency: str = Field(min_length=3, max_length=3)
    invoice_date: str

    @field_validator('currency')
    @classmethod
    def currency_must_be_uppercase(cls, v):
        return v.upper()

    @field_validator('invoice_date')
    @classmethod
    def parse_date(cls, v):
        # Try to parse common date formats
        for fmt in ('%Y-%m-%d', '%d/%m/%Y', '%m/%d/%Y', '%B %d, %Y'):
            try:
                datetime.strptime(v, fmt)
                return v
            except ValueError:
                continue
        raise ValueError(f'Cannot parse date: {v}')

    @field_validator('amount')
    @classmethod
    def reasonable_amount(cls, v):
        if v > 10_000_000:
            raise ValueError(f'Amount {v} seems unreasonably large. Flag for review.')
        return round(v, 2)

Pola Percobaan Ulang dengan Umpan Balik Korektif

Ketika validasi gagal, strategi pemulihan yang paling efektif adalah percobaan ulang dengan umpan balik korektif: kirim pesan kesalahan validasi kembali ke model sebagai konteks, jelaskan hal yang salah, dan minta model memperbaiki hanya bidang yang gagal. Dengan demikian, model memperoleh informasi yang diperlukan untuk memperbaiki keluarannya, bukan sekadar mencoba ulang tanpa arahan.

import openai
from pydantic import BaseModel, ValidationError, Field

client = openai.OpenAI()

class PriceExtraction(BaseModel):
    product: str
    price_usd: float = Field(gt=0, lt=100000)
    quantity: int = Field(ge=1)

def extract_with_retry(text: str, max_retries: int = 3) -> PriceExtraction:
    messages = [
        {'role': 'system', 'content': 'Extract product pricing information.'},
        {'role': 'user', 'content': text}
    ]

    for attempt in range(max_retries):
        result = client.beta.chat.completions.parse(
            model='gpt-4o-mini',
            messages=messages,
            response_format=PriceExtraction
        )
        msg = result.choices[0].message
        if msg.refusal:
            raise ValueError(f'Model refused: {msg.refusal}')

        try:
            return msg.parsed  # Pydantic validates on parse
        except ValidationError as e:
            if attempt == max_retries - 1:
                raise
            # Add corrective feedback for the next attempt
            messages.append({'role': 'assistant', 'content': msg.content})
            messages.append({'role': 'user', 'content': f'The previous extraction failed validation: {e}\nPlease correct and try again.'})
            print(f'Attempt {attempt+1} failed. Retrying with feedback...')

Validasi Logika Bisnis

Validasi logika bisnis memeriksa properti yang mencakup beberapa bidang atau bergantung pada sumber data eksternal. model_validator milik Pydantic dijalankan setelah semua validator tingkat bidang dan dapat mengakses model yang telah terisi sepenuhnya, sehingga tepat digunakan untuk pemeriksaan lintas bidang.

from pydantic import BaseModel, Field, model_validator
from typing import List

class LineItem(BaseModel):
    description: str
    quantity: int = Field(ge=1)
    unit_price: float = Field(ge=0)
    line_total: float

    @model_validator(mode='after')
    def check_line_total(self):
        expected = round(self.quantity * self.unit_price, 2)
        actual = round(self.line_total, 2)
        if abs(expected - actual) > 0.02:  # Allow 2-cent rounding tolerance
            raise ValueError(
                f'Line total {actual} does not match quantity*price={expected}'
            )
        return self

class Invoice(BaseModel):
    line_items: List[LineItem]
    subtotal: float
    tax: float
    total: float

    @model_validator(mode='after')
    def check_invoice_total(self):
        expected_total = round(self.subtotal + self.tax, 2)
        if abs(expected_total - round(self.total, 2)) > 0.02:
            raise ValueError(
                f'Invoice total {self.total} != subtotal+tax ({expected_total})'
            )
        return self

Mencatat Kegagalan Validasi

Setiap kegagalan validasi merupakan sinyal tentang bagian alur Anda yang mengalami masalah. Catat setiap kegagalan dengan: teks masukan (atau hash-nya untuk menjaga privasi), keluaran hasil ekstraksi, kesalahan validasi yang spesifik, dan nomor percobaan. Gabungkan catatan ini untuk mengidentifikasi pola sistematis—apakah model terus-menerus salah pada satu bidang? Apakah ada golongan dokumen yang menyebabkan kegagalan? Data ini mendorong perbaikan prompt yang terarah.

import logging
from pydantic import ValidationError

logger = logging.getLogger(__name__)

def extract_with_logging(text: str, doc_id: str) -> dict:
    result = None
    for attempt in range(3):
        try:
            result = run_extraction(text)  # Your extraction function
            logger.info('Extraction success', extra={
                'doc_id': doc_id,
                'attempt': attempt + 1
            })
            return result
        except ValidationError as e:
            logger.warning('Validation failure', extra={
                'doc_id': doc_id,
                'attempt': attempt + 1,
                'errors': e.errors(),
                'error_count': len(e.errors())
            })
    # All retries failed
    logger.error('Extraction failed after max retries', extra={'doc_id': doc_id})
    return {'error': 'extraction_failed', 'doc_id': doc_id}

def run_extraction(text):
    pass  # Placeholder for actual extraction logic

Skor Keyakinan dan Ambang Batas

Tambahkan bidang confidence ke skema ekstraksi Anda dan instruksikan model untuk menilai keyakinannya pada setiap ekstraksi dari 0 hingga 1. Kemudian terapkan aturan bisnis berdasarkan keyakinan: hasil ekstraksi dengan keyakinan tinggi langsung dimasukkan ke basis data, hasil ekstraksi dengan keyakinan sedang ditandai untuk pemeriksaan sampel, dan hasil ekstraksi dengan keyakinan rendah dimasukkan ke antrean peninjauan manusia.

Pendekatan probabilistik ini jauh lebih praktis daripada menuntut akurasi 100% dari LLM—Anda merancang alur agar dapat menangani ketidakpastian dengan baik, bukan berpura-pura bahwa ketidakpastian tidak ada.

from pydantic import BaseModel, Field
from typing import Optional

class ExtractedWithConfidence(BaseModel):
    value: Optional[str]
    confidence: float = Field(ge=0.0, le=1.0)
    reason: Optional[str] = None  # Why confidence is low, if below threshold

class DocumentExtraction(BaseModel):
    vendor_name: ExtractedWithConfidence
    invoice_amount: ExtractedWithConfidence
    due_date: ExtractedWithConfidence

def route_by_confidence(extraction: DocumentExtraction, threshold=0.85):
    low_confidence_fields = []
    for field_name, field_val in extraction.model_dump().items():
        if isinstance(field_val, dict) and field_val.get('confidence', 1.0) < threshold:
            low_confidence_fields.append(field_name)

    if not low_confidence_fields:
        return 'auto_approve'
    elif len(low_confidence_fields) > 2:
        return 'human_review'
    else:
        return f'spot_check: {low_confidence_fields}'

Strategi Cadangan Saat Percobaan Ulang Gagal

Ketika semua percobaan ulang telah habis dan validasi masih gagal, Anda memerlukan strategi cadangan. Pilihan berdasarkan urutan preferensi:

  1. Hasil sebagian: Kembalikan bidang yang berhasil divalidasi dan tandai bidang yang gagal sebagai null
  2. Antrean peninjauan manusia: Tambahkan dokumen ke antrean untuk ditinjau secara manual, terutama dokumen bernilai tinggi
  3. Ekstraksi dengan ketelitian lebih rendah: Gunakan skema yang lebih sederhana dan meminta lebih sedikit bidang, dengan menerima struktur yang lebih sedikit demi ketangguhan
  4. Penyimpanan teks mentah: Simpan teks asli beserta metadatanya untuk diproses ulang nanti ketika alur ekstraksi Anda telah diperbaiki

Jangan pernah membuang dokumen secara diam-diam. Selalu catat kegagalannya dan pastikan Anda dapat menanganinya kembali.

Validasi Semantik terhadap Data Eksternal

Beberapa aturan validasi memerlukan pencarian data eksternal yang tidak dapat dilakukan di dalam validator Pydantic. Misalnya, memeriksa apakah nama perusahaan yang diekstrak tercantum dalam CRM Anda, atau apakah SKU produk yang diekstrak tersedia dalam inventaris Anda. Pemeriksaan ini termasuk dalam langkah validasi pasca-ekstraksi yang berjalan setelah validasi Pydantic berhasil.

from typing import Optional

# Simulated external data source
KNOWN_VENDORS = {'acme corp', 'techsupplies inc', 'globex corporation'}

def validate_against_crm(extraction: dict) -> dict:
    vendor = extraction.get('vendor', '').lower()
    warnings = []

    if vendor and vendor not in KNOWN_VENDORS:
        warnings.append({
            'field': 'vendor',
            'issue': f'Vendor "{vendor}" not found in CRM',
            'severity': 'warning'
        })
        # Optionally suggest closest match
        # from difflib import get_close_matches
        # matches = get_close_matches(vendor, KNOWN_VENDORS, n=1, cutoff=0.8)
        # if matches: warnings[-1]['suggestion'] = matches[0]

    return {
        'extraction': extraction,
        'warnings': warnings,
        'requires_review': len(warnings) > 0
    }

print('Semantic validation pattern defined')

Menguji Pipeline Validasi Anda

Logika validasi Anda memerlukan rangkaian pengujiannya sendiri, terpisah dari pengujian ekstraksi. Tulislah pengujian unit yang memasukkan keluaran yang diketahui tidak valid ke validator Anda, lalu pastikan kesalahan yang benar muncul. Ujilah kasus batas: jumlah pada nilai batas, tanggal dalam format yang tidak lazim, bidang dengan spasi kosong yang tidak terduga, serta bidang yang berisi string numerik, bukan angka.

Rangkaian pengujian validasi ini berjalan tanpa panggilan API, sehingga cepat dan murah untuk dijalankan pada setiap perubahan kode. Rangkaian ini juga merupakan dokumentasi terbaik untuk aturan validasi Anda — kasus pengujian memperjelas setiap format dan batasan bisnis yang diberlakukan pipeline Anda.

from pydantic import ValidationError

def test_extraction_validation():
    # Test cases: (input_data, should_pass)
    test_cases = [
        ({'vendor': 'ACME', 'amount': 150.00, 'currency': 'USD', 'invoice_date': '2025-01-15'}, True),
        ({'vendor': 'ACME', 'amount': -50.00, 'currency': 'USD', 'invoice_date': '2025-01-15'}, False),  # negative
        ({'vendor': 'ACME', 'amount': 150.00, 'currency': 'EURO', 'invoice_date': '2025-01-15'}, False), # 4-char
        ({'vendor': 'ACME', 'amount': 150.00, 'currency': 'USD', 'invoice_date': 'yesterday'}, False),   # bad date
    ]
    passed = failed = 0
    for data, should_pass in test_cases:
        try:
            # ExtractedInvoice(**data)  # Your Pydantic model
            if should_pass:
                passed += 1
            else:
                print(f'MISSED: Should have failed for {data}')
                failed += 1
        except (ValidationError, ValueError):
            if not should_pass:
                passed += 1
            else:
                print(f'UNEXPECTED FAIL for {data}')
                failed += 1
    print(f'Tests: {passed} passed, {failed} failed')

test_extraction_validation()

Analisis Kegagalan Pola dan Penyesuaian Prompt

Setelah menjalankan pipeline ekstraksi pada sampel dokumen nyata dan meninjau kegagalan validasi, kemungkinan besar Anda akan menemukan bahwa 80% kegagalan memiliki sejumlah kecil penyebab utama yang sama. Penyebab yang umum antara lain: model secara konsisten salah memformat tanggal dari lokal tertentu, salah membedakan jumlah pajak dan total, atau menghasilkan nomor telepon tanpa tanda hubung ketika validator Anda mengharuskan adanya tanda hubung.

Untuk setiap pola kegagalan yang berulang, perbarui prompt ekstraksi Anda dengan contoh dan batasan spesifik yang mencegah kesalahan tersebut. Setelah memperbaruinya, jalankan ulang seluruh rangkaian pengujian untuk memastikan perbaikan meningkatkan akurasi tanpa menurunkan hasil pada kasus lain. Siklus berulang antara penyesuaian prompt lalu evaluasi inilah yang membuat pipeline ekstraksi produksi mencapai akurasi lebih dari 95% pada data dunia nyata.

Pemeriksaan Cepat

Ujilah pemahaman Anda tentang konsep Rekayasa AI dari pelajaran ini.

Rangkuman Pelajaran

Dalam pelajaran ini Anda mempelajari bahwa: validasi berlangsung pada beberapa lapisan — skema, format, logika bisnis, dan semantik — yang masing-masing memerlukan pendekatan implementasi berbeda, percobaan ulang dengan umpan balik korektif memberikan konteks kesalahan yang spesifik kepada model agar model dapat memperbaiki keluarannya secara efisien, dan skor keyakinan memungkinkan perutean probabilistik ke antrean persetujuan otomatis, pemeriksaan sampel, atau peninjauan manusia berdasarkan tingkat kepastian ekstraksi. Anda telah menyelesaikan kursus Structured Output dan JSON Mode. Selanjutnya, kita akan membahas embedding vektor — fondasi setiap sistem RAG.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Memvalidasi dan Mencoba Ulang Keluaran yang Buruk” gratis?

Ya — teks lengkap “Memvalidasi dan Mencoba Ulang Keluaran yang Buruk” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Engineering Academy, upgrade ke CoddyKit PRO. Kursus AI Engineering Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Memvalidasi dan Mencoba Ulang Keluaran yang Buruk”?

Terapkan lapisan validasi yang memeriksa data hasil ekstraksi berdasarkan aturan bisnis, secara otomatis mencoba ulang dengan umpan balik korektif saat validasi gagal, serta mencatat pola kegagalan. Kamu berlatih AI Engineering Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Engineering Academy?

Tidak diperlukan pengalaman sebelumnya. AI Engineering Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Memvalidasi dan Mencoba Ulang Keluaran yang Buruk” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Engineering Academy ini?

Ya. Setiap pelajaran AI Engineering Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mode JSON dan response_format
  2. Keluaran Terstruktur dengan Pydantic
  3. Mengekstrak Data dari Teks Tidak Terstruktur
  4. Memvalidasi dan Mencoba Ulang Keluaran yang Buruk
← Kembali ke AI Engineering Academy