{"product_id":"router-query-engine-tự-dộng-chọn-index-phu-hợp","title":"Router Query Engine — Tự động chọn index phù hợp","description":"\n\u003cp\u003eKhi hệ thống RAG của bạn có nhiều indexes khác nhau — một cho tài liệu kỹ thuật, một cho FAQ, một cho dữ liệu giá — làm thế nào để biết câu hỏi nào nên query index nào? \u003cstrong\u003eRouter Query Engine\u003c\/strong\u003e của LlamaIndex giải quyết vấn đề này: sử dụng Claude để phân tích câu hỏi và tự động route đến query engine phù hợp nhất.\u003c\/p\u003e\n\n\u003ch2\u003eRouter hoạt động như thế nào?\u003c\/h2\u003e\n\n\u003cp\u003eRouter nhận câu hỏi, phân tích nội dung, rồi chọn một hoặc nhiều query engines để truy vấn:\u003c\/p\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eSingle Selection Router\u003c\/strong\u003e — Chọn một engine tốt nhất (nhanh, tiết kiệm)\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eMulti Selection Router\u003c\/strong\u003e — Chọn nhiều engines, tổng hợp kết quả (toàn diện hơn)\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eLLM-based Router\u003c\/strong\u003e — Dùng LLM để quyết định (flexible, hiểu ngữ cảnh)\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eEmbedding-based Router\u003c\/strong\u003e — Dùng cosine similarity (nhanh hơn, ít chi phí)\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eCài đặt\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003epip install llama-index llama-index-llms-anthropic llama-index-embeddings-voyageai\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport os\nfrom llama_index.core import Settings, VectorStoreIndex, SummaryIndex, Document\nfrom llama_index.llms.anthropic import Anthropic\nfrom llama_index.embeddings.voyageai import VoyageEmbedding\n\nSettings.llm = Anthropic(model=\"claude-opus-4-5\", max_tokens=2048)\nSettings.embed_model = VoyageEmbedding(\n    model_name=\"voyage-3\",\n    voyage_api_key=os.environ.get(\"VOYAGE_API_KEY\")\n)\n\nprint(\"Router Query Engine ready\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTạo nhiều Indexes\u003c\/h2\u003e\n\n\u003cp\u003eVí dụ: hệ thống hỗ trợ khách hàng với 3 loại tài liệu khác nhau:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003e# 1. Technical Documentation\ntech_docs = [\n    Document(text=\"\"\"API Authentication: Tất cả requests đến Claude API\n    phải có Authorization header với API key. Format: 'x-api-key: YOUR_KEY'.\n    Không bao giờ để API key trong client-side code. Dùng environment variables.\"\"\"),\n    Document(text=\"\"\"Rate Limiting: Claude API áp dụng rate limits theo tier.\n    Tier 1: 50 RPM, 50K TPM. Tier 2: 1000 RPM, 100K TPM.\n    Khi bị rate limit, nhận HTTP 429. Implement exponential backoff.\"\"\"),\n    Document(text=\"\"\"Error Handling: HTTP 400 = Bad Request (check request format).\n    HTTP 401 = Unauthorized (check API key). HTTP 429 = Rate Limited.\n    HTTP 500 = Server Error (retry after delay). Luôn handle errors gracefully.\"\"\"),\n    Document(text=\"\"\"Streaming: Sử dụng client.messages.stream() để nhận tokens\n    từng phần. Hỗ trợ SSE (Server-Sent Events). Giảm perceived latency đáng kể.\"\"\")\n]\n\n# 2. Pricing and Plans\npricing_docs = [\n    Document(text=\"\"\"Claude Haiku: Input $0.25\/MTok, Output $1.25\/MTok.\n    Model nhanh và tiết kiệm nhất. Phù hợp cho production high-volume tasks,\n    classification, extraction, và simple Q\u0026amp;A.\"\"\"),\n    Document(text=\"\"\"Claude Sonnet: Input $3\/MTok, Output $15\/MTok.\n    Balance tốt giữa intelligence và speed. Dùng cho coding, analysis, và\n    complex tasks cần reasoning tốt hơn Haiku.\"\"\"),\n    Document(text=\"\"\"Claude Opus: Input $15\/MTok, Output $75\/MTok.\n    Model mạnh nhất, tốt nhất cho research, complex reasoning, và tasks\n    cần highest intelligence. Không phù hợp cho high-volume production.\"\"\"),\n    Document(text=\"\"\"Free tier: $5 credit khi đăng ký. Tier progression dựa trên\n    spend và time. Tier 4 yêu cầu ít nhất $40 spend và 7 ngày usage.\"\"\")\n]\n\n# 3. Use Cases and Examples\nusecase_docs = [\n    Document(text=\"\"\"Chatbot: Dùng claude-haiku-4-5 cho speed. Implement conversation\n    history trong messages array. System prompt định nghĩa persona và rules.\n    Rate limit: giới hạn turns per session để tránh abuse.\"\"\"),\n    Document(text=\"\"\"Code Generation: claude-opus-4-5 tốt nhất cho complex code.\n    Cung cấp context đầy đủ: language, framework, existing code.\n    Dùng tool use để execute và test code automatically.\"\"\"),\n    Document(text=\"\"\"Document Analysis: Gửi PDF base64 trong vision messages.\n    200K context window đủ cho tài liệu dài. Extract structured data\n    bằng JSON mode. Combine với RAG cho knowledge base lớn.\"\"\")\n]\n\n# Tạo indexes\ntech_index = VectorStoreIndex.from_documents(tech_docs)\npricing_index = VectorStoreIndex.from_documents(pricing_docs)\nusecase_index = VectorStoreIndex.from_documents(usecase_docs)\nsummary_index = SummaryIndex.from_documents(tech_docs + pricing_docs + usecase_docs)\n\nprint(\"All indexes created\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eLLM Router — Intelligent Selection\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom llama_index.core.query_engine import RouterQueryEngine\nfrom llama_index.core.selectors import LLMSingleSelector, LLMMultiSelector\nfrom llama_index.core.tools import QueryEngineTool\n\n# Tạo query engine tools với descriptions\ntech_tool = QueryEngineTool.from_defaults(\n    query_engine=tech_index.as_query_engine(similarity_top_k=3),\n    name=\"technical_documentation\",\n    description=\"Tài liệu kỹ thuật về API authentication, rate limiting, error handling, \"\n                \"và streaming. Dùng cho câu hỏi về cách implement, xử lý lỗi, giới hạn API.\"\n)\n\npricing_tool = QueryEngineTool.from_defaults(\n    query_engine=pricing_index.as_query_engine(similarity_top_k=3),\n    name=\"pricing_and_plans\",\n    description=\"Thông tin giá cả, tiers, và kế hoạch subscription của Claude API. \"\n                \"Dùng khi cần biết chi phí, so sánh models về giá, hoặc upgrade plans.\"\n)\n\nusecase_tool = QueryEngineTool.from_defaults(\n    query_engine=usecase_index.as_query_engine(similarity_top_k=3),\n    name=\"use_cases_examples\",\n    description=\"Ví dụ use cases và hướng dẫn implement cho chatbot, code generation, \"\n                \"document analysis. Dùng cho câu hỏi 'làm thế nào để xây dựng...'.\"\n)\n\nsummary_tool = QueryEngineTool.from_defaults(\n    query_engine=summary_index.as_query_engine(response_mode=\"tree_summarize\"),\n    name=\"comprehensive_summary\",\n    description=\"Tổng hợp thông tin từ tất cả tài liệu. Dùng cho câu hỏi tổng quát, \"\n                \"so sánh toàn diện, hoặc khi cần overview về Claude API.\"\n)\n\n# Tạo Router với LLM Selector (single selection)\nsingle_router = RouterQueryEngine(\n    selector=LLMSingleSelector.from_defaults(llm=Settings.llm),\n    query_engine_tools=[tech_tool, pricing_tool, usecase_tool, summary_tool],\n    verbose=True\n)\n\n# Chạy queries\nprint(\"\n=== Test Single Router ===\")\nq1 = \"Rate limit của Claude API là bao nhiêu?\"\nprint(f\"\nQ: {q1}\")\nr1 = single_router.query(q1)\nprint(f\"A: {r1.response}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eMulti-Selector Router\u003c\/h2\u003e\n\n\u003cp\u003eKhi câu hỏi liên quan đến nhiều topics, MultiSelector query nhiều indexes:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Router với multi-selection\nmulti_router = RouterQueryEngine(\n    selector=LLMMultiSelector.from_defaults(llm=Settings.llm),\n    query_engine_tools=[tech_tool, pricing_tool, usecase_tool],\n    verbose=True\n)\n\nprint(\"\n=== Test Multi Router ===\")\nq2 = \"Tôi muốn xây dựng chatbot với Claude API. Chi phí bao nhiêu và làm thế nào?\"\nprint(f\"\nQ: {q2}\")\nr2 = multi_router.query(q2)\nprint(f\"A: {r2.response}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eEmbedding-based Router (Nhanh hơn, ít chi phí)\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom llama_index.core.selectors import EmbeddingSingleSelector\n\n# Embedding selector không cần LLM call, dùng cosine similarity\nembedding_router = RouterQueryEngine(\n    selector=EmbeddingSingleSelector.from_defaults(),\n    query_engine_tools=[tech_tool, pricing_tool, usecase_tool],\n    verbose=True\n)\n\nprint(\"\n=== Test Embedding Router ===\")\nq3 = \"Claude Opus giá bao nhiêu tiền?\"\nprint(f\"\nQ: {q3}\")\nr3 = embedding_router.query(q3)\nprint(f\"A: {r3.response}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eCustom Router Logic\u003c\/h2\u003e\n\n\u003cp\u003eTùy chỉnh routing logic cho use case đặc biệt:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom llama_index.core.selectors.utils import select_query_engine_multi\n\ndef keyword_router(query, tools):\n    \"\"\"Router đơn giản dựa trên keywords.\"\"\"\n    query_lower = query.lower()\n\n    selected = []\n    if any(kw in query_lower for kw in [\"giá\", \"chi phí\", \"bao nhiêu tiền\", \"tier\"]):\n        selected.append((\"pricing_and_plans\", 1.0))\n\n    if any(kw in query_lower for kw in [\"lỗi\", \"error\", \"auth\", \"rate limit\", \"implement\"]):\n        selected.append((\"technical_documentation\", 0.9))\n\n    if any(kw in query_lower for kw in [\"xây dựng\", \"ví dụ\", \"chatbot\", \"code\"]):\n        selected.append((\"use_cases_examples\", 0.8))\n\n    if not selected:\n        selected.append((\"comprehensive_summary\", 0.7))\n\n    # Sắp xếp theo confidence\n    selected.sort(key=lambda x: x[1], reverse=True)\n    return selected[0][0]  # Trả về tool name tốt nhất\n\n# Test keyword router\ntest_queries = [\n    \"Rate limit bao nhiêu?\",\n    \"Claude Sonnet giá bao nhiêu?\",\n    \"Cách xây chatbot với Claude?\",\n    \"Overview về Claude API?\"\n]\n\nfor q in test_queries:\n    selected = keyword_router(q, [tech_tool, pricing_tool, usecase_tool])\n    print(f\"Query: '{q}' -\u0026gt; Route to: {selected}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eMonitoring và Analytics\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eroute_counts = {}\n\nclass MonitoredRouter:\n    \"\"\"Router với analytics tracking.\"\"\"\n\n    def __init__(self, router):\n        self.router = router\n        self.route_counts = {}\n        self.query_times = []\n\n    def query(self, question):\n        import time\n        start = time.time()\n\n        response = self.router.query(question)\n        elapsed = time.time() - start\n        self.query_times.append(elapsed)\n\n        return response\n\n    def stats(self):\n        if self.query_times:\n            avg_time = sum(self.query_times) \/ len(self.query_times)\n            return {\n                \"total_queries\": len(self.query_times),\n                \"avg_latency_ms\": avg_time * 1000\n            }\n        return {}\n\nmonitored = MonitoredRouter(single_router)\nmonitored.query(\"Claude Haiku giá bao nhiêu?\")\nprint(f\"\nStats: {monitored.stats()}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eKết luận\u003c\/h2\u003e\n\n\u003cp\u003eRouter Query Engine giải quyết vấn đề \"query routing\" — đảm bảo mỗi câu hỏi được xử lý bởi index phù hợp nhất. LLM-based router hiểu ngữ cảnh tốt hơn, embedding-based router nhanh hơn và rẻ hơn. Trong production, kết hợp cả hai: dùng embedding router cho cases rõ ràng, LLM router cho cases phức tạp.\u003c\/p\u003e\n\n\u003cp\u003eBước tiếp theo: Khám phá \u003ca href=\"\/collections\/nang-cao\"\u003eSubQuestion Engine\u003c\/a\u003e để phân tách câu hỏi phức tạp thành sub-queries song song, hoặc đọc về \u003ca href=\"\/collections\/nang-cao\"\u003eMulti-Document Agent\u003c\/a\u003e cho orchestration phức tạp hơn.\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=\"\/products\/llamaindex-claude-rag-pipeline-c%C6%A1-b%E1%BA%A3n\"\u003eLlamaIndex + Claude — RAG pipeline cơ bản\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/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=\"\/products\/subquestion-engine-phan-tach-cau-h%E1%BB%8Fi-ph%E1%BB%A9c-t%E1%BA%A1p-t%E1%BB%B1-d%E1%BB%99ng\"\u003eSubQuestion Engine — Phân tách câu hỏi phức tạp tự động\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/extended-thinking-ultrathink-khai-thac-suy-lu%E1%BA%ADn-sau-c%E1%BB%A7a-claude\"\u003eExtended Thinking \u0026amp; Ultrathink — Khai thác suy luận sâu của Claude\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/claude-cho-d%E1%BB%AF-li%E1%BB%87u-va-phan-tich-t%E1%BB%95ng-quan-plugin\"\u003eClaude cho Dữ liệu và Phân tích: Tổng quan Plugin\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47721908666580,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/router-query-engine-t_-d_ng-ch_n-index-phu-h_p_51b46fab-f6a0-4faa-8517-1922fbaf33f7.jpg?v=1774521823","url":"https:\/\/claude.vn\/products\/router-query-engine-t%e1%bb%b1-d%e1%bb%99ng-ch%e1%bb%8dn-index-phu-h%e1%bb%a3p","provider":"CLAUDE.VN","version":"1.0","type":"link"}