Product Management
Đăng nhập
ESC

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

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

Bài 6 — Phát hiện bất thường: trùng chi, vượt ngưỡng và gian lận

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

Một agent tài chính giỏi không chỉ ghi chép — nó canh gác. Phát hiện bất thường (anomaly detection) tìm ra giao dịch trùng, chi vượt mức, nhà cung cấp lạ hay dấu hiệu gian lận trước khi tiền mất.

Hai lớp phát hiện

Lớp THỐNG KÊ/LUẬT (rẻ, chạy mọi dòng):
  - Trùng chi (duplicate): cùng số tiền + đối tác trong X ngày
  - Vượt ngưỡng: chi > hạn mức danh mục
  - Đối tác mới: chưa từng xuất hiện
  - Bất thường số học: làm tròn lạ, số lẻ đáng ngờ

Lớp LLM (đắt, chỉ chạy dòng bị gắn cờ):
  - Giải thích ngữ cảnh: "vì sao đáng ngờ"
  - Nhận diện mẫu tinh vi qua mô tả

Luật phát hiện tất định

def detect_duplicates(txns, window=5):
    flags = []
    for i, a in enumerate(txns):
        for b in txns[i+1:]:
            if a["amount"] == b["amount"] \
               and normalize(a["counterparty"]) == normalize(b["counterparty"]) \
               and abs(date_diff(a["date"], b["date"])) <= window:
                flags.append(("DUPLICATE", a, b))
    return flags

def detect_threshold(txn, limits):
    cap = limits.get(txn["category"])
    if cap and abs(txn["amount"]) > cap:
        return ("OVER_LIMIT", txn, f"vượt hạn mức {cap}")

Điểm bất thường (anomaly score)

Gộp nhiều tín hiệu thành một điểm để ưu tiên soát:

def anomaly_score(txn, history):
    s = 0
    if is_new_counterparty(txn, history): s += 0.3
    if abs(txn["amount"]) > p95_amount(history): s += 0.3   # top 5% giá trị
    if is_round_suspicious(txn["amount"]): s += 0.15
    if weekend_or_afterhours(txn["date"]): s += 0.15
    if txn["category"] == "Khác": s += 0.1
    return min(s, 1.0)

Dòng có score cao được đẩy sang LLM để diễn giải, rồi lên báo cáo cảnh báo.

Vì sao tách hai lớp phát hiện

Lớp thống kê/luật chạy trên mọi dòng gần như miễn phí và cho kết quả tất định — thứ mà kiểm toán có thể tin cậy. Nếu bạn dồn cả việc phát hiện trùng chi cho LLM, bạn vừa đốt token trên hàng nghìn dòng vừa nhận về kết quả không nhất quán giữa các lần chạy. Ngược lại, luật thuần túy lại không hiểu ngữ cảnh: nó không biết "hai lần chi cùng số tiền" là trả góp hợp lệ hay lỗi nhập trùng. Vì thế luật lo phát hiện (rẻ, phủ rộng), còn LLM lo diễn giải (đắt, chỉ trên dòng bị gắn cờ). Đây chính là mẫu phân tầng lặp lại xuyên suốt khóa học.

LLM diễn giải, không phán quyết

LLM giải thích tại sao đáng ngờ để con người quyết nhanh, chứ không tự khóa/hủy giao dịch:

def explain_anomaly(txn, signals, llm):
    return llm.text(f"""Giao dịch bị gắn cờ: {txn}
Tín hiệu: {signals}
Giải thích ngắn gọn vì sao đáng ngờ và đề xuất bước kiểm tra. Không kết luận gian lận.""")

Ví dụ cụ thể

Agent thấy hai dòng -15.000.000 | NCC Thiết bị X cách nhau 2 ngày → gắn cờ DUPLICATE. Kế toán kiểm ra: đúng là trả trùng do nhân viên nhập hai lần → thu hồi 15 triệu. Agent vừa cứu tiền thật.

Khung tư duy: cân bằng nhạy–nhiễu

Quá nhạy  -> nhiều cảnh báo giả (false positive) -> kế toán bỏ qua hết
Quá lỏng  -> lọt bất thường thật (false negative) -> mất tiền
Giải pháp -> điểm số + ngưỡng điều chỉnh theo phản hồi

Các bước

  • Xây các luật tất định: trùng, vượt ngưỡng, đối tác mới.
  • Định nghĩa hạn mức theo danh mục cùng bộ phận tài chính.
  • Tính anomaly score gộp nhiều tín hiệu.
  • Đẩy dòng điểm cao sang LLM để diễn giải.
  • Xuất báo cáo cảnh báo xếp theo mức độ ưu tiên.
  • Thu phản hồi (đúng/sai) để hiệu chỉnh ngưỡng.

Sai lầm thường gặp

  • Để LLM tự quyết "gian lận": rủi ro pháp lý và ảo giác. LLM chỉ diễn giải, người quyết.
  • Ngưỡng cố định cứng nhắc: doanh nghiệp lớn dần, ngưỡng cũ thành nhiễu. Điều chỉnh theo dữ liệu.
  • Chỉ dựa vào số tiền: bỏ lọt mẫu tinh vi. Kết hợp thời gian, đối tác, tần suất.
  • Cảnh báo không xếp ưu tiên: kế toán ngập trong danh sách, bỏ sót cái quan trọng. Dùng score.
Bài sau: biến mọi số liệu thành báo cáo con người đọc hiểu.

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