Product Management
Đăng nhập
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Bài 3 — Nạp tài liệu và xây tra cứu RAG có trích nguồn

Đã đọc 0/8 mục · còn khoảng 3 phút
Cách chúng tôi ghi nhận

Một mục được tính là đã đọc khi nó nằm giữa màn hình đủ lâu so với độ dài của nó (bảng và sơ đồ tính một nửa), bạn vẫn đang cuộn hoặc bấm phím, và bạn đã thấy tới cuối mục. Lướt nhanh hoặc để tab mở không được tính. Chúng tôi chỉ lưu thời gian đọc từng mục — không lưu gì khác.

Một legal agent chỉ đáng tin khi mọi kết luận đều truy được về nguồn. Kỹ thuật cốt lõi là RAG (Retrieval-Augmented Generation): thay vì để LLM trả lời từ trí nhớ (dễ bịa), ta tra cứu đoạn văn bản liên quan rồi bắt model trả lời dựa trên đoạn đó và trích dẫn.

Vì sao RAG là bắt buộc trong legal

  • Chống hallucination: model chỉ được dùng thông tin có trong nguồn đã cung cấp.
  • Truy vết: mỗi câu trả lời kèm "Điều X, hợp đồng Y, trang Z".
  • Cập nhật dễ: thay văn bản pháp luật mới vào kho, không cần train lại model.

Quy trình nạp tài liệu (ingestion)

  • Trích văn bản từ PDF/DOCX ra text sạch.
  • Chunking: cắt thành đoạn nhỏ. Với hợp đồng, cắt theo điều khoản thay vì cắt máy móc theo số ký tự — để mỗi chunk là một đơn vị pháp lý trọn vẹn.
  • Gắn metadata: số điều, tên tài liệu, ngày, loại hợp đồng.
  • Tạo embedding cho từng chunk.
  • Lưu vào vector store cùng metadata.
# Chunking theo điều khoản (ưu tiên hơn cắt cứng theo ký tự)
import re

def chunk_by_clause(text, doc_name):
    # Tách theo mẫu "Điều 1.", "Điều 2." ...
    parts = re.split(r"(?=Điều\s+\d+)", text)
    chunks = []
    for p in parts:
        if p.strip():
            m = re.match(r"Điều\s+(\d+)", p)
            clause = m.group(1) if m else "?"
            chunks.append({
                "text": p.strip(),
                "meta": {"doc": doc_name, "clause": clause}
            })
    return chunks

Truy vấn có trích nguồn

Khi người dùng hỏi "Hợp đồng này quy định gì về chấm dứt sớm?":

  • Tạo embedding cho câu hỏi.
  • Tìm top-k chunk gần nhất trong vector store.
  • Đưa các chunk đó vào prompt kèm yêu cầu bắt buộc trích nguồn.
  • Nếu không tìm thấy chunk liên quan, agent phải trả lời "Không tìm thấy điều khoản liên quan" — không được bịa.
SYSTEM: Bạn là trợ lý pháp lý. CHỈ trả lời dựa trên các đoạn được cung cấp.
Mỗi ý phải kèm trích nguồn dạng [doc, Điều X]. Nếu không có trong nguồn,
trả lời chính xác: "Không tìm thấy trong tài liệu." TUYỆT ĐỐI không suy đoán.

NGUỒN:
[HĐ-2024-01, Điều 8] Bên A được chấm dứt hợp đồng khi Bên B chậm...
[HĐ-2024-01, Điều 9] Thông báo chấm dứt phải gửi trước 30 ngày...

CÂU HỎI: Hợp đồng quy định gì về chấm dứt sớm?

Ví dụ output đúng chuẩn

> Hợp đồng cho phép chấm dứt sớm trong hai trường hợp: (1) Bên B chậm nghĩa vụ [HĐ-2024-01, Điều 8]; (2) phải thông báo trước 30 ngày [HĐ-2024-01, Điều 9]. Không tìm thấy quy định về phí phạt khi chấm dứt sớm.

Câu cuối rất quan trọng: agent chủ động nói cái gì không có thay vì bịa ra một con số.

Khung tư duy: Grounding trước Generation

1. RETRIEVE:  tìm nguồn liên quan.
2. GROUND:    ép model chỉ dùng nguồn đó.
3. CITE:      mỗi khẳng định có trích dẫn.
4. ABSTAIN:   không có nguồn -> từ chối trả lời, không đoán.

Checklist chất lượng RAG

  • [ ] Chunk theo đơn vị pháp lý (điều khoản), không cắt giữa câu?
  • [ ] Mỗi chunk có metadata đủ để trích nguồn?
  • [ ] Prompt ép trích dẫn và cho phép "không tìm thấy"?
  • [ ] Đã test câu hỏi mà tài liệu KHÔNG có câu trả lời -> agent từ chối đúng?
  • [ ] Top-k đủ lớn để không sót điều khoản liên quan (thử k=5..8)?

Sai lầm thường gặp

  • Cắt chunk theo số ký tự cứng: làm đứt đôi một điều khoản, agent hiểu sai ngữ cảnh.
  • Không bắt trích nguồn: mất khả năng truy vết, không kiểm chứng được.
  • Không cho phép "không biết": model buộc phải trả lời nên nó bịa.
  • Top-k quá nhỏ: sót điều khoản liên quan nằm rải rác trong hợp đồng.
  • Quên metadata: có đúng nội dung nhưng không biết ở đâu ra — vô dụng khi kiểm tra.
Bài sau: dùng nền RAG này để xây tính năng đầu tiên — trích xuất điều khoản rủi ro có cấu trúc.

Học xong bài này rồi? Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu, và học hết khóa thì có chứng chỉ. Lưu tiến độ của tôi