扩展阅读

Claude SWE-bench 性能

Anthropic·2026/7/21·7 阅读

Claude SWE-bench 性能 \ Anthropic

来源: https://www.anthropic.com/engineering/swe-bench-sonnet 抓取时间: 2026-07-21 16:25:07


我们的最新模型——升级后的 Claude 3.5 Sonnet 在软件工程评估 SWE-bench Verified 上达到了 49% 的成绩,超过了先前最先进模型的 45%。本文解释了我们围绕模型构建的"智能体",旨在帮助开发者从 Claude 3.5 Sonnet 获得最佳性能。

SWE-bench 是一个 AI 评估基准,评估模型完成现实世界软件工程任务的能力。具体来说,它测试模型如何解决来自流行开源 Python 仓库的 GitHub 问题。对于基准中的每个任务,AI 模型会获得一个已设置好的 Python 环境和问题解决前的仓库检出(本地工作副本)。然后模型需要理解、修改和测试代码,再提交其建议的解决方案。

每个解决方案都会根据关闭原始 GitHub 问题的拉取请求中的真实单元测试进行评分。这测试了 AI 模型是否能够实现与 PR 的原始人类作者相同的功能。

SWE-bench 不仅孤立地评估 AI 模型,而是评估整个"智能体"系统。在这种情况下,"智能体"指的是 AI 模型和围绕它的软件脚手架的组合。这个脚手架负责生成输入模型的提示词、解析模型的输出以采取行动,以及管理交互循环——将模型先前动作的结果整合到其下一个提示词中。即使使用相同的底层 AI 模型,智能体在 SWE-bench 上的性能也可能因这个脚手架而有很大差异。

还有许多其他大型语言模型编码能力的基准测试,但 SWE-bench 因其以下几个原因而广受欢迎:

  1. 它使用来自实际项目的真实工程任务,而不是竞赛或面试风格的问题;
  2. 它尚未饱和——还有很大的改进空间。没有模型在 SWE-bench Verified 上的完成率超过 50%(尽管在撰写本文时,更新后的 Claude 3.5 Sonnet 达到了 49%);
  3. 它测量整个"智能体",而不是孤立的模型。开源开发者和初创公司在优化脚手架方面取得了巨大成功,极大地提高了同一模型的性能。

请注意,原始 SWE-bench 数据集包含一些在没有 GitHub 问题之外的额外上下文的情况下无法解决的任务(例如,关于返回特定错误消息的信息)。SWE-bench-Verified 是 SWE-bench 的一个 500 个问题的子集,经过人类审查以确保它们是可解决的,因此提供了编码智能体性能最清晰的衡量标准。这是我们在本文中引用的基准。

实现最先进的性能

工具使用智能体

我们在为更新后的 Claude 3.5 Sonnet 优化智能体支架时的设计理念是,尽可能多地将控制权交给语言模型本身,并保持脚手架最小化。该智能体有一个提示词、一个用于执行 bash 命令的 Bash 工具,以及一个用于查看和编辑文件与目录的编辑工具。我们会持续采样,直到模型决定完成,或超过其 20 万的上下文长度。这个支架允许模型使用自己的判断来处理问题,而不是被硬编码到特定的模式或工作流程中。

提示词概述了模型的建议方法,但对于这项任务来说,它不会过长或过于详细。模型可以自由选择如何从一个步骤过渡到下一个步骤,而不是有严格和离散的转换。如果您对令牌不敏感,明确鼓励模型生成长响应会有所帮助。

以下代码显示了我们智能体支架中的提示词:

<uploaded_files>
{location}
</uploaded_files>
I've uploaded a Python code repository in the directory {location} (not in /tmp/inputs). Consider the following PR description:

<pr_description>
{pr_description}
</pr_description>

Can you help me implement the necessary changes to the repository so that the requirements specified in the <pr_description> are met?
I've already taken care of all changes to any of the test files described in the <pr_description>. This means you DON'T have to modify the testing logic or any of the tests in any way!

Your task is to make the minimal changes to non-tests files in the {location} directory to ensure the <pr_description> is satisfied.

Follow these steps to resolve the issue:
1. As a first step, it might be a good idea to explore the repo to familiarize yourself with its structure.
2. Create a script to reproduce the error and execute it with `python <filename.py>` using the BashTool, to confirm the error
3. Edit the sourcecode of the repo to resolve the issue
4. Rerun your reproduce script and confirm that the error is fixed!
5. Think about edgecases and make sure your fix handles them as well

Your thinking should be thorough and so it's fine if it's very long.

模型的第一个工具执行 Bash 命令。模式很简单,只需要在环境中运行的命令。然而,工具的描述更重要。它包括针对模型的更详细说明,包括转义输入、无法访问互联网以及如何在后台运行命令。

接下来,我们展示 Bash 工具的规范:

{
   "name": "bash",
   "description": "Run commands in a bash shell\n
* When invoking this tool, the contents of the \"command\" parameter does NOT need to be XML-escaped.\n
* You don't have access to the internet via this tool.\n
* You do have access to a mirror of common linux and Python packages via apt and pip.\n
* State is persistent across command calls and discussions with the user.\n
* To inspect a particular line range of a file, e.g. lines 10-25, try 'sed -n 10,25p /path/to/the/file'.\n
* Please avoid commands that may produce a very large amount of output.\n
* Please run long lived commands in the background, e.g. 'sleep 10 &' or start a server in the background.",
   "input_schema": {
       "type": "object",
       "properties": {
           "command": {
               "type": "string",
               "description": "The bash command to run."
           }
       },
       "required": ["command"]
   }
}

模型的第二个工具(编辑工具)要复杂得多,包含模型查看、创建和编辑文件所需的一切。同样,我们的工具描述包含了关于如何使用该工具的详细信息。

我们在各种智能体任务中投入了大量精力来设计这些工具的描述和规范。我们对它们进行了测试,以发现模型可能误解规范的任何方式,或使用工具的可能陷阱,然后编辑描述以预先解决这些问题。我们认为,应该为模型设计工具界面投入更多注意力,就像为人类设计工具界面投入大量注意力一样。

以下代码显示了我们编辑工具的描述:

{
   "name": "str_replace_editor",
   "description": "Custom editing tool for viewing, creating and editing files\n
* State is persistent across command calls and discussions with the user\n
* If `path` is a file, `view` displays the result of applying `cat -n`. If `path` is a directory, `view` lists non-hidden files and directories up to 2 levels deep\n
* The `create` command cannot be used if the specified `path` already exists as a file\n
* If a `command` generates a long output, it will be truncated and marked with `<response clipped>` \n
* The `undo_edit` command will revert the last edit made to the file at `path`\n
\n
Notes for using the `str_replace` command:\n
* The `old_str` parameter should match EXACTLY one or more consecutive lines from the original file. Be mindful of whitespaces!\n
* If the `old_str` parameter is not unique in the file, the replacement will not be performed. Make sure to include enough context in `old_str` to make it unique\n
* The `new_str` parameter should contain the edited lines that should replace the `old_str`",
    ...

我们提高性能的一种方法是"防错"我们的工具。例如,有时模型在智能体移出根目录后可能会搞乱相对文件路径。为了防止这种情况,我们简单地让工具始终要求绝对路径。

我们尝试了几种不同的策略来指定对现有文件的编辑,字符串替换的可靠性最高——模型指定 old_str 以替换给定文件中的 new_str。只有在 old_str 恰好有一个匹配时才会进行替换。如果匹配更多或更少,模型会显示适当的错误消息供其重试。

我们编辑工具的规范如下所示:

...
   "input_schema": {
       "type": "object",
       "properties": {
           "command": {
               "type": "string",
               "enum": ["view", "create", "str_replace", "insert", "undo_edit"],
               "description": "The commands to run. Allowed options are: `view`, `create`, `str_replace`, `insert`, `undo_edit`."
           },
           "file_text": {
               "description": "Required parameter of `create` command, with the content of the file to be created.",
               "type": "string"
           },
           "insert_line": {
               "description": "Required parameter of `insert` command. The `new_str` will be inserted AFTER the line `insert_line` of `path`.",
               "type": "integer"
           },
           "new_str": {
               "description": "Required parameter of `str_replace` command containing the new string. Required parameter of `insert` command containing the string to insert.",
               "type": "string"
           },
           "old_str": {
               "description": "Required parameter of `str_replace` command containing the string in `path` to replace.",
               "type": "string"
           },
           "path": {
               "description": "Absolute path to file or directory, e.g. `/repo/file.py` or `/repo`.",
               "type": "string"
           },
           "view_range": {
               "description": "Optional parameter of `view` command when `path` points to a file. If none is given, the full file is shown. If provided, the file will be shown in the indicated line number range, e.g. [11, 12] will show lines 11 and 12. Indexing at 1 to start. Setting `[start_line, -1]` shows all lines from `start_line` to the end of the file.",
               "items": {
                   "type": "integer"
               },
               "type": "array"
           }
       },
       "required": ["command", "path"]
   }
}

结果

总体而言,升级后的 Claude 3.5 Sonnet 展示了比我们先前模型以及先前最先进模型更高的推理、编码和数学能力。它还展示了改进的智能体能力:工具和脚手架有助于将这些改进的能力发挥到最佳用途。

模型Claude 3.5 Sonnet (新版)先前 SOTAClaude 3.5 Sonnet (旧版)Claude 3 Opus
SWE-bench Verified 分数49%45%33%22%

我们的一些模型在 SWE-bench Verified 上的分数,均使用此智能体支架。

智能体行为示例

为了运行基准测试,我们使用 SWE-Agent 框架作为智能体代码的基础。在下面的日志中,我们将智能体的文本输出、工具调用和工具响应呈现为 THOUGHT(思考)、ACTION(动作)和 OBSERVATION(观察),尽管我们没有将模型约束到固定的顺序。

下面的代码块将逐步介绍 Sonnet 3.5 解决 SWE-bench 问题的典型案例。

在第一个块中,您可以看到给模型的初始提示词的一部分,其中 {pr_description} 填充了 SWE-bench 任务的真实值。重要的是,这个任务包含了重现问题的步骤,这将为模型提供一个有价值的调查起点。

<uploaded_files>
/repo
</uploaded_files>
I've uploaded a Python code repository in the directory /repo (not in /tmp/inputs). Consider the following PR description:

<pr_description>
linear_model.RidgeClassifierCV's Parameter store_cv_values issue
#### Description
Parameter store_cv_values error on sklearn.linear_model.RidgeClassifierCV

#### Steps/Code to Reproduce
import numpy as np
from sklearn import linear_model as lm

#test database
n = 100
x = np.random.randn(n, 30)
y = np.random.normal(size = n)

rr = lm.RidgeClassifierCV(alphas = np.arange(0.1, 1000, 0.1), normalize = True, 
                                         store_cv_values = True).fit(x, y)

#### Expected Results
Expected to get the usual ridge regression model output, keeping the cross validation predictions as attribute.

#### Actual Results
TypeError: __init__() got an unexpected keyword argument 'store_cv_values'

lm.RidgeClassifierCV actually has no parameter store_cv_values, even though some attributes depends on it.
</pr_description>

模型响应并首先使用编辑工具查看仓库结构。您可以在 THOUGHT 和 ACTION 下看到模型的文本输出和工具调用参数,在 OBSERVATION 下看到工具输出的一部分:

THOUGHT:
I'll help you implement the changes to satisfy the PR description. Let's follow the steps you outlined.

1. First, let's explore the repo structure:
ACTION (str_replace_editor):
command:
view

path:
/repo

OBSERVATION:
Here's the files and directories up to 2 levels deep in /repo, excluding hidden items:
/repo
/repo/PULL_REQUEST_TEMPLATE.md
/repo/ISSUE_TEMPLATE.md
/repo/sklearn
/repo/sklearn/decomposition
/repo/sklearn/kernel_ridge.py
/repo/sklearn/model_selection
/repo/sklearn/covariance
/repo/sklearn/cluster
/repo/sklearn/base.py
/repo/sklearn/dummy.py
/repo/sklearn/naive_bayes.py
...

现在模型对仓库结构有了更好的理解,它使用编辑工具创建了一个新脚本,用于重现问题并测试其修复:

THOUGHT:
Based on the repository structure, we'll need to modify the Ridge Classifier in the `sklearn/linear_model` directory.

Let's create a script to reproduce the error:
ACTION (str_replace_editor):
command:
create

path:
/repo/reproduce_error.py

file_text:
import numpy as np
from sklearn import linear_model as lm

#test database
n = 100
x = np.random.randn(n, 30)
y = np.random.normal(size = n)

rr = lm.RidgeClassifierCV(alphas=np.arange(0.1, 1000, 0.1), normalize=True, 
                         store_cv_values=True).fit(x, y)

OBSERVATION:
File created successfully at: /repo/reproduce_error.py

然后模型使用 Bash 工具执行它编写的脚本,成功重现了任务中的问题:

THOUGHT:
Let's verify that we can reproduce the error:
ACTION (bash):
command:
Python3 /repo/reproduce_error.py

OBSERVATION:
Traceback (most recent call last):
  File "/repo/reproduce_error.py", line 10, in <module>
    store_cv_values=True).fit(x, y)
TypeError: __init__() got an unexpected keyword argument 'store_cv_values'

从这里开始,模型使用编辑工具更改仓库中的源代码,然后重新运行其脚本来验证更改是否解决了问题:

THOUGHT:
The error is reproducible. Looking at the code, I can see that the issue is that while the `RidgeClassifierCV` class inherits from `_BaseRidgeCV`, it fails to pass the `store_cv_values` parameter from its constructor through to the base class constructor.

Let's fix this:
ACTION (str_replace_editor):
command:
str_replace

path:
/repo/sklearn/linear_model/ridge.py

old_str:
    def __init__(self, alphas=(0.1, 1.0, 10.0), fit_intercept=True,
                 normalize=False, scoring=None, cv=None, class_weight=None):
        super(RidgeClassifierCV, self).__init__(
            alphas=alphas, fit_intercept=fit_intercept, normalize=normalize,
            scoring=scoring, cv=cv)
        self.class_weight = class_weight

new_str:
    def __init__(self, alphas=(0.1, 1.0, 10.0), fit_intercept=True,
                 normalize=False, scoring=None, cv=None, class_weight=None,
                 store_cv_values=False):
        super(RidgeClassifierCV, self).__init__(
            alphas=alphas, fit_intercept=fit_intercept, normalize=normalize,
            scoring=scoring, cv=cv, store_cv_values=store_cv_values)
        self.class_weight = class_weight

在这个特定示例中,模型工作了 12 步,然后决定准备提交。然后任务的测试成功运行,验证了模型的解决方案解决了问题。有些任务需要 100 多轮模型才提交解决方案;在其他情况下,模型会继续尝试直到用完上下文。

通过审查更新后的 Claude 3.5 Sonnet 与旧模型的尝试,更新后的 3.5 Sonnet 更频繁地自我纠正。它还表现出尝试几种不同解决方案的能力,而不是陷入一遍又一遍地犯同样错误的困境。

挑战

SWE-bench Verified 是一个强大的评估,但它也比简单的单轮评估更复杂。以下是我们在使用它时遇到的一些挑战——其他 AI 开发者也可能遇到这些挑战。

  1. 持续时间和高额令牌成本。 上面的示例来自一个在 12 步内成功完成的案例。然而,许多成功的运行需要模型数百轮才能解决,并且超过 10 万个令牌。更新后的 Claude 3.5 Sonnet 很执着:给它足够的时间,它通常可以找到解决问题的方法,但这可能很昂贵;
  2. 评分。 在检查失败的任务时,我们发现有些情况下模型行为正确,但存在环境设置问题,或者安装补丁被应用了两次的问题。解决这些系统问题对于准确了解 AI 智能体的性能至关重要;
  3. 隐藏测试。 因为模型看不到它被评分所依据的测试,所以它经常"认为"自己已经成功,而任务实际上是失败的。其中一些失败是因为模型在错误的抽象级别上解决了问题(应用了创可贴而不是更深入的重构)。其他失败感觉有点不公平:它们解决了问题,但与原始任务的单元测试不匹配;
  4. 多模态。 尽管更新后的 Claude 3.5 Sonnet 具有出色的视觉和多模态能力,但我们没有实现让它查看保存到文件系统或引用为 URL 的文件的方法。这使得调试某些任务(尤其是来自 matplotlib 的任务)特别困难,并且容易出现模型幻觉。对于开发者来说,这里肯定有可以改进的简单成果——SWE-bench 已经推出了一个新的专注于多模态任务的评估。我们期待看到开发者在不久的将来使用 Claude 在此评估上取得更高的分数。

升级后的 Claude 3.5 Sonnet 在 SWE-bench Verified 上达到了 49% 的成绩,超过了先前的最先进水平(45%),只需要一个简单的提示词和两个通用工具。我们有信心,使用新 Claude 3.5 Sonnet 进行开发的开发者将很快找到新的、更好的方法来提高 SWE-bench 分数,超过我们最初在此展示的水平。

致谢

Erik Schluntz 优化了 SWE-bench 智能体并撰写了这篇博客文章。Simon Biggs、Dawn Drain 和 Eric Christiansen 帮助实施了基准测试。Shauna Kravec、Dawn Drain、Felipe Rosso、Nova DasSarma、Ven Chandrasekaran 和许多其他人为训练 Claude 3.5 Sonnet 成为出色的智能体编码做出了贡献。

评论 (0)

暂无评论,快来抢沙发吧!

91学AI

© 2026 91学AI · 按岗位学 AI 与大数据. All rights reserved.