{"product_id":"customer-support-agent-chatbot-hỗ-trợ-production-grade","title":"Customer Support Agent — Chatbot hỗ trợ production-grade","description":"\n\u003cp\u003eMột chatbot hỗ trợ khách hàng thực sự hữu ích không chỉ trả lời câu hỏi — nó phải tra cứu được đơn hàng thực, tạo ticket, và biết khi nào cần chuyển đến nhân viên. Bài viết này xây dựng một \u003cstrong\u003ecustomer support agent production-grade\u003c\/strong\u003e với đầy đủ tính năng đó.\u003c\/p\u003e\n\n\u003cp\u003eArchitecture dựa trên reference implementation chính thức của Anthropic, được mở rộng với các pattern thực tế từ production deployments.\u003c\/p\u003e\n\n\u003ch2\u003eKiến trúc hệ thống\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eCustomer Message\n      |\n      v\n[Intent Detection] -- Hoi ve don hang? FAQ? Khieu nai?\n      |\n      +--[FAQ] --\u0026gt; Knowledge Base Search --\u0026gt; Tra loi truc tiep\n      |\n      +--[Order] --\u0026gt; Order Lookup Tool --\u0026gt; Tra loi voi du lieu thuc\n      |\n      +--[Complaint] --\u0026gt; Ticket Creation Tool --\u0026gt; Tao ticket + thong bao\n      |\n      +--[Complex] --\u0026gt; Escalation Tool --\u0026gt; Chuyen nhan vien con nguoi\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eDữ liệu mẫu — Mock Database\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport anthropic\nimport json\nfrom datetime import datetime, timedelta\n\nclient = anthropic.Anthropic()\n\n# Mock database don hang\nORDERS_DB = {\n    \"ORD-001\": {\n        \"id\": \"ORD-001\",\n        \"customer\": \"Nguyen Van An\",\n        \"email\": \"an@example.com\",\n        \"items\": [\n            {\"name\": \"Claude API Credits 100K tokens\", \"qty\": 1, \"price\": 150000}\n        ],\n        \"total\": 150000,\n        \"status\": \"delivered\",\n        \"created_at\": \"2026-03-20\",\n        \"delivered_at\": \"2026-03-23\",\n        \"tracking\": \"VN123456789\"\n    },\n    \"ORD-002\": {\n        \"id\": \"ORD-002\",\n        \"customer\": \"Tran Thi Binh\",\n        \"email\": \"binh@example.com\",\n        \"items\": [\n            {\"name\": \"Claude Pro Monthly\", \"qty\": 1, \"price\": 500000}\n        ],\n        \"total\": 500000,\n        \"status\": \"processing\",\n        \"created_at\": \"2026-03-25\",\n        \"delivered_at\": None,\n        \"tracking\": None\n    }\n}\n\n# Mock tickets\nTICKETS_DB = {}\nticket_counter = 1000\n\n# Knowledge base (FAQ)\nKNOWLEDGE_BASE = [\n    {\n        \"id\": \"faq-001\",\n        \"category\": \"billing\",\n        \"question\": \"Lam the nao de xem hoa don?\",\n        \"answer\": \"Dang nhap vao dashboard.claude.ai, chon 'Billing' trong menu Settings. \"\n                  \"Tat ca hoa don se hien thi tai day, co the tai xuong dang PDF.\"\n    },\n    {\n        \"id\": \"faq-002\",\n        \"category\": \"api\",\n        \"question\": \"Rate limit cua Claude API la bao nhieu?\",\n        \"answer\": \"Rate limit phu thuoc vao plan:\n\"\n                  \"- Free: 5 req\/min, 10K tokens\/day\n\"\n                  \"- Pro: 50 req\/min, 1M tokens\/day\n\"\n                  \"- Team: Custom, lien he sales\"\n    },\n    {\n        \"id\": \"faq-003\",\n        \"category\": \"refund\",\n        \"question\": \"Chinh sach hoan tien nhu the nao?\",\n        \"answer\": \"Anthropic ho tro hoan tien trong vong 7 ngay ke tu ngay mua \"\n                  \"neu san pham loi ky thuat. Gui ticket de duoc ho tro.\"\n    },\n    {\n        \"id\": \"faq-004\",\n        \"category\": \"account\",\n        \"question\": \"Quen mat khau phai lam gi?\",\n        \"answer\": \"Vao trang login.claude.ai, click 'Quen mat khau', \"\n                  \"nhap email va check hop thu de lay link reset.\"\n    }\n]\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTool Implementations\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Tool 1: Tim kiem knowledge base\ndef search_knowledge_base(query: str) -\u0026gt; str:\n    query_lower = query.lower()\n    results = []\n\n    for article in KNOWLEDGE_BASE:\n        score = 0\n        for word in query_lower.split():\n            if word in article[\"question\"].lower():\n                score += 2\n            if word in article[\"answer\"].lower():\n                score += 1\n            if word in article[\"category\"].lower():\n                score += 1\n\n        if score \u0026gt; 0:\n            results.append((score, article))\n\n    results.sort(key=lambda x: x[0], reverse=True)\n\n    if not results:\n        return json.dumps({\n            \"found\": False,\n            \"message\": \"Khong tim thay thong tin lien quan trong knowledge base\"\n        })\n\n    top = results[0][1]\n    return json.dumps({\n        \"found\": True,\n        \"category\": top[\"category\"],\n        \"answer\": top[\"answer\"],\n        \"article_id\": top[\"id\"]\n    }, ensure_ascii=False)\n\n\n# Tool 2: Tra cuu don hang\ndef get_order_status(order_id: str = None, email: str = None) -\u0026gt; str:\n    if order_id:\n        order_id = order_id.upper()\n        order = ORDERS_DB.get(order_id)\n        if not order:\n            return json.dumps({\n                \"found\": False,\n                \"message\": f\"Khong tim thay don hang {order_id}\"\n            })\n        return json.dumps(order, ensure_ascii=False)\n\n    if email:\n        orders = [o for o in ORDERS_DB.values() if o[\"email\"] == email]\n        if not orders:\n            return json.dumps({\n                \"found\": False,\n                \"message\": f\"Khong tim thay don hang nao voi email {email}\"\n            })\n        return json.dumps({\n            \"found\": True,\n            \"orders\": orders,\n            \"count\": len(orders)\n        }, ensure_ascii=False)\n\n    return json.dumps({\"error\": \"Vui long cung cap order_id hoac email\"})\n\n\n# Tool 3: Tao ticket ho tro\ndef create_ticket(\n    customer_name: str,\n    email: str,\n    category: str,\n    description: str,\n    priority: str = \"medium\"\n) -\u0026gt; str:\n    global ticket_counter\n    ticket_counter += 1\n    ticket_id = f\"TKT-{ticket_counter}\"\n\n    ticket = {\n        \"id\": ticket_id,\n        \"customer_name\": customer_name,\n        \"email\": email,\n        \"category\": category,\n        \"description\": description,\n        \"priority\": priority,\n        \"status\": \"open\",\n        \"created_at\": datetime.now().isoformat(),\n        \"estimated_response\": \"1-2 ngay lam viec\"\n    }\n\n    TICKETS_DB[ticket_id] = ticket\n\n    return json.dumps({\n        \"success\": True,\n        \"ticket_id\": ticket_id,\n        \"message\": (\n            f\"Da tao ticket {ticket_id} thanh cong. \"\n            f\"Doi ngu ho tro se lien he qua {email} trong {ticket['estimated_response']}.\"\n        )\n    }, ensure_ascii=False)\n\n\n# Tool 4: Leo thang den nhan vien\ndef escalate_to_human(\n    reason: str,\n    customer_email: str,\n    conversation_summary: str\n) -\u0026gt; str:\n    # Trong thuc te: gui Slack notification, tao Zendesk ticket, etc.\n    escalation_id = f\"ESC-{datetime.now().strftime('%Y%m%d%H%M%S')}\"\n\n    return json.dumps({\n        \"success\": True,\n        \"escalation_id\": escalation_id,\n        \"message\": (\n            \"Da chuyen cuoc tro chuyen den chuyen vien ho tro. \"\n            \"Ho se lien he voi ban trong vong 30 phut (gio lam viec).\"\n        ),\n        \"next_steps\": [\n            \"Chuyen vien se review lich su chat nay\",\n            f\"Email xac nhan duoc gui den {customer_email}\",\n            \"Neu khan cap, goi hotline: 1900-xxxx\"\n        ]\n    }, ensure_ascii=False)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTool Schemas\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003esupport_tools = [\n    {\n        \"name\": \"search_knowledge_base\",\n        \"description\": \"Tim kiem trong FAQ va knowledge base de tra loi cau hoi pho bien\",\n        \"input_schema\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"query\": {\n                    \"type\": \"string\",\n                    \"description\": \"Cau hoi hoac tu khoa can tim kiem\"\n                }\n            },\n            \"required\": [\"query\"]\n        }\n    },\n    {\n        \"name\": \"get_order_status\",\n        \"description\": \"Tra cuu trang thai don hang theo ma don hang hoac email\",\n        \"input_schema\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"order_id\": {\n                    \"type\": \"string\",\n                    \"description\": \"Ma don hang, vi du: ORD-001\"\n                },\n                \"email\": {\n                    \"type\": \"string\",\n                    \"description\": \"Email khach hang\"\n                }\n            }\n        }\n    },\n    {\n        \"name\": \"create_ticket\",\n        \"description\": \"Tao ticket ho tro khi can giai quyet van de phuc tap\",\n        \"input_schema\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"customer_name\": {\"type\": \"string\"},\n                \"email\": {\"type\": \"string\"},\n                \"category\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"billing\", \"technical\", \"shipping\", \"refund\", \"other\"]\n                },\n                \"description\": {\"type\": \"string\", \"description\": \"Mo ta van de chi tiet\"},\n                \"priority\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"low\", \"medium\", \"high\", \"urgent\"],\n                    \"description\": \"Mac dinh: medium\"\n                }\n            },\n            \"required\": [\"customer_name\", \"email\", \"category\", \"description\"]\n        }\n    },\n    {\n        \"name\": \"escalate_to_human\",\n        \"description\": \"Leo thang den nhan vien con nguoi khi van de vuot qua kha nang xu ly tu dong\",\n        \"input_schema\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"reason\": {\"type\": \"string\", \"description\": \"Ly do can leo thang\"},\n                \"customer_email\": {\"type\": \"string\"},\n                \"conversation_summary\": {\"type\": \"string\", \"description\": \"Tom tat van de\"}\n            },\n            \"required\": [\"reason\", \"customer_email\", \"conversation_summary\"]\n        }\n    }\n]\n\ntool_map = {\n    \"search_knowledge_base\": search_knowledge_base,\n    \"get_order_status\": get_order_status,\n    \"create_ticket\": create_ticket,\n    \"escalate_to_human\": escalate_to_human\n}\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eSupport Agent với Multi-turn Memory\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eSUPPORT_SYSTEM = \"\"\"Ban la nhan vien ho tro khach hang cua Claude.vn,\nchuyen nghiep, than thien, va luon tim cach giai quyet van de.\n\nQuy tac:\n1. Chao hoi lich su, xac nhan van de truoc khi xu ly\n2. Tim kiem knowledge base truoc khi hoi them thong tin\n3. Neu lien quan den don hang, yeu cau ma don hoac email de tra cuu\n4. Neu giai quyet duoc: tra loi day du, ro rang, co buoc thuc hien cu the\n5. Neu phuc tap hoac cam xuc cao: tao ticket hoac leo thang den nhan vien\n6. Luon ket thuc bang hoi: 'Ban con can ho tro gi khong?'\n\nNgon ngu: Tieng Viet, lich su nhung khong cung nhac.\"\"\"\n\n\nclass CustomerSupportAgent:\n    def __init__(self):\n        self.conversation_history = []\n\n    def chat(self, user_message: str) -\u0026gt; str:\n        self.conversation_history.append({\n            \"role\": \"user\",\n            \"content\": user_message\n        })\n\n        while True:\n            response = client.messages.create(\n                model=\"claude-opus-4-5\",\n                max_tokens=2048,\n                system=SUPPORT_SYSTEM,\n                tools=support_tools,\n                messages=self.conversation_history\n            )\n\n            self.conversation_history.append({\n                \"role\": \"assistant\",\n                \"content\": response.content\n            })\n\n            if response.stop_reason == \"end_turn\":\n                return next(\n                    (b.text for b in response.content if hasattr(b, \"text\")), \"\"\n                )\n\n            if response.stop_reason == \"tool_use\":\n                tool_results = []\n                for block in response.content:\n                    if block.type == \"tool_use\":\n                        result = self._execute_tool(block.name, block.input)\n                        tool_results.append({\n                            \"type\": \"tool_result\",\n                            \"tool_use_id\": block.id,\n                            \"content\": result\n                        })\n\n                self.conversation_history.append({\n                    \"role\": \"user\",\n                    \"content\": tool_results\n                })\n\n    def _execute_tool(self, name: str, inputs: dict) -\u0026gt; str:\n        if name not in tool_map:\n            return json.dumps({\"error\": f\"Unknown tool: {name}\"})\n        try:\n            return tool_map[name](**inputs)\n        except Exception as e:\n            return json.dumps({\"error\": str(e)})\n\n    def reset(self):\n        self.conversation_history = []\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eDemo conversation\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eagent = CustomerSupportAgent()\n\n# Kich ban 1: Tra cuu don hang\nprint(agent.chat(\"Xin chao, toi muon biet don hang ORD-001 di den dau roi?\"))\n# Agent: tra cuu ORDERS_DB, tra loi voi thong tin cu the\n\n# Kich ban 2: Hoan tien\nprint(agent.chat(\"Toi muon hoan tien don hang ORD-002\"))\n# Agent: tra cuu don hang, tao ticket category=refund\n\n# Kich ban 3: Cau hoi ky thuat\nprint(agent.chat(\"Rate limit cua API la bao nhieu?\"))\n# Agent: tim trong knowledge base, tra loi truc tiep\n\n# Kich ban 4: Khieu nai phuc tap\nprint(agent.chat(\"Toi bi tinh phi sai, bi mat 500k roi ma khong ai giai quyet!\"))\n# Agent: escalate_to_human vi cam xuc cao va van de tai chinh\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eProduction Checklist\u003c\/h2\u003e\n\n\u003cp\u003eTrước khi deploy, cần đảm bảo:\u003c\/p\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eRate limiting\u003c\/strong\u003e — Giới hạn số request\/user\/giờ để tránh abuse\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003ePII handling\u003c\/strong\u003e — Không lưu thông tin nhạy cảm trong conversation logs\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eFallback\u003c\/strong\u003e — Khi API lỗi, hiển thị message thân thiện thay vì crash\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eAnalytics\u003c\/strong\u003e — Track: resolution rate, escalation rate, CSAT score\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eA\/B testing\u003c\/strong\u003e — So sánh different system prompts để tối ưu satisfaction\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eHuman review\u003c\/strong\u003e — Sampling 5% conversations để QA định kỳ\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eTổng kết\u003c\/h2\u003e\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n\u003cth\u003eTính năng\u003c\/th\u003e\n\u003cth\u003eTool\u003c\/th\u003e\n\u003cth\u003eUse case\u003c\/th\u003e\n\u003c\/tr\u003e\n  \u003c\/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n\u003ctd\u003eFAQ Lookup\u003c\/td\u003e\n\u003ctd\u003esearch_knowledge_base\u003c\/td\u003e\n\u003ctd\u003eCâu hỏi thường gặp\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eOrder Tracking\u003c\/td\u003e\n\u003ctd\u003eget_order_status\u003c\/td\u003e\n\u003ctd\u003eTra cứu đơn hàng thực\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eTicket Creation\u003c\/td\u003e\n\u003ctd\u003ecreate_ticket\u003c\/td\u003e\n\u003ctd\u003eVấn đề cần xử lý manual\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eHuman Escalation\u003c\/td\u003e\n\u003ctd\u003eescalate_to_human\u003c\/td\u003e\n\u003ctd\u003eTình huống phức tạp\/nhạy cảm\u003c\/td\u003e\n\u003c\/tr\u003e\n  \u003c\/tbody\u003e\n\u003c\/table\u003e\n\n\u003cp\u003eCustomer Support Agent là pattern phổ biến nhất khi deploy Claude vào doanh nghiệp. Muốn đi xa hơn? Xem \u003ca href=\"\/en\/collections\/ung-dung\"\u003eFinancial Data Analyst\u003c\/a\u003e để thấy cách dùng Claude phân tích dữ liệu và tạo báo cáo tự động, hoặc quay lại \u003ca href=\"\/en\/collections\/nang-cao\"\u003eLLM Agent từ đầu\u003c\/a\u003e để nắm vững kiến trúc foundation.\u003c\/p\u003e\n\n\n\u003chr\u003e\n\u003ch3\u003eBài viết liên quan\u003c\/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/claude-cho-customer-support-t%E1%BB%B1-d%E1%BB%99ng-hoa-cham-soc-khach-hang\"\u003eClaude cho Customer Support — Tự động hóa chăm sóc khách hàng\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/claude-cho-lu%E1%BA%ADt-s%C6%B0-nghien-c%E1%BB%A9u-phap-ly-va-so%E1%BA%A1n-van-b%E1%BA%A3n\"\u003eClaude cho luật sư — Nghiên cứu pháp lý và soạn văn bản\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/claude-cho-tai-chinh-phan-tich-bao-cao-va-d%E1%BB%B1-bao\"\u003eClaude cho tài chính — Phân tích, báo cáo và dự báo\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/claude-cho-sales-d%E1%BB%B1-bao-doanh-s%E1%BB%91-chinh-xac\"\u003eClaude cho Sales: Dự báo doanh số chính xác\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/claude-v%E1%BA%ADn-hanh-h%C6%B0%E1%BB%9Bng-d%E1%BA%ABn-k%E1%BA%BFt-n%E1%BB%91i-cong-c%E1%BB%A5\"\u003eClaude Vận hành: Hướng dẫn Kết nối Công cụ\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47721912500436,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/customer-support-agent-chatbot-h_-tr_-production-grade_4768b798-9f4b-4b38-b845-0b79605cb91e.jpg?v=1774521841","url":"https:\/\/claude.vn\/en\/products\/customer-support-agent-chatbot-h%e1%bb%97-tr%e1%bb%a3-production-grade","provider":"CLAUDE.VN","version":"1.0","type":"link"}