Đây là tính năng có giá trị nhất của legal agent: đọc hợp đồng và kéo ra các điều khoản rủi ro dưới dạng bảng có cấu trúc để luật sư rà nhanh. Bí quyết là ép model xuất JSON theo schema cố định thay vì văn xuôi tự do.
Vì sao cần output có cấu trúc
- Dễ đưa vào bảng, dashboard, hệ thống quản lý hợp đồng.
- Dễ so với playbook bằng logic (không phụ thuộc cách diễn đạt).
- Ép model tách bạch: điều khoản gốc / phân loại / mức rủi ro / lý do.
Danh mục điều khoản rủi ro cần trích (ví dụ)
- Giới hạn trách nhiệm (limitation of liability) — trần bồi thường quá thấp?
- Phạt vi phạm (penalty) — mức phạt bất cân xứng?
- Chấm dứt (termination) — bên kia được đơn phương chấm dứt dễ dàng?
- Bồi hoàn (indemnification) — bạn gánh rủi ro của bên kia?
- Luật áp dụng & giải quyết tranh chấp — toà/luật bất lợi?
- Tự động gia hạn (auto-renewal) — bị khoá dài hạn?
- Bảo mật & sở hữu trí tuệ — quyền sở hữu kết quả công việc?
Schema JSON đề xuất
{
"clauses": [
{
"category": "limitation_of_liability",
"source": "Điều 12.3",
"quote": "Trách nhiệm tối đa của Bên B không vượt quá phí 1 tháng...",
"risk_level": "high",
"reason": "Trần bồi thường thấp bất thường so với giá trị hợp đồng năm.",
"suggestion": "Đề xuất nâng trần lên tối thiểu 12 tháng phí."
}
],
"missing_clauses": ["force_majeure", "data_protection"]
}
Lưu ý trường missing_clauses: agent cảnh báo điều khoản đáng lẽ phải có mà lại thiếu — thường nguy hiểm hơn điều khoản xấu hiện hữu.
Prompt trích xuất (rút gọn)
Nhiệm vụ: trích các điều khoản rủi ro từ hợp đồng dưới đây.
Xuất DUY NHẤT JSON đúng schema đã cho.
- quote: trích nguyên văn, KHÔNG diễn giải lại.
- source: số điều khoản.
- risk_level: low | medium | high, theo playbook đính kèm.
- Nếu điều khoản chuẩn (force_majeure, data_protection...) không xuất hiện,
liệt kê vào missing_clauses.
Không thêm nhận định ngoài JSON. Không tự ý kết luận pháp lý cuối cùng.
Các bước triển khai
- Định nghĩa schema + danh mục category cùng luật sư.
- Nhúng playbook (ngưỡng risk_level) vào prompt hoặc bước hậu xử lý.
- Gọi model với response_format = JSON để đảm bảo parse được.
- Validate JSON bằng code; nếu lỗi schema thì gọi lại (retry).
- Đối chiếu
quotevới văn bản gốc — nếu quote không tồn tại trong hợp đồng, đánh dấu nghi ngờ hallucination và loại bỏ. - Xuất bảng cho luật sư duyệt.
def verify_quotes(result, contract_text):
for c in result["clauses"]:
if c["quote"][:40] not in contract_text:
c["flag"] = "quote_not_found" # nghi hallucination
return result
Bước 5 là lá chắn quan trọng nhất: nó bắt lỗi model bịa trích dẫn — sai lầm nguy hiểm nhất trong legal.
Ví dụ tình huống
Hợp đồng thuê dịch vụ SaaS trị giá 500 triệu/năm. Agent trích Điều 12.3: trần trách nhiệm = 1 tháng phí (~42 triệu). Agent gắn risk_level: high, lý do "trần quá thấp so với giá trị năm", và đề xuất nâng lên 12 tháng. Luật sư xem, đồng ý, đưa vào bản đàm phán. Tiết kiệm 40 phút đọc thủ công.
Khung tư duy: ERRS
Extract: trích nguyên văn điều khoản.
Rate: chấm mức rủi ro theo playbook.
Reason: giải thích vì sao rủi ro.
Suggest: đề xuất hướng sửa (để luật sư quyết).
Checklist
- [ ] Output là JSON hợp lệ theo schema?
- [ ] Có kiểm tra
quotetồn tại thật trong hợp đồng? - [ ] Có phát hiện điều khoản THIẾU (missing_clauses)?
- [ ] risk_level bám theo playbook, không do model tự nghĩ?
- [ ] Kết quả đi qua người duyệt trước khi dùng?
Sai lầm thường gặp
- Để model diễn giải thay vì trích nguyên văn: mất tính chính xác pháp lý.
- Không verify quote: bỏ lọt trích dẫn bịa.
- Bỏ qua missing_clauses: rủi ro lớn nhất thường là thứ không có trong hợp đồng.
- Để model tự định nghĩa "rủi ro cao": thiếu playbook nên đánh giá không nhất quán.
- Bỏ bước duyệt: đưa thẳng đánh giá rủi ro vào đàm phán mà không có luật sư xác nhận.