{"product_id":"agent-loop-vs-prompt-chaining-chọn-pattern-dung-cho-bai-toan-của-bạn","title":"Agent Loop vs Prompt Chaining — Chọn pattern đúng cho bài toán của bạn","description":"\n\u003cp\u003eKhi xây dựng ứng dụng với Claude API, một trong những quyết định kiến trúc quan trọng nhất là chọn pattern tương tác phù hợp. Chọn sai pattern có thể dẫn đến chi phí cao gấp 10 lần, độ tin cậy thấp, hoặc giới hạn khả năng mở rộng. Bài viết này phân tích chi tiết 3 pattern chính và cung cấp ma trận quyết định giúp bạn chọn đúng ngay từ đầu.\u003c\/p\u003e\n\n\u003ch2\u003eBa pattern cơ bản\u003c\/h2\u003e\n\u003cp\u003eMọi ứng dụng AI đều thuộc về hoặc kết hợp từ 3 pattern cơ bản sau:\u003c\/p\u003e\n\n\u003ch3\u003ePattern 1: Single Prompt (Một lần gọi)\u003c\/h3\u003e\n\u003cp\u003eGửi toàn bộ input và nhận output trong một lần gọi API duy nhất. Đây là pattern đơn giản nhất và phù hợp nhất cho đa số tác vụ.\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003eimport anthropic\n\nclient = anthropic.Anthropic()\n\n# Single prompt: 1 input -\u0026gt; 1 output\nresponse = client.messages.create(\n    model=\"claude-sonnet-4-20250514\",\n    max_tokens=2048,\n    messages=[{\n        \"role\": \"user\",\n        \"content\": \"Phan tich bai viet sau va tra ve JSON voi \"\n                   \"cac truong: sentiment, topics, summary.\n\n\"\n                   \"[Noi dung bai viet...]\"\n    }]\n)\n\nresult = response.content[0].text\u003c\/code\u003e\u003c\/pre\u003e\n\u003cp\u003eKhi nào dùng: tác vụ có input rõ ràng và output xác định, không cần nhiều bước xử lý. Ví dụ: dịch văn bản, phân loại email, tóm tắt tài liệu, trích xuất thông tin từ CV.\u003c\/p\u003e\n\n\u003ch3\u003ePattern 2: Prompt Chaining (Chuỗi prompt)\u003c\/h3\u003e\n\u003cp\u003eChia tác vụ phức tạp thành nhiều bước tuần tự, output của bước trước trở thành input cho bước sau. Logic điều khiển nằm hoàn toàn trong code của bạn, không phải trong model.\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003edef prompt_chain_content_pipeline(topic):\n    \"\"\"Pipeline tao noi dung: outline -\u0026gt; draft -\u0026gt; review -\u0026gt; final.\"\"\"\n\n    # Buoc 1: Tao outline\n    outline_response = client.messages.create(\n        model=\"claude-sonnet-4-20250514\",\n        max_tokens=1024,\n        messages=[{\n            \"role\": \"user\",\n            \"content\": f\"Tao outline chi tiet cho bai viet ve: {topic}. \"\n                       f\"Tra ve danh sach cac heading va subheading.\"\n        }]\n    )\n    outline = outline_response.content[0].text\n\n    # Buoc 2: Viet draft dua tren outline\n    draft_response = client.messages.create(\n        model=\"claude-sonnet-4-20250514\",\n        max_tokens=4096,\n        messages=[{\n            \"role\": \"user\",\n            \"content\": f\"Viet bai viet day du dua tren outline sau:\n\n\"\n                       f\"{outline}\n\n\"\n                       f\"Yeu cau: 1500-2000 tu, gong dieu chuyen nghiep.\"\n        }]\n    )\n    draft = draft_response.content[0].text\n\n    # Buoc 3: Review va danh gia chat luong\n    review_response = client.messages.create(\n        model=\"claude-sonnet-4-20250514\",\n        max_tokens=2048,\n        messages=[{\n            \"role\": \"user\",\n            \"content\": f\"Review bai viet sau va chi ra:\n\"\n                       f\"1. Diem manh\n\"\n                       f\"2. Diem can cai thien\n\"\n                       f\"3. Loi chinh ta hoac ngu phap\n\n\"\n                       f\"{draft}\"\n        }]\n    )\n    review = review_response.content[0].text\n\n    # Buoc 4: Chinh sua dua tren review\n    final_response = client.messages.create(\n        model=\"claude-sonnet-4-20250514\",\n        max_tokens=4096,\n        messages=[{\n            \"role\": \"user\",\n            \"content\": f\"Chinh sua bai viet sau dua tren feedback:\n\n\"\n                       f\"BAI VIET GOC:\n{draft}\n\n\"\n                       f\"FEEDBACK:\n{review}\n\n\"\n                       f\"Hay tra ve ban chinh sua hoan chinh.\"\n        }]\n    )\n\n    return final_response.content[0].text\u003c\/code\u003e\u003c\/pre\u003e\n\u003cp\u003eKhi nào dùng: tác vụ có thể chia thành các bước rõ ràng, mỗi bước có input\/output xác định, và bạn muốn kiểm soát chính xác luồng xử lý. Ví dụ: pipeline tạo nội dung, quy trình xử lý đơn hàng, phân tích dữ liệu nhiều giai đoạn.\u003c\/p\u003e\n\n\u003ch3\u003ePattern 3: Agent Loop (Vòng lặp agent)\u003c\/h3\u003e\n\u003cp\u003eModel tự quyết định hành động tiếp theo dựa trên kết quả của hành động trước. Model được cung cấp các tool (hàm) và tự chọn tool nào cần gọi, khi nào dừng. Logic điều khiển nằm trong model, không phải trong code.\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003eimport json\n\ntools = [\n    {\n        \"name\": \"search_database\",\n        \"description\": \"Tim kiem san pham trong database\",\n        \"input_schema\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"query\": {\"type\": \"string\"},\n                \"category\": {\"type\": \"string\"}\n            },\n            \"required\": [\"query\"]\n        }\n    },\n    {\n        \"name\": \"check_inventory\",\n        \"description\": \"Kiem tra ton kho cua san pham\",\n        \"input_schema\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"product_id\": {\"type\": \"string\"}\n            },\n            \"required\": [\"product_id\"]\n        }\n    },\n    {\n        \"name\": \"calculate_shipping\",\n        \"description\": \"Tinh phi van chuyen\",\n        \"input_schema\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"product_id\": {\"type\": \"string\"},\n                \"destination\": {\"type\": \"string\"}\n            },\n            \"required\": [\"product_id\", \"destination\"]\n        }\n    }\n]\n\ndef execute_tool(tool_name, tool_input):\n    \"\"\"Thuc thi tool va tra ve ket qua.\"\"\"\n    if tool_name == \"search_database\":\n        return json.dumps({\"results\": [{\"id\": \"P001\", \"name\": \"Laptop X\"}]})\n    elif tool_name == \"check_inventory\":\n        return json.dumps({\"in_stock\": True, \"quantity\": 15})\n    elif tool_name == \"calculate_shipping\":\n        return json.dumps({\"cost\": 50000, \"delivery_days\": 3})\n    return json.dumps({\"error\": \"Unknown tool\"})\n\ndef agent_loop(user_message, max_turns=10):\n    \"\"\"Agent loop: model tu quyet dinh hanh dong tiep theo.\"\"\"\n    messages = [{\"role\": \"user\", \"content\": user_message}]\n\n    for turn in range(max_turns):\n        response = client.messages.create(\n            model=\"claude-sonnet-4-20250514\",\n            max_tokens=4096,\n            tools=tools,\n            messages=messages\n        )\n\n        # Kiem tra model co muon goi tool khong\n        if response.stop_reason == \"end_turn\":\n            # Model da tra loi xong, khong can goi tool nua\n            final_text = \"\"\n            for block in response.content:\n                if block.type == \"text\":\n                    final_text += block.text\n            return final_text\n\n        # Xu ly tool calls\n        assistant_content = response.content\n        messages.append({\"role\": \"assistant\", \"content\": assistant_content})\n\n        tool_results = []\n        for block in assistant_content:\n            if block.type == \"tool_use\":\n                result = 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        messages.append({\"role\": \"user\", \"content\": tool_results})\n\n    return \"Da dat gioi han so vong lap\"\n\n# Su dung\nanswer = agent_loop(\"Tim laptop duoi 20 trieu, con hang, ship ve Ha Noi\")\u003c\/code\u003e\u003c\/pre\u003e\n\u003cp\u003eKhi nào dùng: tác vụ không thể dự đoán trước số bước cần thực hiện, cần tương tác với nhiều hệ thống bên ngoài, hoặc logic xử lý phụ thuộc vào kết quả runtime. Ví dụ: chatbot hỗ trợ khách hàng với quyền truy cập database, trợ lý nghiên cứu tự động, agent xử lý sự cố.\u003c\/p\u003e\n\n\u003ch2\u003eMa trận quyết định\u003c\/h2\u003e\n\u003cp\u003eSử dụng bảng sau để chọn pattern phù hợp cho bài toán của bạn:\u003c\/p\u003e\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003eTiêu chí\u003c\/th\u003e\n      \u003cth\u003eSingle Prompt\u003c\/th\u003e\n      \u003cth\u003ePrompt Chain\u003c\/th\u003e\n      \u003cth\u003eAgent Loop\u003c\/th\u003e\n    \u003c\/tr\u003e\n  \u003c\/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eĐộ phức tạp bài toán\u003c\/td\u003e\n      \u003ctd\u003eThấp - Trung bình\u003c\/td\u003e\n      \u003ctd\u003eTrung bình - Cao\u003c\/td\u003e\n      \u003ctd\u003eCao - Rất cao\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eSố bước xử lý\u003c\/td\u003e\n      \u003ctd\u003e1\u003c\/td\u003e\n      \u003ctd\u003e2-8 (cố định)\u003c\/td\u003e\n      \u003ctd\u003e1-N (không cố định)\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eChi phí tương đối\u003c\/td\u003e\n      \u003ctd\u003e1x (thấp nhất)\u003c\/td\u003e\n      \u003ctd\u003e2-5x\u003c\/td\u003e\n      \u003ctd\u003e3-50x\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eLatency\u003c\/td\u003e\n      \u003ctd\u003eThấp (1 call)\u003c\/td\u003e\n      \u003ctd\u003eTrung bình (N call tuần tự)\u003c\/td\u003e\n      \u003ctd\u003eCao (N call, không dự đoán được)\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eĐộ tin cậy\u003c\/td\u003e\n      \u003ctd\u003eCao nhất\u003c\/td\u003e\n      \u003ctd\u003eCao (kiểm soát được)\u003c\/td\u003e\n      \u003ctd\u003eThấp nhất (model có thể đi sai hướng)\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eKhả năng debug\u003c\/td\u003e\n      \u003ctd\u003eDễ\u003c\/td\u003e\n      \u003ctd\u003eTrung bình\u003c\/td\u003e\n      \u003ctd\u003eKhó\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eKiểm soát luồng\u003c\/td\u003e\n      \u003ctd\u003eCode quyết định\u003c\/td\u003e\n      \u003ctd\u003eCode quyết định\u003c\/td\u003e\n      \u003ctd\u003eModel quyết định\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eCần tool\/API ngoài\u003c\/td\u003e\n      \u003ctd\u003eKhông\u003c\/td\u003e\n      \u003ctd\u003eCó thể\u003c\/td\u003e\n      \u003ctd\u003eThường xuyên\u003c\/td\u003e\n    \u003c\/tr\u003e\n  \u003c\/tbody\u003e\n\u003c\/table\u003e\n\n\u003ch2\u003ePhân tích chi phí chi tiết\u003c\/h2\u003e\n\u003cp\u003eChi phí là yếu tố quyết định quan trọng. Dưới đây là ví dụ với cùng một tác vụ: \"Phân tích website đối thủ và tạo báo cáo cạnh tranh\".\u003c\/p\u003e\n\n\u003ch3\u003eSingle Prompt\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# 1 API call\n# Input: ~2000 tokens (prompt + context)\n# Output: ~3000 tokens (bao cao)\n# Chi phi: (2000 * $3 + 3000 * $15) \/ 1M = $0.051\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003ePrompt Chain (4 bước)\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# Buoc 1: Phan tich co cau website (~1500 input, ~1000 output)\n# Buoc 2: Phan tich noi dung (~2500 input, ~1500 output)\n# Buoc 3: Phan tich SEO (~2000 input, ~1000 output)\n# Buoc 4: Tong hop bao cao (~5000 input, ~3000 output)\n# Tong: 11000 input tokens, 6500 output tokens\n# Chi phi: (11000 * $3 + 6500 * $15) \/ 1M = $0.131\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eAgent Loop (5-15 vòng)\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# Moi vong: ~2000 input, ~500 output (trung binh)\n# 10 vong trung binh: 20000 input, 5000 output\n# Cong them context tich luy: +15000 input tokens\n# Tong: ~35000 input tokens, 5000 output tokens\n# Chi phi: (35000 * $3 + 5000 * $15) \/ 1M = $0.18\n# Truong hop xau (15 vong): co the len $0.35+\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eKhi nào mỗi pattern thắng\u003c\/h2\u003e\n\n\u003ch3\u003eSingle Prompt thắng khi:\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003eTác vụ có thể mô tả trong một prompt ngắn gọn\u003c\/li\u003e\n  \u003cli\u003eOutput có format xác định (JSON, bảng, danh sách)\u003c\/li\u003e\n  \u003cli\u003eKhông cần truy cập dữ liệu bên ngoài\u003c\/li\u003e\n  \u003cli\u003eLatency là ưu tiên (cần phản hồi nhanh)\u003c\/li\u003e\n  \u003cli\u003eChi phí cần tối thiểu\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003eVí dụ thực tế: phân loại email, trích xuất thông tin từ hóa đơn, dịch văn bản, tạo mô tả sản phẩm.\u003c\/p\u003e\n\n\u003ch3\u003ePrompt Chain thắng khi:\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003eTác vụ có các bước rõ ràng, mỗi bước tạo ra artifact cụ thể\u003c\/li\u003e\n  \u003cli\u003eBạn muốn kiểm soát chất lượng ở từng bước (gate check)\u003c\/li\u003e\n  \u003cli\u003eCó thể dùng model khác nhau cho từng bước (Haiku cho bước đơn giản, Sonnet cho bước phức tạp)\u003c\/li\u003e\n  \u003cli\u003eCần xử lý lỗi và retry ở từng bước riêng biệt\u003c\/li\u003e\n  \u003cli\u003eOutput của một bước cần validation trước khi chuyển sang bước tiếp\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003eVí dụ thực tế: pipeline tạo nội dung (outline -\u0026gt; draft -\u0026gt; review -\u0026gt; edit), quy trình phân tích dữ liệu (clean -\u0026gt; analyze -\u0026gt; visualize -\u0026gt; report), multi-step form processing.\u003c\/p\u003e\n\n\u003ch3\u003eAgent Loop thắng khi:\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003eKhông biết trước cần bao nhiêu bước\u003c\/li\u003e\n  \u003cli\u003eModel cần quyết định hành động dựa trên kết quả runtime\u003c\/li\u003e\n  \u003cli\u003eTác vụ yêu cầu tương tác với nhiều tool\/API khác nhau\u003c\/li\u003e\n  \u003cli\u003eNgười dùng mong đợi trải nghiệm \"trợ lý thông minh\" có thể tự giải quyết vấn đề\u003c\/li\u003e\n  \u003cli\u003eTác vụ có tính khám phá (exploratory): tìm kiếm, nghiên cứu, troubleshooting\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003eVí dụ thực tế: customer support bot, coding assistant, research agent, DevOps troubleshooting agent.\u003c\/p\u003e\n\n\u003ch2\u003eLộ trình nâng cấp: từ đơn giản đến phức tạp\u003c\/h2\u003e\n\u003cp\u003eNguyên tắc vàng: luôn bắt đầu với pattern đơn giản nhất có thể giải quyết bài toán, rồi nâng cấp khi thực sự cần thiết.\u003c\/p\u003e\n\n\u003ch3\u003eGiai đoạn 1: Single Prompt\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# Bat dau voi single prompt\nresponse = client.messages.create(\n    model=\"claude-sonnet-4-20250514\",\n    max_tokens=4096,\n    messages=[{\n        \"role\": \"user\",\n        \"content\": f\"Phan tich va tao bao cao cho: {data}\"\n    }]\n)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eGiai đoạn 2: Thêm validation, chuyển sang Chain\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# Khi single prompt khong du chat luong\n# -\u0026gt; Tach thanh chain voi validation\n\n# Buoc 1: Phan tich\nanalysis = call_claude(\"Phan tich data nay: ...\")\n\n# Gate check: kiem tra output co hop le khong\nif not validate_analysis(analysis):\n    analysis = call_claude(\"Phan tich lai, can bao gom: ...\")\n\n# Buoc 2: Tao bao cao tu phan tich da validate\nreport = call_claude(f\"Tao bao cao tu phan tich: {analysis}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eGiai đoạn 3: Thêm tool, chuyển sang Agent\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003e# Khi chain khong du linh hoat\n# -\u0026gt; Chuyen sang agent loop voi tools\n\n# Chi chuyen sang agent khi:\n# 1. So buoc khong co dinh\n# 2. Can truy cap nhieu data source\n# 3. Logic phu thuoc vao du lieu runtime\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eHybrid Pattern: Kết hợp nhiều pattern\u003c\/h2\u003e\n\u003cp\u003eTrong thực tế, nhiều ứng dụng kết hợp các pattern. Ví dụ: dùng agent loop cho phần tương tác với người dùng, nhưng bên trong agent gọi các prompt chain cho từng tác vụ cụ thể:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003edef hybrid_customer_support(user_message):\n    \"\"\"Agent loop o cap cao, prompt chain cho tung tac vu.\"\"\"\n\n    tools = [\n        {\n            \"name\": \"process_refund\",\n            \"description\": \"Xu ly hoan tien. \"\n                           \"Ben trong dung prompt chain 3 buoc: \"\n                           \"verify -\u0026gt; calculate -\u0026gt; confirm\",\n            \"input_schema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                    \"order_id\": {\"type\": \"string\"},\n                    \"reason\": {\"type\": \"string\"}\n                },\n                \"required\": [\"order_id\", \"reason\"]\n            }\n        },\n        {\n            \"name\": \"analyze_complaint\",\n            \"description\": \"Phan tich khieu nai. \"\n                           \"Ben trong dung single prompt.\",\n            \"input_schema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                    \"complaint_text\": {\"type\": \"string\"}\n                },\n                \"required\": [\"complaint_text\"]\n            }\n        }\n    ]\n\n    # Agent loop quyet dinh goi tool nao\n    # Moi tool ben trong co the la single prompt hoac chain\n    return agent_loop(user_message, tools=tools)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eAnti-patterns cần tránh\u003c\/h2\u003e\n\u003cp\u003eMột số sai lầm phổ biến khi chọn pattern:\u003c\/p\u003e\n\n\u003ch3\u003e1. Agent Loop cho tác vụ đơn giản\u003c\/h3\u003e\n\u003cp\u003eDùng agent với tool cho tác vụ mà single prompt đã xử lý tốt. Kết quả: chi phí tăng 10-20x, latency tăng 5-10x, và thêm phức tạp không cần thiết.\u003c\/p\u003e\n\n\u003ch3\u003e2. Single Prompt cho tác vụ quá phức tạp\u003c\/h3\u003e\n\u003cp\u003eNhồi nhét tất cả hướng dẫn vào một prompt khổng lồ. Kết quả: model bỏ sót bước, output không đồng nhất, khó debug khi có lỗi.\u003c\/p\u003e\n\n\u003ch3\u003e3. Prompt Chain cứng nhắc cho tác vụ động\u003c\/h3\u003e\n\u003cp\u003eThiết kế chain cố định cho tác vụ mà mỗi input cần số bước khác nhau. Kết quả: lãng phí token cho bước không cần thiết, hoặc thiếu bước khi cần.\u003c\/p\u003e\n\n\u003ch3\u003e4. Không đặt giới hạn cho Agent Loop\u003c\/h3\u003e\n\u003cp\u003eAgent loop không có max_turns có thể chạy vô tận, tiêu tốn hàng trăm nghìn token. Luôn đặt giới hạn số vòng lặp tối đa.\u003c\/p\u003e\n\n\u003ch2\u003eBước tiếp theo\u003c\/h2\u003e\n\u003cp\u003eChọn đúng pattern là bước đầu tiên để xây dựng ứng dụng AI hiệu quả. Bước tiếp theo là triển khai kiểm soát chi phí cho agent loop (token budget, max iterations, monitoring) để đảm bảo ứng dụng không vượt ngân sách. Khám phá thêm tại \u003ca href=\"\/en\/collections\/nang-cao\"\u003eThư viện Nâng cao Claude\u003c\/a\u003e.\u003c\/p\u003e\n","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47730149359828,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/agent-loop-vs-prompt-chaining-ch_n-pattern-dung-cho-bai-toan-c_a-b_n.jpg?v=1774715287","url":"https:\/\/claude.vn\/en\/products\/agent-loop-vs-prompt-chaining-ch%e1%bb%8dn-pattern-dung-cho-bai-toan-c%e1%bb%a7a-b%e1%ba%a1n","provider":"CLAUDE.VN","version":"1.0","type":"link"}