背景

  • Multi-SWE-Bench是一个用于评估大型语言模型在多语言实际软件工程任务上表现的基准测试平台。它包含GitHub问题及其相应修复,使LLM(Large Language Model,大型语言模型)能够通过生成解决这些问题的补丁来进行能力评估。本文将从环境搭建开始,详细介绍Multi-SWE-Bench的使用流程,包括数据集获取,使用公开cli生成patch,基础与高级评估以及常见问题解决等内容,帮助你全面掌握Multi-SWE-Bench的实战应用。

实战前须知

硬件资源

Multi-SWE-Bench评估非常耗费资源,建议至少有 300GB 可用存储空间、16GB 内存和 8 个 CPU 核心的机器上运行

环境准备:

Multi-SWE-Bench依赖docker来提供一致性评估环节

源代码构建

git clone git@github.com:multi-swe-bench/multi-swe-bench.git
cd multi-swe-bench
make install

Docker安装

这里可以参考Docker安装教程详解

#验证docker 
docker --version

数据准备

Multi-SWE-Bench在Hugger Face中的官方数据已给出,部分数据需要单独在Xet下载

当然如果想自己手动生成数据集,Multi的Github Readme中也已给出,这里就不做赘述。

本人偷懒,就没有手动生成~ 

Patch生成

Patch生成可能是大家比较头疼的部分了,整体论文复现其实还是很简单,唯一需要做的可能是Patch生成脚本了。

这部分主要是通过Cli方式来批量生成,目前已经开源的Cli的Agent有:cursor、Comate、Trae、Qoder、Claude Code

本文使用Comate的zulu智能体和Claude Code智能体。安装方法见下文。

更多Agent的cli自动化方法可见主页后续文章,如cursor、Trae、Qoder。

  • 首先为了各语言文件的环境依赖隔离,所以对每个项目都生成一个文件夹,文件夹格式如下图所示,对应Multi-SWE-Bench 数据集中下载的文件链信息。
model_multi_output/
 ─ cpp/
   ├─ facebook__zstd_dataset/          
   │  ├─ repos/
   │  └─ reports/
   └─ jqlang__jq_dataset/
      ├─ repos/
      └─ reports/
  • 然后调用模型cli实现模型patch生成,这里是通过官方数据集的问题描述提示拼接得到prompt(由于Multi-SWE-BenchMulti-SWE-RL属性字段不同,所以问题描述也不同,注意修改⚠️),然后使用cli工具如Comate IDE8月份发布的ZULU_CLI请求模型给出patch。
  • 下面是使用zulu_cli生成patch的主要代码,完整代码较长就不放了。
  • 主要思路:读取数据集 -- 仓库克隆(复用已有仓库)--重置到原始 bug 版本 -- 调用 AI 代理生成代码修改 -- 构建提示词(Prompt)-- 调用 AI 代理 -- 执行 AI 代理命令 -- 生成 Patch 并清理环境。
  • ds = load_dataset("json",data_files= args.dataset)["train"]   #读取本地数据集
    
    #数据集项目的参数
    repo_name = case["repo"]
    repo = f"{case['org']}/{case['repo']}"
    base_commit = case["base"]["sha"]
    top_problem = str(case["body"])
    all_resolved_bodies = []
    for issue in case["resolved_issues"]:
        issue_body = issue.get("body", "")
        if issue_body: 
            all_resolved_bodies.append(issue_body)
    merged_resolved = str("\n\n".join(all_resolved_bodies))
    problem = top_problem + merged_resolved
    hints = case.get("hints", "")
    instance_id = case["instance_id"]
    
    #预设prompt
    prompt = f"""IMPORTANT:使用中文回复
    IMPORTANT:仅生成代码即可,不要写测试代码,不要运行测试,当前环境不具备可运行项目代码的条件
    根据以下信息修复问题
    问题描述:
    {problem}
    提示:
    {hints}"""
    #准备代码仓库
    run(f"git clone https://github.com/{repo}.git {repo_dir}")
    
    #重置仓库到指定的base commit
    run(f"git reset --hard {base_commit}", cwd=repo_dir)
    run(f"git clean -fd", cwd=repo_dir)
    #请求模型命令
    agent_cmd = "zulu run --license your_licence --max your_model --query {shlex.quote(prompt)}"
    
    #执行命令,请求模型
    completed = subprocess.run(agent_cmd, shell=True, cwd=repo_dir,
                                     stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                                     text=True, check=False, env=os.environ,
                                     timeout=360)
            
    agent_out_file.write_text(completed.stdout, encoding="utf-8")

  • 要进行评估需要将.patch文件转化为.jsonl文件,可以运行脚本将patch文件提取属性(org,repo,number,fix_patch),再将文件按编程语言聚合得到以下形式文件结构。

  • 将文件按编程语言聚合后得到以下文件结构
  • model_multi_json_output/
     ─ cpp/
       ├─ cpp1.jsonl      #cpp.json中聚合了数据集中所有通过模型生成的文件,每一行是一个项目文件         
     ─ java/
       └─ java1.jsonl

    到此生成Patch就完美结束了

评估

  • 配置文件构造
{
    "mode": "evaluation",             #脚本的执行模式
    "workdir": "./data/workdir",      #工作路径
    "patch_files": [                  #模型单语言生成的jsonl文件
        "./data/patches/<your_patch_file>.jsonl"
    ],
    "dataset_files": [                #官方数据集文件
        "./data/patches/<to_evaluate_dataset_file>.jsonl"
    ], 
    "force_build": false,            #即使 Docker 镜像已存在,是否也强制重建它们
    "output_dir": "./data/dataset",  #输出文件
    "specifics": [],                 #要评估的特定 PR ID 列表(空列表 = 全部)
    "skips": [],                     #评估期间要跳过的 PR ID 列表
    "repo_dir": "./data/repos",      #包含克隆仓库的目录
    "need_clone": false,             #如果存储库不存在,是否应该克隆它。
    "global_env": [],                #要传递给 Docker 容器的全局环境变量
    "clear_env": true,               #是否清除 Docker 容器中的环境变量
    "stop_on_error": true,           #发生错误时是否停止执行
    "max_workers": 8,                #一般任务的最大并发工作线程数
    "max_workers_build_image": 8,    #用于构建 Docker 镜像的最大并发工作线程数
    "max_workers_run_instance": 8,   #运行实例的最大并发工作线程数
    "log_dir": "./data/logs",        #日志文件目录
    "log_level": "DEBUG"             #日志级别
}
  • 运行评估
python -m multi_swe_bench.harness.run_evaluation --config /path/to/your/config.json
  • 结果文件展示
{
    "total_instances": 2,
    "submitted_instances": 2,
    "completed_instances": 2,
    "incomplete_instances": 0,
    "resolved_instances": 2,
    "unresolved_instances": 0,
    "empty_patch_instances": 0,
    "error_instances": 0,
    "submitted_ids": [
        "facebook/zstd:pr-1540",
        "facebook/zstd:pr-3942"
    ],
    "completed_ids": [
        "facebook/zstd:pr-1540",
        "facebook/zstd:pr-3942"
    ],
    "incomplete_ids": [],
    "resolved_ids": [
        "facebook/zstd:pr-1540",
        "facebook/zstd:pr-3942"
    ],
    "unresolved_ids": [],
    "empty_patch_ids": [],
    "error_ids": []
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐