Product Management
Đăng nhập
ESC

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

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

Bài 4 — Đối soát giao dịch (phần 2): tầng LLM và xử lý ngoại lệ

Đã đọc 0/9 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.

Sau tầng tất định, còn lại những dòng "khó": mô tả tối nghĩa, chi gộp, tên viết lạ. Đây là lúc LLM tỏa sáng — nhưng phải có kỷ luật để nó không bịa.

Khi nào gọi LLM

Chỉ đưa vào LLM các dòng chưa khớp và kèm danh sách ứng viên (đã lọc theo số tiền gần đúng), thay vì thả toàn bộ sổ. Điều này giảm token và giảm ảo giác.

def llm_match(unmatched_txn, candidates, llm):
    prompt = f"""Bạn là trợ lý đối soát. Giao dịch ngân hàng:
{unmatched_txn}

Các dòng sổ ỨNG VIÊN (chỉ được chọn trong số này hoặc trả 'none'):
{candidates}

Trả JSON: {{"ledger_id": "<id hoặc none>", "confidence": 0..1, "reason": "..."}}
TUYỆT ĐỐI không bịa id ngoài danh sách."""
    return llm.json(prompt)

Ràng buộc "chỉ chọn trong danh sách" là then chốt: nó biến bài toán mở thành bài toán chọn hữu hạn, dễ kiểm.

Xác minh sau LLM

Không tin LLM mù quáng. Sau khi LLM trả ledger_id, code phải xác minh lại bằng tool:

res = llm_match(txn, candidates, llm)
if res["ledger_id"] != "none":
    chosen = lookup(res["ledger_id"])
    if chosen and abs(chosen["amount"] - txn["amount"]) <= TOLERANCE:
        confirm_match(txn, chosen, res["confidence"])
    else:
        queue_for_human(txn, note="LLM chọn nhưng số tiền lệch")

LLM đề xuất, code kiểm chứng. Đây là mẫu "propose–verify" cực quan trọng trong agent tài chính.

Vì sao ràng buộc "chọn trong danh sách" lại quan trọng

Khi bạn để LLM tự do trả về bất kỳ mã sổ nào, không gian đáp án là vô hạn và LLM dễ "sáng tác" một id nghe hợp lý nhưng không tồn tại. Bằng cách thu hẹp thành một tập ứng viên hữu hạn (thường 3–8 dòng đã lọc theo số tiền), bạn biến bài toán từ "sinh tự do" thành "phân loại có kiểm soát". Điều này vừa dễ verify bằng code, vừa giảm mạnh tỷ lệ ảo giác. Nếu không ứng viên nào hợp, LLM được phép trả 'none' — thú nhận không chắc luôn tốt hơn đoán bừa một cặp khớp sai làm lệch sổ.

Xử lý chi gộp (1–nhiều)

Một lần chi 10.000.000 có thể trả cho ba hóa đơn 3tr + 3tr + 4tr. Cho LLM đề xuất tổ hợp, nhưng code kiểm tra tổng:

def verify_combo(txn_amount, combo_ids):
    total = sum(lookup(i)["amount"] for i in combo_ids)
    return total == txn_amount   # phải bằng tuyệt đối

Hàng đợi ngoại lệ (exception queue)

Mọi thứ agent không chắc phải vào hàng đợi cho con người, với đủ ngữ cảnh để duyệt nhanh:

[NGOẠI LỆ #12]
Bank: -7.200.000 | 15/06 | "THANH TOAN DV 06"
Gợi ý agent: có thể khớp INV-payroll-06 (7.200.000) độ tin cậy 0.62
Lý do phân vân: tên đối tác không trùng, ngày lệch 4
Hành động: [Khớp] [Bỏ qua] [Tạo bút toán mới]

Khung tư duy: 3 kết cục cho mỗi dòng

KHỚP tự tin   -> ghi nhận, confidence >= ngưỡng cao (vd 0.9)
KHỚP phân vân -> đẩy hàng đợi kèm gợi ý
KHÔNG khớp    -> đẩy hàng đợi, có thể là giao dịch thiếu chứng từ

Các bước

  • Lọc ứng viên theo số tiền gần đúng cho mỗi dòng chưa khớp.
  • Gọi LLM với ràng buộc "chỉ chọn trong danh sách".
  • Xác minh lại kết quả LLM bằng code (số tiền, tổng combo).
  • Ghi nhận khớp tự tin; đẩy phần phân vân vào hàng đợi.
  • Thiết kế giao diện duyệt tối giản cho con người.
  • Ghi lại quyết định của con người để cải thiện ngưỡng sau này.

Sai lầm thường gặp

  • Tin thẳng id LLM trả về mà không kiểm: LLM có thể bịa id hoặc chọn sai. Luôn propose–verify.
  • Thả toàn bộ sổ vào prompt: tốn token, tăng ảo giác. Chỉ đưa ứng viên đã lọc.
  • Không có hàng đợi ngoại lệ: agent buộc phải "đoán bừa" thay vì thú nhận không chắc.
  • Quên kiểm tổng cho chi gộp: khớp tổ hợp sai làm lệch sổ. Tổng phải bằng tuyệt đối.
Bài sau chuyển sang phân loại chi phí tự động.

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