AI Agents · Pelajaran

Pemeriksaan Fakta dan Pencegahan Halusinasi

Verifikasi berbasis landasan: setiap klaim harus dapat ditelusuri ke sumber yang diambil.

Pelajaran 4 dari 413 langkah

Pemeriksaan Fakta dan Pencegahan Halusinasi adalah pelajaran AI Agents 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 Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.

Masalah Halusinasi dalam Agen Riset

LLM dapat menghasilkan klaim yang terdengar masuk akal tanpa dasar dalam sumber yang diambil. Dalam agen riset, hal ini sangat berbahaya karena keluarannya tampak berwenang dan disajikan dengan sitasi yang mungkin sebenarnya tidak mendukung klaim tersebut.

Pencegahan halusinasi harus menjadi perhatian utama.

Penautan ke Sumber: Setiap Klaim Dapat Ditelusuri ke Sumber

Prinsip inti penautan ke sumber: setiap klaim faktual dalam keluaran akhir harus dapat ditelusuri ke setidaknya satu dokumen yang diambil. Klaim yang tidak dapat ditelusuri berarti merupakan halusinasi atau tidak didukung — keduanya tidak dapat diterima dalam laporan penelitian.

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'])

Pola LLM sebagai Pemverifikasi

Gunakan panggilan LLM terpisah — sebagai "pemverifikasi" — untuk menilai apakah suatu klaim didukung oleh sumber yang disediakan. Dengan demikian, tercipta mekanisme pengawasan berimbang karena generator dan pemverifikasi merupakan panggilan yang terpisah dan independen.

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)

Keluaran Berbasis Ambang Keyakinan

Tetapkan ambang pada skor keyakinan pemverifikasi. Klaim di atas 0,85 dapat diterbitkan. Klaim antara 0,5–0,85 dapat diterbitkan dengan penafian. Klaim di bawah 0,5 tidak disertakan.

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}

Menangkap Pola Halusinasi Tertentu

Pola klaim tertentu berisiko tinggi menimbulkan halusinasi: statistik yang tepat (persentase, jumlah dalam USD), tanggal tertentu, individu yang disebutkan namanya, dan hubungan sebab-akibat. Terapkan pemeriksaan ekstra terhadap pola-pola ini.

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

Putaran Verifikasi Terurai

Untuk bagian yang panjang, uraikan teks menjadi klaim-klaim individual, verifikasi setiap klaim secara independen, lalu susun ulang bagian tersebut hanya dengan klaim yang telah diverifikasi.

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', [])

Menyusun Ulang Teks Terverifikasi

Setelah menyaring setiap klaim berdasarkan ambang, susun ulang bagian yang bersih dan koheren hanya dari klaim yang telah diverifikasi. Keluarkan klaim dengan keyakinan rendah dan tulis ulang teks agar lebih mudah dibaca.

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

Mendeteksi Pergeseran Numerik

LLM terkadang mengubah angka dari sumber secara halus (misalnya, 9,1% menjadi 9,2%). Ekstrak angka dari klaim dan teks sumber, lalu bandingkan keduanya secara eksplisit.

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

Audit Atribusi

Setelah membuat laporan lengkap, jalankan audit atribusi: untuk setiap kalimat dalam laporan, pastikan kalimat tersebut dapat dikaitkan dengan salah satu sumber. Tandai kalimat yang tidak memiliki cuplikan sumber yang cocok.

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)

Menggunakan Bahasa Tentatif untuk Klaim Tidak Pasti

Tidak semua hal dapat diverifikasi dengan tingkat keyakinan tinggi. Alih-alih sepenuhnya mengeluarkan klaim yang berada di batas, gunakan bahasa yang menunjukkan ketidakpastian: 'Beberapa analis berpendapat...', 'Menurut X...', 'Telah dilaporkan bahwa...'. Dengan demikian, informasi tetap tersedia sekaligus memberi sinyal bahwa informasi tersebut tidak pasti.

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))

Memantau Tingkat Halusinasi

Lacak tingkat halusinasi dari waktu ke waktu: berapa persenkah klaim yang dihasilkan gagal diverifikasi? Tetapkan ambang peringatan. Jika angkanya melonjak, rekayasa prompt atau kualitas pengambilan sumber Anda telah menurun.

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%}')

Apa tujuan utama pola 'LLM sebagai pemverifikasi'?

LLM sebagai pemverifikasi merupakan pola arsitektur utama dalam pencegahan halusinasi. Memahami hal yang diperiksa dan alasan pemeriksaan tersebut dilakukan melalui panggilan terpisah sangatlah penting.

Ringkasan Pencegahan Halusinasi

Cegah halusinasi melalui: pemeriksaan penautan ke sumber (setiap klaim merujuk ke sumber), LLM sebagai pemverifikasi (panggilan terpisah menilai dukungan), penyaringan berdasarkan keyakinan (keluarkan klaim di bawah ambang), deteksi pergeseran numerik, bahasa yang menunjukkan ketidakpastian untuk kasus yang berada di batas, dan pemantauan tingkat halusinasi untuk mendeteksi kemunduran.

Gratis untuk memulai

Belajar AI Agents dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
60
Pelajaran
239

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pemeriksaan Fakta dan Pencegahan Halusinasi” gratis?

Ya — teks lengkap “Pemeriksaan Fakta dan Pencegahan Halusinasi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pemeriksaan Fakta dan Pencegahan Halusinasi”?

Verifikasi berbasis landasan: setiap klaim harus dapat ditelusuri ke sumber yang diambil. Kamu berlatih AI Agents 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 Agents?

Tidak diperlukan pengalaman sebelumnya. AI Agents 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 “Pemeriksaan Fakta dan Pencegahan Halusinasi” 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 Agents ini?

Ya. Setiap pelajaran AI Agents 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. Desain Putaran Riset Multi-Langkah
  2. Verifikasi Sumber dan Sitasi
  3. Pembuatan Laporan Terstruktur
  4. Pemeriksaan Fakta dan Pencegahan Halusinasi
← Kembali ke AI Agents