返回资讯中心
外部精选
软件工程
#开发者实时流

开发者复盘深度研究系统构建经验:难点集中在上下文管理与编排

来源标题:Lessons from Building a Deep Research System

开发者 Manav Mehta 复盘其搭建的深度研究系统,指出主要挑战并非研究本身,而是上下文管理、编排与产品设计。该系统能搜索网页、浏览站点、从数十个来源收集证据并生成带引用的长报告。他表示这些经验大多可推广到构建各类可靠的 agent harness。

Hacker News 最新ankitg122026/11/6 · 今天27 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

Field Notes 构建深度研究系统的经验教训 MMManav Mehta·2026年7月18日·阅读时长6分钟 过去几个月里,我构建了一个深度研究系统:一个能够搜索网络、浏览网站、从数十个来源收集证据并生成带引用的长篇报告的 agent。虽然这个系统本身是为研究而构建的,但我们遇到的大多数挑战,与研究本身几乎没有关系。

它们其实是上下文管理、编排和产品设计方面的问题。我们花了多得多的时间来决定推理应该发生在哪里、哪些职责应该交给代码而不是模型、信息应该如何流经系统,以及 harness 应该如何与用户做决策的方式保持一致。

本文以我们的深度研究系统作为案例,来探讨这些想法。这套架构是研究场景专用的,但其中的经验教训并非如此。大多数经验可以推广到构建任何类型的可靠 agent harness。

在深入经验教训之前,值得简要说明一下这个系统是如何工作的。

与传统的聊天机器人不同,深度研究系统被期望去调查一个主题,而不是立即回答它。给定一个研究查询,系统可能需要搜索信息、浏览网站、从数十个来源收集证据,并在产出报告之前不断深化对问题的理解。

下图展示了该系统架构的简化高层视图。

在高层次上,orchestrator 通过规划调查、调用工具并决定下一步调查什么信息来驱动研究过程。Search 负责发现候选来源,而 fetch 和 browse 则从静态和动态网站中提取证据。随着调查推进,系统会定期生成阶段性报告,让用户在最终报告完成之前就能看到目前已经了解到什么。

虽然这套架构随时间发生了显著演变,但最有趣的经验来自于那些后来被证明是错的假设。

我们系统的第一个版本使用了一个专用的 planner。给定一个研究问题,planner 会生成子问题、搜索查询和研究策略。然后 orchestrator 执行该计划,调用 search、fetch 和 browser 工具从网络上收集证据。

这种分解看似自然。规划和执行是不同的任务,所以把它们分离到不同组件里看起来是一种清晰的设计。随着新证据的出现,可以再次调用 planner 来修订策略并生成新的搜索方向。

问题在研究变得迭代之后才显现出来。研究者很少问一次问题就接受答案。他们会阅读报告、缩小范围、提出后续问题,并逐步细化自己真正想找的东西。系统需要建立在它已经学到的一切之上。

orchestrator 自然而然地积累了这种理解。它可以访问对话历史、之前的报告、中间发现以及用户不断演变的意图。然而,planner 每次被调用时都是一次全新的 LLM 调用。只有结构化的 agent 状态跨越了边界。orchestrator 内部存在的更丰富的理解被留在了原地。

乍一看,这似乎很容易修复:把 orchestrator 知道的一切都交给 planner 就行了。实践中,这很快就变得不切实际。orchestrator 的理解并不是一堆可以被序列化并传递过去的事实集合。它是经过多轮构建起来的整个推理过程的产物。在一次全新的 LLM 调用中重建这种理解,与在同一个调用中继续推理有着根本性的不同。无论我们传入多少上下文,planner 始终是在根据一份快照重建心智模型,而 orchestrator 已经拥有了一个心智模型。

这一点在后续问题上表现得最为明显。一份报告可能覆盖了一家公司的整体市场地位,而用户要求只关注东南亚的定价风险。orchestrator 完全明白“只关注”是什么意思,因为它参与了整个对话。planner 只收到了这种理解的一份压缩表示,于是经常把研究重新扩展回更广泛的市场分析。

最终我们移除了 planner,把规划移到了 orchestrator 本身内部。

规划如今仍然存在于系统中,但它发生在执行研究的同一个推理循环内,针对的是同一份上下文,而不是它的副本。

当我们添加推理节点时,我们往往关注它们引入的能力,而忽视了它们制造的信息边界。边界不是免费的。每一条边界都需要上下文从一个组件跨越到另一个组件,而每一次跨越都可能让某些东西丢失、被压平,或者在另一侧被以不同的方式解读。当两个组件在针对同一个目标进行推理时,这种成本可能超过分解本来能带给你的任何好处。

移除 planner 本应让系统更简单,一开始也确实如此。但我们几乎立刻就引入了另一个问题。我们的本能是激进地并行化。每个搜索查询都有自己的 subagent:它会搜索网络、对结果分类、抓取页面、提取证据,然后把一切交回 orchestrator。纸面上这看起来是很好的架构——独立的工作单元并发运行,各自负责研究中的一小块。

实践中,这对延迟和成本来说是一场灾难。为每个查询启动一个 subagent,意味着 orchestrator 在不断地上下文切换:派发工作、等待、摄取每个 subagent 的输出、将其合并到自己的状态中。这种开销随着每次迭代不断累积。

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →