Hatalı Çıktıları Doğrulama ve Yeniden Deneme
Çıkarılan verileri iş kurallarına göre denetleyen bir doğrulama katmanı uygulayın; doğrulama başarısız olduğunda düzeltici geri bildirimle otomatik olarak yeniden deneyin ve başarısızlık örüntülerini günlüğe kaydedin.
Hatalı Çıktıları Doğrulama ve Yeniden Deneme, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.
LLM Çıktılarının Neden Doğrulanması Gerekir
Yapılandırılmış çıktılar ve Pydantic şemaları kullanılsa bile LLM ile bilgi çıkarma, söz dizimi açısından geçerli ancak anlam bakımından yanlış çıktılar üretebilir. 1.5'lik bir güven puanı (0-1 aralığının dışında), -99.99 fiyatı, ayrıştırılamayan bir tarih dizesi veya harfler içeren bir telefon numarası — bunların tümü JSON ayrıştırmasından geçer ancak iş kurallarınıza takılır.
Doğrulama, bilgi çıkarmadan ayrı bir konudur. Bilgi çıkarma şu soruyu sorar: "Yapılandırılmış veri elde ettik mi?" Doğrulama ise şu soruyu sorar: "Yapılandırılmış veri doğru ve kullanılabilir mi?" Üretim kalitesinde bir iş akışı için her iki katman da gereklidir. Bunu iki aşamalı bir filtre gibi düşünün: LLM bilgiyi çıkarır, doğrulayıcınız kabul eder veya reddeder.
Doğrulama Katmanları
Sağlam bir çıktı doğrulama sistemi birden fazla düzeyde çalışır:
- Şema doğrulaması (Pydantic): doğru alan türleri, gerekli alanların mevcut olması, numaralandırmaların izin verilen değerlerle eşleşmesi — yapılandırılmış çıktılar tarafından otomatik olarak gerçekleştirilir
- Biçim doğrulaması: telefon numaralarının bir düzenli ifadeyle eşleşmesi, e-postaların geçerli olması, tarihlerin ayrıştırılabilmesi ve tutarların gerçekçi aralıklarda olması
- İş mantığı doğrulaması: fatura toplamının satır kalemleri toplamına eşit olması, bitiş tarihinin başlangıç tarihinden sonra olması ve miktarın pozitif bir tam sayı olması
- Alanlar arası doğrulama: Bir alanın değerinin başka bir alanın değerine bağlı olması (ör. indirim yüzdesinin 100'ü aşamaması)
- Anlamsal doğrulama: Çıkarılan şirket adının veritabanınızdaki bilinen bir şirketle eşleşmesi
Biçim Denetimleri İçin Pydantic Doğrulayıcıları
Pydantic'in field_validator dekoratörü, model örneklendirildiğinde çalışan özel doğrulama mantığı eklemenizi sağlar. Bunu telefon numaraları ve e-postalar için düzenli ifade doğrulaması, tarih ayrıştırma ve sayısal alanlarda aralık denetimleri gibi biçim düzeyindeki denetimler için kullanın.
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)Düzeltici Geri Bildirimle Yeniden Deneme Örüntüsü
Doğrulama başarısız olduğunda en etkili kurtarma stratejisi düzeltici geri bildirimle yeniden denemedir: Doğrulama hata mesajını bağlam olarak modele geri gönderin, neyin yanlış gittiğini açıklayın ve yalnızca başarısız olan alanları düzeltmesini isteyin. Böylece model, çıktısını körlemesine yeniden denemek yerine düzeltmek için ihtiyaç duyduğu bilgiyi elde eder.
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...')İş Mantığı Doğrulaması
İş mantığı doğrulaması, birden fazla alana yayılan veya harici veri kaynaklarına bağlı olan özellikleri denetler. Pydantic'in model_validator doğrulayıcısı tüm alan düzeyindeki doğrulayıcılardan sonra çalışır ve tamamen doldurulmuş modele erişebilir; bu da onu alanlar arası denetimler için doğru yer hâline getirir.
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 selfDoğrulama Başarısızlıklarını Günlüğe Kaydetme
Her doğrulama başarısızlığı, iş akışınızın nerede aksadığına dair bir işarettir. Her başarısızlığı şu bilgilerle kaydedin: giriş metni (gizlilik için metnin bir özeti de olabilir), çıkarılan çıktı, belirli doğrulama hatası ve deneme numarası. Sistematik örüntüleri belirlemek için bu günlükleri bir araya getirin — Model sürekli olarak bir alanı yanlış mı alıyor? Başarısızlıklara neden olan bir belge sınıfı mı var? Bu veriler, hedefli istem iyileştirmelerine yön verir.
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 logicGüven Puanları ve Eşikler
Bilgi çıkarma şemanıza bir confidence alanı ekleyin ve modelden her çıkarım için güvenini 0 ile 1 arasında derecelendirmesini isteyin. Ardından güvene dayalı iş kuralları uygulayın: yüksek güvenli çıkarımlar doğrudan veritabanınıza gider, orta güvenli çıkarımlar örnekleme yoluyla denetlenmek üzere işaretlenir ve düşük güvenli çıkarımlar insan inceleme kuyruğuna gönderilir.
Bu olasılıksal yaklaşım, LLM'den %100 doğruluk beklemekten çok daha pratiktir — var olmadığını varsaymak yerine iş akışınızı belirsizliği zarif biçimde ele alacak şekilde tasarlarsınız.
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}'Yeniden Denemeler Başarısız Olduğunda Geri Dönüş Stratejileri
Tüm yeniden denemeler tükendiğinde ve doğrulama hâlâ başarısız olduğunda bir geri dönüş stratejisine ihtiyacınız vardır. Tercih sırasına göre seçenekler:
- Kısmi sonuç: Doğrulanan alanları döndürün ve başarısız alanları boş olarak işaretleyin
- İnsan inceleme kuyruğu: Özellikle yüksek değerli belgeler için belgeyi elle incelenmek üzere bir kuyruğa ekleyin
- Daha düşük ayrıntı düzeyinde bilgi çıkarma: Daha az alan isteyen daha basit bir şemaya geçin; sağlamlık karşılığında daha az yapı kabul edin
- Ham metin depolama: Bilgi çıkarma iş akışınızı iyileştirdiğinizde daha sonra yeniden işlemek üzere özgün metni meta verilerle birlikte depolayın
Belgeyi hiçbir zaman sessizce atmayın. Başarısızlığı her zaman günlüğe kaydedin ve belgeye yeniden dönebileceğinizden emin olun.
Harici Verilere Karşı Anlamsal Doğrulama
Bazı doğrulama kuralları, Pydantic doğrulayıcılarının içinde gerçekleştirilemeyen harici veri sorguları gerektirir. Örneğin, çıkarılan şirket adının CRM sisteminizde bulunup bulunmadığını veya çıkarılan ürün SKU'sunun envanterinizde mevcut olup olmadığını kontrol etmek buna örnektir. Bu kontroller, Pydantic doğrulaması başarılı olduktan sonra çalışan çıkarma sonrası doğrulama adımında yapılmalıdır.
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')Doğrulama İşlem Hattınızı Test Etme
Doğrulama mantığınızun, çıkarma testlerinden ayrı kendi test paketine ihtiyacı vardır. Bilinen hatalı çıktıları doğrulayıcılarınıza veren ve doğru hataların oluşturulduğunu doğrulayan birim testleri yazın. Sınır durumlarını test edin: sınır değerlerindeki tutarlar, alışılmadık biçimlerdeki tarihler, beklenmeyen boşluklar içeren alanlar ve sayı yerine sayısal dizeler olan alanlar.
Bu doğrulama test paketi, herhangi bir API çağrısı olmadan çalışır; bu nedenle her kod değişikliğinde çalıştırılması hızlı ve düşük maliyetlidir. Ayrıca doğrulama kurallarınızın en iyi belgesidir; test durumları, işlem hattınızın uyguladığı her biçimi ve iş kuralı kısıtını açıkça ortaya koyar.
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()Örüntü Hatalarını İnceleme ve İstem Ayarlama
Çıkarma işlem hattınızı gerçek belgelerden oluşan bir örneklem üzerinde çalıştırıp doğrulama hatalarını inceledikten sonra, muhtemelen hataların %80'inin az sayıda temel nedeni paylaştığını göreceksiniz. Yaygın nedenler şunlardır: modelin belirli bir yerel ayardaki tarihleri sürekli olarak yanlış biçimlendirmesi, vergi tutarını toplam tutarla karıştırması veya doğrulayıcınız kısa çizgi beklerken kısa çizgisiz telefon numaraları üretmesi.
Tekrarlanan her hata örüntüsü için, bu hatayı önleyen belirli bir örnek ve kısıt içerecek şekilde çıkarma isteminizi güncelleyin. Güncellemeden sonra, düzeltmenin diğer durumlarda gerilemeye yol açmadan doğruluğu artırdığını doğrulamak için tüm test kümenizi yeniden çalıştırın. Bu yinelemeli istem oluşturma ve ardından değerlendirme döngüsü, üretim çıkarma işlem hatlarının gerçek dünya verilerinde %95'in üzerinde doğruluğa ulaşmasını sağlar.
Hızlı Kontrol
Bu dersteki Yapay Zekâ Mühendisliği kavramlarını anlayıp anlamadığınızı test edin.
Ders Özeti
Bu derste şunları öğrendiniz: doğrulama birden çok katmanda çalışır — şema, biçim, iş mantığı ve anlamsal katmanlar — ve her biri farklı uygulama yaklaşımları gerektirir, düzeltici geri bildirim içeren yeniden deneme, çıktısını verimli biçimde düzeltmesi için modele belirli hata bağlamı sağlar ve güven puanları, çıkarma kesinliğine göre otomatik onay, örneklemeli kontrol veya insan incelemesi kuyruklarına olasılıksal yönlendirme yapılmasını sağlar. Yapılandırılmış Çıktı ve JSON Modu kursunu artık tamamladınız. Sırada, her RAG sisteminin temelini oluşturan vektör gömmelerini inceleyeceğiz.
Sıkça Sorulan Sorular
“Hatalı Çıktıları Doğrulama ve Yeniden Deneme” dersi ücretsiz mi?
Evet — “Hatalı Çıktıları Doğrulama ve Yeniden Deneme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.
“Hatalı Çıktıları Doğrulama ve Yeniden Deneme” dersinde ne öğreneceğim?
Çıkarılan verileri iş kurallarına göre denetleyen bir doğrulama katmanı uygulayın; doğrulama başarısız olduğunda düzeltici geri bildirimle otomatik olarak yeniden deneyin ve başarısızlık örüntülerini… AI Engineering Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Hatalı Çıktıları Doğrulama ve Yeniden Deneme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Engineering Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Engineering Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- JSON Modu ve response_format
- Pydantic ile Yapılandırılmış Çıktılar
- Yapılandırılmamış Metinden Veri Çıkarma
- Hatalı Çıktıları Doğrulama ve Yeniden Deneme