# Con agent tính đúng hết, chỉ không biết điều gì đáng nói
Có một bài benchmark công khai mình đọc hôm nay, và nó làm mình ngồi im một lúc.
Họ giao cho một con AI agent 50 hồ sơ thuế thật. Không phải đề bài sạch sẽ trong sách — là đống giấy tờ lộn xộn như khách hàng thật vẫn đưa: hoá đơn chụp nghiêng, sao kê thiếu trang, một cái email nằm giữa hai file PDF, vài con số viết tay. Con agent phải tự đọc, tự sắp, tự phát hiện chỗ nào sai, tự quyết định.
Kết quả: nó tính đúng phần lớn. Không phải "đúng kiểu may mắn", mà đúng thật — số ra khớp, phép tính chuẩn, chỗ nào thiếu tài liệu thì nó nêu ra.
Rồi tới phần làm mình im.
Có một hồ sơ mà khách bán nhà. Con agent tính thuế trên khoản lãi rất gọn gàng. Nhưng nó không nhắc một điều: nếu khách đã ở trong căn nhà đó 2 trong 5 năm trước khi bán, phần lãi đó được miễn — một khoản sáu con số, tính bằng đô.
Khách không hỏi. Nên agent không nói.
Câu trả lời của nó không sai một chữ nào. Nó chỉ trả lời đúng câu được hỏi, và bỏ qua điều đáng nói.
Đó là bài này.
Ba kiểu "đúng", và chỉ một kiểu là chỗ ra tiền
Mình hay nghe tranh luận kiểu "agent đúng bao nhiêu phần trăm". Con số đó vô nghĩa nếu không nói rõ đang đo kiểu đúng nào. Mình tách ra ba kiểu:
Một, đúng số. Cộng trừ, tra bảng, áp công thức, đối chiếu tổng. Đây là chỗ máy đã thắng từ lâu, và thắng không cần bàn. Nếu nghề của bạn chỉ gồm phần này thì phần mềm đã ăn thịt từ thập kỷ trước.
Hai, đúng câu hỏi. Khách hỏi A, mình trả lời A, đủ ý, đúng trọng tâm. Nghe thì hiển nhiên, nhưng đây là chỗ nhiều agent trượt — trả lời lan man, trả lời câu khác, hoặc trả lời A kèm một đống B C D không ai xin. Sửa được, và phần lớn công sức cộng đồng đang đổ vào đây.
Ba, đúng điều đáng nói. Khách không hỏi, vì khách không biết phải hỏi. Người trong nghề vẫn nói, vì họ có cái phản xạ nghề nghiệp: thấy dấu hiệu X là tự động kiểm Y.
Kiểu thứ ba là chỗ khách thật sự trả tiền. Không ai trả tiền cho phép cộng. Người ta trả tiền để có người nói: "khoan, chỗ này anh nên xem."
Và đúng là kiểu thứ ba mà con agent trong bài benchmark kia trượt.
Nó không trượt vì thiếu kiến thức. Mình nghĩ nó trượt vì kiến trúc của cả hệ đang xoay quanh prompt — và prompt là câu hỏi. Một hệ được hỏi gì đáp nấy, tối ưu cho việc đáp đúng, sẽ rất giỏi ở kiểu một và kiểu hai, rồi im lặng ở kiểu ba. Im lặng một cách lịch sự. Không lỗi. Không cảnh báo.
Vì sao "đáng nói" khó hơn "đúng" gấp nhiều lần
Có ba lý do, và cả ba đều không phải lý do kỹ thuật.
Thứ nhất: cái đáng nói thường không nằm trong hồ sơ.
Khách đưa cái khách nghĩ là liên quan. Họ không đưa cái họ không biết là liên quan. Nếu khách biết cần nói "tôi ở đó 2 trong 5 năm", thì họ đã tự tra rồi, và họ đã không cần mình.
Nghĩa là: thông tin quan trọng nhất thường là thông tin thiếu. Mà hệ thống nào cũng được huấn luyện để làm việc với cái có, không phải để đi tìm cái không có và hỏi về nó.
Thứ hai: model được thưởng vì trả lời tốt cho prompt, không được thưởng vì đặt câu hỏi khác.
Đây là chỗ mình nghĩ nhiều người hiểu sai về việc "train thêm là giỏi hơn". Một model được tinh chỉnh bằng phản hồi của người sẽ học đúng một điều: câu trả lời nào làm người đọc hài lòng với câu hỏi đã đưa. Nó không học "câu trả lời nào cứu được khách khỏi sai lầm khách chưa biết mình đang mắc". Hai chuyện đó khác nhau, và chuyện thứ hai thường làm người đọc hơi khó chịu — vì bị hỏi ngược lại.
Mình gọi đây là cái bẫy của sự hài lòng. Agent càng dễ chịu, càng ít nói điều đáng nói.
Thứ ba: đúng thì đo được, đáng nói thì không.
Nếu agent tính sai, có hoá đơn đối chiếu, có người bắt lỗi, có chỗ sửa. Nếu agent im lặng ở một điều đáng nói, không có gì xảy ra cả. Không lỗi, không log đỏ, không ai biết. Khách vẫn nhận kết quả, vẫn thấy ổn, vẫn trả tiền — chỉ là mất một khoản mà không ai biết đã mất.
Đây là kiểu hỏng tệ nhất trong mọi hệ tự động hoá, và mình đã viết về nó mấy lần: hỏng mà vẫn báo thành công. Khác một chỗ — lần này không phải log nói dối, mà là cái hệ không có khái niệm để ghi lại thứ nó đã không nói.
Chuyện này mình gặp hằng ngày, chỉ là ở quy mô nhỏ hơn
Mình có một chuỗi tự động lọc và tổng hợp thông tin chạy nền. Ngày nào cũng ra danh sách. Ngày nào cũng đúng tiêu chí mình đặt.
Và ngày nào mình cũng phải đọc tay.
Ban đầu mình đổ cho chất lượng lọc. Rồi có một lần: một mục mà sau này hoá ra là quan trọng nhất trong tuần bị lọc rơi, chỉ vì nó không chứa từ khoá mình nghĩ ra hồi viết bộ lọc. Bộ lọc chạy đúng. Nó lọc theo đúng cái mình dặn.
Mình nhận ra vấn đề nằm ở chỗ khác: tiêu chí của mình có chữ "liên quan", không có chữ "đáng".
"Liên quan" là một thuộc tính so khớp được — có từ khoá, có chủ đề, có nguồn. "Đáng" là một phán đoán: cái này đổi được quyết định gì của mình tuần này. Máy không có khái niệm đó, vì mình chưa bao giờ viết nó ra. Mình chỉ viết cái dễ viết.
Và mình đoán đây đúng là chỗ mà mọi dịch vụ "agent làm hộ" đang đứng: hệ được dặn bằng thứ dễ dặn, rồi được bán bằng thứ khó làm.
Chỗ này đổi cách bán, không chỉ đổi cách code
Nếu bạn đang tính bán agent cho một nghề chuyên môn — thuế, kế toán, pháp lý, bảo hiểm, y tế, tuyển dụng — thì có một cái thang mình thấy rõ hơn sau bài benchmark kia:
Nấc 1 — Tính. Nhận dữ liệu, ra con số. Đây là chỗ ai cũng làm được, và giá đang rơi về 0.
Nấc 2 — Soạn. Nhận dữ liệu, ra văn bản hoàn chỉnh (bản nháp tờ khai, bản nháp hợp đồng, bản nháp trả lời). Giá cao hơn, nhưng khách vẫn so với phần mềm.
Nấc 3 — Phát hiện. Quét hồ sơ và chỉ ra cái khách không hỏi: chỗ rủi ro, chỗ thiếu, chỗ có thể tiết kiệm, chỗ sắp tới hạn. Đây là nấc mà khách so với lương một người, không so với phần mềm — vì đây đúng là việc họ đang trả lương cho người làm.
Nấc 4 — Chịu trách nhiệm. Ký, nộp, trả tiền, đứng tên. Nấc này cần danh tính, bằng chứng, bảo hiểm, và một chỗ để kiện. Chưa tới lúc với phần lớn người đang đọc bài này.
Chỗ dễ vào nhất không phải nấc 1 (đông và rẻ), cũng không phải nấc 4 (cần giấy phép). Là nấc 3.
Và nấc 3 có một đặc tính rất đẹp về rủi ro: sai ở nấc 3 thì khách chỉ bỏ qua một dòng thừa. Sai ở nấc 1 thì tiền sai. Cùng một hệ, cùng một model, nhưng bán cái "phát hiện" thì biên lợi nhuận cao hơn và rủi ro thấp hơn hẳn — vì bạn đang bán một lớp gợi ý, không bán một kết quả cuối.
Mình nghĩ đây là lý do mấy ứng dụng "review hồ sơ" sống khoẻ hơn mấy ứng dụng "làm hồ sơ", dù cái sau nghe hoành tráng hơn.
Làm sao để hệ có khái niệm "đáng nói"
Đây là phần mình thấy đáng viết ra nhất, vì nó không cần model tốt hơn. Nó cần một tầng không nằm trong model.
Ý cơ bản: đừng dặn model "hãy nhớ hỏi về mốc 2-trong-5-năm". Viết cái đó ra thành danh sách cứng của người trong nghề, chạy bằng code trên dữ liệu đã parse, rồi bắt model trả lời từng mục một khi nó bị kích hoạt.
Pseudo-code để hình dung, không phải nguồn triển khai:
# 1) Tầng cứng: danh sách điều phải hỏi (0 token)
# do người trong nghề viết, không do model sinh
MUST_ASK = [
{ id: "residency_5y", when: sold_property and is_primary_residence,
ask: "Đã ở 2 trong 5 năm trước khi bán?" },
{ id: "deadline_flag", when: any_deadline in file,
ask: "Mốc này còn hiệu lực sau lần sửa luật gần nhất?" },
...
]
# 2) So khớp trên dữ liệu đã parse — không gọi model
triggered = [r for r in MUST_ASK if match(r.when, parsed_file)]
# 3) Model chỉ trả lời từng mục, không phải tự nhớ
for r in triggered:
answer = llm(r.ask, context=relevant_slice(parsed_file))
if answer.confidence == LOW:
findings.append(needs_human(r, answer.reason))
elif answer.says_something_matters:
findings.append(finding(r, answer))
# 4) Cửa "tôi không biết" — bắt buộc, không được im
if not findings and file.looks_unusual:
findings.append(needs_human("hồ sơ không khớp mẫu quen thuộc"))
# 5) Không có phát hiện nào thì phải nói ra, kèm danh sách đã kiểm
report.checked = [r.id for r in triggered]
report.findings = findings
report.signed_by = current_operator # ai chịu trách nhiệm lượt nàyBốn chi tiết trong đó là phần mình phải học bằng cách làm sai:
Danh sách phải do người trong nghề viết, không để model tự sinh. Model tự sinh danh sách thì nó sinh ra những điều nó đã biết — và cái nó đã biết chính là cái nó không bỏ sót. Chỗ hổng nằm ngoài đó.
Danh sách phải chạy tầng cứng, trước khi gọi model. Một bộ so khớp trên dữ liệu đã parse tốn gần 0 đồng và chạy được 100% hồ sơ. Nếu để model tự nhớ, bạn đang trả tiền cho việc nó nhớ hộ — và nó nhớ không đều.
Phải có cửa "tôi không biết". Đây là chỗ mình sai lâu nhất. Mình thiết kế hệ để luôn có câu trả lời, vì "không trả lời" nghe như lỗi. Nhưng với nghề chuyên môn, im lặng đắt hơn từ chối. Một dòng "chỗ này cần người xem, lý do: X" rẻ hơn nhiều so với một tờ khai trông hoàn hảo mà thiếu một khoản miễn.
Phải có người ký. Không phải để hợp pháp hoá — mà để có một cái tên gắn với lượt chạy đó. Hệ không có tên thì không có ai thấy áy náy, và cái áy náy chính là thứ duy nhất phát hiện được lỗi kiểu im lặng.
Và một cái bẫy mình phải nói luôn: danh sách này sẽ chết theo thời gian. Quy định đổi, mốc thời hạn đổi, một dòng luật mới làm hai dòng cũ sai. Checklist không có chủ sở hữu thì sau sáu tháng nó thành vật trang trí — mà vật trang trí thì nguy hiểm hơn không có gì, vì nó làm mình tin là đã kiểm.
Đo cái gì, khi "đúng" không còn là thước đo chính
Nếu bạn bán nấc 3, đừng đo tỷ lệ đúng. Đo ba thứ:
Số phát hiện khách xác nhận trên 100 hồ sơ. Một phát hiện chỉ tính khi khách nói "à, đúng, cái này tôi không để ý". Con số này thấp thì hệ đang nói nhảm. Bằng 0 thì hệ đang im.
Số lần khách phải sửa tay trên 1000 lượt chạy. Con số này là chỗ duy nhất nói thật về chất lượng, và mình đã dùng nó làm thước đo chính từ mấy bài trước.
Số lần hệ trả "cần người xem". Đừng coi đây là lỗi. Coi đây là chi phí bảo hiểm. Bằng 0 thì không phải hệ giỏi, mà là hệ chưa bao giờ thừa nhận giới hạn của mình. Bằng 80% thì hệ chưa đủ dùng. Khoảng 10–20% là vùng mình thấy lành mạnh: đủ khiêm tốn để không bịa, đủ hữu ích để khách không bỏ.
Câu mình tự hỏi sau khi đọc bài kia
Bài benchmark đó không nói "agent dở". Nó nói một điều khó chịu hơn: agent đã giỏi tới mức chỗ nó trượt không còn là chỗ mình tưởng.
Mình đã dành mấy tháng lo về việc model tính sai, sinh bừa, gọi tool lệch. Mấy cái đó sửa được — có lỗi, có log, có chỗ vá. Còn chỗ trượt thật của nó là im lặng ở đúng chỗ cần nói, và chỗ đó không có log để vá.
Nên câu hỏi mình đang tự hỏi, và hỏi luôn anh em đang build mấy hệ này:
Hệ của bạn đang trả lời đúng câu hỏi — hay đang nói đúng điều đáng nói?
Nếu bạn thử một phép: lấy 20 kết quả gần nhất hệ của bạn đã giao, đọc bằng mắt người, và tự hỏi "nếu là người trong nghề làm, họ sẽ nói thêm câu gì?" — mình đoán bạn sẽ thấy một khoảng trống. Không phải khoảng trống về độ chính xác. Khoảng trống về cái đáng nói.
Và cái khoảng trống đó chính là chỗ còn bán được tiền.