aider 基准测试框架Benchmark Harness完整指南在 Docker 中用 polyglot 练习集量化评测 LLM 编码能力【免费下载链接】aideraider is AI pair programming in your terminal项目地址: https://gitcode.com/GitHub_Trending/ai/aider本指南围绕 aider 仓库中的 benchmark/README.md 展开系统讲解 aider 官方基准评测框架的设计动机、搭建步骤、运行方式与结果解读并结合 benchmark.py、docker.sh、Dockerfile 等源码说明其底层工作机制。读完本文你将掌握一套可复现的评测流程能够独立对任意模型跑通评测并获得pass_rate、成本、延迟等量化指标。一、评测框架要解决什么问题aider 官方博客曾用专项文章介绍这一评测方案仓库内的原始文稿见 aider/website/_posts/2024-12-21-polyglot.md。这套框架的定位非常明确用定量手段衡量 aider 与不同 LLM 协作时的真实表现。评测基于 Exercism 编程练习扩展出的 polyglot 练习集。每个练习本质上是一次端到端任务给定一段自然语言需求模型必须产出可执行代码并让代码被正确保存到源文件中、通过配套单元测试。因此它检验的不只是模型的“写代码能力”还包括两个容易被人忽略的环节编辑既有代码的能力——模型必须理解项目上下文并做针对性修改格式化代码编辑的能力——模型产出的补丁或整文件内容必须能被 aider 解析并落地到本地源码。只有在两个环节都成功时单元测试才可能通过最终评分才有意义。为什么必须放进 Docker 跑评测脚本会直接执行 LLM 生成的代码而这些代码从未经过任何人工审查。模型完全有可能生成危害宿主机的代码README 中举了一个直白的例子import os; os.system(sudo rm -rf /)因此官方在 benchmark.py 中加入了硬性保护正常运行评测前会检查环境变量AIDER_DOCKER未设置时直接打印警告并拒绝执行。这就是为什么整套流程“被设计为必须在 docker 容器内运行”。二、任务全景与目录构成评测工作拆成 3 个主要环节安装与初始化准备练习集、scratch 目录、构建容器镜像一次性完成运行评测在容器内对所有练习执行多轮修复-测试循环生成报告汇总各练习的成功/失败情况并输出 YAML 统计。benchmark 目录中的相关脚本与用途如下文件作用benchmark.py核心评测入口含运行评测、生成统计两大功能基于 typer 构建的 CLIprompts.py追加给模型的指令模板修改约束、测试失败反馈模板docker_build.sh构建名为aider-benchmark的镜像docker.sh启动评测容器并注入必要环境变量与挂载目录Dockerfile容器内多语言工具链Python/Go/Rust/Node/Java/Cnpm-test.sh、cpp-test.shJS 与 C 练习的测试驱动脚本swe_bench.py生成 SWE-bench 横向对比图的绘图脚本test_benchmark.py针对输出清洗函数cleanup_test_output的单元测试三、阶段一搭建评测环境以下步骤只需要执行一次。# 1) 克隆 aider 仓库如尚未克隆 git clone https://gitcode.com/GitHub_Trending/ai/aider aider # 2) 在 aider 仓库根目录下创建存放评测结果的 scratch 目录 cd aider mkdir tmp.benchmarks # 3) 克隆练习集仓库Aider-AI 组织下的 polyglot-benchmark放在 scratch 目录里 git clone polyglot-benchmark 仓库地址 tmp.benchmarks/polyglot-benchmark # 4) 构建 docker 镜像 ./benchmark/docker_build.sh几个值得留意的设计点tmp.benchmarks是默认的结果根目录。从源码看这个路径可用环境变量AIDER_BENCHMARK_DIR覆盖见 benchmark.py例如容器内它被设置为/benchmarkspolyglot-benchmark是 Exercism 风格的练习集内部按“语言 / exercises / practice / 练习名”组织每个练习目录里带有.docs/instructions.md等任务描述文件与.meta/config.json配置文件见后文第四节的运行原理docker_build.sh的核心就是调用docker build --file benchmark/Dockerfile -t aider-benchmark .把当前工作区作为构建上下文。容器里预装了哪些工具链从 Dockerfile 可以看到镜像会一次性装好几乎所有主流语言环境以覆盖 polyglot 练习集基于 buildpack-deps:jammy、Python 3.11由 deadsnakes PPA 提供、Go 1.21.5自动适配 amd64/arm64、Rustrustup、Node.js 20 Jest 相关依赖jest、babel/core、babel-jest、types/jest等、OpenJDK 21、CMake 与 Boost。镜像构建时还会以可编辑模式把/aider安装进 Python 环境并声明/aider为工作目录。四、阶段二运行评测启动容器./benchmark/docker.shdocker.sh 做了这些关键配置--memory12g/--memory-swap12g限制容器最多使用 12G 内存防止失控进程拖垮宿主机将当前目录挂载为/aider将tmp.benchmarks/挂载为/benchmarks评测产物落在宿主机磁盘上注入AIDER_DOCKER1放行上述运行检查与AIDER_BENCHMARK_DIR/benchmarks透传OPENAI_API_KEY等 API 密钥环境变量记录容器内 bash 历史HISTFILE/aider/.bash_history方便复查。容器内安装源码并运行# 以开发模式可编辑安装安装 aider # 这样跑的就是你 clone 下来的代码包括尚未提交的本地改动 pip install -e .[dev] # 运行评测 ./benchmark/benchmark.py a-helpful-name-for-this-run \ --model gpt-3.5-turbo \ --edit-format whole \ --threads 10 \ --exercises-dir polyglot-benchmark执行结束后会在tmp.benchmarks/下生成一个以时间戳命名的结果目录形如tmp.benchmarks/YYYY-MM-DD-HH-MM-SS--a-helpful-name-for-this-run如果目录名不带日期前缀脚本会自动补上YYYY-MM-DD-HH-MM-SS--见 resolve_dirname。默认情况下脚本会随机打乱全部练习的顺序再执行benchmark.py避免次序带来的系统偏差。常用参数说明README 推荐用./benchmark/benchmark.py --help查看全部参数并重点提示以下几个--model模型名称与你直接传给 aider 的写法一致--edit-format编辑格式名称同样与传给 aider 的一致。评测新模型时官方建议从whole起步——整文件重写格式兼容性最好--threads并行执行的练习数。调通环境或换新模型时先用单线程默认即 1结果稳定后可加大提速README 提到对 OpenAI API 用 10 线程效果不错--num-tests最多跑多少个练习就停止适合调试环境时小规模验证--keywords只运行名称中包含指定关键字的练习类似pytest -k--read-model-settingsfilename.yml从 YAML 文件加载模型设置格式可参考仓库中的 aider/website/docs/config/adv-model-settings.md。除此之外结合 benchmark.py 的 CLI 定义还有一批对进阶评测有用的参数参数默认值作用--tries/-r2每个练习最多尝试轮数第一轮生成 失败后带测试报错再修pass_rate_N就来自第 N 轮的成功率--num-ctx无覆盖模型上下文窗口大小--languages/-l无只评测指定语言逗号分隔如python,javascript--graphs关闭评测完成后生成图表--clean/-c关闭丢弃已有测试目录并重建干净副本--cont关闭继续匹配到的单一日志目录中未完成的测试--new关闭强制新建带日期的结果目录同名目录已存在时用--no-unit-tests关闭不执行单元测试--no-aider关闭不调用 aider供纯测试或对照实验--diffs关闭对多个结果目录做逐练习的成败 diff--replay无重放上一次评测的.aider.chat.history.md对话用于调试编辑格式等--reasoning-effort无对支持思考预算的模型设置推理强度--thinking-tokens无对支持思考预算的模型设置思考 token 上限--editor-model/--editor-edit-format无覆盖 architect 等模式下“编辑模型”的模型与格式--stats-languages无统计时只纳入指定语言的练习注意两个运行层面的约定并行调度由lox库的thread(threads)(run_test)完成benchmark.py评测期间网络重试超时会被拉长到 24 小时LONG_TIMEOUT 24 * 60 * 60见 benchmark.py尽量让每个练习都有完整的机会跑完。五、阶段三生成评测报告统计工作只是读取结果文件、汇总指标并不会执行任何不安全代码因此无需进入容器在宿主机上直接跑# 针对指定结果目录生成统计 ./benchmark/benchmark.py --stats tmp.benchmarks/YYYY-MM-DD-HH-MM-SS--a-helpful-name-for-this-run若省略目录名脚本会自动挑最近 24 小时内最新更新的结果目录find_latest_benchmark_dir。输出是一份 YAML 记录README 给出了完整样例- dirname: 2024-07-04-14-32-08--claude-3.5-sonnet-diff-continue test_cases: 225 model: claude-3.5-sonnet edit_format: diff commit_hash: 35f21b5 pass_rate_1: 57.1 pass_rate_2: 77.4 percent_cases_well_formed: 99.2 error_outputs: 23 num_malformed_responses: 4 num_with_malformed_responses: 1 user_asks: 2 lazy_comments: 0 syntax_errors: 1 indentation_errors: 0 exhausted_context_windows: 0 test_timeouts: 1 command: aider --sonnet date: 2024-07-04 versions: 0.42.1-dev seconds_per_case: 17.6 total_cost: 3.6346关键指标解读pass_rate_#是核心指标含义是“全部测试通过的任务所占百分比”。会有多个pass_rate_1、pass_rate_2……个数取决于--tries参数——第 N 轮表示给了模型 N 次“看到测试失败并继续修复”机会后的累计通过率。源码中对应逻辑位于 summarize_resultsYAML 同时记录了该次运行生效的全部设置以及运行时刻仓库的 git 提交哈希——若工作区存在未提交改动哈希会带上(dirty)后缀。评测前先git commit是官方建议的好习惯这样model、edit_format、commit_hash三者即可基本锁定一次可复现的实验哈希与脏状态判断见 benchmark.py其余字段刻画“过程健康度”percent_cases_well_formed格式正确的响应占比、error_outputs、num_malformed_responses无法被解析成合法编辑的响应次数、user_asks、lazy_comments模型偷懒只写注释未动手的次数、syntax_errors/indentation_errors、exhausted_context_windows上下文窗口耗尽次数、test_timeouts测试超时次数以及seconds_per_case单练习平均耗时、total_cost总花费。官方排行榜就由这类 YAML 记录汇总而成历史数据可以直接在本仓库中查看例如 aider/website/_data/polyglot_leaderboard.yml含dirname、test_cases、pass_rate_1、pass_rate_2、total_cost、commit_hash等字段的 225 个练习的完整记录更多说明见 aider/website/docs/leaderboards/index.md。如果你想贡献自己的评测结果官方欢迎通过 PR 向aider/website/_data/下的榜单数据文件提交新记录。六、评测循环的源码级工作原理6.1 练习发现与副本隔离脚本先按exercises/practice目录结构收集所有练习支持--languages过滤再把它们从原始练习集复制一份到带时间戳的结果目录中执行benchmark.py保证每次评测的输入是干净副本可被--clean随时重建。6.2 每个练习的单测循环对单个练习核心逻辑在 run_test_real其流程可以归纳为读取任务配置解析练习目录下的.meta/config.json得到test测试文件、example示例实现、solution待修改的骨架文件三类文件清单benchmark.py。.meta/**、.docs/**以及测试/示例文件都会被显式加入“忽略集合”保证模型只负责改真正的实现文件组装自然语言指令拼接.docs/introduction.md、.docs/instructions.md、instructions.append.md再追加 prompts.py 中定义的instructions_addendum模板其中强调“不要改动既有函数/类名可能被测试引用、只用标准库、不要建议安装新包”创建 Coder 并发送请求用Coder.create(...)以指定edit_format实例化编码器设置use_gitFalse、streamFalse、关闭 shell 命令建议并禁止加载任何额外文件coder.get_file_mentions lambda x: set()确保每次交互严格限于该练习的骨架文件benchmark.py执行单元测试按测试文件扩展名选择测试命令见 6.3超时上限 3 分钟timeout 60 * 3失败反馈重试只要测试失败就把报错原文拼进下一条消息模板为 prompts.py 中的test_failures“测试是正确的不要修改测试请修复代码”再次让模型修复直到通过或达到--tries次数benchmark.py。测试输出在回灌给模型前会经过cleanup_test_output清洗——去掉in 0.003s这类计时信息并把绝对路径替换成目录名避免与代码无关的随机噪声影响模型该函数还有配套单测 test_benchmark.py把Ran 5 tests in 0.003s\nOK规范成\nOK记录结果每个练习生成一份.aider.results.json含模型名、编辑格式、逐轮测试结果tests_outcomes、耗时、成本、各种错误计数与对话哈希等benchmark.py同时.aider.chat.history.md会留存完整对话供复盘或--replay重放。6.3 多语言测试命令映射run_unit_tests依据测试文件扩展名选择执行器benchmark.py扩展名测试命令.pypytest.rscargo test -- --include-ignored.gogo test ./....js/aider/benchmark/npm-test.sh符号链接共享镜像内 npm 依赖并执行npm run testnpm-test.sh.cpp/aider/benchmark/cpp-test.shcmake -DEXERCISM_RUN_ALL_TESTS1makecpp-test.sh.java./gradlew test细节处理还包括Java 测试会移除Disabled(...)注解强制全量执行每一轮测试前把原始测试文件重新复制回工作目录防止上轮被意外改动每轮结束后清理 Rusttarget/debug、Javabuild、Nodenode_modules等构建残留避免跨练习串扰。6.4 汇总统计逻辑--stats走 show_stats / summarize_results遍历结果目录下所有*.aider.results.json按练习聚合pass_rate_#并累加各类错误计数与 token 用量若某次(model, edit_format)组合出现多条记录会给出提示结果不完整已完成数小于总练习数时会打印 Warning。最后还会额外输出每练习平均成本与“按全量练习外推”的预计总成本。七、局限与注意事项这套脚本是面向 aider 开发者的内部工具普通终端用户通常不需要也不应该运行它由于 LLM 生成的代码会在无人监督下执行评测必须在 Docker 容器内进行且建议先单线程小规模验证环境、再上并行部分工具以 bash 脚本实现如docker.sh、npm-test.sh在 Windows 上难以直接使用--threads太大可能被 API 限流成本也会随--tries与练习数量线性上升量产前先用--num-tests和--keywords做小范围验证会更稳妥复现实验时请先提交代码再开跑否则结果会带上-dirty标记而难以精确定位代码版本。【免费下载链接】aideraider is AI pair programming in your terminal项目地址: https://gitcode.com/GitHub_Trending/ai/aider创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
