TriSoul 三魂共识架构 · DeepSWE 评测成果 · 2026-08-27

用同一个小模型,把"做不出来"的题做出来了

DeepSWE 是一套让前沿大模型也只能做对七成的编程题库。我们拿了其中 38 道「小模型 deepseek-v4-flash 几乎全军覆没」的难题,让 TriSoul 架构驱动同一个 flash 模型再做一遍——全程断网、每题只有一次机会。结果:单次通过率从官方的 10.5% 提到 30.6%,与贵它 50 倍的 GPT-5.4 打平;另有 10 道题只差 1–2 个隐藏测试。

30.6%
TriSoul 单次通过率(11/36 题)
同一个 flash 模型官方成绩:10.5%
2.9×
相对底座模型的通过率提升
(同一批题、同一模型、单次尝试)
≈ GPT-5.4
与 GPT-5.4 xhigh 在同批题上持平(28.3%)
单次成本约为其 1/10
+10 题
离满分只差 1–2 个隐藏测试
(DeepSWE 只认 100% 通过)

一、成绩:同一批难题,谁能过

DeepSWE 官方公开了 62 个「模型 × 推理强度」配置在 113 道题上的全部 28010 次运行记录。我们选了官方 flash 模型通过率 ≤ 1/4 的 38 道题(其中 17 道 flash 是 0/4 四连败),用 TriSoul 驱动同一个 flash 模型跑一遍,再和官方各模型在同样这 38 道题上的记录对比:

同一批难题上谁能过:TriSoul vs 官方各模型同一批难题上谁能过:TriSoul vs 官方各模型38 道「官方 flash ≤1/4」的题 · 官方 = DeepSWE v1.1 全量 rollout(mini-swe-agent,每题 4 次尝试)· TriSoul 每题只跑 1 次、全程断网deepseek-v4-flash(官方,同底座)10.5% 16/152 次 · $0.10/次TriSoul ⟵ 同一个 flash30.6% 11/36 题 · 单次尝试gpt-5.4 xhigh(官方)28.3% 43/152 次 · $5/次全部 62 配置池化(官方)35.1% 3276/9346 次deepseek-v4-pro(官方)38.8% 59/152 次 · $0.25/次gemini-3.7-flash high(官方)50.7% 77/152 次 · $1.7/次kimi-k3 max(官方)50.3% 76/151 次 · $4.5/次glm-5.3 max(官方)61.6% 93/151 次 · $4.2/次claude-opus-5 全档(官方)58.7% 436/743 次 · $5–12/次0%25%50%75%100%
图 1 · 官方数字为「尝试级通过率」(每题 4 次尝试的平均),TriSoul 每题只跑 1 次。成本为官方公布的每次运行均价。数据:00-数据/官方对照.md
三个可以直接说出口的事实

口径说明:这 38 题是按「官方 flash 表现差」挑的,所以 flash 的 10.5% 略被低估(回归均值效应);对其它模型没有这个偏差。TriSoul 每题一次、官方每题四次,所以我们的数字不能和官方的「四次里至少过一次」(pass@4)比,只能和「平均每次」(pass@1)比——图上用的就是后者。

38 题里,离满分差几个隐藏测试?(reward 只认 100% 通过)绿=通过 · 橙=差 1–2 个 · 红=差更多 · 灰字=测试总数 · * = r2 本批* awilix-async-container-initializatio差 0 /24* bandit-structured-nosec-directives差 0 /69csstree-shorthand-expansion-compress差 0 /79fastapi-implicit-head-options差 0 /43* ink-grid-box-layout差 0 /25koota-composite-trait-aspects差 0 /51meriyah-explicit-resource-declaratio差 0 /49numba-stencil-boundary-modes差 0 /29opa-rego-rule-profiling差 0 /25sqlfmt-create-table-ddl-formatting差 0 /32sqlite-utils-safe-import-checkpoints差 0 /60* go-critic-doc-link-checker差 1 /3koota-pair-relation-tracking差 1 /38* pwntools-tube-multiplexing差 1 /73* testem-bail-on-test-failure差 1 /90* updo-policy-alerting差 1 /17adaptix-name-mapping-aliases差 2 /44bandit-incremental-cache-control差 2 /88kea-atomic-signal-selectors差 2 /12kombu-single-active-consumer-priorit差 2 /85quill-shared-toolbar-focus差 2 /13fastapi-deprecation-response-headers差 3 /137* happy-dom-deterministic-intersection差 3 /14* koota-query-predicates差 4 /43effect-sse-httpapi-streaming差 5 /47* termenv-preserve-ansi-resets差 7 /35kombu-virtual-queue-dead-lettering差 8 /76valibot-recursive-schema-composition差 8 /10* superjson-error-stack-serialization差 11 /80* textual-kitty-key-phases差 11 /23* gql-incremental-graphql-delivery差 14 /17* langchain-request-coalescing差 15 /50pest-character-class-coalescing差 22 /104* obsidian-linter-auto-table-of-conten差 41 /41* participle-grammar-conflict-analysis差 77(含编译/崩溃连坐) /91* expr-try-catch-errors差 79(含编译/崩溃连坐) /79
图 2 · 每道题离满分差几个隐藏测试。绿色 = 通过;橙色 = 差 1–2 个;红色两条超长柱是编译失败/测试进程崩溃导致的「连坐」,不是真做错了那么多。

二、它是怎么做到的

TriSoul 一步是怎么走的需求 + 仓库三魂并行盲写A 对齐官B 博识官C 实证官互评表决每魂投别人 1 票胜者独走执行落败要点挂账 tips下一步(带着 tips 与胜者的思考)
图 3 · TriSoul 的一步。三个"灵魂"是同一个模型带着不同职责的三份并行实例。

TriSoul 不换模型、不联网、不看答案。它做的事只有一件:让同一个模型的三份实例在每一步各自独立地想、互相挑毛病、然后只让胜出的那份往下走。

它的价值不在"想得更聪明",而在把一次性的判断变成有对手的判断:一个人写的方案要先过另外两个人的眼睛,才有资格落地。两个本轮转录里的例子:updo 第 14 步,系统的工作快照凭空"记住"了一次从未发生的 commit,三个灵魂各自独立识破、各自跑 git status 实测后才继续;pwntools 第 9 步,一个灵魂想通过改弱测试绕开尚未修好的死锁,另外两票精确点名"weakens test_accept_closed … to dodge the bug",2:0 否决。

三、三个转胜的故事

awilix 从零字节到满分 —— Opus 5 官方 20 次 0 通过的题

老版本(08-26)2664 秒里一行代码都没写:三个灵魂在脑内反复推演一个 TypeScript 类型冲突,直到超时,交了 0 字节。
新版本(08-27)同一个冲突两步内定案,第 607 秒开始写代码;编译器报出 28 个错误后,三个灵魂在同一轮里独立诊断出同一根因,并收敛到仓库里已有的写法。
结果20 个自造测试 + 181 个全量测试全绿,隐藏测试 24/24,1543 秒收工。这道题官方 Opus 5 是 0/20、GPT-5.4 是 0/4。

决胜的一票是这样写的:"C 是完整实现且真的跑了 npm test,A 只改了第一个文件从未验证"——票选的是执行与验证,不是文采。

bandit-structured 两个灵魂倒下,第三个扛到底 —— 全场 62 个配置只有 7% 通过率的"地狱题"

第 6 步是关键实现步。这一步灵魂 B 的思考超过 50 万字触发熔断,灵魂 C 栈溢出——只剩灵魂 A 一个人。A 在这一步的摘要里精确点出了要修的缺陷类型("只查了多行语句里的一行被抑制"),一次写对,后续没有返工。最终隐藏测试 69/69、回归测试 282/282 全过,1953 秒收工——比老版本快 33%、补丁小 13%。官方这道题:flash 0/4、pro 0/4、Opus 5 3/20。

老版本输在一次执行事故:同一次写文件调用里把同一个文件列了两遍,后一次空内容覆盖了刚写好的 435 行模块,被迫凭记忆重写,细节走样,挂在唯一一条回归测试上。新版本把改动折进既有文件、用外科手术式编辑,天然避开了这类事故。

ink-grid 两条"多写的测试"救回来的题 —— Opus 5 官方 2/20

老版本挂在 3 个隐藏测试上,背后是两处独立缺陷:minmax(min, 固定max) 有多余空间时没顶满 max;没有显式 width 时不填充父容器宽度。老版本 21 个自造测试全绿——因为没有一条测试压到这两条路径。新版本多写了两条针对性的自测:一条显式给 width={10} 把可用空间打满,一条 grid: fills parent width 故意不给宽度。两条测试各自逼出一处缺陷,结果 25/25

这个故事同时是本轮最重要的教训(见第七节):自己写的测试,只有真的去压需求没写明的地方,才算测试。(本案例经终审复核修正:原分析把两处缺陷归并成了一处。)

四、一天迭代带来了什么

08-26 到 08-27 之间,插件做了一轮修复(去掉融合轮、加思考熔断、修假收官、放宽 tips 挂账等)。在 14 道两版都跑过的题上:

3 → 0
3 题由败转胜,0 题由胜转败
−19%
平均用时 3328s → 2680s
3 → 1
撞满 90 分钟被强杀的题数
2
灾难型回归(编译失败 / 测试进程崩溃)
同一道题,老版本(r1 · 08-26) → 新版本(r2 · 08-27):隐藏测试通过比例老版本新版本绿线=进步 红线=退步 · 数字为 f2p 通过数/总数awilix-async-container-initialization0/24 → 24/24 ✅testem-bail-on-test-failure78/90 → 89/90ink-grid-box-layout22/25 → 25/25 ✅updo-policy-alerting15/17 → 16/17bandit-structured-nosec-directives69/69 → 69/69 ✅go-critic-doc-link-checker2/3 → 2/3happy-dom-deterministic-intersectionob11/14 → 11/14superjson-error-stack-serialization69/80 → 69/80koota-query-predicates41/43 → 39/43termenv-preserve-ansi-resets30/35 → 28/35langchain-request-coalescing39/50 → 35/50textual-kitty-key-phases15/23 → 12/23participle-grammar-conflict-analysis89/91 → 14/91expr-try-catch-errors77/79 → 0/790%50%100%
图 4 · 同一道题两个版本的隐藏测试通过比例。上半部分是进步,下半部分是退步。最底下两条是"连坐型":一处编译错误或一个死循环把整个测试进程拖垮,几十条本来能过的测试被判未运行。
同一道题的用时:老版本 vs 新版本(秒,上限 5400 = 90 分钟)灰=老版本 红=新版本 · ⏱ = 撞满 90 分钟被强杀(rc=124)termenv-preserve-ansi-resets33931083superjson-error-stack-serialization12461327updo-policy-alerting10381405awilix-async-container-initialization26641543go-critic-doc-link-checker5393 ⏱1720testem-bail-on-test-failure26601950bandit-structured-nosec-directives29261953langchain-request-coalescing5364 ⏱2371happy-dom-deterministic-intersectionob15963125textual-kitty-key-phases37003316participle-grammar-conflict-analysis24713834ink-grid-box-layout52684237koota-query-predicates35054252expr-try-catch-errors5362 ⏱5397 ⏱
图 5 · 同一道题两个版本的用时。老版本 3 题撞满 90 分钟,新版本 1 题。

五、这些成绩可信吗

我们对评测环境做了作弊面审计,并把两条可能被质疑的点写在明处:

可能的质疑实测结论
能不能联网抄答案?不能。容器接内部网络、无默认网关,唯一出口是一条只转发到模型 API 的 TCP 隧道;DNS、直连 IP、SNI 伪装全部实测失败。模型自己也试过:4 道题里调用了 web_search,零次拿到数据
仓库历史里有没有藏答案?没有。浅克隆到基准提交,git rev-list --all --not HEAD = 0。这也是 DeepSWE 官方在发现 Claude Opus 4.6/4.7 在另一基准上"读 git log 抄 gold commit"后刻意设计的。
能不能改测试、改判分?测试文件在判分前被重置为官方版本;判分用官方 grader、原样计分。我们发现了一条理论上可以预置分数文件的敞口,并确认本批没有任何一次走过它(已记录待官方修补)。
是不是把分数往好了算?相反。obsidian 一题因官方测试命名漂移被判 0/41,实际验证器输出 35/41——我们仍按 0 计

六、如果跑满 113 题,总分会是多少(推算)

我们只跑了 flash 做不好的 38 题。把官方 113 题按 flash 的 4 次通过数分成五桶,已测的两桶用实测,未测的三桶(75 题)按假设外推:

如果跑满 113 题:DeepSWE 总分推算(pass@1)已测 38 题用实测通过率(0/4 桶 7/21、1/4 桶 4/15),未测 75 题按三种假设外推;名次按官方 62 个配置deepseek-v4-flash 官方实测53.3% 第 38 / 62 位TriSoul · 其他 75 题维持 flash 原分60.0% 第 26 位 · 只替换已测 38 题TriSoul · 其他题获同类型提升63.8% 第 23 位 · 转化 22.5% 剩余失败TriSoul · 上界参考(提升翻倍)67.5% 第 14 位榜首 claude_opus_5_max73.6% 官方0%25%50%75%100%
图 6 · 三种假设下的 DeepSWE 总分。计算脚本 scratchpad/extrapolate.py,数据 00-数据/全量推算.json
flash 官方通过数题数flash 通过率TriSoul
0/4220%33.3%(实测 7/21,1 题环境阻断)
1/41625%26.7%(实测 4/15,1 题环境阻断)
2/42350%未测 · 假设 50% / 61.2%
3/42975%未测 · 假设 75% / 80.6%
4/423100%未测 · 假设 100%
113 题总分53.3%(第 38 / 62)60.0%(其他题不变,第 26)· 63.8%(同类型提升,第 23)

这是推算不是实测:①未测三桶是 flash 本来就常做对的题,TriSoul 会不会在这些题上引入回归(本轮在难题上观察到 4 条实质回归)没有数据;②TriSoul 每题只有 1 次样本,11/36 的 95% 置信区间大约是 17%–47%;③假设"同类型提升"是把难题上的转化率直接平移,是否成立要跑了才知道。要把推算变成实测,按 3 并发跑满剩余 75 题约需 22 小时机时。

七、边界与下一步

我们不回避的三件事

本轮最大的收获是一条跨所有失败案例都成立的规律:自己写的测试和自己写的实现共用同一套思路,所以自测全绿不等于做对。 下一轮的改进方向由此展开——让测试独立于实现(先写测试再写代码、三个灵魂互相跑对方的测试)、让投票必须引用需求原文或测试输出而不是比文采、平票时保护少数派而不是轮流坐庄。这些改动大多是提示词与流程层面的,改动量小、可快速验证。