论文:https://arxiv.org/pdf/2212.10509IRCoT 的核心思想是:在每一轮中,模型基于当前检索到的文档、历史推理链和问题生成新的推理内容(CoT),并据此触发下一轮检索。 这一交替式的循环可持续推进推理深度,直至满足终止条件(如明确回答已生成)。因此,它需要对多轮中间结果进行有效记录与访问——这正是 UltraRAG 中 Memory 机制的用武之地。
Step 1:明确工作流结构
IRCoT 的推理过程包括如下步骤:- 初始检索:以原始问题为查询,获取第一批文档;
- 推理-检索交替循环(最多 N 轮):
- 使用当前检索文档 + 历史 CoT 推理句生成下一步 CoT;
- 若新生成文本中包含 “So the answer is:“,则提前终止;
- 否则提取当前 CoT 的第一句话作为下一轮检索查询;
- 最终回答生成:在结束迭代后提取答案用于评估。
- Prompt 构造:支持拼接历史 CoT + 文档,首轮由于无CoT需特殊处理;
- 判断是否提前结束:识别是否生成了最终回答语句(原论文通过判断是否包含 So the answer is:);
- 构造下一轮查询:用于构造下一轮的检索查询,每轮检索使用模型生成CoT内容的第一句话;
- 答案抽取:从生成文本中提取最终答案内容。
memory_
即可访问之前每轮迭代的中间结果。
关于这部分,请参考教程 中间变量存储机制。
Step 2:实现必要tool
Step 2.1:实现 ircot_next_prompt
首先,在prompt/IRCoT.jinja
中定义提示模板,样例如下:
servers/prompt/src/prompt.py
Step 2.2:实现 router.ircot_check_end
用于检测模型生成内容中是否包含 “So the answer is:”:servers/router/src/router.py
Step 2.3:实现 custom.ircot_get_first_sent
由于 IRCoT 在每次检索时,使用的都是当前模型生成内容的第一句话作为数据,因此需要在 Custom Server 中额外实现一个单独的提取第一句话的逻辑代码:servers/custom/src/custom.py
Step 2.4:实现 custom.ircot_extract_ans
用于从最后一轮模型生成内容中抽取具体答案:Step 3:编写 Pipeline 配置文件
完成上述 Tool 后,即可使用以下 YAML 文件构建 IRCoT 推理流程:Step 4:配置 Pipeline 参数
执行命令构建参数模板:examples/parameter/IRCoT_parameter.yaml
,配置如下内容: