Trong bài viết này
Từ được đánh dấu có giải thích. Di chuột hoặc chạm để xem, hay mở từ điển AI.
Agent gửi yêu cầu tạo lịch hẹn, máy chủ tạo thành công nhưng phản hồi bị mất. Agent thấy timeout và thử lại. Nếu máy chủ hiểu đây là yêu cầu mới, người dùng có hai lịch hẹn giống nhau. Timeout mô tả điều client biết, không chứng minh phía máy chủ chưa thực hiện.
Tiên quyết: hiểu API, lưu trữ giao dịch và vòng lặp AI agent. Ví dụ lịch hẹn dưới đây hoàn toàn minh họa; các thao tác được thử trong môi trường riêng có dữ liệu giả.
Gắn danh tính với ý định, không với lần gọi
Idempotency là thuộc tính giúp lặp cùng một thao tác mà không làm tăng thêm tác dụng phụ mong muốn. Trong Making retries safe with idempotent APIs, AWS trình bày việc dùng mã yêu cầu do caller cung cấp để phân biệt retry với ý định mới.
Ứng dụng tạo operation_id khi người dùng xác nhận một lịch hẹn, rồi giữ nguyên nó qua các lần thử lại. Hai lịch có cùng nội dung nhưng được người dùng yêu cầu riêng phải có hai mã khác nhau. Chỉ băm nội dung sẽ nhầm hai ý định hợp lệ thành một.
Agent dùng trạng thái hiện tại để chọn công cụ, đọc kết quả thực thi và kiểm tra tiến độ. Vòng lặp tiếp tục trong giới hạn được đặt trước hoặc kết thúc với kết quả đã xác minh.
↔ Vuốt ngang để xem toàn bộ sơ đồ.
01 / Quan sát
Agent nhận mục tiêu, trạng thái hiện tại và kết quả của các bước trước.
02 / Gọi công cụ
Mô hình đề xuất công cụ và đầu vào; ứng dụng kiểm tra quyền trước khi thực thi.
03 / Đọc kết quả
Agent nhận dữ liệu trả về, bao gồm thành công, dữ liệu rỗng hoặc lỗi.
04 / Kiểm tra và dừng
Kiểm tra mục tiêu đã đạt chưa. Dừng khi hoàn thành, thiếu quyền hoặc chạm giới hạn; nếu cần thì tiếp tục.
Minh họa một vòng lặp agent đơn giản. Công cụ chỉ được thực hiện thao tác trong quyền đã cấp; lời mô hình nói không thay thế kết quả thực thi.
Vòng lặp trong sơ đồ cho thấy công cụ có thể được gọi nhiều lần; cơ chế khử trùng phải nằm tại ranh giới thực thi, không được sơ đồ này đảm bảo sẵn.
Lưu cả khóa và dấu vân tay của đầu vào
Hợp đồng minh họa chứa tenant_id, operation_id, payload_hash, status và result. Máy chủ đặt ràng buộc duy nhất trên cặp tenant và mã thao tác. Nếu khóa đã tồn tại nhưng nội dung khác, trả lỗi xung đột thay vì âm thầm dùng kết quả cũ.
begin transaction
operation = reserve_or_lock_unique(tenant, operation_id, payload_hash)
if operation.payload_hash != payload_hash: reject conflict
if operation.completed: return operation.result
appointment = create_appointment(payload)
save_result(operation, appointment.id)
commit
Mã giả này chỉ phù hợp khi việc tạo lịch và lưu kết quả nằm trong cùng miền giao dịch. Hai request đồng thời cần được ràng buộc duy nhất hoặc khóa giao dịch điều phối; một câu if trong bộ nhớ không đủ.
Nếu tác dụng phụ nằm ở dịch vụ ngoài, giao dịch cơ sở dữ liệu cục bộ không bao phủ được nó. Cần khóa idempotency mà dịch vụ đích hỗ trợ, hoặc cơ chế đối soát. Không nên gọi thiết kế ấy là “exactly once” chỉ vì đã thêm bảng theo dõi.
Xử lý vùng không chắc chắn
Trạng thái STARTED cho biết hệ thống đã nhận ý định; SUCCEEDED cho biết có kết quả xác nhận; UNKNOWN cho biết chưa biết tác dụng phụ đã xảy ra hay chưa. Khi ở UNKNOWN, truy vấn theo mã thao tác là bước an toàn hơn việc sinh một mã mới rồi gửi lại.
Giả sử nhà cung cấp không hỗ trợ tra cứu hoặc khử trùng. Với thao tác quan trọng, hệ thống có thể dừng để đối soát thủ công. Đây là đánh đổi giữa tính sẵn sàng và nguy cơ lặp hành động; mô hình giỏi suy luận hơn không loại bỏ được sự thiếu thông tin từ mạng.
Thời gian giữ khóa cũng thuộc hợp đồng. Nếu xóa khóa sau một giờ nhưng hàng đợi có thể phát lại vào ngày hôm sau, yêu cầu muộn trở thành mới. Chọn thời hạn từ vòng đời nghiệp vụ và thời gian retry thực tế, không từ một con số tiện cho bộ nhớ đệm.
Thử lỗi đúng vào thời điểm khó
Bài tập: tạo công cụ giả create_appointment, sau đó chèn lỗi ở ba điểm: trước khi ghi, sau khi ghi nhưng trước phản hồi, và sau phản hồi nhưng trước khi agent lưu trạng thái. Gửi lại cùng mã thao tác năm lần, kể cả hai lời gọi đồng thời.
Tự kiểm: chỉ một lịch được tạo, các retry trả cùng định danh, cùng khóa với payload khác bị từ chối, và một ý định mới với khóa mới vẫn tạo lịch riêng. Cuối cùng xóa khóa theo chính sách thử nghiệm và quan sát yêu cầu muộn; ghi rõ giới hạn còn tồn tại thay vì che nó bằng thông báo thành công.
Đọc tiếp state machine để biểu diễn UNKNOWN và checkpoint để giữ khóa xuyên qua lần phục hồi.