数据截至 (上游 commit d89e37cdfbbe)
ChainOfRAG:逐跳追事实
DeepSearcher 的第二种迭代策略,灵感来自论文 Chain-of-Retrieval Augmented Generation(chain_of_rag.py:84 注明 https://arxiv.org/pdf/2501.14342)。它的 __description__:"decompose complex queries and gradually find the fact information of sub-queries ... suitable for ... concrete factual queries and multi-hop questions"(chain_of_rag.py:73-76)。
4.1 它和 DeepSearch 的根本差别
两者都「迭代」,但迭代的形状不同:
| DeepSearch | ChainOfRAG | |
|---|---|---|
| 每轮问几个问题 | 多个(子问题并行) | 一个 follow-up |
| 每轮要不要先答 | 不答,只攒片段 | 即答(intermediate answer) |
| 下一轮靠什么 | 反思「还缺什么」 | 上一跳的问答喂给下一跳 |
| 适合 | 宽问题、写报告 | 多跳事实(A→B→C 链式推理) |
| 形状 | 广度(发散再收) | 深度(一条链往下追) |
直觉:DeepSearch 像「列提纲、各角度铺开查」;ChainOfRAG 像「顺藤摸瓜——查到 A 才知道下一步该问 B」。多跳问题(「X 的作者出生在哪个国家?」需要先查作者、再查国籍)是 ChainOfRAG 的主场。
4.2 一轮迭代里发生什么
主问题 + 历史问答
│
▼
① 生成一个简单 follow-up 问题(FOLLOWUP_QUERY_PROMPT)
│
▼
② 检索 + 立刻生成「中间答案」(INTERMEDIATE_ANSWER_PROMPT)
│ └─ 强约束:只用文档、不许编;没有就说 "No relevant information found"
▼
③ 让 LLM 挑出「真正支撑这个答案」的文档(GET_SUPPORTED_DOCS_PROMPT)
│
▼
④ 把「中间问+中间答」记进 history,供下一跳参考
│
▼
(可选)⑤ early_stopping:问 LLM「信息够了吗?」够就停(REFLECTION_PROMPT)
源码主循环在 retrieve(chain_of_rag.py:244-275)。