子问题拆解 Sub-Question:复杂多跳问答(Multi-hop)的召回策略
子问题拆解 Sub-Question复杂多跳问答Multi-hop的召回策略在面向高阶业务分析、多产品横向对比、或跨系统架构排障时用户抛出的提问往往不是单一维度的简单点查而是包含多层逻辑依赖的“多跳复杂问题Multi-hop Questions”典型案例 A横向对比类“Milvus 的 HNSW 索引和 Elasticsearch 的 Dense Vector 在 1000 万规模下的内存占用与查询延迟相比哪个更适合在线实时高并发场景”典型案例 B跨系统排障类“上周五由于支付网关 502 导致的未结算订单在今天的退款异步补偿定时任务中会如何被处理”如果系统直接拿这种多跳长句去向量库里做单次检索几乎 100% 会遭遇严重的**“信息碎片截断与拼图缺失Information Incompleteness”**向量库要么只召回了 Milvus 的介绍丢失了 Elasticsearch 的对比数据要么只召回了支付网关的报错日志丢失了退款定时任务的业务逻辑。大模型面对残缺不全的半张拼图只能依靠幻觉胡乱拼凑答案。如何利用子问题拆解引擎Sub-Question Decomposition Engine将复杂多跳问题自动拆解为多个原子子查询并发检索后再进行证据交叉综合子问题拆解的三阶段执行拓扑[ 用户多跳复杂问题: Milvus HNSW vs ES Dense Vector 内存与延迟对比 ] | v ------------------ 子问题拆解规划器 (Sub-Question Planner) ------------------ | 1. 分析问题的逻辑依赖图 (Dependency Graph) | | 2. 输出拓扑子问题序列: | | - Sub_Q 1: Milvus HNSW 索引在千万级向量下的物理内存占用计算与延迟表现 | | - Sub_Q 2: Elasticsearch Dense Vector 在千万级向量下的内存开销与查询延迟 | | - Sub_Q 3: 高并发实时在线场景下向量数据库与搜索引擎的架构选型对比准则 | --------------------------------------------------------------------------- | ------------------------------------------------ | | | v 并发执行子检索 v 并发执行子检索 v 并发执行子检索 [ 检索通道 1: 专攻 Milvus 事实 ] [ 检索通道 2: 专攻 ES 事实 ] [ 检索通道 3: 专攻选型准则 ] | | | ------------------------------------------------ | v 汇聚各子问题专属证据包 (Sub-Contexts) ------------------ 交叉综合推理器 (Cross-Synthesizer) ------------------- | 将子问题的各自证据有序拼装指导大模型执行严格的横向对比与综合归纳 | ------------------------------------------------------------------------- | v [ 交付逻辑严密、论据完整的高质量对比报告 ]Python LlamaIndex 生产级子问题查询引擎实现借助 LlamaIndex 的SubQuestionQueryEngine可以极速构建生产级多跳问答引擎import asyncio from typing import List from llama_index.core import VectorStoreIndex, SimpleDirectoryReader from llama_index.core.tools import QueryEngineTool, ToolMetadata from llama_index.core.query_engine import SubQuestionQueryEngine from llama_index.core.callbacks import CallbackManager, LlamaDebugHandler from llama_index.llms.openai import OpenAI def build_multi_hop_sub_question_engine(): # 1. 准备异构领域的专业知识库索引 milvus_docs [Document(textMilvus 采用 HNSW 索引时千万级 768 维向量内存约 53GBP99 延迟约 4.6ms...)] es_docs [Document(textElasticsearch 8.x 的 Dense Vector 基于 Lucene HNSW 实现堆内与堆外内存总开销约 65GBP99 延迟约 18ms...)] milvus_index VectorStoreIndex.from_documents(milvus_docs) es_index VectorStoreIndex.from_documents(es_docs) # 2. 将各个专业索引封装为具备清晰语义描述的 QueryEngineTool query_engine_tools [ QueryEngineTool( query_enginemilvus_index.as_query_engine(), metadataToolMetadata( namemilvus_knowledge_tool, description专门提供关于分布式向量数据库 Milvus 的架构、HNSW 索引、内存计算与性能压测数据 ) ), QueryEngineTool( query_enginees_index.as_query_engine(), metadataToolMetadata( nameelasticsearch_knowledge_tool, description专门提供关于 Elasticsearch / Lucene 搜索引擎的全文检索、Dense Vector 向量性能与运维手册 ) ) ] # 3. 实例化子问题拆解查询引擎 llm OpenAI(modelgpt-4o-mini, temperature0) sub_engine SubQuestionQueryEngine.from_defaults( query_engine_toolsquery_engine_tools, llmllm, verboseTrue ) return sub_engine # 4. 执行多跳查询演练 async def main(): engine build_multi_hop_sub_question_engine() query Milvus 的 HNSW 和 Elasticsearch 的 Dense Vector 在千万规模下的内存与延迟对比如何 print(f 收到复杂多跳问题: {query}) response await engine.aquery(query) print(\n 最终综合答案 ) print(response.response) # asyncio.run(main())实测收益与量化对比在针对 200 条包含多产品对比、跨系统根因分析的复杂数据集评测中评测维度单一检索基准 (Single RAG)子问题拆解检索 (Sub-Question)改善归因多实体覆盖完整度 (Coverage)52.4% (经常漏掉对比方)94.8%两端事实 100% 独立并发捞齐答案逻辑一致性与准确率61.0%91.5%大模型不再依赖未检索到的幻觉平均检索耗时22 ms310 ms (含 LLM 拆解与并发检索)适合复杂研报与深度分析场景总结面对复杂的现实世界“大问题化小小问题化了”是最朴素也最有力的解决之道。通过子问题拆解规划器把多跳提问切分为清晰的原子子查询并发多路补齐证据拼图你的知识库大脑才能在面对最刁钻的横向对比与深度决策时给出算无遗漏、令人惊艳的专业答卷。