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

Phản Hồi Lỗi Có Cấu Trúc

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

Khi một MCP tool thất bại, phản hồi lỗi mà nó trả về quyết định liệu agent có thể phục hồi một cách thông minh hay chỉ hành động mù quáng. Các thông báo lỗi chung chung như "Operation failed" (Thao tác thất bại) vô dụng đối với một LLM — chúng không cung cấp tín hiệu nào về việc đã xảy ra chuyện gì, có nên thử lại hay không, hay nên đi theo hướng thay thế nào.

MCP protocol cung cấp cờ isError dành riêng cho việc báo lỗi tool về cho agent. Việc đặt cờ này báo cho model biết rằng việc thực thi tool đã thất bại, cho phép nó suy luận về cách phục hồi thay vì coi văn bản lỗi như một kết quả thành công bình thường.

Bốn Loại Lỗi

Mọi lỗi tool đều rơi vào một trong bốn loại. Mỗi loại đòi hỏi một chiến lược phục hồi khác nhau, và agent cần metadata có cấu trúc để phân biệt chúng.

1. Lỗi tạm thời (Transient Errors) Timeout, dịch vụ không khả dụng, giới hạn tốc độ (rate limit). Hệ thống bên dưới tạm thời không thể truy cập được nhưng bản thân yêu cầu là hợp lệ. Cách phục hồi: thử lại sau một khoảng chờ ngắn.

jsonCopy

{
  "isError": true,
  "content": [{
    "type": "text",
    "text": "Service temporarily unavailable"
  }],
  "errorCategory": "transient",
  "isRetryable": true,
  "description": "The order database is experiencing high load. The request is valid and should succeed on retry."
}

2. Lỗi xác thực (Validation Errors) Định dạng đầu vào không hợp lệ, thiếu trường bắt buộc, giá trị nằm ngoài phạm vi cho phép. Bản thân yêu cầu bị sai định dạng. Cách phục hồi: sửa đầu vào rồi thử lại.

jsonCopy

{
  "isError": true,
  "content": [{
    "type": "text",
    "text": "Invalid order ID format"
  }],
  "errorCategory": "validation",
  "isRetryable": true,
  "description": "Order ID must be in format #NNNNN (e.g. #12345). Received: 'order-abc'. Please reformat and retry."
}

3. Lỗi nghiệp vụ (Business Errors) Vi phạm chính sách, vượt giới hạn, xung đột quy tắc nghiệp vụ. Yêu cầu về mặt kỹ thuật là hợp lệ nhưng vi phạm một ràng buộc nghiệp vụ. Cách phục hồi: KHÔNG thử lại — cùng một yêu cầu sẽ luôn thất bại. Agent cần một quy trình làm việc thay thế.

jsonCopy

{
  "isError": true,
  "content": [{
    "type": "text",
    "text": "Refund exceeds policy limit"
  }],
  "errorCategory": "business",
  "isRetryable": false,
  "description": "Refund amount of £750 exceeds the £500 automatic refund limit. This requires manager approval. Please escalate to a human agent with the refund details."
}

Lưu ý cờ isRetryable: false. Điều này rất quan trọng. Lỗi nghiệp vụ không bao giờ được giải quyết bằng cách thử lại. Agent phải đi theo một hướng hoàn toàn khác — thường là leo thang (escalation) hoặc một quy trình làm việc thay thế. Việc bao gồm một lời giải thích thân thiện với khách hàng giúp agent giao tiếp phù hợp.

4. Lỗi quyền truy cập (Permission Errors) Truy cập bị từ chối, thiếu thông tin xác thực, thất bại về ủy quyền. Tool không thể thực thi vì bên gọi thiếu quyền cần thiết. Cách phục hồi: leo thang hoặc sử dụng thông tin xác thực khác.

jsonCopy

{
  "isError": true,
  "content": [{
    "type": "text",
    "text": "Access denied"
  }],
  "errorCategory": "permission",
  "isRetryable": false,
  "description": "The current service account does not have permission to access financial records. Escalate to a senior agent with financial system access."
}

isRetryable Thực Sự Báo Hiệu Điều Gì

isRetryable trả lời một câu hỏi: có con đường nào dẫn đến thành công thông qua việc thử lại hay không? Nó không hứa hẹn rằng cùng một yêu cầu sẽ thành công mà không thay đổi gì. Hai loại lỗi cùng có isRetryable: true nhưng cần cách phục hồi khác nhau. Một lỗi tạm thời được thử lại y nguyên một khi hệ thống phục hồi. Một lỗi xác thực chỉ được thử lại sau khi agent sửa đầu vào, định dạng lại order-abc thành #12345. Lỗi nghiệp vụ và lỗi quyền truy cập có isRetryable: false vì lý do ngược lại: không việc thử lại nào có ích. Một quy tắc nghiệp vụ chặn đứng yêu cầu, và một lỗi quyền truy cập cần một chủ thể khác, một tài khoản có quyền truy cập phù hợp, chứ không phải một lệnh gọi được viết lại. Hãy đọc cờ này như "một lần thử lại có thể có tác dụng hay không", sau đó đọc errorCategory để biết cách: gửi lại, tự sửa, leo thang, hay đi theo hướng thay thế.

Lỗi Truy Cập So Với Kết Quả Rỗng Hợp Lệ

Sự phân biệt này là một trong những khái niệm quan trọng nhất trong toàn bộ lĩnh vực này, và kỳ thi kiểm tra nó trực tiếp.

Lỗi truy cập: Tool không thể tiếp cận nguồn dữ liệu. Đã xảy ra timeout, xác thực thất bại, hoặc dịch vụ bị gián đoạn. Dữ liệu có thể tồn tại, nhưng tool không thể kiểm tra được. Agent cần quyết định liệu có nên thử lại hay không.

Kết quả rỗng hợp lệ: Tool đã truy vấn thành công nguồn dữ liệu và không tìm thấy kết quả khớp. Truy vấn đã thực thi đúng — đơn giản là không có dữ liệu nào khớp với tiêu chí. Agent KHÔNG nên thử lại. Câu trả lời là "không tìm thấy kết quả nào."

Nhầm lẫn hai điều này phá vỡ hoàn toàn logic phục hồi. Hãy xem xét tình huống này:

Một tool trả về một mảng rỗng sau khi tra cứu khách hàng. Agent thử lại 3 lần, sau đó leo thang lên con người. Phân tích cho thấy tài khoản của khách hàng đơn giản là không tồn tại.

Tool đã thành công. Nó đã truy vấn cơ sở dữ liệu, không tìm thấy khách hàng khớp, và trả về đúng một kết quả rỗng. Nhưng vì phản hồi không phân biệt giữa "tôi không thể tiếp cận cơ sở dữ liệu" và "tôi đã tiếp cận cơ sở dữ liệu và không tìm thấy gì", agent xử lý cả hai theo cùng một cách — như một thất bại đáng để thử lại.

Cách khắc phục: hãy cấu trúc các phản hồi tool của bạn sao cho một truy vấn thành công không có kết quả trông khác biệt về căn bản so với một truy vấn thất bại.

jsonCopy

// Valid empty result — NOT an error
{
  "isError": false,
  "content": [{
    "type": "text",
    "text": "No customer found matching email 'john@example.com'. The query executed successfully but returned no matches."
  }],
  "resultCount": 0
}
 
// Access failure — IS an error
{
  "isError": true,
  "content": [{
    "type": "text",
    "text": "Could not reach customer database"
  }],
  "errorCategory": "transient",
  "isRetryable": true,
  "description": "Connection to the customer database timed out after 5 seconds. The query did not execute."
}

Lan Truyền Lỗi Trong Hệ Thống Đa Agent

Trong các kiến trúc đa agent, việc xử lý lỗi tuân theo nguyên tắc phục hồi cục bộ với lan truyền có chọn lọc:

  1. Subagent triển khai phục hồi cục bộ cho các thất bại tạm thời. Nếu một tìm kiếm web bị timeout, subagent tìm kiếm thử lại trước khi làm phiền coordinator.
  2. Chỉ lan truyền các lỗi không thể giải quyết cục bộ. Nếu tất cả các lần thử lại đều thất bại, subagent báo cáo thất bại lên trên.
  3. Bao gồm kết quả một phần và những gì đã được thử. Coordinator cần ngữ cảnh: "Tôi đã tìm kiếm thành công 3 trong số 5 nguồn. Nguồn 4 và 5 bị timeout. Đây là kết quả một phần từ 3 nguồn thành công."

Điều này ngăn chặn hai anti-pattern: âm thầm che giấu lỗi (trả về kết quả rỗng như thể là thành công) và chấm dứt toàn bộ quy trình làm việc chỉ vì một thất bại duy nhất. Cả hai đều phá hủy khả năng của coordinator trong việc đưa ra các quyết định thông minh.

Khái niệm chính

Sự phân biệt giữa lỗi truy cập (tool không thể tiếp cận nguồn dữ liệu) và kết quả rỗng hợp lệ (tool đã truy vấn thành công và không tìm thấy gì) rất quan trọng. Nhầm lẫn hai điều này gây ra lãng phí các lần thử lại và leo thang không chính xác. Kỳ thi kiểm tra điều này trực tiếp.

Bẫy thi

Bẫy thi: Retrying when a tool returns an empty result from a successful query

Một kết quả rỗng từ một truy vấn thành công có nghĩa là 'không có dữ liệu nào khớp với tiêu chí của bạn.' Việc thử lại sẽ tạo ra cùng một kết quả rỗng. Agent nên chấp nhận kết quả và phản hồi tương ứng.

Bẫy thi: Using generic error messages like 'Operation failed' without structured metadata

Nếu không có errorCategory, isRetryable, và một description, agent không thể phân biệt các thất bại tạm thời với các vi phạm quy tắc nghiệp vụ. Nó không thể đưa ra các quyết định phục hồi phù hợp.

Bẫy thi: Treating business errors as retryable

Lỗi nghiệp vụ (ví dụ: hoàn tiền vượt quá giới hạn chính sách) sẽ không bao giờ được giải quyết bằng cách thử lại. Cùng một vi phạm chính sách sẽ áp dụng mỗi lần. Agent phải đi theo một hướng thay thế như leo thang.

Bẫy thi: Silently suppressing subagent errors by returning empty results as success

Điều này che giấu thông tin thất bại khỏi coordinator, ngăn cản khả năng phục hồi thông minh. Coordinator không thể phân biệt 'không tìm thấy gì' với 'không thể tìm kiếm' và có thể tạo ra đầu ra không đầy đủ hoặc không chính xác.

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

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

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

Xây Dựng Phản Hồi Lỗi Có Cấu Trúc Cho Cả Bốn Loại

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

  • Triển khai các phản hồi lỗi có cấu trúc với metadata errorCategory, isRetryable, và description
  • Phân biệt giữa lỗi truy cập (isError: true) và kết quả rỗng hợp lệ (isError: false)
  • Phân loại các thất bại tool thành các loại tạm thời, xác thực, nghiệp vụ, và quyền truy cập
  • Xây dựng logic phục hồi của agent để thực hiện các hành động khác nhau dựa trên metadata lỗi

Các bước

Vì sao: Việc mô phỏng các chế độ thất bại trong một môi trường có kiểm soát cho phép bạn quan sát cách agent hành xử khi lỗi thiếu cấu trúc. Kỳ thi kiểm tra sự hiểu biết của bạn về cách các phản hồi lỗi kém gây ra lãng phí các lần thử lại và leo thang không chính xác.

Bạn sẽ thấy: Một MCP server đang chạy với một tool customer_lookup chấp nhận một mã định danh khách hàng và một tham số failure_mode để kích hoạt các điều kiện lỗi cụ thể theo yêu cầu.

Vì sao: Mỗi loại lỗi đòi hỏi một chiến lược phục hồi khác nhau. Kỳ thi kiểm tra liệu bạn có thể xác định lỗi thuộc loại nào và hành động phục hồi nào là phù hợp. Lỗi tạm thời có thể thử lại; lỗi nghiệp vụ thì không bao giờ.

Bạn sẽ thấy: Bốn phản hồi lỗi khác biệt, mỗi cái có isError: true, một giá trị errorCategory cụ thể, boolean isRetryable đúng, và một thông điệp mô tả giải thích chuyện gì đã xảy ra và cần làm gì tiếp theo.

Vì sao: Metadata có cấu trúc là thứ cho phép phục hồi thông minh. Nếu không có các trường này, agent không thể phân biệt một timeout tạm thời với một vi phạm chính sách vĩnh viễn. Kỳ thi kiểm tra cụ thể liệu bạn có biết rằng isRetryable: false nghĩa là agent phải đi theo một hướng thay thế, chứ không phải thử lại hay không.

Bạn sẽ thấy: Mỗi phản hồi lỗi được phân tích thành một đối tượng JSON chứa đúng ba trường: errorCategory (một trong transient, validation, business, permission), isRetryable (boolean), và description (một câu giải thích lỗi và gợi ý cách phục hồi).

Vì sao: Đây là một trong những sự phân biệt quan trọng nhất trong Lĩnh vực 2. Nhầm lẫn lỗi truy cập với kết quả rỗng hợp lệ gây ra lãng phí các lần thử lại và leo thang không chính xác. Kỳ thi kiểm tra điều này trực tiếp — một agent thử lại một truy vấn rỗng thành công là anti-pattern kinh điển.

Bạn sẽ thấy: Hai phản hồi khác biệt về mặt cấu trúc: một kết quả rỗng hợp lệ với isError: false và resultCount: 0 (chỉ ra rằng truy vấn đã chạy thành công nhưng không tìm thấy gì), và một lỗi truy cập với isError: true, errorCategory: transient, và isRetryable: true.

Vì sao: Agent loop minh họa kết quả thực tế của metadata lỗi có cấu trúc. Mỗi loại lỗi ánh xạ đến một hành động phục hồi cụ thể, và loop phải rẽ nhánh đúng cách. Đây chính xác là kiểu logic quyết định mà kỳ thi mong đợi bạn thiết kế.

Bạn sẽ thấy: Một agent loop phân tích metadata lỗi, rẽ nhánh theo errorCategory, thử lại các lỗi tạm thời tối đa 3 lần với backoff, định dạng lại đầu vào đối với lỗi xác thực, leo thang lỗi nghiệp vụ lên con người, và yêu cầu thông tin xác thực nâng cao đối với lỗi quyền truy cập.

Nguồn tham khảo