Product Management
Đăng nhập
ESC

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

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

Bài 7 — Sinh báo cáo tài chính: số liệu tất định, diễn giải bằng LLM

Đã đọ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.

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.
Bài cuối: ghép tất cả thành một agent vận hành thực tế, an toàn và có thể tin cậy.

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