Bài 7 — Chống hallucinate, kiểm chứng chéo & kiểm soát chất lượng
Rủi ro lớn nhất của research agent là nói dối một cách tự tin: đưa ra con số nghe hợp lý nhưng sai hoặc bịa nguồn. Với competitive intelligence, một số liệu sai có thể dẫn tới quyết định đầu tư sai. Bài này dựng các lớp phòng thủ.
Ba dạng lỗi phải diệt
- Fabrication — bịa số/nguồn không tồn tại.
- Misattribution — số có thật nhưng gán sai nguồn.
- Staleness — số đúng nhưng đã lỗi thời.
Lớp 1: Grounding — cấm nói ngoài nguồn
Mọi prompt trích xuất/tổng hợp phải nhấn mạnh: chỉ dùng thông tin có trong context được cung cấp. Kèm thủ thuật: yêu cầu model trích nguyên văn câu chứa dữ kiện (quote) trước khi kết luận.
class GroundedFact(BaseModel):
value: str
source_url: str
quote: str # câu nguyên văn từ nguồn chứa value
Nếu model không trích được quote, coi như không có dữ kiện. Có quote cho phép ta kiểm tra máy móc.
Lớp 2: Verify nguồn tồn tại và chứa quote
Sau khi trích, kiểm tra bằng code (không tin lời model):
def verify_fact(fact, fetched_texts):
text = fetched_texts.get(fact.source_url)
if not text:
return "URL_KHONG_TON_TAI"
# so khớp lỏng: bỏ dấu, hạ chữ thường
if norm(fact.quote) not in norm(text):
return "QUOTE_KHONG_KHOP"
return "OK"
Chỉ Fact trả "OK" mới được vào báo cáo. Còn lại → loại hoặc gắn cờ "cần người kiểm".
Lớp 3: Kiểm chứng chéo (cross-check)
Số liệu quan trọng cần ≥2 nguồn độc lập đồng thuận. Nếu hai nguồn mâu thuẫn:
- Ưu tiên nguồn chính thức hơn nguồn thứ cấp.
- Ưu tiên nguồn mới hơn nguồn cũ.
- Nếu vẫn không ngã ngũ → báo cáo cả hai kèm ghi chú mâu thuẫn, không tự chọn bừa.
def cross_check(facts_same_field):
values = {f.value for f in facts_same_field}
if len(values) == 1:
return "AGREE", facts_same_field
return "CONFLICT", facts_same_field # đưa cả vào báo cáo
Lớp 4: LLM-as-judge (thận trọng)
Dùng một lượt LLM riêng đóng vai "phản biện": đọc báo cáo + nguồn, đánh dấu câu nào không được nguồn hỗ trợ. Đây là lưới an toàn bổ sung, không thay cho verify bằng code ở Lớp 2 (vì judge cũng có thể sai).
Khung tư duy: thang độ tin (trust ladder)
- Cao — ≥2 nguồn chính thức đồng thuận, quote khớp, mới.
- Trung bình — 1 nguồn chính thức, quote khớp.
- Thấp — nguồn thứ cấp, hoặc cũ, hoặc chỉ 1 nguồn.
- Loại — không quote, hoặc URL không tồn tại.
Sai lầm thường gặp
- Tin LLM-as-judge tuyệt đối — nó cũng hallucinate; luôn có verify bằng code.
- Không lưu quote nên không thể kiểm máy móc, chỉ còn cách tin lời model.
- Chọn bừa khi hai nguồn mâu thuẫn thay vì báo cáo cả hai.
- Bỏ qua ngày tháng khiến số cũ lọt vào như số mới.
- Verify quá lỏng (so khớp chính xác từng ký tự) làm loại nhầm quote đúng chỉ khác dấu câu.
- Không có ngưỡng "loại" — mọi thứ đều được đưa vào, kể cả rác.
Checklist kiểm soát chất lượng
- [ ] Mỗi Fact có quote nguyên văn
- [ ] Verify code: URL tồn tại + quote khớp
- [ ] Số liệu quan trọng cross-check ≥2 nguồn
- [ ] Mâu thuẫn được báo cáo, không giấu
- [ ] Có thang độ tin, chỉ dữ kiện tin cao mới thành khuyến nghị
- [ ] LLM-judge chỉ là lớp bổ sung
Ví dụ: một dữ kiện đi qua đủ 4 lớp phòng thủ
Giả sử agent trích được "Ví Y thu phí rút 2.000đ". Đường đi kiểm chứng: Lớp 1 — model kèm quote "Phí rút tiền về ngân hàng: 2.000đ/giao dịch". Lớp 2 — code xác nhận chuỗi quote (sau khi bỏ dấu, hạ chữ) nằm trong text đã fetch của URL y.vn/phi → OK. Lớp 3 — tìm thêm 1 bài báo lớn cũng ghi 2.000đ → AGREE, độ tin lên cao. Lớp 4 — LLM-judge đọc lại báo cáo, không gắn cờ câu này. Kết quả: dữ kiện đạt bậc 'Cao' trên thang độ tin và được phép dùng cho khuyến nghị. Nếu bất kỳ lớp nào thất bại, dữ kiện tụt xuống 'Thấp' hoặc bị loại — đó chính là cơ chế biến một agent hay bịa thành một agent đáng tin.
Bài 8: đóng gói tất cả thành agent chạy tự động, lịch định kỳ và vận hành thực tế.