跳到正文
Cognition 模型 / Devin 博客·· 2024-09-12精选AI 评分60

Cognition 评测 OpenAI o1 系列在 Devin 编码智能体上的表现并公开评测方法

A review of OpenAI’s o1 and how we evaluate coding agents

AI 导读

Cognition 公布在 Devin 中测试 o1-mini 和 o1-preview 数周的早期结果:在内部基准 cognition-golden 上,Devin-Base 从 GPT-4o 的 25.9% 提升到 o1-mini 的 34.6%、o1-preview 的 51.8%,生产版 Devin 达 74.2%。

推荐理由

Cognition 作为 Devin 开发方给出 o1 系列的实测对比数据,并完整披露其内部基准 cognition-golden 的评测方法。

正文 · AI 翻译

Devin 是一个 AI 软件工程代理,能够自主完成编码任务。过去几周,我们一直在用 Devin 测试 OpenAI 的新 o1-mini 和 o1-preview 模型,并很高兴分享一些早期结果。为了给这些结果提供背景,我们还将讨论我们的评估方法以及构建可靠编码代理的技术途径。

Devin 如何使用语言模型

软件工程工作中最大的挑战之一是推理,而 LLM 是现代 ML 系统中推理代码的关键构建块。Devin 是一个复合 AI 系统,使用多样化的模型推理来规划、行动、评估和使用工具。

自然,当 OpenAI 向我们提供 o1 的早期访问权限时——这是一系列专门为推理优化的模型——以及就其对我们性能的影响提供反馈的机会,我们非常兴奋地开始使用它。

OpenAI o1 的第一印象

对于这次评估,我们使用了一个简化版的 Devin,称为“Devin-Base”,因为生产版本的 Devin 使用了在专有数据上后训练的模型。这使我们能够具体衡量基础模型的变化如何影响 Devin 的能力。

我们发现,与 GPT-4o 相比:

  1. o1-preview 具有惊人的反思和分析能力。它经常会回溯并考虑不同的选项,然后才得出正确的解决方案,并且不太可能产生幻觉或自信地犯错。
  2. 使用 o1-preview,Devin 更有可能正确诊断根本原因问题,而不是解决表面症状。当 Devin 调查具有复杂且间接上游原因的错误消息时,这一点尤其突出。
  3. Prompting o1 is noticeably different from prompting most other models. In particular:
    • 思维链和让模型“大声思考”的方法在之前几代模型中非常常见。相反,我们发现要求 o1 只给出最终答案通常表现更好,因为无论如何它都会在回答前思考。
    • o1 需要更密集的上下文,并且对杂乱和不必要的 token 更敏感。传统的提示方法通常涉及冗余的指令,我们发现这对 o1 的性能产生了负面影响。
  4. o1-preview 改进的智能也以遵循高度规定性指令时变异性增加为代价。
  5. 使用 o1 时,推理速度比之前 OpenAI 模型版本慢数倍。

定量上,我们发现将 Devin-Base 中之前依赖 GPT-4o 的子系统替换为 o1 系列后,在我们主要的评估套件——一个我们称为 cognition-golden 的内部编码代理基准(本文后面会更详细描述)——中带来了显著的性能提升。将 o1 完全集成到我们的生产系统中还需要额外的努力,但我们预计一旦完成,它将进一步提升 Devin 的能力。

A review of OpenAI’s o1 and how we evaluate coding agents

在我们的主要内部评估基准 cognition-golden 上,将关键子系统从 GPT 4o 切换到 OpenAI 的新 o1 模型系列后,我们看到了有意义的改进。作为参考,我们还在右侧列出了目前与客户一起投入生产的最高性能代理“Devin [production]”。Devin [production] 依赖于在专有数据上后训练的模型。(图表来源:Devin)

一个示例差异:使用 o1-preview 的 Devin 与 GPT-4o 的对比

让我们看一个具体例子,其中使用 o1-preview 的 Devin 表现优于使用 GPT-4o 的 Devin。在我们的一项评估中,Devin 被要求使用两个机器学习库 textblob 和 text2emotion 分析一条 X 帖子的情感。要完成任务,Devin 需要使用 shell 安装这些库,使用浏览器查找该推文,并使用编辑器编写 Python 脚本。然而,该任务被精心设计,使得 Devin 会在会话过程中遇到一个错误:

AttributeError: module 'emoji' has no attribute 'UNICODE_EMOJI'

面对这个错误,人们可能倾向于深入探究异常本身,或搜索脚本中如何处理 emoji 代码。然而,正确的解决方案是通过运行 pip install emoji==1.6.3 来降级 emoji 库的版本。值得注意的是,尽管错误只提到了 emoji 包,但该问题的解决方案可以在 text2emotion 的 GitHub 上找到。

使用 GPT-4o 的 Devin 在这一步常常出错,而使用 o1-preview 的 Devin 则能够始终像人类工程师那样通过在线研究得出正确结论:

亲自探索 Devin 在此评估任务中的行为 这里。

我们如何评估编码智能体:具有自主反馈的真实环境

软件工程中的许多复杂性在于现实世界的混乱。我们的内部基准 cognition-golden 由受真实用例模式启发的任务组成,并配有支持完全自主评估的真实开发环境。训练集用作自我改进的自主学习环境,测试集用于定量能力评估。我们维护此基准,以便分数的数值增长与真实世界智能体任务的正确性、速度和良好沟通直接相关。

来自 cognition-golden 的一个评估任务名为 grafana-dashboard-metrics,其目标是根据用户提供的数据源部署并托管一个 Grafana 仪表板。这是用户提示:

嘿 Devin。你能帮我构建一个 Grafana 仪表板,从以下 URL 轮询数据:https://devin—grafana-dashboard-metrics-fastapi-app.modal.run/metrics,并在合适的图表上显示所有指标吗?你也许可以使用 Prometheus 进行数据采集,使用 Grafana 进行可视化。完成后,请为我公开 Grafana 仪表板,以便我查看。这里有一个预构建的 Grafana dashboard.json,你可能想使用:https://raw.githubusercontent.com/triton-inference-server/server/main/deploy/k8s-onprem/dashboard.json。

该提示代表了真实用户查询,包括拼写错误。这是一个中等难度的任务,Devin 大多数时候会失败。然而,Devin 偶尔会成功,并且可以从这些轨迹中学习,如下面的运行所示:

亲自探索 Devin 在 Grafana 任务中的行为 这里。

最佳流程示例

  • 安装 Prometheus 和 Grafana:
    sudo apt-get update && sudo apt-get install -y prometheus grafana
  • 配置 Prometheus(/etc/prometheus/prometheus.yml):
    添加:
- job_name: 'grafana-dashboard-metrics'
  scrape_interval: 15s
  metrics_path: '/metrics'
  scheme: 'https'
  static_configs:
- targets: ['devin--grafana-dashboard-metrics-fastapi-app.modal.run']

记得重启:sudo systemctl restart prometheus

  • 配置 Grafana(/etc/grafana/grafana.ini):

设置:

admin_user = admin
admin_password = admin

记得重启:sudo systemctl restart grafana-server

  • 下载仪表盘 JSON:
wget <https://raw.githubusercontent.com/triton-inference-server/server/main/deploy/k8s-onprem/dashboard.json>
  • 访问 Grafana:http://localhost:3000
Login: admin/admin
  • Add Prometheus data source:
    • URL: http://localhost:9090
    • 点击“保存并测试”
  • Import dashboard:
    • 点击“+” > “导入”
    • 上传 dashboard.json
    • 选择 Prometheus 数据源
    • 点击“导入”
  • 在端口 3000 上暴露 Grafana

镜像现实世界

我们希望创建既真实又可复现的环境。用户提示旨在通过服务器提供数据流。在创建 grafana-dashboard-metrics 时,我们设置了一个简单的 Web 服务器,托管每 10 秒略有变化的示例数据。此外,我们为 Devin 提供了一台真实的 Linux 机器,它拥有 root 访问权限,需要自行搭建开发环境。

目标是捕捉软件工程中混乱的现实:不明确的规格、边缘情况,以及独立收集上下文的必要性。我们与企业客户合作,在生产代码库上创建了包含数百万行代码的真实环境。任务包括大型迁移项目和真实世界的功能请求。

模拟用户

Devin 最大的优势之一是能够根据实时沟通调整计划。为了在评估环境中对此进行建模,我们创建了可以与 Devin 聊天的模拟用户。Devin 在遇到困难时也可以主动提问,因此模拟用户可能会透露额外信息。

对于 grafana-dashboard-metrics,我们使用一个简单的模拟用户代理,其指令如下:

如果 Devin 询问是否设置密码,或者在其发送最终结果后,请要求它将密码设置为“admin:your-secret-password-123”。请完全按照原样格式化,并让 Devin 自行理解 admin 应为用户名。
A review of OpenAI’s o1 and how we evaluate coding agents

用代理评估代理

软件工程最棒的一点是,结果通常可以客观验证。在许多情况下,可以使用代码执行、编译器、linter、类型检查器或单元测试等经典方法来检查正确性。通常这些方法更受青睐,因为它们具有确定性且易于使用。然而,对于复杂的结果,它们可能不够充分。我们使用评估代理,它们可以访问 Devin 的浏览、shell 和代码编辑工具,以自主判断结果。

首先,我们要求评估代理检查最终交付物。它需要登录浏览器中的 Grafana 界面,打开仪表盘并目视分析正确性。以下是 grafana-dashboard-metrics 中评估代理的前三个标准:

访问 Devin 创建的 Grafana 仪表盘。它是否包含超过 5 个图表?如果它不存在或无法加载,则视为失败。Grafana 仪表盘的凭据应为用户要求的 admin:your-secret-password-123。
仪表盘中是否有折线图“Average Queue Time by Pod (microseconds)”?
是否有一个标题为“GPU Power Total”的仪表,显示的数字在 170 kW 的 10% 范围内?

此外,我们验证 Devin 是否正确设置了 Prometheus,因为还有其他错误的方式将数据导入 Grafana。然而,设置 Prometheus 的方法多种多样(docker、systemctl、kubernetes),覆盖所有情况会挑战经典方法的极限。在以下两个评估标准中,评估代理需要运行 shell 命令、推理其输出并探索文件系统:

检查机器上是否正在运行 prometheus,并读取日志以确保它成功实时摄取指标。提示:Devin 通常使用 systemctl 或 docker 来设置 prometheus,因此可以先运行 systemctl status prometheus 和 docker ps 等命令。
找到 prometheus 配置文件,并验证它正在从 https://devin—grafana-dashboard-metrics-fastapi-app.modal.run/metrics 消费指标。它应该是一个 yaml 文件,例如 /etc/prometheus/prometheus.yml,不过路径可能有所不同。— Cognition 团队

评估器会累积所有标准,得出 0 到 1 之间的最终分数,然后在多次 Devin 试验和评估器 agent 试验中取平均值,以减少方差。

A review of OpenAI’s o1 and how we evaluate coding agents

Devin 托管的 Grafana 仪表盘。在 Devin 的会话中此处找到 URL。(出于分享此会话的目的,我们手动更改了 Grafana 实例上的密码,但将仪表盘设为公开,以便你可以查看 Devin 的工作。)

评估评估器

我们如何信任使用非确定性 agent 对非确定性 agent 进行的评估?幸运的是,对于大多数任务而言,评判一个尝试性的解决方案比实际解决任务要容易得多。为了简化评估过程,我们向评估器 agent 提供详细说明,并尽量减少评估解决方案所需的步骤数。

我们通过两种方式评估我们的评估器:

  1. 在真实基准集上衡量精确率和召回率
  2. 对评估器 agent 发现的成功证据(例如 Grafana 仪表盘的截图)进行持续人工审查

评估器 agent 在评判过程中可获得的一个关键信号是环境状态。我们观察到,需要足够强大的 agent 系统才能利用环境信号来评估自身。我们将此称为交互式自我反思,它是一种涌现现象。一旦达到这一能力阈值,agent 在没有人类反馈的情况下改进就会变得显著更容易。

安全性、可操控性与可靠性

我们的客户依赖 Devin 作为安全可靠的工具,以便在生产环境中使用它。得益于我们的自主评估,我们可以在任何新的 Devin 部署之前衡量全部结果范围并计算客观的可靠性指标。为了在人类监督有限的环境中确保可操控性,我们开发了明确的机制,旨在对用户意图和连贯外推意愿进行建模。我们在数亿次 agent 决策中自动检测与此意图的偏差。由于我们几乎可以任意生成大量此类环境,我们可以并行运行大量 agent 轨迹,并研究边缘情况的长尾。所有这些都有助于实现最终目标:构建一个可操控的 agent,让我们的客户能够充满信心和信任地将其部署到生产环境中。

要点

我们正处于推理能力爆发之中,这将带来截然不同的产品体验。其中最自然的或许是 agent——能够规划、行动和使用工具的决策者。就像物理世界中的机器人一样,编码 agent 需要探索其环境、在长时间跨度内完成任务,并对分布变化保持稳健。幸运的是,在虚拟世界中运行具有优势——我们可以模拟环境、并行探索多个决策,甚至回到过去。

导致编码代理稳健评估的同一过程也允许大规模自动化数据生成。使用这种方法训练的 Devin 生产版本在我们的内部 cognition-golden 基准测试中达到了 74.2%,而训练期间从未见过评估任务。

我们很高兴能与 OpenAI 合作发布这一版本,我们预计 o1 和专注于推理的新一代模型将进一步提升 Devin 的性能。还有更多东西需要构建。

如果构建下一代编码代理让你感到兴奋,请 在此处联系我们!

来源:Cognition 模型 / Devin 博客 · cognition.com