Prompt Chaining và vòng lặp Validation-Retry
Những điều bạn cần biết
Các hệ thống trích xuất trong production sẽ gặp lỗi. Tài liệu có định dạng bất ngờ, giá trị số không cộng khớp, và các trường dữ liệu bị đặt sai chỗ. Câu hỏi không phải là liệu lỗi có xảy ra hay không, mà là hệ thống của bạn phản ứng thế nào khi chúng xảy ra. Task statement này trình bày mẫu validation-retry, biến các lần trích xuất thất bại thành những quy trình tự sửa lỗi.
Retry kèm phản hồi lỗi (retry-with-error-feedback)
Mẫu retry đúng cách sẽ gửi lại cho model ba thông tin sau:
- Tài liệu gốc — để model có nguồn dữ liệu để xem xét lại
- Kết quả trích xuất thất bại — để model thấy nó đã tạo ra cái gì
- Lỗi validation cụ thể — để model biết chính xác điều gì đã sai
typescriptCopy
// Retry with error feedback
const retryMessages = [
{
role: "user",
content: `Original document:\n${originalDocument}\n\n` +
`Your extraction:\n${JSON.stringify(failedExtraction)}\n\n` +
`Validation error: Line items sum to £450 but stated_total is £500. ` +
`Please re-extract, ensuring all line items are captured.`
}
];Cách làm này hiệu quả hơn hẳn so với retry đơn giản. Nếu không có lỗi cụ thể, model không có bất kỳ hướng dẫn nào về việc cần sửa gì và thường lặp lại đúng sai lầm cũ. Khi có lỗi cụ thể, model có thể nhắm đúng mục tiêu để tự sửa — xem lại tài liệu để tìm các dòng chi tiết bị bỏ sót, kiểm tra việc đặt trường, hoặc tính lại tổng.
Ranh giới hiệu quả của retry
Đây là khái niệm mà đề thi kiểm tra gắt gao nhất trong task statement này. Retry có một ranh giới hiệu quả rất rõ ràng:
Retry CÓ hiệu quả với:
- Sai lệch định dạng (sai định dạng ngày tháng, ký hiệu tiền tệ không nhất quán)
- Lỗi output về cấu trúc (giá trị nằm sai trường, lồng nhau sai)
- Giá trị đặt sai chỗ (dữ liệu có tồn tại trong tài liệu nhưng bị trích xuất vào sai trường)
- Lỗi toán học (model bỏ sót một dòng chi tiết ảnh hưởng đến tổng)
Retry KHÔNG hiệu quả với:
- Thông tin thực sự không có trong tài liệu nguồn
- Dữ liệu chỉ tồn tại trong một tài liệu bên ngoài không được cung cấp cho model
- Các trường đòi hỏi kiến thức mà model không có
Đề thi đưa ra cả hai loại tình huống và mong bạn xác định được cái nào có thể sửa được. Nếu một tài liệu thực sự không chứa tên phòng ban, dù retry bao nhiêu lần cũng không thể tạo ra giá trị đúng. Hành động đúng là gắn cờ kết quả trích xuất đó để con người review, hoặc trả về null (nếu schema cho phép).
Thiết kế luồng tự sửa lỗi
Thay vì chỉ dựa vào logic validation bên ngoài, bạn có thể xây dựng khả năng tự sửa lỗi ngay trong chính schema trích xuất:
calculated_total so với stated_total: Trích xuất cả tổng mà model tự tính từ các dòng chi tiết riêng lẻ lẫn tổng được nêu trong tài liệu. Khi hai giá trị này khác nhau, bạn có ngay một cờ báo sai lệch tự động mà không cần logic bên ngoài.
jsonCopy
{
"line_items": [
{ "description": "Widget A", "amount": 150.00 },
{ "description": "Widget B", "amount": 300.00 }
],
"calculated_total": 450.00,
"stated_total": 500.00,
"total_discrepancy": true
}Boolean conflict_detected: Thêm các trường boolean để gắn cờ khi tài liệu nguồn chứa thông tin mâu thuẫn. Ví dụ, nếu một tài liệu ghi "hạn thanh toán: 30 ngày" ở một mục nhưng "điều khoản thanh toán: net 60" ở mục khác, model nên trích xuất cả hai và đặt conflict_detected: true thay vì âm thầm chọn một trong hai.
Trường detected_pattern
Với các pipeline review và phân tích code, hãy thêm trường detected_pattern vào các kết quả có cấu trúc. Trường này ghi lại chính xác cấu trúc code nào đã kích hoạt mỗi phát hiện.
jsonCopy
{
"finding": "Potential SQL injection vulnerability",
"severity": "critical",
"detected_pattern": "string concatenation in SQL query",
"file": "user_service.py",
"line": 42
}Khi developer bác bỏ (dismiss) các phát hiện, bạn có thể phân tích các mẫu bác bỏ theo detected_pattern. Nếu developer liên tục bác bỏ các phát hiện được kích hoạt bởi "biến bị che khuất (shadowing) trong scope lồng nhau", mẫu đó nhiều khả năng cần được tinh chỉnh lại trong prompt. Điều này tạo ra một vòng lặp cải thiện có hệ thống: trích xuất, xác thực, thu thập dữ liệu bác bỏ, tinh chỉnh prompt, rồi lặp lại.
Lỗi cú pháp schema so với lỗi xác thực ngữ nghĩa
Đề thi phân biệt hai loại lỗi sau:
Lỗi cú pháp schema — JSON sai định dạng, thiếu trường bắt buộc, sai kiểu dữ liệu. Bị loại bỏ hoàn toàn bởi tool_use với JSON schema (đã trình bày ở Task Statement 4.2).
Lỗi xác thực ngữ nghĩa — Cấu trúc JSON đúng nhưng giá trị sai. Các dòng chi tiết không cộng khớp, ngày tháng có thứ tự sai lệch nhau, giá trị nằm sai trường. Những lỗi này cần logic xác thực nằm ngoài schema và là trọng tâm của các vòng lặp retry.
Sự chồng lấn giữa các task statement này là có chủ đích. Đề thi kiểm tra xem bạn có hiểu rằng tool_use giải quyết được loại lỗi thứ nhất nhưng không giải quyết được loại thứ hai hay không.
Khái niệm chính
Retry kèm phản hồi lỗi hoạt động bằng cách gửi lại tài liệu gốc, kết quả trích xuất thất bại, và lỗi xác thực cụ thể. Retry sửa được lỗi định dạng và lỗi cấu trúc nhưng không thể tạo ra thông tin không có trong tài liệu nguồn. Luôn xác định xem một lỗi có thể sửa được hay không trước khi retry.
Bẫy thi
Bẫy thi: Cho rằng retry luôn hiệu quả với mọi lỗi trích xuất
Retry sửa được sai lệch định dạng, lỗi cấu trúc, và giá trị đặt sai chỗ. Chúng không thể tạo ra thông tin thực sự không có trong tài liệu nguồn. Đề thi đưa ra cả tình huống sửa được lẫn không sửa được — bạn phải phân biệt được chúng.
Bẫy thi: Triển khai retry mà không kèm lỗi xác thực cụ thể
Retry đơn giản không kèm phản hồi lỗi sẽ lặp lại đúng sai lầm cũ. Model cần thấy chính xác điều gì đã sai (ví dụ 'tổng các dòng chi tiết là £450 nhưng stated_total là £500') để tự sửa hiệu quả.
Bẫy thi: Chỉ dựa vào validation schema mà bỏ qua kiểm tra ngữ nghĩa
Validation schema (qua tool_use) bắt được lỗi cú pháp. Lỗi ngữ nghĩa — tổng sai, giá trị đặt sai chỗ, dữ liệu bịa đặt — cần logic xác thực và vòng lặp retry.
Tình huống luyện tập
Không tìm thấy câu hỏi luyện tập "q-4-4-001".
Bài tập thực hành
Xây dựng một vòng lặp Validation-Retry cho trích xuất tài liệu
Bạn sẽ học được gì
- Triển khai mẫu retry kèm phản hồi lỗi: tài liệu gốc + kết quả trích xuất thất bại + lỗi xác thực cụ thể
- Phân biệt lỗi có thể sửa (định dạng, cấu trúc, toán học) với lỗi không thể sửa (thông tin không tồn tại)
- Thiết kế schema tự sửa lỗi với calculated_total so với stated_total và các boolean conflict_detected
- Xây dựng vòng lặp cải thiện có hệ thống bằng trường detected_pattern và theo dõi tỷ lệ bác bỏ
- Hiểu ranh giới giữa lỗi cú pháp schema (bị loại bỏ bởi tool_use) và lỗi xác thực ngữ nghĩa (cần vòng lặp retry)
Các bước
Vì sao: Các trường tự sửa lỗi như calculated_total so với stated_total cho phép phát hiện sai lệch tự động mà không cần logic bên ngoài. Boolean conflict_detected và trường detected_pattern tạo nền tảng dữ liệu cho việc cải thiện prompt có hệ thống.
Bạn sẽ thấy: Một JSON schema với các trường số calculated_total và stated_total tách biệt, một boolean total_discrepancy, một boolean conflict_detected, và một trường chuỗi detected_pattern trên mỗi phát hiện trong mảng line_items.
Vì sao: Xác thực ngữ nghĩa bắt được các lỗi mà tool_use không thể bắt. Đề thi phân biệt lỗi cú pháp schema (bị loại bỏ bởi tool_use) với lỗi ngữ nghĩa (tổng sai, giá trị đặt sai chỗ) cần logic xác thực và vòng lặp retry.
Bạn sẽ thấy: Một hàm xác thực trả về một mảng các thông báo lỗi cụ thể, có thể hành động được. Mỗi lỗi nên nêu rõ điều gì được kỳ vọng so với điều gì thực tế tìm thấy, chứ không chỉ đơn giản báo validation thất bại.
Vì sao: Retry kèm phản hồi lỗi hiệu quả hơn hẳn so với retry đơn giản. Nếu không có lỗi cụ thể, model không có hướng dẫn và thường lặp lại đúng sai lầm cũ. Khi có lỗi, model có thể nhắm đúng mục tiêu để tự sửa.
Bạn sẽ thấy: Một tin nhắn retry bao gồm đủ ba thành phần: văn bản tài liệu gốc, JSON của kết quả trích xuất thất bại, và chuỗi lỗi xác thực cụ thể. Model nên tạo ra một kết quả trích xuất đã được sửa đúng ở lần retry.
Vì sao: Ranh giới hiệu quả của retry là khái niệm được kiểm tra gắt gao nhất trong task statement này. Retry sửa được sai lệch định dạng và lỗi cấu trúc nhưng không thể tạo ra thông tin không có trong nguồn. Đề thi đưa ra cả hai tình huống và mong bạn xác định được cái nào sửa được.
Bạn sẽ thấy: 2 tài liệu sửa được thành công sau 1-2 lần retry với tổng hoặc vị trí trường đã được sửa đúng. 3 tài liệu không sửa được được xác định đúng là thiếu thông tin và được gắn cờ để con người review thay vì bị retry.
Vì sao: Trường detected_pattern tạo ra một vòng lặp cải thiện có hệ thống. Khi developer liên tục bác bỏ các phát hiện được kích hoạt bởi một mẫu cụ thể, mẫu đó nhiều khả năng cần được tinh chỉnh lại trong prompt. Điều này biến dữ liệu bác bỏ thành các ưu tiên cải thiện prompt có thể hành động được.
Bạn sẽ thấy: Một bản ghi hoặc bảng thể hiện mỗi detected_pattern, tần suất của nó, tỷ lệ bị bác bỏ, và một danh sách ưu tiên các mẫu cần tinh chỉnh prompt. Các mẫu có tỷ lệ bác bỏ cao nên nằm ở đầu danh sách.
Nguồn tham khảo
- Claude Certified Architect Foundations Exam Guide — Task Statement 4.4 — Anthropic
- Tool Use (Function Calling) — Anthropic
- Building with Claude API (Skilljar) — Anthropic