尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
AutoRAG 查询分解(Query Decompose)节点详解:用 LLM 将多跳问题拆解为可检索的单跳子问题
AutoRAG 查询分解Query Decompose节点详解用 LLM 将多跳问题拆解为可检索的单跳子问题【免费下载链接】AutoRAGAutoRAG: Now your agent can find anything in your computer. It gets smarter if you are using it frequently.项目地址: https://gitcode.com/GitHub_Trending/au/AutoRAGQuery Decompose 是 AutoRAG 的query_expansion查询扩展节点中一个极具实用价值的模块它利用 LLM 将“多跳问题”multi-hop question分解为多个相互独立的“单跳问题”single-hop question让后续的检索模块可以分别针对每个子问题进行精准召回从而显著提升多跳问答场景下的检索质量。阅读本文后你将掌握query_decompose的完整配置方法、默认提示词Prompt的内部逻辑、源码层面的解析与兜底机制以及它在 AutoRAG 完整 RAG 流水线中的评估与选优流程。一、为什么需要查询分解多跳问题的检索困境在复杂问答场景中用户的提问往往不是一句可以直接检索的事实性问题而是需要多步推理的“多跳问题”例如“Is Hamlet more common on IMDB than Comedy of Errors?”这个问题无法直接通过一次检索得到答案——它需要先分别查明两部作品在 IMDB 上的收录数量再进行比较。如果直接把整句问题交给 BM25 或向量检索召回的内容往往同时混杂两部作品的信息相关性被稀释检索精度下降。query_decompose模块正是为解决这一问题而生它调用 LLM把这类多跳问题拆解为若干自包含self-contained的单跳子问题再让检索管线分别针对每个子问题进行召回最后汇总证据供生成模块作答。默认的分解提示词来自 Visconde 论文中的 StrategyQA few-shot 提示词因此该模块在策略型、推理型问答数据集上表现尤为突出。从源码结构看query_decompose继承自查询扩展节点的抽象基类BaseQueryExpansion见 base.py与pass_query_expansion、hyde、multi_query_expansion并列为 AutoRAG 提供的四种查询扩展模块见init.py。二、核心实现原理从提示词到子问题的完整链路QueryDecompose的核心实现位于 query_decompose.py其执行链路可以分为四个环节。2.1 组装完整提示词_pure方法在_pure方法中模块对每一个待分解的 query 构造完整提示词full_prompts [] for query in queries: if bool(prompt): full_prompt fprompt: {prompt}\n\n question: {query} else: full_prompt decompose_prompt.format(questionquery) full_prompts.append(full_prompt)这里有一个值得注意的细节当用户传入了自定义prompt时模块采用fprompt: {prompt}\n\n question: {query}的拼接方式即自定义提示词中需要自行包含{question}占位符的实际替换位置只有当使用默认提示词时才会通过decompose_prompt.format(questionquery)自动完成{question}的替换。因此在自定义提示词时务必在模板中显式写出{question}占位符原文档也特别强调“each question will be allocated in{question}, so you have to write it in the prompt”。2.2 调用 LLM 生成分解结果组装好的提示词被放入 DataFrame 的prompts列然后统一交给生成器模块执行input_df pd.DataFrame({prompts: full_prompts}) result_df self.generator.pure(previous_resultinput_df, *args, **kwargs) answers result_df[generated_texts].tolist()也就是说query_decompose本身并不直接持有 LLM而是通过基类BaseQueryExpansion.__init__中的make_generator_callable_param(kwargs)从配置参数中解析出生成器模块generator module再调用其pure方法批量生成文本见 base.py。这就是为什么配置中必须给出generator_module_type和llm两个关键参数——它们决定了实际执行分解任务的 LLM 能力。2.3 解析分解结果get_query_decompose函数LLM 返回的原始文本并不能直接当作子问题列表使用get_query_decompose负责把文本解析为结构化的子问题列表其解析规则如下若回答忽略大小写后等于the question needs no decomposition说明该问题无需分解直接返回原始 query 本身[query]否则按行拆分去掉空行如果首行是Decompositions:则丢弃该标题行对剩余每行以第一个冒号:为分隔符取冒号右侧内容作为子问题若解析不出任何子问题或解析过程抛出异常则回退为返回原始 query[query]。这个设计保证了模块的健壮性无论 LLM 输出格式如何变化最终输出永远是一个合法的子问题列表且“不可分解”的问题会原样保留不会因为分解失败而导致下游检索节点收到空列表。2.4 空值兜底check_expanded_query最后基类中的_check_expanded_query会对每个子问题做一次空串清理如果某个子问题在 strip 后为空字符串就用原始 query 替换它见 base.py 的check_expanded_query。至此pure方法返回的是List[List[str]]——即“每条原始 query 对应一个子问题列表”。三、模块参数详解3.1 LLM 相关参数query_decompose节点本质上是“以生成器为内核对查询做变换”因此它需要的参数与 AutoRAG 的 generator 节点一致参数类型说明generator_module_typestr使用的生成器模块类型如llama_index_llm、openai_llm、vllm等llmstrLLM 提供方类型如openai具体支持范围取决于所选的 generator 模块modelstr / list模型名称如gpt-4o-mini支持以列表形式给出多个候选值做超参搜索temperaturefloat / list采样温度控制分解结果的随机性max_tokenint生成的最大 token 数其他 LLM 参数-以关键字参数kwargs形式透传给 LLM 对象用于进一步定制生成行为其中model、temperature、max_token等“其他 LLM 相关参数”会被作为 kwargs 透传给 LLM 对象。需要特别说明的是generator_module_type与prompt会在pure方法中被显式弹出kwargs.pop(prompt, decompose_prompt)与kwargs.pop(generator_module_type, None)不会泄漏给底层 LLM 调用。3.2 自定义提示词prompt默认值不配置prompt时使用来自 Visconde 论文的 StrategyQA few-shot 提示词即decompose_prompt。自定义规则传入prompt后LLM 将完全按照你的模板进行分解模板中必须显式包含{question}占位符以接收原始问题。不变式约束无论使用默认还是自定义提示词当问题不需要分解时LLM 都必须返回固定字符串The question needs no decomposition解析逻辑正是依据这一字符串来判断是否保留原 query。3.3 标准配置示例原文档示例modules: - module_type: query_decompose generator_module_type: llama_index_llm llm: openai model: [ gpt-3.5-turbo-16k, gpt-3.5-turbo-1106 ]四、在完整流水线中配置 query_decompose仅有modules片段是不够的——在实际项目中query_decompose需要挂在pre_retrieve_node_line的query_expansion节点下并配合strategy完成评估选优。参考仓库自带的 full.yaml 与 english/non_gpu/full.yaml一个可直接运行的配置如下node_lines: - node_line_name: pre_retrieve_node_line # Arbitrary node line name nodes: - node_type: query_expansion strategy: metrics: [retrieval_f1, retrieval_recall, retrieval_precision] speed_threshold: 10 top_k: 10 retrieval_modules: - module_type: bm25 bm25_tokenizer: [ porter_stemmer, space, gpt2 ] - module_type: vectordb vectordb: default modules: - module_type: pass_query_expansion - module_type: query_decompose generator_module_type: llama_index_llm llm: openai model: [ gpt-4o-mini ] - module_type: hyde generator_module_type: llama_index_llm llm: openai model: [ gpt-4o-mini ] max_token: 64 - module_type: multi_query_expansion generator_module_type: llama_index_llm llm: openai temperature: [ 0.2, 1.0 ]其中strategy的语义如下metrics用于评估查询扩展效果的检索指标常用retrieval_f1、retrieval_recall、retrieval_precisionspeed_threshold速度阈值秒超出阈值的模块候选将被过滤top_k评估时检索返回的候选数默认值为 10retrieval_modules评估时用于“以扩展后的查询跑一次检索”的检索模块组合不配置时默认使用bm25。在 AutoRAG 的优化循环Optuna trial中model: [ gpt-4o-mini ]这种列表写法意味着框架会对列表中的每个候选值各生成一个 trial 并逐一评估同理temperature、max_token也可用列表形式参与超参搜索。五、默认提示词全文与解析对应关系decompose_prompt的完整内容定义在 query_decompose.py 顶部其正文如下Decompose a question in self-contained sub-questions. Use The question needs no decomposition when no decomposition is needed. Example 1: Question: Is Hamlet more common on IMDB than Comedy of Errors? Decompositions: 1: How many listings of Hamlet are there on IMDB? 2: How many listing of Comedy of Errors is there on IMDB? Example 2: Question: Are birds important to badminton? Decompositions: The question needs no decomposition Example 3: Question: Is it legal for a licensed child driving Mercedes-Benz to be employed in US? Decompositions: 1: What is the minimum driving age in the US? 2: What is the minimum age for someone to be employed in the US? Example 4: Question: Are all cucumbers the same texture? Decompositions: The question needs no decomposition Example 5: Question: Hydrogens atomic number squared exceeds number of Spice Girls? Decompositions: 1: What is the atomic number of hydrogen? 2: How many Spice Girls are there? Example 6: Question: {question} Decompositions:将该提示词与 2.3 节的解析逻辑对照可以理解整个 few-shot 设计示例 1、3、5展示了“需要分解”的情况输出格式为序号: 子问题对应解析逻辑中“以冒号分割取右侧内容”的分支示例 2、4展示了“不需要分解”的情况输出固定短语The question needs no decomposition对应“回答等于该短语时保留原 query”的分支示例 6末尾的{question}是待分解问题占位符由decompose_prompt.format(questionquery)填充。通过这样的 few-shot 示范LLM 可以稳定地输出规整格式而解析器则从规整格式中可靠地提取子问题列表。正因如此自定义提示词时建议保持“序号 冒号 子问题”的输出约定与The question needs no decomposition的免分解约定否则解析结果可能回退为原始 query。六、输出数据结构与下游衔接QueryDecompose的公开入口是pure方法被result_to_dataframe([queries])装饰返回的 DataFrame 包含queries列该列的每一行是一个子问题列表List[str]。在 run.py 的run_query_expansion_node中查询扩展节点的输出会按以下流程被消费每个模块的run_evaluator被measure_speed包裹执行记录执行时间并保存结果到node_line_dir/query_expansion/{i}.parquet同时生成summary.csv当节点下配置了多个查询扩展模块时会以queries扩展后的子问题列表为输入依次运行strategy中配置的retrieval_modules如bm25、vectordb做一轮检索用retrieval_f1、retrieval_recall等检索指标对“分解后检索”的效果进行打分再通过select_best选出最优模块默认策略为mean也可配置max等并将最优结果写入best_{filename}.parquet若节点下只有一个模块则直接将其结果与previous_result拼接作为该节点输出跳过评估。也就是说query_decompose究竟比pass_query_expansion原样透传或其他扩展模块好多少不是拍脑袋决定的而是由 AutoRAG 在优化流程中通过真实检索指标自动比较、自动选优的——这也是把它放进modules列表与pass_query_expansion并列的意义所在。七、测试用例验证仓库为query_decompose提供了专门的单元测试 test_query_decompose.py可佐证其行为约定test_query_decompose使用两个多跳样本问题如 “Which group has more members, Newjeans or Aespa?”断言分解结果的第一个 query 会被拆成多于一个子问题len(result[0]) 1且结果条数与输入一致test_query_decompose_node通过QueryDecompose.run_evaluator走完整入口配置generator_module_typellama_index_llm、llmmock并校验输出 DataFrame 符合查询扩展节点的统一输出约定复用base_query_expansion_node_test。从测试中还可以看出query_decompose与生成器模块解耦——测试用llmmock即可运行说明只要任何实现了生成器接口的 LLM 后端可用OpenAI、vLLM、本地模型等该模块就能正常工作这为本地化、低成本验证提供了便利。八、使用建议与注意事项适用场景面向多跳、策略推理类问题如 StrategyQA 风格数据时收益明显对于本身是事实性单跳问题占多数的语料可保留pass_query_expansion作为对照让 AutoRAG 通过评估自行决定是否启用分解。成本控制分解需要额外的 LLM 调用会引入推理延迟与 token 开销可通过speed_threshold设定可接受的耗时上限超出者自动淘汰。自定义提示词务必保留{question}占位符与The question needs no decomposition免分解约定避免破坏下游解析逻辑。模型选择分解质量取决于 LLM 的指令遵循能力建议在可用预算内优先选择指令微调充分的模型仓库示例中既有gpt-3.5-turbo-16k系列也有较新的gpt-4o-mini配置。综上query_decompose是 AutoRAG 查询扩展节点中“面向复杂问题”的关键武器它把多跳问题拆解为可检索的子问题以完备的解析兜底保证流水线稳定并通过 AutoRAG 的自动评估机制与其他扩展策略公平竞技最终为整个 RAG 系统选出最优的查询预处理方案。【免费下载链接】AutoRAGAutoRAG: Now your agent can find anything in your computer. It gets smarter if you are using it frequently.项目地址: https://gitcode.com/GitHub_Trending/au/AutoRAG创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

FineReport报表开发高频问题排查与性能优化实战合辑

FineReport报表开发高频问题排查与性能优化实战合辑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/18 10:29:58
Ant Design Notification 带图标的通知提醒框:从四种语义类型到源码级图标渲染原理

Ant Design Notification 带图标的通知提醒框:从四种语义类型到源码级图标渲染原理

Ant Design Notification 带图标的通知提醒框:从四种语义类型到源码级图标渲染原理 【免费下载链接】ant-design An enterprise-class UI design language and React UI library 项目地址: https://gitcode.com/gh_mirrors/antde/ant-design 通知提醒框&…

📅 2026/9/18 10:29:58
pto-isa A5 向量算子性能指标与 Trace 解析规范:VF 总时间定义、记录字段与 Speedup 计算

pto-isa A5 向量算子性能指标与 Trace 解析规范:VF 总时间定义、记录字段与 Speedup 计算

pto-isa A5 向量算子性能指标与 Trace 解析规范:VF 总时间定义、记录字段与 Speedup 计算 【免费下载链接】pto-isa Parallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This …

📅 2026/9/18 10:29:58
MORE NEWS

更多资讯

📰

高校成绩管理数据库系统设计实战指南

1. 这不是作业,是真实业务场景的微型实战沙盒“高校成绩管理数据库系统”——这八个字背后,藏着高校教务系统最核心的业务命脉。我带过三届数据库课程设计,每年都会收到上百份学生提交的“学生成绩管理系统”,但真正能跑通、能查、…

📰

nmap端口扫描详解:从基础命令到实战排查技巧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

CANN PyPTO 贡献指南:从 fork 到合入的 PR 提交前检查清单实战

CANN PyPTO 贡献指南:从 fork 到合入的 PR 提交前检查清单实战 【免费下载链接】pypto PyPTO(发音: pai p-t-o):Parallel Tensor/Tile Operation编程范式。 项目地址: https://gitcode.com/cann/pypto 在 CANN / PyPTO&…

📰

Agent Governance Toolkit:OWASP ASI Top 10 与行业 Starter 策略包的规则级映射

Agent Governance Toolkit:OWASP ASI Top 10 与行业 Starter 策略包的规则级映射 【免费下载链接】agent-governance-toolkit AI Agent Governance Toolkit — Policy enforcement, zero-trust identity, execution sandboxing, and reliability engineering for au…

📰

深度学习权重与偏置全解析:从初始化到实战调参

1. 权重和偏置到底是什么1.1 从一个最简单的神经元说起很多刚接触深度学习的同学,上来就被各种网络结构、激活函数、损失函数搞得晕头转向,却忽略了整个深度学习大厦最基础的砖块——神经元。其实你只要搞清楚一个神经元里发生了什么,权重和偏…

📰

AIGC检测与学术写作辅助工具技术解析

1. 项目背景与核心痛点2026年高校毕业季来临之际,国内多所重点院校学术委员会联合发布《学位论文AIGC检测标准白皮书》,首次将"人工智能生成内容识别率"纳入论文查重指标体系。这份白皮书犹如投入平静湖面的巨石,瞬间在学术圈引发轩…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬