Trước khi viết dòng code đầu tiên, phải quyết định ba thứ: chạy model ở đâu, dùng công cụ gì, và bảo vệ dữ liệu nhạy cảm ra sao. Với legal, bảo mật không phải tùy chọn — nó là yêu cầu bắt buộc.
1. Chọn model: đánh đổi năng lực vs. bảo mật
| Lựa chọn | Ưu | Nhược | Dùng khi |
|---|---|---|---|
| API cloud (GPT, Claude, Gemini) | Mạnh nhất, dễ dùng | Dữ liệu rời khỏi hạ tầng | Dữ liệu đã ẩn danh, có DPA (Data Processing Agreement) |
| Model self-host (Llama, Qwen) | Dữ liệu không rời máy | Cần GPU, chất lượng thấp hơn | Hợp đồng chứa bí mật tối mật |
| Cloud có cam kết no-training | Cân bằng | Chi phí cao hơn | Đa số doanh nghiệp |
2. Kiến trúc tối thiểu
[Tài liệu] -> [Trích xuất văn bản] -> [Chunking] -> [Vector store]
|
[Câu hỏi/tác vụ] -> [Agent orchestrator] --tra cứu--> [Vector store]
|
+--gọi--> [LLM] -> [Output + trích nguồn]
|
+--> [Log + human review]
Các thành phần:
- Trích xuất văn bản: đọc PDF/DOCX ra text (ví dụ thư viện PdfParser).
- Vector store: lưu embedding để tra cứu ngữ nghĩa (Chroma, Qdrant, pgvector).
- Orchestrator: khung điều phối (LangChain, LlamaIndex, hoặc tự viết).
- Log: lưu lại prompt, output, nguồn trích dẫn — bắt buộc cho audit.
3. Cấu hình biến môi trường (ví dụ)
# .env — KHÔNG commit vào git
LLM_PROVIDER=azure_openai # endpoint doanh nghiệp, no-training
LLM_API_KEY=sk-xxxx
LLM_MODEL=gpt-4o
EMBED_MODEL=text-embedding-3-large
VECTOR_DB_URL=http://localhost:6333
DATA_RETENTION_DAYS=30 # tự xoá log sau 30 ngày
PII_REDACTION=on # bật ẩn danh trước khi gửi model
4. Các bước thiết lập
- Chọn endpoint có cam kết bảo mật phù hợp mức nhạy cảm dữ liệu.
- Cài orchestrator + vector store (bắt đầu bằng bản local để test).
- Viết lớp redaction: thay tên người, số CMND/CCCD, số tài khoản bằng placeholder trước khi gửi model.
- Bật logging: lưu mọi request/response kèm timestamp và user.
- Đặt retention policy: tự động xoá dữ liệu tạm sau X ngày.
- Test bằng 1 tài liệu ẩn danh để xác nhận luồng chạy end-to-end.
5. Ví dụ lớp redaction (pseudocode)
import re
def redact(text):
# Ẩn số CCCD (12 số), số điện thoại, email
text = re.sub(r"\b\d{12}\b", "[CCCD]", text)
text = re.sub(r"\b0\d{9}\b", "[PHONE]", text)
text = re.sub(r"[\w.]+@[\w.]+", "[EMAIL]", text)
return text
# Luôn redact TRƯỚC khi gửi lên LLM
safe_text = redact(raw_contract)
Lưu ý: redaction bằng regex chỉ là lớp phòng vệ đầu; với dữ liệu tối mật vẫn nên self-host.
Khung tư duy: Phân loại dữ liệu 3 mức
Mức Xanh (public): hợp đồng mẫu công khai -> API cloud thoải mái.
Mức Vàng (internal): hợp đồng đã ẩn danh -> cloud có DPA + redaction.
Mức Đỏ (confidential): bí mật KD, dữ liệu KH -> self-host hoặc không dùng LLM.
Checklist thiết lập
- [ ] Endpoint có cam kết no-training + DPA?
- [ ] Lớp redaction chạy trước mọi lần gọi model?
- [ ] Logging bật và có retention policy?
- [ ]
.envnằm trong.gitignore? - [ ] Đã test end-to-end với 1 tài liệu ẩn danh?
Sai lầm thường gặp
- Dùng chatbot công cộng cho hợp đồng thật: rò rỉ dữ liệu khách hàng, có thể vi phạm hợp đồng bảo mật.
- Commit API key vào git: khoá bị lộ, ai cũng dùng được và tính tiền vào tài khoản bạn.
- Bỏ qua logging: khi agent sai, không có bằng chứng để điều tra.
- Tin rằng redaction regex là đủ: nó bỏ sót tên riêng, địa danh; đừng dựa hoàn toàn.
- Chọn model mạnh nhất bất chấp bảo mật: năng lực vô nghĩa nếu vi phạm nghĩa vụ bảo mật.
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