{"product_id":"human-in-the-loop-khi-nao-ai-agent-cần-xin-phep-con-người","title":"Human-in-the-Loop — Khi nào AI Agent cần xin phép con người","description":"\n\u003cp\u003eAI Agent ngày càng tự chủ hơn trong việc thực thi tác vụ phức tạp. Nhưng tự chủ không có nghĩa là không cần giám sát. Trong các hệ thống production thực tế, một agent tự ý xóa dữ liệu, chuyển tiền, hoặc publish nội dung sai có thể gây thiệt hại nghiêm trọng. Human-in-the-Loop (HITL) là mô hình thiết kế đảm bảo rằng ở những bước quan trọng, agent sẽ dừng lại và xin phép con người trước khi tiếp tục. Bài viết này phân tích chi tiết khi nào cần HITL, cách thiết kế approval gates, confidence thresholds, và xây dựng quy trình audit trail hoàn chỉnh.\u003c\/p\u003e\n\n\u003ch2\u003eTại sao AI Agent cần giám sát của con người?\u003c\/h2\u003e\n\u003cp\u003eCó ba lý do cốt lõi khiến HITL trở thành yêu cầu bắt buộc trong các hệ thống agent production:\u003c\/p\u003e\n\n\u003ch3\u003e1. Rủi ro không thể đảo ngược (Irreversible Actions)\u003c\/h3\u003e\n\u003cp\u003eMột số hành động khi đã thực hiện thì không thể hoàn tác: xóa dữ liệu, chuyển khoản ngân hàng, gửi email cho hàng nghìn khách hàng, hoặc deploy code lên production. Agent có thể hiểu sai yêu cầu hoặc gặp edge case mà không được lường trước. Một lớp phê duyệt của con người ở đây là tấm lưới an toàn cuối cùng.\u003c\/p\u003e\n\n\u003ch3\u003e2. Giới hạn hiểu biết ngữ cảnh\u003c\/h3\u003e\n\u003cp\u003eAgent hoạt động dựa trên thông tin được cung cấp, nhưng không phải lúc nào cũng có đầy đủ ngữ cảnh kinh doanh. Ví dụ, agent có thể đề xuất hủy đơn hàng của một khách VIP vì đơn quá hạn thanh toán, nhưng không biết rằng khách này đang trong chương trình ưu đãi đặc biệt. Con người nắm giữ ngữ cảnh mà dữ liệu không thể hiện hết.\u003c\/p\u003e\n\n\u003ch3\u003e3. Yêu cầu pháp lý và compliance\u003c\/h3\u003e\n\u003cp\u003eNhiều ngành (tài chính, y tế, pháp lý) yêu cầu quyết định quan trọng phải có sự phê duyệt của con người. Đây không chỉ là best practice mà là yêu cầu pháp luật. EU AI Act và các quy định tương tự đang ngày càng siết chặt yêu cầu human oversight cho AI systems.\u003c\/p\u003e\n\n\u003ch2\u003eMô hình HITL: Các cấp độ giám sát\u003c\/h2\u003e\n\u003cp\u003eKhông phải mọi hành động đều cần cùng mức độ giám sát. Một hệ thống HITL hiệu quả phân loại hành động theo cấp độ rủi ro:\u003c\/p\u003e\n\n\u003ch3\u003eCấp 1: Fully Autonomous (Tự động hoàn toàn)\u003c\/h3\u003e\n\u003cp\u003eAgent thực hiện mà không cần xin phép. Áp dụng cho các tác vụ rủi ro thấp, có thể đảo ngược: đọc dữ liệu, tìm kiếm thông tin, tạo bản nháp, tính toán.\u003c\/p\u003e\n\n\u003ch3\u003eCấp 2: Notify After Action (Thông báo sau khi thực hiện)\u003c\/h3\u003e\n\u003cp\u003eAgent thực hiện rồi thông báo cho người giám sát. Áp dụng cho các tác vụ rủi ro trung bình thấp: gửi tin nhắn nội bộ, cập nhật trạng thái ticket, tạo báo cáo.\u003c\/p\u003e\n\n\u003ch3\u003eCấp 3: Approval Required (Yêu cầu phê duyệt)\u003c\/h3\u003e\n\u003cp\u003eAgent chuẩn bị hành động, trình bày cho con người duyệt, và chỉ thực hiện khi được phê duyệt. Áp dụng cho các tác vụ rủi ro cao: chuyển tiền, publish nội dung, thay đổi cấu hình hệ thống.\u003c\/p\u003e\n\n\u003ch3\u003eCấp 4: Human Takes Over (Con người tiếp quản)\u003c\/h3\u003e\n\u003cp\u003eAgent dừng hoàn toàn và chuyển giao cho con người. Áp dụng khi agent không đủ tự tin, gặp tình huống chưa từng xử lý, hoặc phát hiện xung đột trong yêu cầu.\u003c\/p\u003e\n\n\u003ch2\u003eThiết kế Approval Gates\u003c\/h2\u003e\n\u003cp\u003eApproval gate là điểm kiểm soát trong workflow của agent nơi hành động bị tạm dừng chờ phê duyệt. Thiết kế tốt một approval gate cần đảm bảo ba yếu tố: rõ ràng, đầy đủ thông tin, và dễ hành động.\u003c\/p\u003e\n\n\u003ch3\u003eCấu trúc một Approval Request\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e\/\/ Cấu trúc approval request gửi đến người phê duyệt\nconst approvalRequest = {\n  \/\/ ID duy nhất để tracking\n  request_id: \"apr_20260328_001\",\n\n  \/\/ Agent nào yêu cầu\n  agent_id: \"order-processing-agent\",\n\n  \/\/ Hành động cần phê duyệt\n  action: {\n    type: \"REFUND_TRANSACTION\",\n    description: \"Hoàn tiền đơn hàng #ORD-2026-1234\",\n    amount: 5500000,  \/\/ 5.5 triệu VND\n    currency: \"VND\",\n    target: \"Nguyen Van A - VCB ****5678\"\n  },\n\n  \/\/ Lý do agent đề xuất hành động này\n  reasoning: \"Khách hàng phản hồi sản phẩm bị lỗi. Đã xác minh qua ảnh chụp. Chính sách hoàn tiền cho phép hoàn 100% trong 7 ngày. Đơn hàng được đặt cách đây 3 ngày.\",\n\n  \/\/ Confidence score của agent\n  confidence: 0.87,\n\n  \/\/ Dữ liệu hỗ trợ quyết định\n  supporting_data: {\n    order_date: \"2026-03-25\",\n    product: \"Tai nghe Bluetooth XYZ\",\n    customer_history: \"12 đơn hàng, 0 lần hoàn tiền trước đó\",\n    evidence_urls: [\"https:\/\/storage.example.com\/evidence\/img_001.jpg\"]\n  },\n\n  \/\/ Các lựa chọn cho người phê duyệt\n  options: [\"APPROVE\", \"REJECT\", \"MODIFY\", \"ESCALATE\"],\n\n  \/\/ Thời hạn phê duyệt\n  expires_at: \"2026-03-28T18:00:00+07:00\",\n\n  \/\/ Hành động mặc định nếu hết hạn\n  default_on_expiry: \"ESCALATE\"\n};\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eNguyên tắc thiết kế Approval Gate\u003c\/h3\u003e\n\u003cp\u003eKhi thiết kế approval gates, cần tuân thủ các nguyên tắc sau:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eCung cấp đủ ngữ cảnh:\u003c\/strong\u003e Người phê duyệt phải hiểu được tình huống mà không cần tra cứu thêm. Bao gồm reasoning của agent, dữ liệu liên quan, và lịch sử tương tác.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eCho phép hành động nhanh:\u003c\/strong\u003e Giao diện phê duyệt phải cho phép approve\/reject bằng một thao tác. Tránh yêu cầu người dùng điền form phức tạp.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eCó thời hạn rõ ràng:\u003c\/strong\u003e Mỗi approval request phải có deadline. Nếu hết hạn mà chưa được phê duyệt, hệ thống cần có hành động mặc định (thường là escalate hoặc reject).\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eHỗ trợ modify:\u003c\/strong\u003e Ngoài approve\/reject, cho phép người phê duyệt chỉnh sửa hành động trước khi approve (ví dụ: giảm số tiền hoàn, thay đổi nội dung email).\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eConfidence Thresholds: Khi nào agent tự tin và khi nào không\u003c\/h2\u003e\n\u003cp\u003eKhông phải mọi hành động cùng loại đều cần approval. Agent có thể tự đánh giá mức độ tự tin (confidence) và quyết định có cần xin phép hay không dựa trên ngưỡng đã cấu hình.\u003c\/p\u003e\n\n\u003ch3\u003eThiết kế Confidence-Based Routing\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e\/\/ Cấu hình confidence thresholds theo loại hành động\nconst confidenceConfig = {\n  actions: {\n    \"SEND_EMAIL\": {\n      auto_approve_threshold: 0.95,  \/\/ \u0026gt;= 95% tự thực hiện\n      review_threshold: 0.70,       \/\/ 70-95% cần review\n      escalate_threshold: 0.70      \/\/ \u0026lt; 70% escalate\n    },\n    \"PROCESS_REFUND\": {\n      auto_approve_threshold: 0.98,\n      review_threshold: 0.80,\n      escalate_threshold: 0.80,\n      max_auto_amount: 500000  \/\/ Tối đa 500k VND tự duyệt\n    },\n    \"DELETE_DATA\": {\n      auto_approve_threshold: 1.0,  \/\/ Không bao giờ tự duyệt\n      review_threshold: 0.0,        \/\/ Luôn cần review\n      escalate_threshold: 0.0\n    },\n    \"PUBLISH_CONTENT\": {\n      auto_approve_threshold: 0.99,\n      review_threshold: 0.85,\n      escalate_threshold: 0.85\n    }\n  }\n};\n\n\/\/ Hàm quyết định routing dựa trên confidence\nfunction routeAction(action, confidence, metadata) {\n  const config = confidenceConfig.actions[action.type];\n\n  if (!config) {\n    \/\/ Hành động không được cấu hình -\u0026gt; luôn escalate\n    return { route: \"ESCALATE\", reason: \"Unknown action type\" };\n  }\n\n  \/\/ Kiểm tra điều kiện đặc biệt (ví dụ: giới hạn số tiền)\n  if (config.max_auto_amount \u0026amp;\u0026amp; action.amount \u0026gt; config.max_auto_amount) {\n    return { route: \"REVIEW\", reason: \"Amount exceeds auto-approve limit\" };\n  }\n\n  if (confidence \u0026gt;= config.auto_approve_threshold) {\n    return { route: \"AUTO_APPROVE\", reason: \"High confidence\" };\n  }\n\n  if (confidence \u0026gt;= config.review_threshold) {\n    return { route: \"REVIEW\", reason: \"Moderate confidence\" };\n  }\n\n  return { route: \"ESCALATE\", reason: \"Low confidence\" };\n}\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eCách tính Confidence Score\u003c\/h3\u003e\n\u003cp\u003eConfidence score nên kết hợp nhiều yếu tố, không chỉ dựa vào xác suất đầu ra của model:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eModel confidence:\u003c\/strong\u003e Xác suất từ LLM cho câu trả lời được chọn\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eData completeness:\u003c\/strong\u003e Tỷ lệ dữ liệu đầu vào có sẵn so với yêu cầu. Thiếu dữ liệu quan trọng sẽ hạ confidence\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eHistorical accuracy:\u003c\/strong\u003e Agent đã từng xử lý tình huống tương tự chưa? Kết quả ra sao?\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003ePolicy compliance:\u003c\/strong\u003e Hành động có nằm trong phạm vi chính sách cho phép không?\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eAnomaly detection:\u003c\/strong\u003e Yêu cầu hiện tại có bất thường so với pattern bình thường không?\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eEscalation Triggers: Khi nào agent phải dừng lại\u003c\/h2\u003e\n\u003cp\u003eNgoài confidence thresholds, có những tình huống agent phải escalate ngay lập tức, bất kể mức độ tự tin:\u003c\/p\u003e\n\n\u003ch3\u003eDanh sách Escalation Triggers phổ biến\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003econst escalationTriggers = {\n  \/\/ Trigger dựa trên nội dung\n  content_triggers: [\n    \"Yêu cầu liên quan đến thông tin cá nhân nhạy cảm (PII)\",\n    \"Phát hiện ý định gian lận hoặc lạm dụng\",\n    \"Nội dung có thể vi phạm pháp luật\",\n    \"Khách hàng yêu cầu nói chuyện với con người\",\n    \"Phát hiện mâu thuẫn trong yêu cầu\"\n  ],\n\n  \/\/ Trigger dựa trên ngưỡng\n  threshold_triggers: [\n    \"Số tiền giao dịch vượt giới hạn cho phép\",\n    \"Số lượng hành động trong một session vượt ngưỡng\",\n    \"Thời gian xử lý vượt quá timeout cho phép\",\n    \"Số lần retry vượt ngưỡng\"\n  ],\n\n  \/\/ Trigger dựa trên hệ thống\n  system_triggers: [\n    \"API bên thứ ba trả về lỗi không mong đợi\",\n    \"Dữ liệu đầu vào không nhất quán với database\",\n    \"Phát hiện thay đổi schema hoặc format\",\n    \"Rate limit gần đạt ngưỡng\"\n  ],\n\n  \/\/ Trigger dựa trên người dùng\n  user_triggers: [\n    \"Người dùng thể hiện sự không hài lòng\",\n    \"Người dùng hỏi cùng câu hỏi nhiều lần (loop detection)\",\n    \"Người dùng sử dụng ngôn ngữ khẩn cấp\",\n    \"Người dùng đề cập đến vấn đề pháp lý\"\n  ]\n};\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eApproval UI Patterns\u003c\/h2\u003e\n\u003cp\u003eGiao diện phê duyệt cần được thiết kế cho tốc độ và độ chính xác. Dưới đây là các pattern phổ biến:\u003c\/p\u003e\n\n\u003ch3\u003ePattern 1: Inline Approval (Trong chat)\u003c\/h3\u003e\n\u003cp\u003eAgent hiển thị thẻ phê duyệt ngay trong cuộc hội thoại. Phù hợp cho ứng dụng chatbot nội bộ nơi người giám sát theo dõi conversation.\u003c\/p\u003e\n\n\u003ch3\u003ePattern 2: Dashboard Queue\u003c\/h3\u003e\n\u003cp\u003eTất cả approval requests được gom vào một dashboard riêng. Người phê duyệt có thể xử lý hàng loạt. Phù hợp cho team operations xử lý nhiều request mỗi ngày.\u003c\/p\u003e\n\n\u003ch3\u003ePattern 3: Notification-Based\u003c\/h3\u003e\n\u003cp\u003eAgent gửi notification (Slack, email, SMS) đến người phê duyệt phù hợp. Người đó click vào link để xem chi tiết và phê duyệt. Phù hợp cho các hành động không thường xuyên nhưng quan trọng.\u003c\/p\u003e\n\n\u003ch3\u003eTriển khai Approval Queue\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e\/\/ Hệ thống approval queue với routing thông minh\nclass ApprovalQueue {\n  constructor(notificationService, storageService) {\n    this.notifications = notificationService;\n    this.storage = storageService;\n  }\n\n  async submitForApproval(request) {\n    \/\/ Lưu request vào storage\n    await this.storage.save(\"approvals\", request);\n\n    \/\/ Tìm người phê duyệt phù hợp\n    const approver = await this.findApprover(request);\n\n    \/\/ Gửi notification\n    await this.notifications.send(approver, {\n      title: \"Yêu cầu phê duyệt mới\",\n      summary: request.action.description,\n      urgency: this.calculateUrgency(request),\n      approve_url: this.generateApproveUrl(request.request_id),\n      reject_url: this.generateRejectUrl(request.request_id)\n    });\n\n    \/\/ Thiết lập timeout\n    this.scheduleExpiry(request);\n\n    return { status: \"PENDING\", request_id: request.request_id };\n  }\n\n  async findApprover(request) {\n    \/\/ Routing dựa trên loại hành động và số tiền\n    const rules = [\n      {\n        condition: (r) =\u0026gt; r.action.amount \u0026gt; 10000000,\n        approver_role: \"finance_manager\"\n      },\n      {\n        condition: (r) =\u0026gt; r.action.type === \"PUBLISH_CONTENT\",\n        approver_role: \"content_lead\"\n      },\n      {\n        condition: (r) =\u0026gt; r.action.type === \"DELETE_DATA\",\n        approver_role: \"data_admin\"\n      }\n    ];\n\n    for (const rule of rules) {\n      if (rule.condition(request)) {\n        return await this.storage.findByRole(rule.approver_role);\n      }\n    }\n\n    return await this.storage.findByRole(\"default_approver\");\n  }\n\n  calculateUrgency(request) {\n    const hoursUntilExpiry =\n      (new Date(request.expires_at) - new Date()) \/ 3600000;\n    if (hoursUntilExpiry \u0026lt; 1) return \"CRITICAL\";\n    if (hoursUntilExpiry \u0026lt; 4) return \"HIGH\";\n    if (hoursUntilExpiry \u0026lt; 24) return \"MEDIUM\";\n    return \"LOW\";\n  }\n}\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eAsync Approval Flow\u003c\/h2\u003e\n\u003cp\u003eTrong thực tế, người phê duyệt không phải lúc nào cũng có mặt ngay. Hệ thống cần hỗ trợ asynchronous approval flow:\u003c\/p\u003e\n\n\u003ch3\u003eKiến trúc Async Approval\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e\/\/ Async approval flow với state machine\nconst approvalStates = {\n  PENDING: {\n    transitions: {\n      APPROVE: \"APPROVED\",\n      REJECT: \"REJECTED\",\n      MODIFY: \"MODIFIED\",\n      ESCALATE: \"ESCALATED\",\n      EXPIRE: \"EXPIRED\"\n    }\n  },\n  APPROVED: {\n    onEnter: async (request) =\u0026gt; {\n      await executeAction(request.action);\n      await notifyAgent(request.agent_id, \"APPROVED\");\n      await logAudit(request, \"APPROVED\");\n    }\n  },\n  REJECTED: {\n    onEnter: async (request) =\u0026gt; {\n      await notifyAgent(request.agent_id, \"REJECTED\");\n      await logAudit(request, \"REJECTED\");\n    }\n  },\n  MODIFIED: {\n    onEnter: async (request, modifications) =\u0026gt; {\n      const modifiedAction = applyModifications(\n        request.action, modifications\n      );\n      await executeAction(modifiedAction);\n      await notifyAgent(request.agent_id, \"MODIFIED\");\n      await logAudit(request, \"MODIFIED\", modifications);\n    }\n  },\n  ESCALATED: {\n    onEnter: async (request) =\u0026gt; {\n      const nextApprover = await findEscalationTarget(request);\n      await reassignApproval(request, nextApprover);\n      await logAudit(request, \"ESCALATED\");\n    }\n  },\n  EXPIRED: {\n    onEnter: async (request) =\u0026gt; {\n      const defaultAction = request.default_on_expiry;\n      await handleExpiry(request, defaultAction);\n      await logAudit(request, \"EXPIRED\");\n    }\n  }\n};\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eXử lý khi agent đang chờ phê duyệt\u003c\/h3\u003e\n\u003cp\u003eKhi agent gửi approval request và đang chờ, có hai chiến lược:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eBlocking:\u003c\/strong\u003e Agent tạm dừng hoàn toàn, chờ đến khi có kết quả. Phù hợp cho workflow tuần tự nơi bước tiếp theo phụ thuộc vào kết quả phê duyệt.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eNon-blocking:\u003c\/strong\u003e Agent tiếp tục xử lý các tác vụ khác trong khi chờ. Phù hợp cho agent xử lý nhiều yêu cầu song song. Agent sẽ quay lại xử lý khi nhận được callback từ approval system.\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eAudit Trail: Ghi lại mọi quyết định\u003c\/h2\u003e\n\u003cp\u003eAudit trail là yêu cầu bắt buộc cho mọi hệ thống HITL trong production. Mỗi quyết định -- dù là tự động hay qua phê duyệt -- đều phải được ghi lại.\u003c\/p\u003e\n\n\u003ch3\u003eCấu trúc Audit Log\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e\/\/ Schema cho audit log entry\nconst auditLogEntry = {\n  \/\/ Metadata\n  log_id: \"audit_20260328_001\",\n  timestamp: \"2026-03-28T14:30:00+07:00\",\n\n  \/\/ Agent information\n  agent_id: \"order-processing-agent\",\n  agent_version: \"2.3.1\",\n  session_id: \"sess_abc123\",\n\n  \/\/ Action details\n  action: {\n    type: \"REFUND_TRANSACTION\",\n    target: \"order_ORD-2026-1234\",\n    parameters: {\n      amount: 5500000,\n      reason: \"defective_product\"\n    }\n  },\n\n  \/\/ Decision information\n  decision: {\n    type: \"HUMAN_APPROVED\",  \/\/ AUTO | HUMAN_APPROVED | HUMAN_REJECTED | ESCALATED\n    decided_by: \"user_nguyen_thi_b\",\n    decided_at: \"2026-03-28T14:28:00+07:00\",\n    time_to_decision_ms: 45000,\n    modifications: null\n  },\n\n  \/\/ Context tại thời điểm quyết định\n  context: {\n    agent_confidence: 0.87,\n    routing_reason: \"Amount exceeds auto-approve limit\",\n    input_data_hash: \"sha256_abc...\",\n    supporting_evidence: [\"evidence\/img_001.jpg\"]\n  },\n\n  \/\/ Kết quả thực thi\n  execution: {\n    status: \"SUCCESS\",\n    executed_at: \"2026-03-28T14:30:00+07:00\",\n    result: { refund_id: \"REF-2026-5678\" },\n    side_effects: [\n      \"Email confirmation sent to customer\",\n      \"Inventory updated\"\n    ]\n  }\n};\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eTruy vấn Audit Trail\u003c\/h3\u003e\n\u003cp\u003eAudit trail cần hỗ trợ truy vấn linh hoạt để phục vụ compliance review, incident investigation, và cải thiện hệ thống:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003e\/\/ Các truy vấn audit phổ biến\nconst auditQueries = {\n  \/\/ Tất cả quyết định của một agent trong 24h qua\n  recentDecisions: {\n    agent_id: \"order-processing-agent\",\n    timestamp: { $gte: \"2026-03-27T14:30:00+07:00\" }\n  },\n\n  \/\/ Tất cả hành động bị reject\n  rejectedActions: {\n    \"decision.type\": \"HUMAN_REJECTED\",\n    timestamp: { $gte: \"2026-03-01\" }\n  },\n\n  \/\/ Hành động có confidence thấp nhưng được approve\n  lowConfidenceApproved: {\n    \"context.agent_confidence\": { $lt: 0.7 },\n    \"decision.type\": \"HUMAN_APPROVED\"\n  },\n\n  \/\/ Thời gian phê duyệt trung bình theo loại hành động\n  avgApprovalTime: {\n    $group: {\n      _id: \"$action.type\",\n      avg_time: { $avg: \"$decision.time_to_decision_ms\" }\n    }\n  }\n};\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eVí dụ thực tế: HITL cho các tình huống cụ thể\u003c\/h2\u003e\n\n\u003ch3\u003eTình huống 1: Giao dịch tài chính\u003c\/h3\u003e\n\u003cp\u003eMột agent xử lý hoàn tiền cho khách hàng e-commerce. Quy tắc HITL:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003eHoàn tiền duoi 500.000 VND cho sản phẩm lỗi xác nhận bằng ảnh: tự động approve\u003c\/li\u003e\n  \u003cli\u003eHoàn tiền 500.000 - 5.000.000 VND: cần approval của team lead\u003c\/li\u003e\n  \u003cli\u003eHoàn tiền trên 5.000.000 VND: cần approval của finance manager\u003c\/li\u003e\n  \u003cli\u003eKhách hàng đã hoàn tiền 3 lần trong 30 ngày: luôn escalate bất kể số tiền\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch3\u003eTình huống 2: Content Publishing\u003c\/h3\u003e\n\u003cp\u003eAgent tự động tạo và đăng bài blog. Quy tắc HITL:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003eBài viết dạng cập nhật sản phẩm, confidence trên 95%: tự động publish\u003c\/li\u003e\n  \u003cli\u003eBài viết có nhắc đến đối thủ cạnh tranh: luôn cần review\u003c\/li\u003e\n  \u003cli\u003eBài viết chứa số liệu tài chính hoặc tuyên bố pháp lý: luôn cần review từ legal team\u003c\/li\u003e\n  \u003cli\u003eBài viết dài hơn 2000 từ: cần review từ content lead\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch3\u003eTình huống 3: Xóa dữ liệu\u003c\/h3\u003e\n\u003cp\u003eAgent xử lý yêu cầu xóa tài khoản theo GDPR\/PDPA. Quy tắc HITL:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003eXóa dữ liệu cá nhân: luôn cần approval, không bao giờ tự động\u003c\/li\u003e\n  \u003cli\u003eAgent chuẩn bị danh sách dữ liệu sẽ bị xóa và ảnh hưởng\u003c\/li\u003e\n  \u003cli\u003eYêu cầu approval từ data protection officer\u003c\/li\u003e\n  \u003cli\u003eSau khi approve, agent thực hiện soft delete trước, hard delete sau 30 ngày\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eXây dựng Approval Flow với Claude Agent SDK\u003c\/h2\u003e\n\u003cpre\u003e\u003ccode\u003eimport Anthropic from \"@anthropic-ai\/sdk\";\n\nconst client = new Anthropic();\n\n\/\/ Định nghĩa tools với approval gates\nconst tools = [\n  {\n    name: \"read_customer_data\",\n    description: \"Đọc thông tin khách hàng. Không cần approval.\",\n    input_schema: {\n      type: \"object\",\n      properties: {\n        customer_id: { type: \"string\" }\n      },\n      required: [\"customer_id\"]\n    }\n  },\n  {\n    name: \"process_refund\",\n    description: \"Xử lý hoàn tiền. CẦN APPROVAL nếu số tiền trên 500.000 VND.\",\n    input_schema: {\n      type: \"object\",\n      properties: {\n        order_id: { type: \"string\" },\n        amount: { type: \"number\" },\n        reason: { type: \"string\" }\n      },\n      required: [\"order_id\", \"amount\", \"reason\"]\n    }\n  }\n];\n\n\/\/ Approval gate middleware\nfunction requiresApproval(toolName, toolInput) {\n  const rules = {\n    process_refund: (input) =\u0026gt; input.amount \u0026gt; 500000,\n    delete_account: () =\u0026gt; true,  \/\/ Luôn cần approval\n    publish_content: (input) =\u0026gt; input.contains_claims === true\n  };\n\n  const rule = rules[toolName];\n  return rule ? rule(toolInput) : false;\n}\n\n\/\/ Agent loop với HITL\nasync function agentWithHITL(userMessage) {\n  let messages = [{ role: \"user\", content: userMessage }];\n\n  while (true) {\n    const response = await client.messages.create({\n      model: \"claude-sonnet-4-20250514\",\n      max_tokens: 4096,\n      tools: tools,\n      messages: messages\n    });\n\n    if (response.stop_reason === \"end_turn\") {\n      return response.content;\n    }\n\n    \/\/ Xử lý tool calls\n    for (const block of response.content) {\n      if (block.type === \"tool_use\") {\n        if (requiresApproval(block.name, block.input)) {\n          \/\/ Tạm dừng và xin phép\n          const approval = await requestHumanApproval({\n            tool: block.name,\n            input: block.input,\n            reasoning: extractReasoning(response.content)\n          });\n\n          if (approval.status === \"REJECTED\") {\n            messages.push({\n              role: \"assistant\",\n              content: response.content\n            });\n            messages.push({\n              role: \"user\",\n              content: [{\n                type: \"tool_result\",\n                tool_use_id: block.id,\n                content: \"Hành động bị từ chối bởi người phê duyệt. \"\n                  + \"Lý do: \" + approval.reason\n              }]\n            });\n            continue;\n          }\n        }\n\n        \/\/ Thực thi tool call\n        const result = await executeTool(block.name, block.input);\n        messages.push({\n          role: \"assistant\",\n          content: response.content\n        });\n        messages.push({\n          role: \"user\",\n          content: [{\n            type: \"tool_result\",\n            tool_use_id: block.id,\n            content: JSON.stringify(result)\n          }]\n        });\n      }\n    }\n  }\n}\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eMetrics và monitoring cho HITL\u003c\/h2\u003e\n\u003cp\u003eTheo dõi hiệu quả của hệ thống HITL qua các metrics quan trọng:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eApproval rate:\u003c\/strong\u003e Tỷ lệ phê duyệt \/ từ chối. Nếu approval rate quá cao (trên 99%), có thể threshold quá thấp, gây lãng phí thời gian. Nếu quá thấp (duoi 70%), agent cần cải thiện độ chính xác.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eTime to decision:\u003c\/strong\u003e Thời gian trung bình từ khi gửi request đến khi có quyết định. Nếu quá lâu, cần cải thiện notification hoặc tăng số người phê duyệt.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eEscalation rate:\u003c\/strong\u003e Tỷ lệ request bị escalate. Escalation rate cao cho thấy agent gặp nhiều tình huống ngoài khả năng xử lý.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eFalse positive rate:\u003c\/strong\u003e Tỷ lệ request bị yêu cầu review nhưng thực tế không cần. Giúp tinh chỉnh confidence thresholds.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003ePost-approval incidents:\u003c\/strong\u003e Số vụ việc xảy ra sau khi đã approve. Đây là metric quan trọng nhất, phản ánh chất lượng thực sự của quy trình review.\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eBest practices cho HITL trong production\u003c\/h2\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eBắt đầu với ngưỡng cao:\u003c\/strong\u003e Khi mới triển khai, yêu cầu approval cho nhiều hành động hơn cần thiết. Sau đó nới lỏng dần dựa trên dữ liệu thực tế.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eTách biệt approval logic:\u003c\/strong\u003e Đừng hard-code approval rules vào agent code. Sử dụng cấu hình bên ngoài để có thể điều chỉnh mà không cần deploy lại.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eFeedback loop:\u003c\/strong\u003e Dữ liệu từ quyết định của con người nên được dùng để cải thiện agent. Nếu một loại request luôn được approve, xem xét hạ threshold.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eFallback rõ ràng:\u003c\/strong\u003e Luôn có quy trình xử lý khi không có người phê duyệt (cuối tuần, ngoài giờ). Thường là queue lại hoặc reject với thông báo cho người dùng.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eTest kỹ edge cases:\u003c\/strong\u003e Test các tình huống: approval timeout, người phê duyệt offline, nhiều request cùng lúc, request mâu thuẫn nhau.\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eGradual autonomy:\u003c\/strong\u003e Theo thời gian, tăng dần quyền tự chủ cho agent dựa trên track record. Đây là quá trình xây dựng trust giữa tổ chức và hệ thống AI.\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eTổng kết\u003c\/h2\u003e\n\u003cp\u003eHuman-in-the-Loop không phải là sự thừa nhận rằng AI yếu kém. Ngược lại, đây là biểu hiện của một hệ thống AI trưởng thành, biết giới hạn của mình và biết khi nào cần sự hỗ trợ của con người. Một agent tốt không phải là agent làm mọi thứ tự động, mà là agent biết khi nào nên tự làm, khi nào nên hỏi, và khi nào nên dừng lại. Hãy thiết kế approval gates dựa trên mức độ rủi ro, sử dụng confidence thresholds để routing thông minh, xây dựng audit trail cho mọi quyết định, và liên tục cải thiện dựa trên dữ liệu thực tế.\u003c\/p\u003e\n","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47730149425364,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/human-in-the-loop-khi-nao-ai-agent-c_n-xin-phep-con-ng_i.jpg?v=1774715301","url":"https:\/\/claude.vn\/products\/human-in-the-loop-khi-nao-ai-agent-c%e1%ba%a7n-xin-phep-con-ng%c6%b0%e1%bb%9di","provider":"CLAUDE.VN","version":"1.0","type":"link"}