{"product_id":"subquestion-engine-phan-tach-cau-hỏi-phức-tạp-tự-dộng","title":"SubQuestion Engine — Phân tách câu hỏi phức tạp tự động","description":"\n\u003cp\u003eCâu hỏi phức tạp như \"So sánh doanh thu, chi phí và lợi nhuận của công ty A và B trong Q1 và Q2 2024\" thực ra là nhiều câu hỏi nhỏ hơn. \u003cstrong\u003eSubQuestion Query Engine\u003c\/strong\u003e của LlamaIndex tự động phân tách câu hỏi phức tạp thành sub-questions, query mỗi câu song song, rồi tổng hợp thành câu trả lời hoàn chỉnh.\u003c\/p\u003e\n\n\u003cp\u003eKết hợp với Claude, đây là kỹ thuật mạnh mẽ để xử lý câu hỏi phân tích phức tạp trên nhiều tài liệu.\u003c\/p\u003e\n\n\u003ch2\u003eSubQuestion Engine hoạt động như thế nào?\u003c\/h2\u003e\n\n\u003col\u003e\n  \u003cli\u003e\n\u003cstrong\u003eDecomposition\u003c\/strong\u003e — Claude phân tích câu hỏi gốc, chia thành N sub-questions\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eRouting\u003c\/strong\u003e — Mỗi sub-question được assign đến query engine phù hợp\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eParallel Query\u003c\/strong\u003e — Tất cả sub-questions được query đồng thời\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eSynthesis\u003c\/strong\u003e — Claude tổng hợp tất cả sub-answers thành câu trả lời cuối\u003c\/li\u003e\n\u003c\/ol\u003e\n\n\u003cp\u003eVí dụ: \"So sánh doanh thu Q1 và Q2?\" sẽ được chia thành: (1) \"Doanh thu Q1 là bao nhiêu?\" và (2) \"Doanh thu Q2 là bao nhiêu?\" — query song song rồi tổng hợp.\u003c\/p\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 nest_asyncio\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport os\nimport asyncio\nimport nest_asyncio\nnest_asyncio.apply()  # Cho phép nested event loops\n\nfrom llama_index.core import Settings, VectorStoreIndex, Document\nfrom llama_index.llms.anthropic import Anthropic\nfrom llama_index.embeddings.voyageai import VoyageEmbedding\nfrom llama_index.core.query_engine import SubQuestionQueryEngine\nfrom llama_index.core.tools import QueryEngineTool\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(\"SubQuestion Engine ready\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTạo Indexes cho nhiều tài liệu\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Báo cáo Q1 2024\nq1_docs = [\n    Document(text=\"\"\"BÁO CÁO Q1 2024\n    Công ty A:\n    - Doanh thu: 5.2 tỷ đồng (tăng 23% so với Q1 2023)\n    - Chi phí vận hành: 3.1 tỷ đồng\n    - Lợi nhuận ròng: 1.8 tỷ đồng (biên lợi nhuận 34.6%)\n    - Nhân viên: 87 người\n    - Khách hàng mới: 234\n\n    Công ty B:\n    - Doanh thu: 4.8 tỷ đồng (tăng 18% so với Q1 2023)\n    - Chi phí vận hành: 3.4 tỷ đồng\n    - Lợi nhuận ròng: 1.1 tỷ đồng (biên lợi nhuận 22.9%)\n    - Nhân viên: 95 người\n    - Khách hàng mới: 198\"\"\"),\n    Document(text=\"\"\"PHÂN TÍCH THỊ TRƯỜNG Q1 2024\n    Thị phần: Công ty A 28%, Công ty B 26%, Others 46%.\n    Tăng trưởng ngành: 15% YoY.\n    Top sản phẩm A: Enterprise Plan (45% doanh thu).\n    Top sản phẩm B: Pro Bundle (38% doanh thu).\"\"\")\n]\n\n# Báo cáo Q2 2024\nq2_docs = [\n    Document(text=\"\"\"BÁO CÁO Q2 2024\n    Công ty A:\n    - Doanh thu: 6.1 tỷ đồng (tăng 17.3% so với Q1 2024)\n    - Chi phí vận hành: 3.5 tỷ đồng\n    - Lợi nhuận ròng: 2.2 tỷ đồng (biên lợi nhuận 36.1%)\n    - Nhân viên: 102 người (tuyển thêm 15)\n    - Khách hàng mới: 312\n\n    Công ty B:\n    - Doanh thu: 5.3 tỷ đồng (tăng 10.4% so với Q1 2024)\n    - Chi phí vận hành: 3.7 tỷ đồng\n    - Lợi nhuận ròng: 1.3 tỷ đồng (biên lợi nhuận 24.5%)\n    - Nhân viên: 108 người\n    - Khách hàng mới: 221\"\"\"),\n    Document(text=\"\"\"PHÂN TÍCH THỊ TRƯỜNG Q2 2024\n    Thị phần: Công ty A 31% (+3%), Công ty B 25% (-1%), Others 44%.\n    Tăng trưởng ngành: 18% YoY (tăng tốc so với Q1).\n    A mở rộng sang thị trường miền Trung.\n    B ra mắt sản phẩm mới: Team Edition.\"\"\")\n]\n\n# Dữ liệu ngành\nindustry_docs = [\n    Document(text=\"\"\"TỔNG QUAN NGÀNH 2024\n    Thị trường SaaS Việt Nam dự kiến đạt 1.2 tỷ USD năm 2024.\n    Tăng trưởng CAGR 5 năm: 22%.\n    Churn rate trung bình ngành: 6-8%.\n    CAC benchmark: 15-25 triệu đồng.\n    LTV:CAC ratio tốt: trên 3:1.\n    Top concerns: Security (67%), Integration (54%), Cost (48%).\"\"\")\n]\n\n# Tạo indexes\nq1_index = VectorStoreIndex.from_documents(q1_docs)\nq2_index = VectorStoreIndex.from_documents(q2_docs)\nindustry_index = VectorStoreIndex.from_documents(industry_docs)\n\nprint(\"All indexes created\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTạo SubQuestion Engine\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom llama_index.core.question_gen import LLMQuestionGenerator\nfrom llama_index.core.question_gen.prompts import build_tools_text\n\n# Tạo query engine tools\nq1_tool = QueryEngineTool.from_defaults(\n    query_engine=q1_index.as_query_engine(similarity_top_k=3),\n    name=\"q1_report\",\n    description=\"Báo cáo kinh doanh Q1 2024 của Công ty A và Công ty B. \"\n                \"Chứa: doanh thu, chi phí, lợi nhuận, nhân viên, khách hàng Q1.\"\n)\n\nq2_tool = QueryEngineTool.from_defaults(\n    query_engine=q2_index.as_query_engine(similarity_top_k=3),\n    name=\"q2_report\",\n    description=\"Báo cáo kinh doanh Q2 2024 của Công ty A và Công ty B. \"\n                \"Chứa: doanh thu, chi phí, lợi nhuận, nhân viên, khách hàng Q2.\"\n)\n\nindustry_tool = QueryEngineTool.from_defaults(\n    query_engine=industry_index.as_query_engine(similarity_top_k=3),\n    name=\"industry_data\",\n    description=\"Dữ liệu và benchmark ngành SaaS Việt Nam 2024. \"\n                \"Chứa: thị phần, tăng trưởng ngành, benchmarks về CAC, LTV, churn.\"\n)\n\n# Tạo SubQuestion Engine\nsubquestion_engine = SubQuestionQueryEngine.from_defaults(\n    query_engine_tools=[q1_tool, q2_tool, industry_tool],\n    llm=Settings.llm,\n    use_async=True,    # Query sub-questions song song\n    verbose=True       # In ra sub-questions và kết quả\n)\n\nprint(\"SubQuestion Engine created!\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eChạy Complex Queries\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Query phức tạp: cần nhiều sub-questions\ncomplex_queries = [\n    \"So sánh doanh thu và lợi nhuận của Công ty A giữa Q1 và Q2 2024. Tăng trưởng như thế nào?\",\n    \"Công ty nào hoạt động hiệu quả hơn trong H1 2024? Dựa trên doanh thu, biên lợi nhuận và tăng trưởng.\",\n    \"So với benchmark ngành, CAC và churn rate của Công ty A và B như thế nào?\"\n]\n\nfor query in complex_queries:\n    print(f\"\n{'='*60}\")\n    print(f\"QUERY: {query}\")\n    print(\"=\"*60)\n\n    response = subquestion_engine.query(query)\n    print(f\"\nFINAL ANSWER:\n{response.response}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eVí dụ output SubQuestion decomposition\u003c\/h2\u003e\n\n\u003cp\u003eKhi hỏi \"So sánh doanh thu và lợi nhuận Q1 và Q2?\", engine sẽ tự động tạo:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003e[SubQuestion 1]: Doanh thu Công ty A trong Q1 2024?\n  -\u0026gt; Engine: q1_report\n  -\u0026gt; Answer: 5.2 tỷ đồng\n\n[SubQuestion 2]: Doanh thu Công ty A trong Q2 2024?\n  -\u0026gt; Engine: q2_report\n  -\u0026gt; Answer: 6.1 tỷ đồng\n\n[SubQuestion 3]: Lợi nhuận Công ty A Q1 2024?\n  -\u0026gt; Engine: q1_report\n  -\u0026gt; Answer: 1.8 tỷ (biên 34.6%)\n\n[SubQuestion 4]: Lợi nhuận Công ty A Q2 2024?\n  -\u0026gt; Engine: q2_report\n  -\u0026gt; Answer: 2.2 tỷ (biên 36.1%)\n\n[Synthesis]: Doanh thu tăng 17.3% từ Q1 sang Q2 (5.2 -\u0026gt; 6.1 tỷ).\nLợi nhuận tăng 22.2% (1.8 -\u0026gt; 2.2 tỷ). Biên lợi nhuận cải thiện\ntừ 34.6% lên 36.1%, cho thấy hiệu quả vận hành tốt hơn...\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eCustom Question Generator\u003c\/h2\u003e\n\n\u003cp\u003eTùy chỉnh cách Claude phân tách câu hỏi:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom llama_index.core.prompts import PromptTemplate\n\ncustom_decompose_prompt = PromptTemplate(\n    \"\"\"Bạn là AI analyst chuyên về business intelligence.\nCho câu hỏi sau: {query_str}\n\nVà các data sources sau:\n{tools_str}\n\nHãy phân tách câu hỏi thành các sub-questions cụ thể cần trả lời.\nMỗi sub-question phải:\n1. Rõ ràng, có thể trả lời độc lập\n2. Được assign đến đúng data source\n3. Kết hợp lại sẽ trả lời đầy đủ câu hỏi gốc\n\nFormat: JSON list of {{\"sub_question\": \"...\", \"tool_name\": \"...\"}}\n\"\"\"\n)\n\n# Custom question generator\ncustom_question_gen = LLMQuestionGenerator.from_defaults(\n    llm=Settings.llm,\n    prompt=custom_decompose_prompt\n)\n\ncustom_engine = SubQuestionQueryEngine.from_defaults(\n    query_engine_tools=[q1_tool, q2_tool, industry_tool],\n    question_gen=custom_question_gen,\n    use_async=True,\n    verbose=False\n)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003ePerformance: Async vs Sync\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport time\n\n# Sync (tuần tự)\nstart = time.time()\nsync_engine = SubQuestionQueryEngine.from_defaults(\n    query_engine_tools=[q1_tool, q2_tool, industry_tool],\n    use_async=False,  # Tuần tự\n    verbose=False\n)\nr1 = sync_engine.query(\"So sánh Công ty A và B trong H1 2024\")\nsync_time = time.time() - start\n\n# Async (song song)\nstart = time.time()\nasync_engine = SubQuestionQueryEngine.from_defaults(\n    query_engine_tools=[q1_tool, q2_tool, industry_tool],\n    use_async=True,   # Song song\n    verbose=False\n)\nr2 = async_engine.query(\"So sánh Công ty A và B trong H1 2024\")\nasync_time = time.time() - start\n\nprint(f\"Sync time:  {sync_time:.2f}s\")\nprint(f\"Async time: {async_time:.2f}s\")\nprint(f\"Speedup: {sync_time\/async_time:.1f}x\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eKết hợp với Router Engine\u003c\/h2\u003e\n\n\u003cp\u003eKết hợp SubQuestion Engine và Router Engine cho maximum flexibility:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom llama_index.core.query_engine import RouterQueryEngine\nfrom llama_index.core.selectors import LLMSingleSelector\n\n# SubQuestion engine xử lý complex queries\nsubq_tool = QueryEngineTool.from_defaults(\n    query_engine=subquestion_engine,\n    name=\"complex_analysis\",\n    description=\"Phân tích phức tạp cần so sánh nhiều metrics, thời kỳ, hoặc công ty. \"\n                \"Dùng cho câu hỏi 'so sánh...', 'phân tích tổng hợp...', 'trend của...'.\"\n)\n\n# Simple query engine cho câu hỏi đơn giản\nsimple_tool = QueryEngineTool.from_defaults(\n    query_engine=q1_index.as_query_engine(),\n    name=\"simple_lookup\",\n    description=\"Tra cứu nhanh thông tin cụ thể trong Q1 2024. \"\n                \"Dùng cho câu hỏi đơn giản về một số liệu hoặc fact.\"\n)\n\n# Router quyết định: simple lookup hay complex analysis\ncombined_engine = RouterQueryEngine(\n    selector=LLMSingleSelector.from_defaults(),\n    query_engine_tools=[simple_tool, subq_tool],\n    verbose=True\n)\n\ncombined_engine.query(\"Doanh thu Công ty A Q1?\")  # -\u0026gt; Simple lookup\ncombined_engine.query(\"So sánh hiệu quả A và B H1 2024\")  # -\u0026gt; SubQuestion\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eKết luận\u003c\/h2\u003e\n\n\u003cp\u003eSubQuestion Engine là kỹ thuật mạnh mẽ nhất trong LlamaIndex cho complex analytical queries. Thay vì dựa vào một prompt dài với tất cả context, engine phân chia và chinh phục — tìm đúng thông tin cho từng phần của câu hỏi rồi tổng hợp thông minh.\u003c\/p\u003e\n\n\u003cp\u003eSử dụng \u003ccode\u003euse_async=True\u003c\/code\u003e để query sub-questions song song, giảm latency đáng kể khi có nhiều sub-questions. Kết hợp với Router Engine để tự động chọn strategy phù hợp cho mỗi câu hỏi.\u003c\/p\u003e\n\n\u003cp\u003eBước tiếp theo: Xem lại \u003ca href=\"\/collections\/nang-cao\"\u003eRouter Query Engine\u003c\/a\u003e để kết hợp hai kỹ thuật này, hoặc khám phá \u003ca href=\"\/collections\/nang-cao\"\u003eMulti-Document Agent\u003c\/a\u003e cho kiến trúc agent linh hoạt 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\/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\/router-query-engine-t%E1%BB%B1-d%E1%BB%99ng-ch%E1%BB%8Dn-index-phu-h%E1%BB%A3p\"\u003eRouter Query Engine — Tự động chọn index phù hợp\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/context-compaction-t%E1%BB%B1-d%E1%BB%99ng-nen-context-cho-conversations-dai\"\u003eContext Compaction — Tự động nén context cho conversations dài\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\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\u003c\/ul\u003e","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47721908699348,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/subquestion-engine-phan-tach-cau-h_i-ph_c-t_p-t_-d_ng.jpg?v=1774521826","url":"https:\/\/claude.vn\/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","provider":"CLAUDE.VN","version":"1.0","type":"link"}