Thực hànhNâng cao

Idempotency cho công cụ AI: thử lại mà không tạo tác dụng phụ trùng

Thiết kế khóa thao tác, trạng thái không chắc chắn và hợp đồng retry cho công cụ do agent sử dụng.

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.

Nhìn để hiểuAgent: hành động, quan sát, kiểm tra

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.

Vòng lặp có điều kiện dừng của agentAgent quan sát trạng thái, gọi công cụ, đọc kết quả thực thi rồi kiểm tra mục tiêu và giới hạn. Sơ đồ minh họa một tác vụ sắp xếp thư mục. Khi đã đạt mục tiêu hoặc chạm giới hạn, vòng lặp phải dừng; kết quả do công cụ xác nhận, không chỉ do mô hình tuyên bố.MỤC TIÊUSắp xếp thư mụcQuan sátGọi công cụĐọc danh sáchKết quả thậtKiểm traĐạt / giới hạn?Dừng

↔ Vuốt ngang để xem toàn bộ sơ đồ.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Bạn muốn hiểu điều gì?

Khám phá tất cả bài viết esc để đóng