{"product_id":"context-compaction-tự-dộng-nen-context-cho-conversations-dai","title":"Context Compaction — Tự động nén context cho conversations dài","description":"\n\u003cp\u003eKhi xây dựng agents xử lý long-running tasks — customer service xử lý hàng chục tickets, coding assistant debug qua nhiều giờ, research agent phân tích documents — context window sẽ đầy. Đây không phải bug, đây là giới hạn vật lý của mọi LLM. Câu hỏi là: bạn xử lý nó như thế nào?\u003c\/p\u003e\n\n\u003cp\u003eAnthropic Agent SDK cung cấp \u003cstrong\u003econtext compaction tự động\u003c\/strong\u003e thông qua \u003ccode\u003ecompaction_control\u003c\/code\u003e parameter — giải pháp server-side được khuyến nghị cho production workloads.\u003c\/p\u003e\n\n\u003ch2\u003eContext Compaction hoạt động như thế nào?\u003c\/h2\u003e\n\n\u003cp\u003eThay vì đơn giản truncate (cắt bỏ messages cũ), compaction thông minh hơn nhiều. Quy trình gồm 4 bước:\u003c\/p\u003e\n\n\u003col\u003e\n  \u003cli\u003e\n\u003cstrong\u003eMonitor token usage\u003c\/strong\u003e — SDK liên tục theo dõi lượng tokens đã dùng trong context window\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eInject summary prompt\u003c\/strong\u003e — Khi gần đầy, SDK tự động inject một prompt yêu cầu tóm tắt toàn bộ conversation\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eModel generates summary\u003c\/strong\u003e — Claude tạo summary trong \u003ccode\u003e\u0026lt;summary\u0026gt;\u003c\/code\u003e tags, bao gồm tất cả thông tin quan trọng\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eClear history, resume with summary\u003c\/strong\u003e — Context history được xóa, thay bằng summary. Conversation tiếp tục như bình thường\u003c\/li\u003e\n\u003c\/ol\u003e\n\n\u003cp\u003eKết quả: agent có thể chạy \u003cstrong\u003evô hạn thời gian\u003c\/strong\u003e mà không bao giờ hết context — như một nhân viên có thể nhớ tóm tắt lịch sử thay vì nhớ từng từ.\u003c\/p\u003e\n\n\u003ch2\u003eSetup: Beta decorator và compaction_control\u003c\/h2\u003e\n\n\u003cp\u003eContext compaction hiện là \u003cstrong\u003ebeta feature\u003c\/strong\u003e. Để kích hoạt, dùng \u003ccode\u003e@beta_tool\u003c\/code\u003e decorator và set \u003ccode\u003ecompaction_control\u003c\/code\u003e:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport anthropic\nfrom anthropic import Anthropic\n\nclient = Anthropic()\n\n# Cấu hình compaction\n# threshold: % context window đã dùng trước khi compact\n# model dùng để tạo summary (nên dùng fast model)\ncompaction_config = {\n    \"type\": \"enabled\",\n    \"summary_context_ratio\": 0.5,  # Compact khi dùng 50% context\n}\n\n# Tạo agent với compaction enabled\ndef create_compaction_agent():\n    return client.beta.messages.create(\n        model=\"claude-opus-4-5\",\n        max_tokens=4096,\n        betas=[\"context-compaction-2025-06-01\"],\n        # compaction_control được pass qua beta headers\n    )\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eSử dụng Agent SDK (cách khuyến nghị)\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003efrom anthropic.agents import AgentLoop\n\n# AgentLoop tự động handle compaction\nagent = AgentLoop(\n    client=client,\n    model=\"claude-opus-4-5\",\n    tools=[...],\n    compaction_control={\n        \"type\": \"enabled\",\n        \"summary_context_ratio\": 0.5\n    }\n)\n\n# Run agent — sẽ tự compact khi cần\nasync def run_with_compaction():\n    result = await agent.run(\n        \"Process these 25 customer service tickets: ...\"\n    )\n    return result\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eDemo: Customer Service Agent xử lý 20-30 tickets\u003c\/h2\u003e\n\n\u003cp\u003eĐây là bài toán điển hình: agent nhận 25 tickets, phải xử lý từng cái, tổng hợp kết quả. Không có compaction, context sẽ đầy sau khoảng ticket thứ 10-15.\u003c\/p\u003e\n\n\u003ch3\u003eDefine tools cho customer service agent\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003eCUSTOMER_SERVICE_TOOLS = [\n    {\n        \"name\": \"get_ticket_details\",\n        \"description\": \"Lấy chi tiết một ticket support\",\n        \"input_schema\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"ticket_id\": {\"type\": \"string\"}\n            },\n            \"required\": [\"ticket_id\"]\n        }\n    },\n    {\n        \"name\": \"update_ticket_status\",\n        \"description\": \"Cập nhật trạng thái ticket\",\n        \"input_schema\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"ticket_id\": {\"type\": \"string\"},\n                \"status\": {\n                    \"type\": \"string\",\n                    \"enum\": [\"resolved\", \"pending\", \"escalated\"]\n                },\n                \"resolution\": {\"type\": \"string\"}\n            },\n            \"required\": [\"ticket_id\", \"status\"]\n        }\n    },\n    {\n        \"name\": \"send_customer_reply\",\n        \"description\": \"Gửi reply cho khách hàng\",\n        \"input_schema\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"ticket_id\": {\"type\": \"string\"},\n                \"message\": {\"type\": \"string\"}\n            },\n            \"required\": [\"ticket_id\", \"message\"]\n        }\n    }\n]\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eSimulate ticket database\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003eTICKET_DATABASE = {\n    f\"TK-{i:03d}\": {\n        \"id\": f\"TK-{i:03d}\",\n        \"customer\": f\"Nguyen Van {chr(65 + i % 26)}\",\n        \"issue\": [\n            \"San pham bi loi sau 3 ngay su dung\",\n            \"Khong nhan duoc hang sau 7 ngay dat\",\n            \"Yeu cau hoan tien vi san pham khong dung mo ta\",\n            \"Loi thanh toan khi checkout\",\n            \"Can ho tro cai dat san pham\"\n        ][i % 5],\n        \"priority\": [\"high\", \"medium\", \"low\"][i % 3],\n        \"status\": \"open\"\n    }\n    for i in range(25)\n}\n\ndef handle_tool_call(tool_name, tool_input):\n    if tool_name == \"get_ticket_details\":\n        tid = tool_input[\"ticket_id\"]\n        return TICKET_DATABASE.get(tid, {\"error\": \"Ticket not found\"})\n\n    elif tool_name == \"update_ticket_status\":\n        tid = tool_input[\"ticket_id\"]\n        if tid in TICKET_DATABASE:\n            TICKET_DATABASE[tid][\"status\"] = tool_input[\"status\"]\n            TICKET_DATABASE[tid][\"resolution\"] = tool_input.get(\"resolution\", \"\")\n        return {\"success\": True}\n\n    elif tool_name == \"send_customer_reply\":\n        # In production: gửi email thật\n        print(f\"[EMAIL] To ticket {tool_input['ticket_id']}: {tool_input['message'][:50]}...\")\n        return {\"success\": True, \"message_id\": f\"MSG-{tool_input['ticket_id']}\"}\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eAgent với context compaction\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003eimport json\n\ndef run_customer_service_agent():\n    ticket_ids = [f\"TK-{i:03d}\" for i in range(25)]\n    ticket_list = \", \".join(ticket_ids)\n\n    system_prompt = \"\"\"Ban la Customer Service Agent cho mot cong ty thuong mai dien tu Viet Nam.\n    Nhiem vu: xu ly tat ca tickets duoc giao, phan tich van de, gui reply cho khach,\n    va cap nhat trang thai. Sau khi xu ly xong, bao cao tong ket.\"\"\"\n\n    messages = [{\n        \"role\": \"user\",\n        \"content\": f\"Hay xu ly tat ca {len(ticket_ids)} tickets sau: {ticket_list}. Xu ly tung ticket mot, gui reply phu hop va cap nhat trang thai.\"\n    }]\n\n    print(f\"Starting agent with {len(ticket_ids)} tickets...\")\n    total_input_tokens = 0\n    compaction_count = 0\n\n    while True:\n        response = client.messages.create(\n            model=\"claude-opus-4-5\",\n            max_tokens=4096,\n            system=system_prompt,\n            tools=CUSTOMER_SERVICE_TOOLS,\n            messages=messages,\n            extra_headers={\n                \"anthropic-beta\": \"context-compaction-2025-06-01\"\n            }\n        )\n\n        # Track token usage\n        total_input_tokens += response.usage.input_tokens\n\n        # Detect compaction occurred\n        if hasattr(response, 'context_compaction_metadata'):\n            compaction_count += 1\n            print(f\"[Compaction #{compaction_count}] Context compressed successfully\")\n\n        if response.stop_reason == \"end_turn\":\n            # Extract final report\n            for block in response.content:\n                if hasattr(block, 'text'):\n                    print(\"\n=== FINAL REPORT ===\")\n                    print(block.text)\n            break\n\n        elif response.stop_reason == \"tool_use\":\n            messages.append({\"role\": \"assistant\", \"content\": response.content})\n            tool_results = []\n\n            for block in response.content:\n                if block.type == \"tool_use\":\n                    print(f\"[Tool] {block.name}({json.dumps(block.input)[:60]}...)\")\n                    result = handle_tool_call(block.name, block.input)\n                    tool_results.append({\n                        \"type\": \"tool_result\",\n                        \"tool_use_id\": block.id,\n                        \"content\": json.dumps(result)\n                    })\n\n            messages.append({\"role\": \"user\", \"content\": tool_results})\n        else:\n            print(f\"Unexpected stop reason: {response.stop_reason}\")\n            break\n\n    print(f\"\nStats: {total_input_tokens:,} total tokens, {compaction_count} compactions\")\n\nrun_customer_service_agent()\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eOutput mẫu: Compaction in action\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eStarting agent with 25 tickets...\n[Tool] get_ticket_details({\"ticket_id\": \"TK-000\"}...)\n[Tool] send_customer_reply({\"ticket_id\": \"TK-000\", \"message\": \"Xin chao...\")\n[Tool] update_ticket_status({\"ticket_id\": \"TK-000\", \"status\": \"resolved\"...)\n[Tool] get_ticket_details({\"ticket_id\": \"TK-001\"}...)\n...\n[Compaction #1] Context compressed successfully\n[Tool] get_ticket_details({\"ticket_id\": \"TK-014\"}...)\n...\n[Compaction #2] Context compressed successfully\n[Tool] get_ticket_details({\"ticket_id\": \"TK-022\"}...)\n...\n\n=== FINAL REPORT ===\nDa xu ly xong 25 tickets:\n- 18 tickets resolved (cap do trung binh va thap)\n- 5 tickets escalated (van de phuc tap, can ky thuat vien)\n- 2 tickets pending (cho phan hoi tu khach hang)\n...\n\nStats: 284,521 total tokens, 2 compactions\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eCompaction strategies: Server-side vs Client-side\u003c\/h2\u003e\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003eAspect\u003c\/th\u003e\n      \u003cth\u003eServer-side (compaction_control)\u003c\/th\u003e\n      \u003cth\u003eClient-side (manual)\u003c\/th\u003e\n    \u003c\/tr\u003e\n  \u003c\/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eImplementation\u003c\/td\u003e\n      \u003ctd\u003e1 parameter, tự động\u003c\/td\u003e\n      \u003ctd\u003ePhải tự code logic compaction\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eSummary quality\u003c\/td\u003e\n      \u003ctd\u003eCao — model tự summary\u003c\/td\u003e\n      \u003ctd\u003ePhụ thuộc vào code của bạn\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eTiming control\u003c\/td\u003e\n      \u003ctd\u003eHạn chế (threshold config)\u003c\/td\u003e\n      \u003ctd\u003eFull control\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eCost\u003c\/td\u003e\n      \u003ctd\u003eThêm tokens cho summary step\u003c\/td\u003e\n      \u003ctd\u003eCó thể tối ưu hơn nếu code tốt\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eRecommended for\u003c\/td\u003e\n      \u003ctd\u003eProduction, Opus models\u003c\/td\u003e\n      \u003ctd\u003eFine-grained control needed\u003c\/td\u003e\n    \u003c\/tr\u003e\n  \u003c\/tbody\u003e\n\u003c\/table\u003e\n\n\u003cp\u003e\u003cstrong\u003eAnthropic khuyến nghị server-side compaction\u003c\/strong\u003e cho claude-opus-4-5 và các production workloads vì model tự tạo summary chất lượng cao hơn, bảo toàn nhiều context quan trọng hơn.\u003c\/p\u003e\n\n\u003ch2\u003eKhi nào NÊN và KHÔNG NÊN dùng compaction\u003c\/h2\u003e\n\n\u003ch3\u003eNên dùng khi:\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003eAgent cần xử lý nhiều items trong một session (20+ tickets, documents, records)\u003c\/li\u003e\n  \u003cli\u003eDebugging session kéo dài nhiều giờ\u003c\/li\u003e\n  \u003cli\u003eResearch agent phải đọc và tổng hợp nhiều tài liệu\u003c\/li\u003e\n  \u003cli\u003eAny workflow mà context window là bottleneck\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch3\u003eKhông cần khi:\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003eSingle-turn queries ngắn\u003c\/li\u003e\n  \u003cli\u003eConversations ít hơn 10-15 exchanges\u003c\/li\u003e\n  \u003cli\u003eKhi bạn cần truy cập exact text từ early conversation\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eTổng kết\u003c\/h2\u003e\n\n\u003cp\u003eContext compaction với \u003ccode\u003ecompaction_control\u003c\/code\u003e parameter là giải pháp production-ready cho long-running agents:\u003c\/p\u003e\n\n\u003cul\u003e\n  \u003cli\u003eKhông cần viết code phức tạp — 1 parameter bật tự động\u003c\/li\u003e\n  \u003cli\u003eSummary quality cao vì model tự tạo\u003c\/li\u003e\n  \u003cli\u003eĐặc biệt hiệu quả với claude-opus-4-5 cho complex reasoning tasks\u003c\/li\u003e\n  \u003cli\u003eCho phép agents xử lý workflows dài vô hạn mà không crash\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003cp\u003eBước tiếp theo: Tìm hiểu \u003ca href=\"\/en\/collections\/nang-cao\"\u003eProgrammatic Tool Calling\u003c\/a\u003e để giảm latency thêm bước nữa — thay vì round-trips qua model, để Claude viết code gọi tools trực tiếp.\u003c\/p\u003e\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\/extended-thinking-tool-use-suy-lu%E1%BA%ADn-sau-k%E1%BA%BFt-h%E1%BB%A3p-cong-c%E1%BB%A5\"\u003eExtended Thinking + Tool Use — Suy luận sâu kết hợp công cụ\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/react-agent-v%E1%BB%9Bi-llamaindex-claude-ly-lu%E1%BA%ADn-hanh-d%E1%BB%99ng\"\u003eReAct Agent với LlamaIndex + Claude — Lý luận + Hành động\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/xay-d%E1%BB%B1ng-llm-agent-t%E1%BB%AB-d%E1%BA%A7u-reference-implementation\"\u003eXây dựng LLM Agent từ đầu — Reference Implementation\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/claude-cho-engineering-chi%E1%BA%BFn-l%C6%B0%E1%BB%A3c-testing-toan-di%E1%BB%87n\"\u003eClaude cho Engineering: Chiến lược testing toàn diện\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/claude-cho-data-trich-xu%E1%BA%A5t-context-t%E1%BB%AB-datasets\"\u003eClaude cho Data: Trích xuất context từ datasets\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47721767665876,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/context-compaction-t_-d_ng-nen-context-cho-conversations-dai.jpg?v=1774521539","url":"https:\/\/claude.vn\/en\/products\/context-compaction-t%e1%bb%b1-d%e1%bb%99ng-nen-context-cho-conversations-dai","provider":"CLAUDE.VN","version":"1.0","type":"link"}