Bước cuối của chuỗi là biến dữ liệu đã đối soát và phân loại thành báo cáo người ta đọc hiểu: tổng chi theo danh mục, so với kỳ trước, điểm nổi bật, cảnh báo. Nguyên tắc bất di bất dịch: số do code tính, chữ do LLM viết.
Kiến trúc báo cáo hai lớp
LỚP SỐ (code, tất định):
- Tổng chi/thu theo danh mục
- So sánh kỳ này vs kỳ trước (%)
- Top 5 khoản chi lớn nhất
- Số dòng chưa đối soát, số cảnh báo
LỚP CHỮ (LLM, diễn giải):
- Tóm tắt điều hành (executive summary)
- Giải thích biến động bất thường
- Đề xuất hành động
Bước 1: tính toán bằng code
def compute_metrics(txns, prev):
by_cat = defaultdict(int)
for t in txns:
by_cat[t["category"]] += t["amount"]
total = sum(by_cat.values())
deltas = {c: pct_change(by_cat[c], prev.get(c, 0)) for c in by_cat}
top5 = sorted(txns, key=lambda t: abs(t["amount"]))[-5:]
return {"by_cat": dict(by_cat), "total": total,
"deltas": deltas, "top5": top5}
Mọi con số trong báo cáo phải truy được về compute_metrics, không bao giờ để LLM "nhớ" số.
Bước 2: LLM viết diễn giải TỪ số đã tính
Đưa metrics đã tính vào prompt và yêu cầu LLM chỉ diễn giải, cấm bịa số mới:
def write_summary(metrics, alerts, llm):
prompt = f"""Viết tóm tắt điều hành cho báo cáo chi phí tháng.
DỮ LIỆU (chỉ dùng đúng các số này, KHÔNG tự tính số mới):
{metrics}
CẢNH BÁO: {alerts}
Yêu cầu: 4-6 câu, nêu tổng chi, danh mục tăng mạnh nhất, cảnh báo đáng chú ý,
và 1 đề xuất. Trích số y nguyên từ dữ liệu."""
return llm.text(prompt)
Chống ảo giác số: kiểm tra chéo
Sau khi LLM viết, rút mọi con số trong văn bản và đối chiếu với metrics gốc:
for num in extract_numbers(summary):
if num not in flatten(metrics):
log_warning(f"LLM có thể bịa số: {num}")
Mẫu báo cáo đầu ra
## Báo cáo chi phí — Tháng 06/2026
Tóm tắt: Tổng chi 248.500.000 VND, tăng 12% so với tháng 5.
Marketing tăng mạnh nhất (+45%) do chiến dịch ra mắt sản phẩm.
Có 1 nghi vấn trùng chi 15.000.000 với NCC Thiết bị X cần xác minh.
Đề xuất: rà soát ngân sách Marketing quý tới.
| Danh mục | Số tiền | So kỳ trước |
|----------|--------:|:-----------:|
| Lương & Phúc lợi | 120.000.000 | +2% |
| Marketing | 48.000.000 | +45% |
| Thuê mặt bằng | 35.000.000 | 0% |
Cần soát: 3 dòng chưa đối soát · 2 cảnh báo bất thường
Checklist báo cáo
- [ ] Mọi số đều do code tính, có nguồn gốc?
- [ ] LLM chỉ diễn giải, có prompt cấm bịa số?
- [ ] Có kiểm tra chéo số trong văn bản?
- [ ] Báo cáo nêu rõ phần chưa đối soát và cảnh báo?
- [ ] Có so sánh kỳ trước để thấy xu hướng?
Sai lầm thường gặp
- Để LLM tính tổng/tỷ lệ: sai số âm thầm, mất uy tín báo cáo. Code tính hết.
- Không kiểm chéo số trong văn bản LLM: một số bịa lọt vào báo cáo gửi sếp. Luôn đối chiếu.
- Giấu phần chưa đối soát: báo cáo trông "đẹp" nhưng che rủi ro. Minh bạch số dòng tồn.
- Chỉ có số, không có diễn giải: sếp phải tự đọc bảng. Thêm executive summary.
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