Batch Processing và tối ưu hóa Prompt
Những điều bạn cần biết
Message Batches API là một công cụ tối ưu chi phí với những ràng buộc cứng mà đề thi kiểm tra trực tiếp. Hiểu khi nào nên dùng nó — và khi nào không — là trọng tâm của task statement này.
Message Batches API: Các sự thật cần biết
Đây là những ràng buộc không thể thương lượng:
- Tiết kiệm 50% chi phí so với các lời gọi API đồng bộ
- Cửa sổ xử lý lên tới 24 giờ — kết quả có thể về trong vài phút hoặc mất tới 24 giờ
- Không có SLA độ trễ được đảm bảo — bạn không thể tin rằng kết quả sẽ về trong một khung thời gian cụ thể nào
- Không hỗ trợ gọi tool nhiều lượt (multi-turn) trong một request batch duy nhất — model không thể thực thi tool giữa chừng request và dùng kết quả đó để tiếp tục xử lý
- Trường
custom_idđể đối chiếu cặp request/response — mỗi request trong một batch có một định danh duy nhất dùng để khớp nó với response tương ứng
Quy tắc khớp (matching rule)
Đây là khái niệm được kiểm tra nhiều nhất trong task statement này:
API đồng bộ: Dùng cho các quy trình chặn (blocking) nơi ai đó hoặc thứ gì đó đang chờ kết quả. Kiểm tra trước khi merge trong CI/CD, phản hồi review code theo thời gian thực, bất kỳ quy trình nào mà developer bị chặn lại chờ hoàn thành.
Batch API: Dùng cho các quy trình chịu được độ trễ, nơi kết quả được sử dụng sau. Báo cáo nợ kỹ thuật chạy qua đêm, tóm tắt audit code hàng tuần, các lần chạy sinh test hàng đêm, trích xuất tài liệu theo lô.
Đề thi đưa ra cụ thể một tình huống (Câu 11 trong bộ câu hỏi mẫu) trong đó một quản lý đề xuất chuyển toàn bộ hệ thống sang batch processing để tiết kiệm chi phí. Đáp án đúng là giữ các quy trình chặn ở chế độ đồng bộ và chỉ chuyển những quy trình chịu được độ trễ sang batch.
typescriptCopy
// Synchronous — developer is waiting for this
const preMergeReview = await client.messages.create({
model: "claude-sonnet-4-20250514",
max_tokens: 4096,
messages: [{ role: "user", content: prDiffContent }]
});
// Batch — results consumed tomorrow morning
const batchRequest = await client.batches.create({
requests: technicalDebtDocuments.map((doc, i) => ({
custom_id: `debt-report-${i}`,
params: {
model: "claude-sonnet-4-20250514",
max_tokens: 4096,
messages: [{ role: "user", content: doc }]
}
}))
});Tính toán SLA
Khi thiết kế lịch trình batch processing, bạn phải tính đến cửa sổ xử lý tối đa 24 giờ. Nếu tổ chức của bạn yêu cầu SLA 30 giờ cho một báo cáo:
- Batch API đảm bảo kết quả trong vòng 24 giờ, vì vậy batch cuối cùng phải được nộp không muộn hơn 24 giờ trước hạn chót
- Tổng SLA 30 giờ trừ đi 24 giờ xử lý = 6 giờ đệm dùng để thu thập request, xác thực đầu vào, hoặc hấp thụ các độ trễ vận hành
- Nộp batch mỗi 4-6 giờ trong khoảng thời gian đệm đó để luôn có một batch mới đang xử lý
Đề thi có thể đưa ra một câu hỏi về lập lịch mà bạn cần tính ngược từ hạn SLA để xác định tần suất nộp batch.
Xử lý thất bại trong batch
Không phải mọi tài liệu trong một batch đều thành công. Mẫu xử lý thất bại đúng cách gồm ba bước:
1. Xác định các thất bại theo custom_id. Mỗi request có một định danh duy nhất. Hãy parse kết quả batch để tìm ra những giá trị custom_id nào bị lỗi.
2. Chỉ nộp lại những thất bại kèm điều chỉnh. Đừng nộp lại toàn bộ batch. Các điều chỉnh thường gặp gồm:
- Chia nhỏ (chunk) các tài liệu quá lớn vượt giới hạn context
- Đơn giản hóa prompt trích xuất cho các tài liệu có cấu trúc bất thường
- Thêm ví dụ few-shot theo định dạng cụ thể cho các tài liệu thất bại do sự đa dạng về cấu trúc
3. Tinh chỉnh prompt trên một tập mẫu TRƯỚC KHI xử lý batch. Đây là bước chủ động giúp tối đa hóa tỷ lệ thành công ngay từ lần đầu và giảm chi phí nộp lại. Hãy thử nghiệm prompt của bạn trên một tập mẫu đại diện (5-10 tài liệu bao quát các định dạng và trường hợp biên) trước khi xử lý toàn bộ batch.
typescriptCopy
// Parse batch results and identify failures
const results = await client.batches.results(batchId);
const failures = results.filter(r => r.result.type === "errored");
const failedIds = failures.map(f => f.custom_id);
// Resubmit only failures with modifications
const retryRequests = failedIds.map(id => {
const originalDoc = documentsById[id];
return {
custom_id: `${id}-retry-1`,
params: {
model: "claude-sonnet-4-20250514",
max_tokens: 8192, // increased for oversized docs
messages: [{
role: "user",
content: chunkIfNeeded(originalDoc)
}]
}
};
});Hạn chế về gọi tool nhiều lượt (multi-turn)
Batch API không hỗ trợ gọi tool nhiều lượt trong một request duy nhất. Điều này có nghĩa là bạn không thể:
- Định nghĩa tool và để model gọi chúng giữa chừng request
- Xử lý kết quả tool và tiếp tục hội thoại trong cùng một mục batch
- Chạy các agentic loop trong một request batch duy nhất
Nếu quy trình của bạn cần thực thi tool giữa chừng xử lý, bạn buộc phải dùng API đồng bộ. Hạn chế này là một điểm kiểm tra trực tiếp trong đề thi — nếu một tình huống mô tả một quy trình batch cần gọi tool bên ngoài trong lúc xử lý, đáp án đúng là dùng API đồng bộ cho bước đó.
Khái niệm chính
Message Batches API cung cấp mức tiết kiệm chi phí 50% với cửa sổ xử lý lên tới 24 giờ và không có SLA độ trễ. Chỉ dùng nó cho các quy trình chịu được độ trễ (báo cáo qua đêm, audit hàng tuần). Các quy trình chặn (kiểm tra trước khi merge) phải giữ ở chế độ đồng bộ. Luôn tinh chỉnh prompt trên một tập mẫu trước khi nộp các batch lớn.
Tối ưu hóa prompt trước khi nộp batch
Chiến lược batch processing tiết kiệm chi phí nhất là đầu tư thời gian tinh chỉnh prompt trước khi nộp khối lượng lớn:
- Thử nghiệm trên tập mẫu: Lấy 5-10 tài liệu đại diện bao quát các định dạng, trường hợp biên, và loại tài liệu có trong batch của bạn
- Lặp lại tinh chỉnh trên tập mẫu: Tinh chỉnh prompt trích xuất, thêm ví dụ few-shot, điều chỉnh thiết kế schema cho đến khi tập mẫu đạt độ chính xác cao
- Nộp toàn bộ batch: Với prompt đã được tinh chỉnh, tỷ lệ thành công ngay từ lần đầu sẽ cao hơn đáng kể
- Xử lý các thất bại: Chỉ nộp lại những tài liệu thất bại kèm các điều chỉnh có mục tiêu
Quy trình này giảm đáng kể tổng chi phí. Tỷ lệ thành công lần đầu 90% trên 1.000 tài liệu nghĩa là chỉ có 100 lần retry. Tỷ lệ thành công lần đầu 60% nghĩa là 400 lần retry — gấp bốn lần chi phí nộp lại, cộng thêm chi phí xử lý batch cho những lần retry đó.
Bẫy thi
Bẫy thi: Chuyển toàn bộ quy trình sang batch processing để tiết kiệm chi phí
Các quy trình chặn nơi developer chờ kết quả (kiểm tra trước khi merge, review theo thời gian thực) phải giữ ở chế độ đồng bộ. Batch API không có SLA độ trễ được đảm bảo và có thể mất tới 24 giờ. Chỉ những quy trình chịu được độ trễ mới nên dùng batch.
Bẫy thi: Cho rằng kết quả batch luôn về nhanh vì thường là như vậy
Batch API không có SLA độ trễ. Kết quả thường về nhanh hơn 24 giờ, nhưng bạn không thể thiết kế các quy trình chặn dựa trên tình huống tốt nhất. Hãy thiết kế dựa trên mức tối đa 24 giờ.
Bẫy thi: Dùng batch API cho các quy trình cần gọi tool nhiều lượt
Batch API không hỗ trợ gọi tool nhiều lượt trong một request duy nhất. Nếu quy trình của bạn cần thực thi tool và dùng kết quả giữa chừng xử lý, bạn buộc phải dùng API đồng bộ.
Tình huống luyện tập
Không tìm thấy câu hỏi luyện tập "q-4-5-001".
Bài tập thực hành
Thiết kế một chiến lược Batch Processing
Bạn sẽ học được gì
- Phân loại quy trình là chặn (đồng bộ) hay chịu được độ trễ (đủ điều kiện dùng batch) dựa trên yêu cầu độ trễ
- Dùng Message Batches API với trường custom_id để đối chiếu request-response
- Triển khai xử lý thất bại chỉ nộp lại những tài liệu thất bại kèm các điều chỉnh có mục tiêu
- Tính toán tần suất nộp batch dựa trên ràng buộc SLA, có tính đến cửa sổ xử lý 24 giờ
- Áp dụng quy trình tinh chỉnh prompt: thử nghiệm trên tập mẫu trước khi nộp toàn bộ batch
Các bước
Vì sao: Quy tắc khớp giữa API đồng bộ và batch là khái niệm được kiểm tra nhiều nhất trong task statement này. Đề thi đưa ra một tình huống trong đó một quản lý đề xuất chuyển mọi thứ sang batch để tiết kiệm chi phí, và bạn phải xác định quy trình nào không thể chịu được cửa sổ xử lý 24 giờ.
Bạn sẽ thấy: Một bảng với 5 quy trình, mỗi quy trình được phân loại rõ ràng kèm giải thích. Các quy trình chặn có ai đó hoặc thứ gì đó đang chờ kết quả. Các quy trình đủ điều kiện dùng batch tiêu thụ kết quả sau, không có phụ thuộc thời gian thực.
Vì sao: Trường custom_id là cơ chế để đối chiếu các cặp request-response trong kết quả batch. Không có định danh duy nhất, bạn không thể xác định tài liệu nào thành công hay thất bại, khiến việc xử lý thất bại trở nên bất khả thi.
Bạn sẽ thấy: Một object batch request hợp lệ với 20 mục, mỗi mục chứa một custom_id duy nhất, đặc tả model, max_tokens, và một mảng messages với nội dung tài liệu.
Vì sao: Chỉ nộp lại những thất bại kèm điều chỉnh có mục tiêu là mẫu xử lý thất bại batch đúng cách. Nộp lại toàn bộ batch sẽ lãng phí chi phí cho những tài liệu đã thành công. Đề thi kiểm tra việc bạn hiểu cơ chế đối chiếu custom_id và retry có mục tiêu.
Bạn sẽ thấy: Một bộ xử lý thất bại lọc kết quả theo trạng thái lỗi, trích ra các giá trị custom_id của những thất bại, tra cứu lại tài liệu gốc, và tạo một batch retry với các điều chỉnh như tăng max_tokens hoặc chia nhỏ nội dung.
Vì sao: Tính toán SLA với cửa sổ xử lý batch 24 giờ là một điểm kiểm tra trực tiếp trong đề thi. Bạn phải tính ngược từ hạn SLA để xác định thời điểm cần nộp, có tính đến thời gian xử lý tối đa cộng thêm một khoảng đệm an toàn.
Bạn sẽ thấy: Một phép tính thể hiện: SLA 30 giờ trừ đi cửa sổ xử lý tối đa 24 giờ bằng 6 giờ đệm. Việc nộp phải diễn ra ít nhất 30 giờ trước hạn chót, với các batch được nộp mỗi 4-6 giờ để đảm bảo SLA có khoảng dự phòng.
Vì sao: Tinh chỉnh prompt trên tập mẫu trước khi nộp batch là chiến lược batch processing tiết kiệm chi phí nhất. Tỷ lệ thành công lần đầu 90% nghĩa là 2 lần retry trên 20 tài liệu. Tỷ lệ thành công lần đầu 60% nghĩa là 8 lần retry, gấp bốn lần chi phí nộp lại.
Bạn sẽ thấy: Một tập mẫu bao quát các loại tài liệu và trường hợp biên, 2-3 lần lặp tinh chỉnh prompt cải thiện độ chính xác trên tập mẫu, và sau đó việc nộp toàn bộ batch đạt tỷ lệ thành công lần đầu cao.
Nguồn tham khảo
- Claude Certified Architect Foundations Exam Guide — Task Statement 4.5 — Anthropic
- Message Batches API — Anthropic
- Building with Claude API (Skilljar) — Anthropic