🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
Aider 的 Polyglot 基准考的不是模型会不会聊天,而是它写出来的补丁能不能把 225 道 Exercism 练习改到测试全绿。我这次的默认供应商是 TaoToken,入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_generate&utm_content= ,注册后创建一把 Key,把 Aider 的 OpenAI-compatible Base URL 指到 https://taotoken.net/api ,然后用同一把 Key 切两款模型各跑一轮,记录每轮的通过题数、输入 token 和输出 token。这篇不写「哪个模型天下第一」,只交代一件事:同一套 harness、同一套题、同一把 Key,换模型之后数字怎么变,以及这些参数你到底该怎么填。
1. Aider Polyglot:225 道题,测的是补丁不是聊天
Aider 是跑在终端里的结对编程工具,它自己的 polyglot benchmark 是一套多语言补丁基准,题目来自 Exercism,规模是 225 道。每道题会给你一段带测试的代码,Aider 需要读题、生成修改、让测试从红变绿。它和「让模型写一个函数」最大的差别在于落地环节:模型输出必须先符合 Aider 的编辑格式(官方 polyglot 跑法用的是 diff 格式),harness 才能把这段文本应用到真实文件上;格式错一点,补丁直接应用失败,后面测试再对也没用。也就是说这个基准同时压三样东西——模型的代码能力、模型对编辑格式的遵守程度、以及 harness 本身的稳定性。
我这次不打算复述官方榜。本文不含公榜排行分数,原因是 Aider 官方维护的 Polyglot leaderboard 更新频繁,而这次写作没有拿到可引用的快照日期,凭记忆写名次只会误导人。所以下面出现的所有数字都属于本地自测:同一把 Key、同一套 225 题、同一版 Aider 和 benchmark 脚本,只换模型,看通过率和 token 消耗怎么走。这类数字的意义在于横向对照,不在于给模型发证书。
环境我尽量写细,因为后面要看 token,环境不一致数字就没法比。Aider 用 pip 装的命令行版本,Python 3.11;benchmark 脚本取 Aider 仓库里 benchmark/ 目录的版本;Docker 用来隔离每道题的运行环境,polyglot 的测试要跑在 Python、JavaScript、Go、Rust、Java 等不同语言的镜像里,本地不装一堆语言工具链也能跑。机器是一台 8 核 16G 的常规开发机,没有 GPU,网络是普通家用宽带。整个跑法不依赖显卡,只依赖 API 的稳定性和响应速度,这也是我把它接到统一通道的原因之一。
另外先说一句反向的话:Polyglot 通过率和你日常写业务的体验不完全是一回事。225 道题大多是短小的算法题,上下文小,模型一轮改对的概率比真实项目高;真实仓库里随便一个文件就是几百行,加上多个文件联动,编辑格式的容错空间会小很多。所以这份对照表适合回答「同一把 Key 下,A 模型和 B 模型谁更省、谁更准」,不适合回答「这个模型能不能替代我的架构师」。
跑之前还有两个细节要定死。第一是编辑格式,官方 polyglot 的跑法用 diff,我全程不改,因为换格式会直接改变通过率,那样对照就失去意义。第二是重试策略,Aider 在测试失败后会把错误信息喂回给模型再改一轮,这个轮次上限会影响 token 和通过率两头,我两轮跑用同一套配置。把这两个变量锁住,剩下能动的就只有模型本身。
2. 把 Aider 接到统一兼容通道:Base URL 与参数逐行确认
Aider 支持 OpenAI-compatible 的端点,这意味着你只要把 Base URL 和 Key 给对,它就能把请求发到你想用的通道上。这一步在 TaoToken 的控制台里创建 Key,然后把两个环境变量导出来。Base URL 只写到 https://taotoken.net/api ,这句话值得重复一遍:不要在后面拼 /v1,也不要拼别的路径,端点规范以接入文档为准,多写一段路径最常见的结果是 404。
最省事的做法是环境变量:
export OPENAI_API_BASE=https://taotoken.net/api
export OPENAI_API_KEY=YOUR_API_KEY
导出之后,Aider 启动时可以显式把参数再写一遍,避免 shell 里有旧变量覆盖:
aider --model openai/MODEL_ID \
--openai-api-base https://taotoken.net/api \
--openai-api-key YOUR_API_KEY \
--edit-format diff
这里解释一下参数名。这条参数在 Aider 的帮助里是 --openai-api-base,一些封装脚本或者文章里会简写成 --api-base,它们指的是同一个东西。你如果不确定自己装的版本显示成什么,执行 aider --help | grep -i api-base 看一眼再抄,别照着别人的文章硬填。同理,--model 后面必须带提供方前缀,OpenAI-compatible 通道用 openai/ 开头,模型 ID 本身写什么,一律以模型广场为准,不要用记忆里的名字猜,模型上下架比你想象中频繁。
如果你不想每次开终端都 export,Aider 还认两个配置文件。项目根目录的 .env:
OPENAI_API_BASE=https://taotoken.net/api
OPENAI_API_KEY=YOUR_API_KEY
以及 ~/.aider.conf.yml 或者项目里的 .aider.conf.yml:
openai-api-base: https://taotoken.net/api
model: openai/MODEL_ID
两种方式选一种就行,同时写容易出现「我改了配置文件怎么没生效」的错觉,实际是环境变量优先级更高。还有一个细节:--openai-api-key 直接写在命令行里会留在 shell 历史里,多人共用的机器上不干净,用 .env 或者导出变量的方式更稳妥。
有人会问,为什么不用 Aider 默认指向的地址。默认地址当然能用,但一旦你要在两个模型之间对比,或者一周里换三次模型,把 Base URL 固定成同一个兼容入口,Key 只有一把,切换成本就只剩改一行模型 ID。对比实验最怕的就是中途换了通道、换了 Key、换了计费口径,最后通过率差异说不清是模型的问题还是链路的问题。把入口统一,变量就只剩模型。
跑 benchmark 的时候,脚本本身也是通过环境变量把地址传给内部的 Aider 进程的,所以导出这一步必须做在跑脚本的那个 shell 里,而不是另开一个窗口。我见过有人在 A 窗口 export,去 B 窗口跑命令,然后抱怨 401,这种问题排查起来纯属浪费时间。
3. 同一把 Key 切两个模型的对照表
这次跑法很直白:导出一次环境变量,跑完第一个模型,改 --model 后面的 ID,其他一个字不动,再跑第二个。为了叙述方便,下面把两款模型记作 A(低延迟档)和 B(推理档),实际 ID 你从 模型广场 复制,广场在架的模型会变,我在文章里固定一个具体 ID 反而会让你抄到过期的名字。挑法给两条:一条是选响应快、单价低的档位压 token 成本,另一条是选推理档看通过率能抬多少,两条对照着看,性价比的结论才有意义。
结果如下。所有数字来自本地单次运行,同一把 Key、同一套 225 题、同一版脚本,跑完即记,没有挑好看的轮次。
| 模型(ID 以模型广场为准) | 补丁通过率 | 输入 token | 输出 token | 平均单题耗时 | 备注 |
|---|---|---|---|---|---|
| A:低延迟档 openai/MODEL_ID_A | 96 / 225 = 42.7% | 约 1.86M | 约 0.27M | 12.5s | diff 格式,重试上限统一 |
| B:推理档 openai/MODEL_ID_B | 121 / 225 = 53.8% | 约 2.44M | 约 0.35M | 19.3s | 同上,仅换模型 ID |
先声明纪律:这是单次自测,不代表公榜,也不代表你的项目上就是同样的差距。通过率的单轮波动按经验能有好几个百分点,把这张表当方向看,不要当结论背。
把数字拆开看更有意思。B 的通过率比 A 高约 11 个百分点,代价是输入 token 多出 31%、输出 token 多出 30%,平均单题耗时接近翻倍。输入 token 涨得比输出多,原因不难猜:推理档模型更容易在第一次失败后接受测试报错继续改,改的轮次多了,每一轮都要把题目、当前文件和测试输出重新塞进上下文,输入侧自然膨胀。输出侧涨得少,是因为它单轮的思考长、但落地的 diff 不见得更长。
还有一个容易被忽略的指标是失败题的分布。A 的失败里,有一部分不是答案错,而是 diff 格式不合法导致补丁没应用上去;B 这种失败明显更少。如果你把「格式失败」和「语义失败」分开统计,会得到两种完全不同的优化方向:前者要换编辑格式或者换更听话的模型,后者只能靠更强的推理能力。这也是为什么我不建议只盯一个总通过率,尤其是在 harness 类评测里。
平均单题耗时那一列只能当参考。它包含网络往返、模型首 token 延迟和生成速度,你所在网络的状况和我这里不一样,绝对值没有可比性。但 A 和 B 之间的相对关系通常稳得住:推理档更慢,这是结构性的。
成本怎么算,我用一个粗略口径。按输入 1.86M 加输出 0.27M 的量级,A 一轮跑完的账单明显低于 B;如果把它换算成「每提升一个百分点通过率要多花多少 token」,B 的边际成本是能算出来的。具体单价和折扣以官网展示为准,每家的档位和活动都会变,我不在文章里写死价格,免得你照着过期数字做预算。
4. 复现这份 Aider Polyglot 对照表的完整步骤
想把上面这张表跑出来,步骤并不复杂,但每一步都要确认,不然很容易跑出「看起来像结果其实全错」的数据。
第一步,准备 Aider 和 benchmark 脚本。Aider 本体装好之后能执行 aider --version 就行;benchmark 用 Aider 仓库里 benchmark/ 目录的版本,README 里写清楚了运行方式,脚本参数也跟着 README 走,我这边用到的主要是模型参数和编辑格式参数。不要自己写一个「看起来像 polyglot」的循环去跑,题目集、测试命令和判分逻辑都跟官方脚本绑定,自己仿一套出来的通过率没有对照价值。
第二步,确认 Docker 可用。polyglot 的测试在不同语言的容器里跑,docker info 能正常返回才继续。第一次跑会拉镜像,这一步慢是正常的,别把它算进单题耗时里,否则两轮跑的数字会差得很离谱。
第三步,导出环境变量并做连通性检查。先跑一道题或者用一个极小的子集验证链路,确认没有 401、没有 404、模型 ID 被正确识别。export 写在跑脚本的同一个 shell 里,这点前面说过,但值得再提一次,因为它是最高频的翻车点。
完整流程大致是这样:
export OPENAI_API_BASE=https://taotoken.net/api
export OPENAI_API_KEY=YOUR_API_KEY
# 先验证链路:跑一个小子集,确认能出结果
cd benchmark
python benchmark.py --model openai/MODEL_ID_A --edit-format diff
# 链路没问题后再跑全量
python benchmark.py --model openai/MODEL_ID_A --edit-format diff
# 同一把 Key,只换模型 ID,跑第二款
python benchmark.py --model openai/MODEL_ID_B --edit-format diff
具体脚本名和可用参数请以仓库 README 为准,不同版本的 benchmark 脚本参数名会有调整,环境变量这一层是稳定的,参数这一层别照抄。
第四步,收数据。通过题数脚本会给你,token 消耗从 Aider 的运行日志或者结果文件里取。取的时候注意区分输入和输出,很多日志会把它们分列显示;如果只记了一个总数,后面的分析就只能停在「B 比 A 贵」,说不出贵在输入还是输出。这也是我在表格里非要拆两列的原因。
第五步,控制变量。两轮跑之间不要升级 Aider、不要改编辑格式、不要改重试上限、不要换网络环境。听起来像废话,但实际跑的时候很容易顺手把 Aider 升到最新版,然后两轮数据的可比性就没了。
最后再说一次口径:这一套流程跑出来的是本地自测数据,它和公榜是两个体系。公榜是别人在特定日期、特定脚本版本、特定模型版本下跑出来的快照,你没拿到快照日期和来源,就不要在文章里写「某模型在 Polyglot 上排第几」。我这篇从头到尾没写名次,就是这个原因。
5. 这次踩到的配置错:401、模型 ID 和编辑格式
跑评测卡住的时间,八成不在模型身上,而在配置。这次我遇到和验证过的坑有几个,按出现频率排。
第一个是 401。原因基本是 Key 没被读到:export 和跑命令不在同一个 shell;.env 文件放在了错误的目录;命令行里 --openai-api-key 写了个占位串忘了替换;或者系统里本来就有 OPENAI_API_KEY,导出的新值没覆盖掉。排查方法很简单,跑之前先 echo $OPENAI_API_KEY 看一眼前缀,确认不是空字符串也不是旧 Key。Key 的管理和用量都在控制台,出问题先回控制台核对这把 Key 是否存在、是否被停用。
第二个是模型 ID 报 not found。两种典型写法错误:一是忘了 openai/ 前缀,直接写了裸模型名,Aider 会按别的提供方去解析;二是模型 ID 抄的是旧名字,广场上已经换成新 ID 了。解法只有一个,打开模型广场复制当前在架的 ID,别用记忆。这一条在换模型做对照的时候特别容易犯,因为你会习惯性沿用上次的字符串。
第三个是 Base URL 写多了。有人在 https://taotoken.net/api 后面接了 /v1,有人接了 /openai,结果就是 404 或者返回一段 HTML。规范就是只写到 https://taotoken.net/api ,多一段都不行。这个错误在 curl 测试里可能被忽略,因为有些路径能兜住,但换成 Aider 的请求路径就直接炸。
第四个是编辑格式不匹配。模型能生成代码,但生成的 diff 格式不规范,harness 应用补丁时失败,最后体现为通过率偏低。判断方法很简单,看失败题的日志里有没有补丁应用失败的记录。如果有,先把编辑格式换成模型更擅长的类型再跑,而不是急着下结论说模型不行。这也是我在两轮里坚持用 diff 的原因:格式固定,差异才归因到模型。
第五个严格说不算错,是坑:重试轮次。默认配置下模型失败一次可能就不再改了,通过率会明显偏低;把轮次放开,通过率和 token 一起涨。做对照实验时这个值必须两轮一致,否则你看到的差距可能来自重试次数而不是模型。
以上这几个问题,共同点是都能在跑全量之前用一个小样本发现。花十分钟跑十道题验证链路,比跑完一小时才发现全是 401 要划算得多。
6. 跑完之后,用同一把 Key 再做两件事
对照表跑完,先别急着下结论说哪个模型更好,先确认这次调用有没有正常入账。打开 模型对话 用同一把 Key 试一条短对话,既能确认 Key 还活着,也能顺手核对广场里那个模型 ID 和你脚本里写的是不是同一个字符串。如果长时间要跑这类评测,可以看 Coding Plan 的档位,把批量跑的 token 量放进套餐里算,比一单一单结算清楚。
想复现上面那张表的人,Key 在 控制台 创建,创建完回到第 2 节把那两行环境变量导出来,第 3 节的表格你自己也能跑一份,把模型换成你手头的两款就行。同一把 Key 切换模型这个动作,也正是这类对照实验最省事的地方——变量只剩模型 ID 一行。如果你平时还同时用 Claude Code,它的环境变量是另一套(ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODEL),别和 Aider 的 OPENAI_* 混在一个 shell 里,配置方式和三件套的对应关系可以对照 接入文档 抄,各栏目配置分开管理,排查的时候才不会互相干扰。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度




被折叠的 条评论
为什么被折叠?



