开源 DeepResearch – 释放我们的搜索智能体

发布于 2025 年 2 月 4 日
在 GitHub 上更新

内容提要

昨天,OpenAI 发布了 Deep Research,这是一个能够浏览网页、总结内容并根据总结回答问题的系统。这个系统令人印象深刻,我们初次尝试时就被其震撼到了。

这篇博文中的一个主要成果是在通用人工智能助手基准(GAIA)上取得了显著的性能提升,这也是我们最近一直在研究的一个基准。他们在 1-shot 平均测试中成功达到了近 67% 的正确率,而在特别具有挑战性的“3 级”问题(涉及多步推理和工具使用)上达到了 47.6% 的正确率(关于 GAIA 的介绍见下文)。

DeepResearch 由一个 LLM(可以从 OpenAI 当前提供的 LLM 列表中选择,如 4o、o1、o3 等)和一个内部的“智能体框架”组成,该框架引导 LLM 使用网页搜索等工具,并将其行动组织成多个步骤。

尽管现在强大的 LLM 已经可以在开源社区免费获得(例如最近的 DeepSeek R1 模型),但 OpenAI 并未透露太多关于 Deep Research 底层智能体框架的信息……

因此,我们决定进行一项为期 24 小时的任务,以复现他们的结果,并在此过程中开源所需的框架!

时间紧迫,我们开始吧!⏱️

目录

什么是智能体框架,为何它们如此重要?

智能体框架是在 LLM 之上的一个层,它让 LLM 能够执行动作(如浏览网页或阅读 PDF 文档),并将其操作组织成一系列步骤。如需快速了解智能体,请查看吴恩达的精彩访谈以及我们关于 smolagents 库的介绍性博文。要更深入地了解智能体,您可以订阅我们几天后开始的智能体课程:点击此处链接

几乎每个人都已经通过玩聊天机器人体验到 LLM 的强大之处……然而,并非所有人都意识到,将这些 LLM 集成到智能体系统中可以赋予它们真正的超能力!

下面是一个最近的例子,比较了几个前沿 LLM 在有和没有智能体框架(此例中为简单的 smolagents 库)的情况下的性能——使用智能体框架将性能提升了高达 60 个点!

Benchmarks

事实上,OpenAI 也在其发布博文中强调了 Deep Research 在知识密集型的“人类最后一次考试”基准测试中,性能远超独立的 LLM。

那么,当我们把当前顶级的 LLM 集成到一个智能体框架中,朝着 open-DeepResearch(开源 DeepResearch)的目标努力时,会发生什么呢?

简要说明:我们将以同样的 GAIA 挑战来对我们的结果进行基准测试,但请记住,这只是一个进行中的工作。DeepResearch 是一项巨大的成就,其开源复现需要时间。特别是,要完全达到同等水平,需要改进浏览器使用和交互,就像 OpenAI Operator 所提供的那样,即超越我们在此第一步中探索的纯文本网页交互。

首先,让我们来了解一下这个挑战的范围:GAIA。

GAIA 基准测试

GAIA 可以说是最全面的智能体基准测试。它的问题非常困难,触及了基于 LLM 系统的许多挑战。下面是一个难题的例子:

在 2008 年的画作《乌兹别克斯坦的刺绣》中展示的水果中,哪些曾作为 1949 年 10 月远洋客轮早餐菜单的一部分,而该客轮后来被用作电影《最后的航行》的浮动道具?请按画中水果从 12 点钟位置开始顺时针排列的顺序,以逗号分隔的列表形式给出这些物品,并使用每种水果的复数形式。

你可以看到这个问题涉及多个挑战

  • 以受限格式回答,
  • 使用多模态能力(从图像中提取水果),
  • 收集多条信息,其中一些信息相互依赖
    • 识别图片中的水果
    • 找出哪艘远洋客轮被用作《最后的航行》的浮动道具
    • 找到上述远洋客轮 1949 年 10 月的早餐菜单
  • 按正确顺序将问题解决的轨迹串联起来。

解决这个问题既需要高水平的规划能力,也需要严谨的执行能力,而这两个方面都是单独使用 LLM 时的弱项。

所以,这对智能体系统来说是一个极好的测试集!

在 GAIA 的公开排行榜上,GPT-4 在没有任何智能体设置的情况下,在验证集上的得分甚至不到 7%。而在光谱的另一端,凭借 Deep Research,OpenAI 在验证集上达到了 67.36% 的分数,这简直是数量级的提升!(虽然我们不知道它们在私有测试集上的实际表现如何。)

让我们看看用开源工具能否做得更好!

构建一个开放的 Deep Research

使用 CodeAgent

我们首先要解决的、超越传统 AI 智能体系统的改进是使用所谓的“代码智能体”(code agent)。正如 Wang 等人 (2024) 所展示的,让智能体用代码表达其动作有几个优点,其中最显著的是代码天生就是为表达复杂的动作序列而设计的

考虑一下 Wang 等人给出的这个例子。

Code Agent

这凸显了使用代码的几个优点

  • 代码动作比 JSON 简洁得多
    • 需要并行运行 4 个流,每个流包含 5 个连续的动作?用 JSON,你需要生成 20 个 JSON 块,每个都在一个单独的步骤中;用代码,只需要 1 个步骤。
    • 平均而言,该论文显示代码动作所需的步骤比 JSON 少 30%,这相当于生成的 token 数量也减少了相同的比例。由于 LLM 调用通常是智能体系统的主要成本,这意味着你的智能体系统运行成本降低了约 30%。
  • 代码能够重用通用库中的工具
  • 在基准测试中表现更佳,原因有二
    • 表达动作的方式更直观
    • LLM 在训练中广泛接触代码

我们在 agent_reasoning_benchmark 上的实验证实了上述优点。

通过构建 smolagents,我们还可以引出一个显著的额外优势,即更好地处理状态:这对于多模态任务尤其有用。需要为以后使用存储这个图像/音频/其他内容吗?没问题,只需在你的状态中将其赋值给一个变量,如果需要,你可以在 4 个步骤后重新使用它。而在 JSON 中,你必须让 LLM 在一个字典键中命名它,并相信 LLM 之后能理解它仍然可以使用。

打造合适的工具 🛠️

现在我们需要为智能体提供一套合适的工具。

1. 一个网页浏览器。虽然像 Operator 那样功能齐全的网页浏览器交互是达到最佳性能所必需的,但我们目前为了第一个概念验证,先从一个极其简单的基于文本的网页浏览器开始。你可以在这里找到代码。

2. 一个简单的文本检查器,能够读取多种文本文件格式,代码在这里

这些工具取自微软研究院优秀的 Magentic-One 智能体,向他们致敬!我们没有对它们做太多改动,因为我们的目标是用尽可能低的复杂性获得尽可能高的性能。

以下是我们认为能够真正提升这些工具性能的简短改进路线图(欢迎随时提交 PR 并做出贡献!):

  • 扩展可读取的文件格式数量。
  • 提供更细粒度的文件处理方式。
  • 用基于视觉的网页浏览器替换当前的,我们已经开始在这里进行这项工作。

结果 🏅

在我们 24 小时以上的复现冲刺中,我们已经看到我们的智能体在 GAIA 上的性能稳步提升!

我们很快就超越了之前使用开源框架的最高水平(Magentic-One 约 46%),达到了我们目前在验证集上 55.15% 的性能

这次性能的提升主要归功于让我们的智能体用代码来编写它们的动作!实际上,当切换到一个用 JSON 而非代码编写动作的标准智能体时,相同设置的性能立即下降到验证集上的平均 33%。

这是最终的智能体系统。

我们已经在这里设置了一个实时演示,供您试用!

然而,这仅仅是个开始,还有很多地方需要改进!我们的开源工具可以做得更好,smolagents 框架也可以进行调整,我们还希望探索更优秀的开源模型来支持这个智能体。

我们欢迎社区加入我们的这项事业,以便我们能共同利用开放研究的力量,构建一个卓越的开源智能体框架!这将使任何人都能在家里运行一个类似 DeepResearch 的智能体,使用他们最喜欢的模型,并采用完全本地化和定制化的方法!

社区复现

在我们专注于 GAIA 的工作期间,社区中也涌现出了其他优秀的 Deep Research 开源实现,特别是由以下人员贡献的:

这些实现各自使用了不同的库来进行数据索引、网页浏览和查询 LLM。在这个项目中,我们希望复现 OpenAI 提出的基准测试(pass@1 平均分),对切换到开源 LLM(如 DeepSeek R1)、使用视觉语言模型(vision LM)进行基准测试和记录我们的发现,并对传统工具调用与原生代码智能体进行基准比较。

最重要的后续步骤

OpenAI 的 Deep Research 很可能得益于他们在 Operator 中引入的出色网页浏览器。

所以我们接下来要攻克这个难题!在一个更普遍的问题上:我们将构建 GUI 智能体,即“能看到你的屏幕并能直接用鼠标和键盘操作的智能体”。如果你对这个项目感到兴奋,并希望通过开源帮助每个人获得如此酷炫的功能,我们非常欢迎你的贡献!

我们还在招聘一名全职工程师来帮助我们进行这项及更多的工作,如果你感兴趣,欢迎申请 🙂

社区

DeepSeek 的推理能力对于这样的任务可能特别有用。但在我看来,特别是对于学术研究类型的任务,模型中固有的宣传内容是不可接受的。我昨天测试了新的
DeepSeek-R1-Distill-Llama-70B-Uncensored-v2-Unbiased 模型。这是一个非常粗略的测试,但我印象深刻。我是新手,所以把这当作一个轻微的建议,以防它有帮助,仅此而已。

·

是的,我也对它印象深刻。它能很好地遵循指令,并纠正(故意的)错误。我正打算让它在我的 RTX 4090 上通过卸载(offloading)良好地工作。

这听起来很有趣,所以我根据描述点了个赞。然而,演示的实现肯定需要注意和改进。现在,在几次等待了 100 多个用户的队列之后,我反复收到“生成模型输出时出错
litellm.ContextWindowExceededError: litellm.BadRequestError: ContextWindowExceededError: OpenAIException - 错误代码: 400 - {'error': {'message': "此模型的最大上下文长度为 128000 个 token。但是,您的消息导致了 419624 个 token。请减少消息的长度。", 'type': 'invalid_request_error', 'param': 'messages', 'code': 'context_length_exceeded'}}”。所以这看起来很基础,*. * 演示肯定需要精心设计,以便模型能够在正确的时间和地点处理正确的 token 限制。否则……

我在演示网站上也遇到了和楼上一样的问题。肯定是个 bug,因为我试了不同的提示,但由于排队,每个都要等大约 1 小时。
生成模型输出时出错
litellm.ContextWindowExceededError: litellm.BadRequestError: ContextWindowExceededError: OpenAIException - 错误代码: 400 - {'error': {'message': "此模型的最大上下文长度为 128000 个 token。然而,您的消息导致了 709582 个 token。请减少消息的长度。", 'type': 'invalid_request_error', 'param': 'messages', 'code': 'context_length_exceeded'}}

非常酷,谢谢!我觉得 OpenAI 已经恨上开源了 :)))))
那些拼命想商业化的产品,一天之内就被做出来了。

这是朝着更强大的 AI 智能体迈出的一大步。在 Automatio.ai,我们正在努力整合类似的自主网络智能体,以简化数据提取和网络自动化,让用户无需编码即可构建强大的爬虫。挑战在于确保这些智能体能够可靠地浏览复杂的网站。您认为开源 AI 如何帮助弥合研究原型与现实世界自动化之间的差距?

太棒了。我非常感兴趣参与。

我目前正在探索 OpenAI DeepResearch 的开源替代品,因为它确实是一个很棒的产品,是我自 2022 年 ChatGPT 发布以来用过的最有用产品之一,因为研究结果质量非常高,不仅仅是简单的“搜索”功能。
我决定通过 Hugging Face Space 试用这个 Open Deep Research,但遇到了返回输出超过 128K token 限制的问题。
image.png

@albertvillanova @clefourrier 有没有办法解决这个问题,或者设置指令来限制输出 token,以确保它不会抛出错误并能正常工作,即使有一些限制?
附言:在有局限的情况下工作总比完全不能工作要好得多。

我们能得到一个带说明的 readme 文件吗

我尝试在本地运行这个,但在安装了依赖后,使用 run.py 命令时遇到了一些错误。也许你们应该添加一个 readme 来指导设置。https://github.com/huggingface/smolagents/blob/gaia-submission-r1/examples/open_deep_research/run.py

·

是的,我也遇到了错误。不确定是否需要安装整个仓库,具体要安装什么等等。但我试了,还没能让它运行起来。

如何预见未来

Cursor 能够很好地设置这个(并进行扩展);只需确保你添加了 smolagents 的文档,并将其指向 git 仓库 src 目录下的特定 open deep research 文档。

·

多说点吧,我的朋友……

嘿,伙计们!演示网站挂了 :/

无法访问演示。

我尝试将您的工具与付费的 Gemini Advanced 1.5 Pro with Deep Research 进行并排比较,以完成一个特别有趣且具有挑战性的任务,但很难对结果进行基准测试。Gemini 总体表现不佳至一般,而且是在多次手动额外提示之后才达到的。

初始提示
“在过去 10 年中,马萨诸塞州的房东因租户提出的过失或故意造成精神痛苦的索赔而收到的最高判决是什么?”
结果 - 它什么也没找到
我用如下提示进一步修正了工作流程
“请注意,这也可能出现在房东对租户的诉讼中,其中租户在反诉中获胜”

“那里可能有一些有用的结果,但是,请按照我提出的两个标准‘过去 10 年内’和‘在马萨诸塞州’重新生成,然后尝试评估为什么您的流程在其最终输出中犯了这个明显的错误,并与我分享您的自我分析”

“请考虑几种方法,可以在满足我标准的同时扩展您的筛选范围。1. 提出‘过失造成精神痛苦’或‘故意造成精神痛苦’的诉讼有多种法律框架。可能是在消费者保护法第 93A 章的背景下,也可能是在 M.G.L. c. 186, §14 的背景下,特别是在驱逐案件的反诉中。2. 如果您搜索引用了那些具有里程碑意义的旧案例的案件,特别是 simon vs. solomon 和 Haddad v. Gonzalez,它们会非常有帮助。3. 寻找普通案例比寻找有约束力的判例法更困难,一些建议是,某些初审法院,如马萨诸塞州住房法院西部分院,会公布其‘法院报告’,这基本上是他们几乎所有案件裁决的数据转储。3. 您明智地抓取了 masscases.com,因为它有未公布和已公布的判决,这对我很有用,而且他们使用对抓取友好的 URL 方案。judyrecords.com, trellis.law, docketalarm 都选择允许被谷歌爬取以便出现在谷歌搜索结果中。我所寻求的信息几乎总是可以纯粹从提供给谷歌的信息中推断出来,例如 {massachusetts emotional distress tenant site:trellis.law}(不带大括号)会返回许多案例。请再试一次”

“Rader v Odermatt 是一个完全符合我标准的案例的绝佳例子。租户在反诉中胜诉,甚至获得了通常不鼓励且罕见的重复性损害赔偿。请尝试评估您是如何错过这个案例的,输出一份修订后的列表,并在您的工作流程中输出您的自我分析”

我省略了谷歌提供的自我分析,它大体上是正确的,但正如它自己认识到的,它未能对我的修订给予适当的权重。当然,另一个主要障碍是,对于准法律、有时是技术性的,以及由于彻头彻尾的政治偏见,大多数下级法院的案件,在某种程度上意味着“真实案件”,非常难找到,更难抓取。我尝试用抓取策略进行提示,但最终几乎没有找到有意义的结果。我准备了一些结果来评估其有效性。不幸的是,您的工具在第一个提示时就给了我与其他用户一样的错误。

文章作者

演示又上线了!

·

不会持续太久 :(

Screenshot_20250207_213738_Brave.jpg

我成功在本地运行了 run.py .. 请在 https://github.com/huggingface/smolagents/issues/501 查看解决方案.. 我在那里提到了步骤。

我从头到尾都读完了。感谢这篇文章

缓冲区

我很想读一下这个 open_deep_research 文件夹的一个好的 README.md,了解如何使用和调整那个示例 :)

太棒了

📻 🎙️ 嘿,我为这篇博客文章制作了一个播客,快来听听吧!

该播客由 ngxson/kokoro-podcast-generator 生成,使用了 DeepSeek-R1 和 Kokoro-TTS

·

这很酷。

嘿,很棒的博文!我注意到你们公布了用于 Gaia/Math 基准测试的模型——感谢分享。

我想知道你们是用哪个服务器来运行这些模型的?我目前在使用 vLLM,但它似乎还不支持 tool_choice="required"。为了让它工作,我不得不调整模型代码来强制它返回一个工具以供执行。

预先感谢任何见解!

我尝试在我的本地设置中运行这个智能体,我想说,它相当令人印象深刻。我试了 OpenAI Deep Research 页面上(https://openai.com/index/introducing-deep-research/)同样的问题,只是为了比较工作流程和输出。

它创建的行动计划很清晰,并逐一执行了所有工作流程步骤,尽管中间出现了一些错误,但这并没有中断进程。最终,它根据所有收集到的数据给出了最终建议。

附上的是使用 gpt-4o 模型的结果。使用 o1 模型肯定会得到更好的推理结果。
plan.jpg
final-answer.jpg

我们能添加一个搜索 arxiv 和 pubmed 文章然后呈现研究成果的功能吗?我认为这将是一个很好的开始。

·

像一个爬虫,会从研究文章中收集数据然后输入到 DeepSeek?

看来又向 closedAI 开了一枪 :))

是的

此评论已被隐藏

我会想办法让所有技术都开源,并为这个世界带来开源的人性

@m-ric 你好,我正在尝试利用基于 SimpleTextBrowserVisitTool 来从 URL 获取页面内容。但我发现对于某些 URL,比如 https://www.businessresearchinsights.com/market-reports/software-resellers-market-117159,它可能会返回 错误 403 启用 JavaScript 和 cookie 以继续。所以我想知道 Open DR 在生成最终报告或进行分析时是如何处理这类问题的。是直接跳过,还是通过 GoogleSearchTool 从页面获取内容片段?

注册登录 以发表评论