Claude Certification Guide
0% chương trình học đã hoàn thành
5.3

Lan truyền lỗi trong hệ thống đa agent

Những điều bạn cần biết

Lan truyền lỗi (error propagation) quyết định một hệ thống đa agent có phục hồi một cách suôn sẻ hay thất bại trong im lặng. Khi một subagent gặp phải sự cố — timeout, lỗi quyền truy cập, một truy vấn không hợp lệ — cách thông tin về sự cố đó truyền ngược về bộ điều phối (coordinator) sẽ quyết định độ tin cậy của hệ thống. Đề thi kiểm tra sự hiểu biết của bạn về ngữ cảnh lỗi có cấu trúc, hai anti-pattern quan trọng, và sự phân biệt mà hầu hết các nhà phát triển thường nhầm lẫn: lỗi truy cập so với kết quả rỗng hợp lệ.

Ngữ cảnh lỗi có cấu trúc

Khi một subagent thất bại, nó phải trả về ngữ cảnh lỗi có cấu trúc để bộ điều phối có thể đưa ra quyết định phục hồi thông minh. Ngữ cảnh này phải bao gồm bốn yếu tố:

1. Loại lỗi. Phân loại sự cố: tạm thời (timeout, giới hạn tần suất — có thể thành công khi thử lại), xác thực (đầu vào sai — cần sửa truy vấn), nghiệp vụ (vi phạm quy tắc — cần leo thang hoặc tìm phương án khác), hoặc quyền truy cập (bị từ chối truy cập — không thể thử lại nếu không thay đổi quyền hạn).

2. Đã thử làm gì. Truy vấn cụ thể, các tham số đã dùng, và hệ thống mục tiêu. "Đã tìm kiếm trong cơ sở dữ liệu học thuật với từ khóa 'chính sách năng lượng tái tạo' trong khoảng thời gian 2022-2024" là thông tin hữu ích để hành động. "Tìm kiếm thất bại" thì không.

3. Kết quả từng phần thu thập được trước khi thất bại. Nếu subagent đã lấy được ba trong số năm nguồn trước khi bị timeout, ba kết quả đó vẫn có giá trị. Việc vứt bỏ chúng chỉ vì toàn bộ thao tác thất bại là lãng phí.

4. Các phương án thay thế khả thi. Subagent hiểu rõ lĩnh vực của nó. Nếu một cơ sở dữ liệu học thuật đang gặp sự cố, nó có thể đề xuất thử một cơ sở dữ liệu khác, mở rộng từ khóa tìm kiếm, hoặc kiểm tra kết quả đã lưu cache. Những gợi ý này giúp bộ điều phối quyết định chiến lược phục hồi.

jsonCopy

{
  "status": "partial_failure",
  "failureType": "transient",
  "attemptedAction": {
    "tool": "search_academic_db",
    "query": "renewable energy policy",
    "dateRange": "2022-2024"
  },
  "partialResults": [
    {
      "title": "EU Renewable Energy Directive 2023",
      "source": "EUR-Lex",
      "retrieved": true
    }
  ],
  "alternativeApproaches": [
    "Retry with narrower date range (2023-2024)",
    "Search alternative database: government_publications",
    "Use cached results from previous research session"
  ]
}

Cấu trúc này cung cấp cho bộ điều phối mọi thứ nó cần để quyết định: thử lại cùng một truy vấn, thử một phương án khác, tiếp tục với kết quả từng phần, hoặc leo thang.

Hai anti-pattern

Đề thi kiểm tra hai điều này một cách trực tiếp. Cả hai đều thảm khốc theo những cách khác nhau:

Che giấu trong im lặng: trả về kết quả rỗng nhưng đánh dấu là thành công. Đây là anti-pattern tệ nhất. Subagent gặp phải timeout nhưng trả về { "results": [], "status": "success" }. Bộ điều phối tin rằng cuộc tìm kiếm đã chạy và không tìm thấy gì. Nó sẽ không thử lại, không thử phương án khác, và sẽ tạo ra một bản tổng hợp âm thầm bỏ sót toàn bộ một lĩnh vực nghiên cứu. Đầu ra cuối cùng trông có vẻ đầy đủ nhưng lại thiếu nội dung quan trọng.

Việc che giấu trong im lặng đặc biệt nguy hiểm vì nó vô hình. Đầu ra trông có vẻ đúng — nó chỉ có những lỗ hổng mà không ai có thể phát hiện được. Trong bối cảnh hỗ trợ khách hàng, điều này có thể có nghĩa là agent báo cáo "không tìm thấy đơn hàng" trong khi hệ thống tra cứu đơn hàng thực ra đang gặp sự cố, khiến agent nói với khách hàng rằng họ không có tài khoản.

Chấm dứt luồng công việc: giết chết toàn bộ pipeline chỉ vì một lỗi duy nhất. Một subagent bị timeout và toàn bộ pipeline nghiên cứu sập theo. Bốn subagent còn lại đã hoàn thành thành công, nhưng kết quả của chúng bị vứt bỏ. Đây là một phản ứng không tương xứng, lãng phí công việc đã hoàn thành và không cung cấp lối phục hồi nào.

Điểm cân bằng đúng đắn là lan truyền lỗi có cấu trúc: subagent thất bại báo cáo những gì đã xảy ra, bộ điều phối đánh giá thiệt hại, và hệ thống tiếp tục với kết quả từng phần hoặc phục hồi có mục tiêu.

Lỗi truy cập so với kết quả rỗng hợp lệ

Sự phân biệt này rất quan trọng và đề thi kiểm tra nó một cách trực tiếp:

Lỗi truy cập: Tool không thể tiếp cận nguồn dữ liệu. Một timeout, một lỗi kết nối, một từ chối quyền truy cập. Cuộc tìm kiếm chưa thực sự chạy. Hãy cân nhắc thử lại với cùng tham số hoặc tham số đã điều chỉnh.

Kết quả rỗng hợp lệ: Tool đã tiếp cận được nguồn và thực thi truy vấn. Nó không tìm thấy kết quả khớp nào. Đây CHÍNH LÀ câu trả lời. Không cần thử lại vì hệ thống đã hoạt động đúng — chỉ đơn giản là không có kết quả nào cho truy vấn này.

Nhầm lẫn hai điều này dẫn đến hai vấn đề:

  • Coi lỗi truy cập là kết quả rỗng hợp lệ nghĩa là bạn sẽ không bao giờ thử lại khi lẽ ra nên thử.
  • Coi kết quả rỗng hợp lệ là lỗi truy cập nghĩa là bạn lãng phí thời gian thử lại một truy vấn mà lúc nào cũng sẽ trả về không có gì.

pythonCopy

# Access failure — consider retry
{
    "status": "error",
    "failureType": "transient",
    "message": "Connection timeout after 30s",
    "shouldRetry": True
}
 
# Valid empty result — no retry needed
{
    "status": "success",
    "results": [],
    "message": "Query executed successfully. No matching records found.",
    "shouldRetry": False
}

Chú thích mức độ bao phủ

Khi một agent tổng hợp kết hợp các phát hiện từ nhiều subagent, đầu ra nên ghi chú lĩnh vực chủ đề nào được hỗ trợ đầy đủ và lĩnh vực nào còn thiếu sót. Nếu một subagent không lấy được các nguồn về năng lượng địa nhiệt, bản tổng hợp nên ghi rõ:

"Phần về năng lượng địa nhiệt bị hạn chế do không thể truy cập tạp chí học thuật trong quá trình nghiên cứu."

Điều này tốt hơn nhiều so với việc âm thầm bỏ qua chủ đề đó. Chú thích mức độ bao phủ cho người đọc biết báo cáo bao quát đầy đủ điều gì và có những hạn chế đã biết ở đâu. Không có chúng, một lỗ hổng trong bản tổng hợp trông giống như chủ đề đó không liên quan, thay vì thực tế là nguồn dữ liệu không khả dụng.

Phục hồi cục bộ đối với lỗi tạm thời

Subagent nên triển khai phục hồi cục bộ đối với các lỗi tạm thời — logic thử lại, nguồn dự phòng, phản hồi ở mức suy giảm — trước khi lan truyền lỗi lên bộ điều phối. Chỉ lan truyền các lỗi mà subagent không thể tự giải quyết cục bộ. Khi lan truyền, luôn bao gồm những gì đã thử và bất kỳ kết quả từng phần nào đã thu thập được.

Điều này giảm bớt độ phức tạp cho bộ điều phối. Bộ điều phối không cần phải quản lý logic thử lại cho mọi lỗi tạm thời có thể xảy ra ở mọi subagent. Mỗi subagent tự xử lý các lỗi tạm thời của mình và chỉ leo thang những lỗi kéo dài.

Khái niệm chính

Ngữ cảnh lỗi có cấu trúc (loại lỗi, hành động đã thử, kết quả từng phần, phương án thay thế) cho phép bộ điều phối phục hồi một cách thông minh. Hai anti-pattern là che giấu trong im lặng (kết quả rỗng đánh dấu là thành công) và chấm dứt luồng công việc (giết chết pipeline vì một lỗi duy nhất). Lỗi truy cập cần cân nhắc thử lại; kết quả rỗng hợp lệ thì không.

Bẫy thi

Bẫy thi: Bắt được một timeout và trả về kết quả rỗng nhưng đánh dấu là thành công

Che giấu trong im lặng ngăn chặn mọi khả năng phục hồi. Bộ điều phối tin rằng cuộc tìm kiếm đã thành công và không tìm thấy gì, nên nó sẽ không bao giờ thử các phương án khác. Đây là anti-pattern tệ nhất.

Bẫy thi: Chấm dứt toàn bộ pipeline nghiên cứu khi một subagent bị timeout

Chấm dứt luồng công việc lãng phí kết quả từng phần từ các subagent khác đã hoàn thành thành công. Bộ điều phối nên đánh giá lỗi và quyết định phục hồi có mục tiêu.

Bẫy thi: Trả về một trạng thái chung chung 'tìm kiếm không khả dụng' sau khi hết số lần thử lại

Lỗi chung chung che giấu truy vấn, kết quả từng phần, và các phương án thay thế khỏi bộ điều phối. Ngữ cảnh lỗi có cấu trúc cho phép phục hồi có căn cứ; trạng thái chung chung thì ngăn cản điều đó.

Bẫy thi: Thử lại một kết quả rỗng hợp lệ vì nó trông giống như một lỗi

Một kết quả rỗng hợp lệ nghĩa là truy vấn đã thực thi thành công và không tìm thấy kết quả khớp nào. Đây CHÍNH LÀ câu trả lời. Việc thử lại lãng phí thời gian và tài nguyên cho một truy vấn sẽ luôn trả về không có gì.

Tình huống luyện tập

Không tìm thấy câu hỏi luyện tập "q-5-3-001".

Bài tập thực hành

Xây dựng một hệ thống lan truyền lỗi có cấu trúc

Bạn sẽ học được gì

  • Thiết kế ngữ cảnh lỗi có cấu trúc với bốn yếu tố bắt buộc: loại lỗi, hành động đã thử, kết quả từng phần, và phương án thay thế
  • Phân biệt lỗi truy cập (timeout, lỗi kết nối) với kết quả rỗng hợp lệ (truy vấn thành công, không có kết quả khớp)
  • Nhận diện và tránh hai anti-pattern: che giấu trong im lặng và chấm dứt luồng công việc
  • Triển khai logic thử lại cục bộ cho các lỗi tạm thời trước khi lan truyền lên bộ điều phối
  • Thêm chú thích mức độ bao phủ vào đầu ra tổng hợp để minh bạch về các lỗ hổng thông tin

Các bước

Vì sao: Ngữ cảnh lỗi có cấu trúc cho phép bộ điều phối phục hồi một cách thông minh. Bốn yếu tố này cung cấp cho bộ điều phối mọi thứ nó cần để quyết định: thử lại, thử một phương án khác, tiếp tục với kết quả từng phần, hoặc leo thang. Các thông báo lỗi chung chung như 'tìm kiếm không khả dụng' ngăn cản mọi khả năng phục hồi có căn cứ.

Bạn sẽ thấy: Một interface TypeScript hoặc schema JSON với failureType là một enum của bốn loại, attemptedAction là một đối tượng gồm tool/truy vấn/tham số, partialResults là một mảng, và alternativeApproaches là một mảng chuỗi. Mỗi trường nên có mô tả giải thích mục đích của nó.

Vì sao: Nhầm lẫn giữa lỗi truy cập và kết quả rỗng hợp lệ là một lỗi nghiêm trọng mà đề thi kiểm tra trực tiếp. Lỗi truy cập nghĩa là truy vấn chưa thực sự chạy và nên được thử lại. Kết quả rỗng hợp lệ nghĩa là truy vấn đã thành công và không tìm thấy gì, đây CHÍNH LÀ câu trả lời. Xử lý hai trường hợp này giống nhau dẫn đến việc hoặc không bao giờ thử lại khi lẽ ra nên thử, hoặc lãng phí thời gian thử lại những truy vấn sẽ luôn trả về không có gì.

Bạn sẽ thấy: Một hàm subagent bắt các ngoại lệ (timeout, lỗi kết nối) và báo cáo chúng là lỗi truy cập với shouldRetry: true, trong khi các truy vấn thành công không trả về kết quả được báo cáo là thành công với mảng results rỗng và shouldRetry: false.

Vì sao: Subagent nên tự xử lý các lỗi tạm thời của mình cục bộ trước khi leo thang. Điều này giảm bớt độ phức tạp cho bộ điều phối, vì bộ điều phối không cần phải quản lý logic thử lại cho mọi lỗi tạm thời có thể xảy ra ở mọi subagent. Chỉ những lỗi kéo dài, không được giải quyết bằng thử lại cục bộ, mới nên được lan truyền.

Bạn sẽ thấy: Một wrapper thử lại với backoff theo cấp số nhân (ví dụ: 1 giây, 2 giây, 4 giây) thử thao tác tối đa 3 lần trước khi lan truyền lỗi có cấu trúc lên bộ điều phối. Kết quả từng phần thu thập được trước khi thất bại nên được giữ lại qua các lần thử lại.

Vì sao: Bộ điều phối là người ra quyết định phục hồi thông minh. Với ngữ cảnh lỗi có cấu trúc, nó có thể đưa ra lựa chọn có căn cứ thay vì áp dụng chính sách đồng loạt. Đây là điểm cân bằng đúng đắn giữa che giấu trong im lặng (bỏ qua lỗi) và chấm dứt luồng công việc (giết chết pipeline vì một lỗi duy nhất).

Bạn sẽ thấy: Một hàm điều phối kiểm tra loại lỗi, xem xét kết quả từng phần, đánh giá các phương án thay thế, và chọn chiến lược phục hồi phù hợp. Nó nên xử lý cả bốn loại lỗi theo cách khác nhau và không bao giờ âm thầm che giấu lỗi.

Vì sao: Chú thích mức độ bao phủ cho người đọc biết báo cáo bao quát đầy đủ điều gì và có những hạn chế đã biết ở đâu. Không có chúng, một lỗ hổng trông giống như chủ đề đó không liên quan, thay vì thực tế là nguồn dữ liệu không khả dụng. Sự minh bạch này tốt hơn nhiều so với việc âm thầm bỏ qua các chủ đề.

Bạn sẽ thấy: Một đầu ra tổng hợp bao gồm một phần mức độ bao phủ, liệt kê mỗi lĩnh vực chủ đề cùng trạng thái chất lượng dữ liệu của nó: được hỗ trợ đầy đủ, hạn chế (kèm lý do), hoặc không khả dụng (kèm lý do). Các chủ đề bị lỗi từ subagent nên được ghi chú rõ ràng, không bị âm thầm bỏ qua.

Nguồn tham khảo