Skip to content

GPT Researcher:多来源怎样变成报告上下文

GPT Researcher Hybrid 研究上下文的来源汇合图

查看原尺寸 SVG(可缩放)

可编辑图源 · PNG 预览 · 图的文字版 · 九步代码导读

固定官方仓库 assafelovic/gpt-researcher@6f998577d547b1e54ec662dac63583aa11e3b84b。范围是非 DeepResearch、未指定 source_urls、未传入 write_report(ext_context=...)ReportSource.Hybrid:文档路径和网页路径汇合后生成普通研究报告;文档路径不保证实际加载到本地文档。本文只做源码静态核对;没有运行检索器、模型或检查真实报告引用。

核心问题

“会联网研究”并不说明报告依据怎样形成。这里要分清三层:原始来源(可能有本地文件,也可能仅有网页)、按子问题筛选的研究上下文、最终 LLM 写出的报告。GPT Researcher 的 Hybrid 分支把文档路径和网页搜索路径并发执行,结果拼接进 researcher.context;写作器收到的是这个整理后的上下文,不是原始网页集合的独立证据验证结果

关键代码路径

  1. GPTResearcher.conduct_research() 把普通研究交给 ResearchConductor.conduct_research(),返回的内容保存到 self.contextDeepResearch 则走另一条分支。主入口
  2. Hybrid 分支先用 OnlineDocumentLoaderDocumentLoader 读取本地/指定文档,再以 asyncio.gather 并发执行“给定文档的上下文提取”和“空文档输入的网页检索”,最后用 prompt_family.join_local_web_documents 拼接。第一路只有文档非空时才是本地文档上下文;若加载结果为空,_process_sub_query() 可能转向网页抓取,因此两路都可能取得网页内容。来源分支 · 空文档回退 · 拼接格式
  3. _get_context_by_web_search() 规划子查询并行执行;_process_sub_query() 对网页路径调用检索器、获取 URL、抓取或复用预取正文,然后让 ContextManager 生成与子查询相关的压缩上下文。MCP retriever 可按策略参与,但不是 Hybrid 的必然组成。子查询规划与并行 · 单个子查询处理 · 抓取和预取正文汇合
  4. ContextManager 使用 ContextCompressor;小文档集可直接格式化,较大的文档集会走拆分和 embedding 相关性过滤。格式化内容带标题与来源字段,形成报告提示可用的上下文。上下文管理器 · 压缩快慢路径 · 来源格式
  5. GPTResearcher.write_report() 将内部 self.context 或外部传入的 ext_context 交给 ReportGenerator;后者遇到真正的空字符串会拒绝生成“有来源”的报告,否则把上下文交给 generate_report 调用 LLM。提示文本要求引用,但提示要求不是引用正确性校验写作入口 · 空上下文保护 · LLM 报告生成 · 引用要求

一个需要单独核验的边界

在本文限定的非 Granite PromptFamily 路径,join_local_web_documents 无条件写出 Context from local documents:Context from web sources: 两段标签。即使两路没有有效正文,拼接结果在字符串意义上仍可能非空;而写作器当前只用 _ctx.strip() 判断“是否有材料”。因此,从静态路径看,这道保护不能独立证明该 Hybrid 报告确有来源材料。Granite 提示词家族覆写了拼接格式,不能照搬这项字符串推断。这只是代码可推导的风险,尚未实际触发或证明会生成虚假引用。拼接实现 · Granite 覆写 · 写作器判断

不要混淆

  • visited_urls 是 URL 去重状态,不是事实核验或可信度分数。URL 去重
  • curate_sources 是配置控制的可选步骤,不应在图中画成所有请求必经。可选筛选
  • Hybrid、多源、MCP、DeepResearch 是不同维度;这张图只覆盖 Hybrid 普通研究中的本地与网页并发汇合。

下一步应在隔离环境用两份标有互相冲突事实的文档及可控网页源,记录抓取内容、压缩后的来源字段、researcher.context 和最终引用;再单测“双源均空”的保护边界。静态图不能代替这样的证据质量验证。

图的文字说明 · gpt-researcher-evidence

这张图对应 assafelovic/gpt-researcher@6f998577 的非 DeepResearch、未指定 source_urls 或外部写作上下文的 ReportSource.Hybrid 路径。返回章节 · 手机查看原尺寸 SVG · PNG

  1. 图内的“在线加载器”指 OnlineDocumentLoaderDocumentLoaderOnlineDocumentLoader 先完成文档加载;可选的 vector store 加载也发生在 asyncio.gather 前。这一阶段不属于并发框。
  2. 随后 asyncio.gather 并发执行两次 _get_context_by_web_search。已加载文档非空时,第一路使用这些文档形成 local context;若文档列表为空,_process_sub_query() 会回退到网页检索和抓取,故这一路也可能取得网页材料。第二路以空文档输入规划子查询、检索 URL、抓取正文并形成 web context。两路 context 是并发分支,local context 是分支名称,不保证材料一定来自本地。单个子查询处理
  3. join_local_web_documents 给两路上下文加标签并拼接;研究器保存为 researcher.context,之后可按配置做来源筛选。
  4. ReportGenerator 对字符串意义上的空上下文有拒绝生成分支;有上下文时将其送入 LLM 报告提示。提示要求引用来源,但图不表示已核验每条主张。
  5. 风险标注:即使双路正文为空,Hybrid 固定标签仍可能让拼接字符串非空,所以空串检查不能单独作为证据存在的证明。

图是静态源码说明,不是一次真实检索轨迹。MCP retriever、图片预生成、DeepResearch、其他来源类型和引用验收均不在本图范围。

编辑 build.py 后运行 python3 figures/gpt-researcher-evidence/build.py,再用 excalidraw-agent renderer 从原生 scene.excalidraw 导出 SVG 和 PNG。


在线预览稿:书稿仍在校稿,系统篇以文内固定源码版本为准;静态阅读不等于运行验收。