0Pricing
AI Agents · Ders

Bilgi Doğrulama ve Halüsinasyonları Önleme

Temellendirmeye dayalı doğrulama: her iddia, getirilen bir kaynağa kadar izlenebilmelidir.

Bilgi Doğrulama ve Halüsinasyonları Önleme, CoddyKit'te ücretsiz bir AI Agents 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 Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.

Araştırma Ajanlarındaki Halüsinasyon Sorunu

LLM'ler, getirilen kaynaklarda hiçbir dayanağı olmayan ancak kulağa inandırıcı gelen iddialar oluşturabilir. Bir araştırma ajanında bu özellikle tehlikelidir; çünkü çıktı güvenilir görünür ve iddiayı gerçekten desteklemeyebilecek atıflarla sunulur.

Halüsinasyonları önlemek temel bir öncelik olmalıdır.

Kaynaklandırma: Her İddia Bir Kaynağa Dayanır

Kaynaklandırmanın temel ilkesi şudur: Nihai çıktıda yer alan her olgusal iddia, en az bir alınmış belgeye kadar izlenebilir olmalıdır. İzlenemeyen iddialar ya halüsinasyondur ya da dayanaklandırılmamıştır; araştırma raporunda her ikisi de kabul edilemez.

def check_grounding(claim: str, retrieved_docs: list[dict]) -> dict:
    doc_texts = '\n\n'.join(
        f'[DOC {i+1}] ({d["url"]})\n{d["text"][:800]}'
        for i, d in enumerate(retrieved_docs[:5])
    )
    return {
        'claim': claim,
        'docs':  doc_texts,
        'grounded': None   # to be filled by LLM verifier
    }

if __name__ == '__main__':
    docs = [{'url': 'https://example.com/geo', 'text': 'Paris is the capital of France.'}]
    result = check_grounding('Paris is the capital of France.', docs)
    print('Claim:', result['claim'])
    print('Supporting docs used:')
    print(result['docs'])

LLM Doğrulayıcı Kalıbı

Bir iddianın sağlanan kaynaklar tarafından desteklenip desteklenmediğini değerlendirmek için ayrı bir LLM çağrısı, yani “doğrulayıcı” kullanın. Bu yaklaşım, üretici ile doğrulayıcının birbirinden bağımsız çağrılar olduğu bir denetim ve denge mekanizması oluşturur.

import openai, json

client = openai.OpenAI(api_key='YOUR_OPENAI_KEY')

def verify_claim(claim: str, source_texts: list[str]) -> dict:
    sources_block = '\n---\n'.join(source_texts[:3])
    prompt = (
        f'Is the following claim directly supported by the provided sources?\n'
        f'Claim: "{claim}"\n\n'
        f'Sources:\n{sources_block}\n\n'
        f'Return JSON: {{\n'
        f'  "supported": true/false,\n'
        f'  "confidence": 0.0-1.0,\n'
        f'  "reason": "one sentence explanation"\n'
        f'}}'
    )
    resp = client.chat.completions.create(
        model='gpt-4o',
        messages=[{'role': 'user', 'content': prompt}],
        response_format={'type': 'json_object'}
    )
    return json.loads(resp.choices[0].message.content)

Güven Eşiğine Bağlı Çıktı

Doğrulayıcının güven puanı için eşikler belirleyin. 0,85'in üzerindeki iddialar yayımlanır. 0,5 ile 0,85 arasındaki iddialar bir sorumluluk reddiyle birlikte yayımlanır. 0,5'in altındaki iddialar çıkarılır.

INCLUDE_THRESHOLD  = 0.85
DISCLAIMER_THRESHOLD = 0.50

def gate_claim(claim: str, source_texts: list[str]) -> dict:
    result = verify_claim(claim, source_texts)
    conf = result.get('confidence', 0.0)
    supported = result.get('supported', False)

    if not supported or conf < DISCLAIMER_THRESHOLD:
        return {'action': 'exclude', 'claim': claim, 'reason': result.get('reason')}
    elif conf < INCLUDE_THRESHOLD:
        return {
            'action': 'include_with_disclaimer',
            'claim': f'[LOW CONFIDENCE] {claim}',
            'reason': result.get('reason')
        }
    else:
        return {'action': 'include', 'claim': claim}

Belirli Halüsinasyon Kalıplarını Yakalama

Bazı iddia kalıpları halüsinasyon açısından yüksek risk taşır: kesin istatistikler (yüzdeler, dolar tutarları), belirli tarihler, adı belirtilen kişiler ve nedensel ilişkiler. Bunları ek bir titizlikle inceleyin.

import re

def is_high_risk_claim(claim: str) -> bool:
    patterns = [
        r'\d+\.?\d*\s*%',            # percentages: 9.1%
        r'\$\s*\d+',                  # dollar amounts
        r'\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d{4}',  # dates
        r'\b[A-Z][a-z]+\s+[A-Z][a-z]+\s+(said|stated|argued|claimed)',  # named quotes
        r'(caused?|led to|resulted in)',                                  # causal claims
    ]
    return any(re.search(p, claim) for p in patterns)

print(is_high_risk_claim('Inflation hit 9.1% in June 2022'))  # True
print(is_high_risk_claim('Inflation was elevated'))            # False

Ayrıştırılmış Doğrulama Döngüsü

Uzun bölümlerde metni tek tek iddialara ayırın, her iddiayı bağımsız olarak doğrulayın, ardından bölümü yalnızca doğrulanmış iddialarla yeniden oluşturun.

def decompose_into_claims(section_text: str) -> list[str]:
    prompt = (
        f'Break this text into individual verifiable factual claims.\n'
        f'Each claim should be a single sentence containing exactly one fact.\n'
        f'Return JSON: {{"claims": ["..."]}}\n\n'
        f'TEXT:\n{section_text}'
    )
    resp = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': prompt}],
        response_format={'type': 'json_object'}
    )
    return json.loads(resp.choices[0].message.content).get('claims', [])

Doğrulanmış Metni Yeniden Oluşturma

Her iddiayı eşik denetiminden geçirdikten sonra yalnızca doğrulanmış iddialardan temiz ve tutarlı bir bölüm oluşturun. Güven düzeyi düşük olanları çıkarın ve okunabilirlik için yeniden yazın.

def reconstruct_section(verified_claims: list[str],
                        section_name: str) -> str:
    claims_text = '\n'.join(f'- {c}' for c in verified_claims)
    prompt = (
        f'Rewrite these verified facts as a coherent {section_name} section.\n'
        f'Do NOT add any new information not present in the claims.\n'
        f'Only use the facts provided.\n\n'
        f'VERIFIED CLAIMS:\n{claims_text}'
    )
    resp = client.chat.completions.create(
        model='gpt-4o',
        messages=[{'role': 'user', 'content': prompt}]
    )
    return resp.choices[0].message.content

Sayısal Sapmayı Algılama

LLM'ler bazen kaynaktaki sayıları fark edilmesi güç biçimde değiştirir (örneğin, %9,1'i %9,2 yapabilir). Hem iddia metninden hem de kaynak metninden sayıları çıkarın ve bunları açıkça karşılaştırın.

import re

def extract_numbers(text: str) -> list[float]:
    matches = re.findall(r'[-+]?\d*\.?\d+', text)
    return [float(m) for m in matches]

def check_numeric_drift(claim: str, source_text: str,
                        tolerance: float = 0.01) -> bool:
    claim_nums  = extract_numbers(claim)
    source_nums = extract_numbers(source_text)

    for cn in claim_nums:
        found_match = any(abs(cn - sn) <= tolerance for sn in source_nums)
        if not found_match:
            return True  # numeric drift detected
    return False

print(check_numeric_drift(
    'Inflation reached 9.2% in June 2022',
    'The CPI rose 9.1 percent in June 2022'
))  # True — 9.2 vs 9.1

Kaynak Atfı Denetimi

Tam raporu oluşturduktan sonra bir kaynak atfı denetimi gerçekleştirin: Rapordaki her cümlenin kaynaklardan birine dayandırılabildiğini doğrulayın. Eşleşen bir kaynak parçası olmayan cümleleri işaretleyin.

def attribution_audit(report_text: str, sources: list[dict]) -> list[str]:
    sentences = [s.strip() for s in report_text.split('.') if len(s.strip()) > 20]
    unattributed = []

    for sentence in sentences:
        found = False
        for src in sources:
            if any(word in src.get('text', '') for word in sentence.split()[:5]):
                found = True
                break
        if not found:
            unattributed.append(sentence)

    return unattributed

# Flag unattributed sentences for manual review or re-verification

if __name__ == '__main__':
    report = ("Water boils at 100 degrees Celsius at sea level. "
              "The moon is made primarily of green cheese according to this document.")
    sources = [{'text': 'Water boils at 100C (212F) at standard atmospheric pressure.'}]
    unattributed = attribution_audit(report, sources)
    print('Unattributed sentences (need manual review):')
    for s in unattributed:
        print(' -', s)

Belirsiz İddiaları İhtiyatlı İfade Etme

Her şey yüksek güven düzeyiyle doğrulanamaz. Sınırda kalan iddiaları tamamen çıkarmak yerine ihtiyatlı ifadeler kullanın: “Bazı analistler ... öne sürüyor”, “X'e göre ...”, “... bildirildi”. Bu yaklaşım, belirsizliği belirtirken bilgiyi korur.

def hedge_claim(claim: str, confidence: float) -> str:
    if confidence >= 0.85:
        return claim  # state as fact
    elif confidence >= 0.65:
        hedges = ['Some sources suggest', 'According to available evidence',
                  'Analysts have noted']
        return f'{hedges[hash(claim) % len(hedges)]}, {claim.lower()}'
    else:
        return f'It has been reported (with low confidence) that {claim.lower()}'

print(hedge_claim('Inflation peaked at 9.1%', 0.90))
print(hedge_claim('Supply chain disruptions contributed to inflation', 0.72))
print(hedge_claim('Specific policy caused inflation', 0.45))

Halüsinasyon Oranını İzleme

Halüsinasyon oranını zaman içinde izleyin: oluşturulan iddiaların yüzde kaçı doğrulamadan geçemiyor? Bir uyarı eşiği belirleyin. Oran aniden yükselirse istem tasarımınızın veya bilgi alma kalitenizin kötüleştiği anlaşılır.

verification_log = []  # In production: a database

def log_verification(claim: str, supported: bool, confidence: float):
    verification_log.append({
        'claim':      claim[:100],
        'supported':  supported,
        'confidence': confidence
    })

def hallucination_rate() -> float:
    if not verification_log:
        return 0.0
    failed = sum(1 for v in verification_log if not v['supported'])
    return failed / len(verification_log)

def check_hallucination_alert(threshold: float = 0.15):
    rate = hallucination_rate()
    if rate > threshold:
        print(f'ALERT: Hallucination rate {rate:.1%} exceeds threshold {threshold:.1%}')
    return rate

if __name__ == '__main__':
    log_verification('The sky is blue', True, 0.95)
    log_verification('The moon is made of cheese', False, 0.2)
    log_verification('Water boils at 100C at sea level', True, 0.99)
    rate = check_hallucination_alert(threshold=0.15)
    print(f'Hallucination rate so far: {rate:.1%}')

“LLM doğrulayıcı” kalıbının temel amacı nedir

LLM doğrulayıcı, halüsinasyonları önlemede önemli bir mimari kalıptır. Neyi denetlediğini ve bunun neden ayrı bir çağrı olarak gerçekleştirildiğini anlamak büyük önem taşır.

Halüsinasyonları Önleme Özeti

Halüsinasyonları şu yollarla önleyin: kaynaklandırma denetimleri (her iddia bir kaynağa dayanır), LLM doğrulayıcı (desteği ayrı bir çağrı değerlendirir), güven eşiği denetimi (eşiğin altındaki iddiaları çıkarır), sayısal sapma algılama, sınırda kalan durumlar için ihtiyatlı ifadeler ve gerilemeleri algılamak için halüsinasyon oranı izleme.

Sıkça Sorulan Sorular

“Bilgi Doğrulama ve Halüsinasyonları Önleme” dersi ücretsiz mi?

Evet — “Bilgi Doğrulama ve Halüsinasyonları Önleme” 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 Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.

“Bilgi Doğrulama ve Halüsinasyonları Önleme” dersinde ne öğreneceğim?

Temellendirmeye dayalı doğrulama: her iddia, getirilen bir kaynağa kadar izlenebilmelidir. AI Agents 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 Agents öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Agents, 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.

“Bilgi Doğrulama ve Halüsinasyonları Önleme” 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 Agents dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Agents 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

  1. Çok Adımlı Araştırma Döngüsü Tasarımı
  2. Kaynak Doğrulama ve Atıf
  3. Yapılandırılmış Rapor Oluşturma
  4. Bilgi Doğrulama ve Halüsinasyonları Önleme
← AI Agents Sayfasına Dön