GPT Researcher:多来源怎样变成报告上下文
可编辑图源 · PNG 预览 · 图的文字版 · 九步代码导读
固定官方仓库
assafelovic/gpt-researcher@6f998577d547b1e54ec662dac63583aa11e3b84b。范围是非DeepResearch、未指定source_urls、未传入write_report(ext_context=...)的ReportSource.Hybrid:文档路径和网页路径汇合后生成普通研究报告;文档路径不保证实际加载到本地文档。本文只做源码静态核对;没有运行检索器、模型或检查真实报告引用。
核心问题
“会联网研究”并不说明报告依据怎样形成。这里要分清三层:原始来源(可能有本地文件,也可能仅有网页)、按子问题筛选的研究上下文、最终 LLM 写出的报告。GPT Researcher 的 Hybrid 分支把文档路径和网页搜索路径并发执行,结果拼接进 researcher.context;写作器收到的是这个整理后的上下文,不是原始网页集合的独立证据验证结果。
关键代码路径
GPTResearcher.conduct_research()把普通研究交给ResearchConductor.conduct_research(),返回的内容保存到self.context;DeepResearch则走另一条分支。主入口- Hybrid 分支先用
OnlineDocumentLoader或DocumentLoader读取本地/指定文档,再以asyncio.gather并发执行“给定文档的上下文提取”和“空文档输入的网页检索”,最后用prompt_family.join_local_web_documents拼接。第一路只有文档非空时才是本地文档上下文;若加载结果为空,_process_sub_query()可能转向网页抓取,因此两路都可能取得网页内容。来源分支 · 空文档回退 · 拼接格式 _get_context_by_web_search()规划子查询并行执行;_process_sub_query()对网页路径调用检索器、获取 URL、抓取或复用预取正文,然后让ContextManager生成与子查询相关的压缩上下文。MCP retriever 可按策略参与,但不是 Hybrid 的必然组成。子查询规划与并行 · 单个子查询处理 · 抓取和预取正文汇合ContextManager使用ContextCompressor;小文档集可直接格式化,较大的文档集会走拆分和 embedding 相关性过滤。格式化内容带标题与来源字段,形成报告提示可用的上下文。上下文管理器 · 压缩快慢路径 · 来源格式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
- 图内的“在线加载器”指
OnlineDocumentLoader。DocumentLoader或OnlineDocumentLoader先完成文档加载;可选的 vector store 加载也发生在asyncio.gather前。这一阶段不属于并发框。 - 随后
asyncio.gather并发执行两次_get_context_by_web_search。已加载文档非空时,第一路使用这些文档形成 local context;若文档列表为空,_process_sub_query()会回退到网页检索和抓取,故这一路也可能取得网页材料。第二路以空文档输入规划子查询、检索 URL、抓取正文并形成 web context。两路 context 是并发分支,local context是分支名称,不保证材料一定来自本地。单个子查询处理 join_local_web_documents给两路上下文加标签并拼接;研究器保存为researcher.context,之后可按配置做来源筛选。ReportGenerator对字符串意义上的空上下文有拒绝生成分支;有上下文时将其送入 LLM 报告提示。提示要求引用来源,但图不表示已核验每条主张。- 风险标注:即使双路正文为空,Hybrid 固定标签仍可能让拼接字符串非空,所以空串检查不能单独作为证据存在的证明。
图是静态源码说明,不是一次真实检索轨迹。MCP retriever、图片预生成、DeepResearch、其他来源类型和引用验收均不在本图范围。
编辑 build.py 后运行 python3 figures/gpt-researcher-evidence/build.py,再用 excalidraw-agent renderer 从原生 scene.excalidraw 导出 SVG 和 PNG。
在线预览稿:书稿仍在校稿,系统篇以文内固定源码版本为准;静态阅读不等于运行验收。