Prompting for Legal Contract Analysis & Summarization — Mục tiêu: Extract clauses, risk flags, clause comparison
Anh em nào làm dự án SaaS, Fintech hay GovTech chắc không lạ gì chuyện xử lý hợp đồng. Một cái HĐNDA có thể dài cả trăm trang, nội dung lủng củng luật lệ, ngôn ngữ kiểu “pháp chế” nghe xong cứ ú ớ. Công ty mình từng nhận dự án phải tự động hóa việc rà soát hợp đồng để giảm 70% thời gian luật sư ngồi cầm cọc giấy.
Vấn đề là: làm sao máy hiểu được ngôn ngữ pháp lý, trích xuất đúng clause, gắn flag rủi ro, rồi so sánh với mẫu chuẩn? Đó là lúc AI/ML chen vào, đặc biệt là NLP (Natural Language Processing) + prompting chiến lược.
1. Vấn đề cốt lõi khi xử lý hợp đồng
1.1 Ngôn ngữ pháp lý vs ngôn ngữ máy
- Độ mơ hồ cao: “bên B có quyền chấm dứt khi thấy cần” → máy hiểu sao?
- Cấu trúc lồng ghép: Một clause có thể tham chiếu clause khác ở trang 10.
- Thuật ngữ đặc thù: “force majeure”, “indemnification” → cần từ điển chuyên ngành.
1.2 Yêu cầu kỹ thuật
- Extract clauses: Tách từng điều khoản (điều 1, điều 2…).
- Risk flags: Gắn cờ các điều khoản có rủi ro (ví dụ: trách nhiệm vô hạn, thời hạn thanh toán quá dài).
- Clause comparison: So sánh với mẫu chuẩn, highlight khác biệt.
2. Kiến trúc hệ thống xử lý hợp đồng
┌─────────────────────────────────────────────────────────────┐
│ Contract Processing System │
├─────────────────────────────────────────────────────────────┤
│ 1. Document Ingestion Layer │
│ - PDF, DOCX, TXT → OCR + Text Extraction │
│ - Output: raw text + metadata │
├─────────────────────────────────────────────────────────────┤
│ 2. Preprocessing Pipeline │
│ - Cleaning (remove headers, footers) │
│ - Normalization (lowercase, remove accents) │
│ - Tokenization + Sentence Splitting │
├─────────────────────────────────────────────────────────────┤
│ 3. Clause Extraction Engine │
│ - Rule-based (regex for "Điều X:", "Clause X:") │
│ - ML-based (BERT, RoBERTa fine-tuned on legal text) │
│ - Output: structured clauses with IDs │
├─────────────────────────────────────────────────────────────┤
│ 4. Risk Analysis Module │
│ - Keyword matching (force majeure, unlimited liability) │
│ - Semantic similarity (cosine similarity with risk DB) │
│ - Confidence scoring (0-1) │
├─────────────────────────────────────────────────────────────┤
│ 5. Comparison Engine │
│ - Clause vs Template matching │
│ - Diff highlighting (like git diff) │
│ - Risk aggregation report │
├─────────────────────────────────────────────────────────────┤
│ 6. Output & Reporting │
│ - JSON summary + HTML report │
│ - Export to PDF/Excel │
└─────────────────────────────────────────────────────────────┘
3. Prompting chiến lược cho AI
3.1 Prompt template cho clause extraction
prompt_template = """
Bạn là trợ lý pháp lý AI. Nhiệm vụ: trích xuất các điều khoản từ văn bản hợp đồng.
Yêu cầu:
1. Mỗi điều khoản bắt đầu bằng "Điều X:" hoặc "Clause X:".
2. Trích xuất nội dung đến khi gặp điều khoản mới hoặc hết văn bản.
3. Bỏ qua mục lục, phụ lục, chữ ký.
4. Trả về JSON với format:
{
"clause_id": "Điều 1",
"title": "Nội dung tiêu đề (nếu có)",
"content": "Nội dung điều khoản",
"page_number": số trang
}
Văn bản cần xử lý:
[INSERT CONTRACT TEXT HERE]
"""
# Ví dụ code Python sử dụng OpenAI API
import openai
def extract_clauses(contract_text):
messages = [
{"role": "system", "content": "Bạn là trợ lý pháp lý AI chuyên nghiệp."},
{"role": "user", "content": prompt_template.replace("[INSERT CONTRACT TEXT HERE]", contract_text)}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
temperature=0.1, # Giảm randomness
max_tokens=2000
)
return response.choices[0].message.content
3.2 Prompt cho risk flagging
risk_prompt = """
Phân tích rủi ro trong từng điều khoản. Với mỗi điều khoản, đánh giá:
- Mức độ rủi ro (0-10)
- Loại rủi ro (tài chính, pháp lý, vận hành)
- Giải thích ngắn gọn
Các rủi ro cần quan tâm:
- Trách nhiệm vô hạn
- Thời hạn thanh toán quá dài (>90 ngày)
- Điều khoản force majeure quá rộng
- Bồi thường một chiều
Văn bản điều khoản:
[INSERT CLAUSE CONTENT HERE]
"""
def analyze_risk(clause_content):
messages = [
{"role": "system", "content": "Bạn là chuyên gia phân tích rủi ro pháp lý."},
{"role": "user", "content": risk_prompt.replace("[INSERT CLAUSE CONTENT HERE]", clause_content)}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
temperature=0.3
)
return response.choices[0].message.content
3.3 Prompt cho clause comparison
comparison_prompt = """
So sánh điều khoản này với mẫu chuẩn. Highlight khác biệt và đánh giá mức độ chấp nhận được.
Điều khoản cần so sánh:
[INSERT CLAUSE CONTENT HERE]
Mẫu chuẩn:
[INSERT TEMPLATE CLAUSE HERE]
Trả lời theo format:
{
"differences": ["điểm khác biệt 1", "điểm khác biệt 2"],
"risk_level": "thấp/cao",
"recommendation": "đề xuất thay đổi"
}
"""
def compare_clauses(clause, template):
messages = [
{"role": "system", "content": "Bạn là luật sư so sánh hợp đồng."},
{"role": "user", "content": comparison_prompt.replace("[INSERT CLAUSE CONTENT HERE]", clause)
.replace("[INSERT TEMPLATE CLAUSE HERE]", template)}
]
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
temperature=0.2
)
return response.choices[0].message.content
4. Use Case kỹ thuật: Xử lý hợp đồng 10.000 từ
4.1 Thông số kỹ thuật
- Input: PDF 15 trang, ~10.000 từ
- Processing time: ~45 giây (GPT-4)
- Accuracy: ~85% (so với luật sư chuyên nghiệp)
- Cost: ~$0.15/request (OpenAI API)
4.2 Workflow chi tiết
import time
from typing import List, Dict
class ContractAnalyzer:
def __init__(self, api_key: str):
self.api_key = api_key
def process_contract(self, contract_text: str) -> Dict:
start_time = time.time()
# Step 1: Extract clauses
clauses = self.extract_clauses(contract_text)
# Step 2: Analyze risks
risk_results = []
for clause in clauses:
risk_result = self.analyze_risk(clause['content'])
risk_results.append(risk_result)
# Step 3: Compare with template
template = self.load_template() # Load từ DB
comparison_results = []
for clause, risk in zip(clauses, risk_results):
result = self.compare_clauses(clause['content'], template.get(clause['clause_id'], ''))
comparison_results.append(result)
# Step 4: Generate report
report = self.generate_report(clauses, risk_results, comparison_results)
processing_time = time.time() - start_time
return {
"clauses": clauses,
"risk_analysis": risk_results,
"comparisons": comparison_results,
"report": report,
"processing_time": processing_time
}
4.3 Performance optimization
# Batch processing cho performance
def batch_process_contracts(contract_texts: List[str], batch_size: int = 5):
results = []
for i in range(0, len(contract_texts), batch_size):
batch = contract_texts[i:i+batch_size]
# Parallel processing
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(process_single_contract, text) for text in batch]
batch_results = [f.result() for f in futures]
results.extend(batch_results)
return results
# Caching cho performance
@lru_cache(maxsize=1000)
def load_template_clause(clause_id: str) -> str:
# Lấy từ database hoặc file
return template_db.get(clause_id, "")
5. Technical Comparison: Các phương pháp xử lý
| Phương pháp | Độ chính xác | Tốc độ | Chi phí | Learning Curve | Phù hợp |
|---|---|---|---|---|---|
| Rule-based | 60-70% | ⚡ Rất nhanh | 💰 Rẻ | 📉 Thấp | Hợp đồng đơn giản, cấu trúc chuẩn |
| ML-based (BERT) | 75-85% | 🚀 Nhanh | 💰 Trung bình | 📈 Trung bình | Hợp đồng có sự thay đổi nhẹ |
| LLM (GPT-4) | 85-95% | ⏳ Chậm | 💰 Đắt | 📈 Cao | Hợp đồng phức tạp, ngôn ngữ đa dạng |
| Hybrid (Rule + LLM) | 90-98% | ⚡⏳ Trung bình | 💰 Trung bình | 📈 Cao | Production, cần balance |
5.1 Khi nào nên chọn phương pháp nào?
Rule-based: Khi hợp đồng luôn có format cố định, không cần xử lý ngôn ngữ phức tạp. Ví dụ: HĐ mua bán hàng hóa với mẫu chuẩn.
ML-based: Khi cần xử lý đa dạng format nhưng vẫn có tập training đủ lớn. Phù hợp cho startup mới bắt đầu.
LLM: Khi chất lượng là ưu tiên số 1 và chi phí không phải vấn đề. Dùng cho dự án trọng yếu, khách hàng lớn.
Hybrid: Khi cần tối ưu chi phí + performance. Dùng rule cho các trường hợp đơn giản, LLM cho các trường hợp khó.
6. Dẫn chứng uy tín
6.1 OpenAI Documentation
Theo OpenAI’s best practices, nên:
– Use system prompts để định hướng hành vi AI
– Set temperature=0 cho tasks cần consistency
– Implement human review cho critical applications
6.2 GitHub Stars & Community
- LangChain: 50k+ stars, hỗ trợ tốt cho legal document processing
- Haystack: 5k+ stars, tối ưu cho retrieval-augmented generation
- spaCy: 25k+ stars, thư viện NLP tiêu chuẩn
6.3 Engineering Blog
- Netflix: Sử dụng ML cho metadata extraction trong content licensing
- Stripe: Tự động hóa contract analysis cho merchant agreements
- Airbnb: NLP cho review và policy compliance
7. Security & Risk Considerations
7.1 Data Privacy
- GDPR compliance: Hợp đồng có thể chứa PII (Personally Identifiable Information)
- Encryption: Data at rest + in transit
- Access control: Role-based authentication
7.2 AI Hallucinations
- Fact-checking: Luôn verify AI output với nguồn gốc
- Confidence scoring: Flag low-confidence results
- Human-in-the-loop: Critical decisions cần human review
7.3 Cost Management
- Token optimization: Sử dụng concise prompts
- Caching: Cache common templates và results
- Fallback strategies: Rule-based cho simple cases
8. Tương lai của contract analysis
8.1 Multimodal AI
- Vision models: Xử lý trực tiếp từ PDF/image
- Audio models: Chuyển đổi voice negotiation thành text
- Cross-modal reasoning: Kết hợp text + table + image
8.2 Small Language Models
- Domain-specific: Mô hình trained riêng cho legal domain
- On-premise: Xử lý mà không cần internet
- Cost-effective: Rẻ hơn 10x so với GPT-4
8.3 Standardization
- Legal markup languages: XML-based contract formats
- Interoperability: APIs giữa các hệ thống pháp lý
- Blockchain: Smart contracts tự thực thi
Key Takeaways
- Prompting chiến lược là chìa khóa để AI hiểu ngôn ngữ pháp lý phức tạp.
- Hybrid approach (Rule + ML + LLM) cho kết quả tốt nhất về accuracy và cost.
- Security và compliance không phải là option mà là requirement bắt buộc.
- Human-in-the-loop vẫn cần thiết cho critical decisions, AI chỉ là trợ lý.
- Performance optimization (batch processing, caching) giúp giảm cost đáng kể.
Anh em đã từng gặp lỗi gì khi xử lý hợp đồng tự động chưa? Giải quyết thế nào? Mình thấy vấn đề lớn nhất là AI “ảo tưởng” (hallucination) khi gặp thuật ngữ lạ, dẫn đến extract sai clause. Cách mình làm là thêm step verification với legal database.
Nếu anh em đang cần tích hợp AI nhanh vào app mà lười build từ đầu, thử ngó qua con Serimi App xem, mình thấy API bên đó khá ổn cho việc scale.
Nội dung được Hải định hướng, trợ lý AI giúp mình viết chi tiết.








