这次评测的目标很直接:在同一套项目代码、同一份 .trellis 业务知识库、同一个 Claude Code、同一个模型与思考程度下,实测把项目接入从 Trellis 换成 mini-trellis 后,完成同样的开发任务能不能更快、更省 Token。
测试涵盖空载启动、日常写代码、查项目规范、按规范写实现,以及跨会话记规则与迭代修改,共 6 组任务,每组独立跑 3 次。结果显示:在两边自动检查全部通过的前提下,mini-trellis 在每一组任务上都比 Trellis 更快、处理 Token 更低;全部任务累计耗时减少 38.4%(提速 1.62×),累计处理 Token 减少 40.1%(少用 162.7 万 Token)。
一、评测前提与环境配置
为了保证对比公平,除了安装的工具本身不同之外,其余所有条件完全一致,每次测试都在全新初始化的独立项目目录与独立宿主历史目录中运行:
| 评测维度 | 固定配置 / 对比项 | 具体说明 |
|---|---|---|
| 评测目的 | mini-trellis vs Trellis 端到端效率对比 |
检验去掉重型阶段工作流、改为轻量记忆层后,实际完成任务的耗时、轮次与 Token 开销差异 |
| 对比对象 | mini-trellis v0.3.1 vs Trellis v0.7.0-beta.4 |
均在空白 Git 仓库中执行标准初始化(init --claude --yes),各自加载默认 Hook、脚本与指令模板 |
| 宿主与模型 | Claude Code v2.1.306 + deepseek-v4-flash |
统一开启最高思考程度(--effort max),使用相同的无头调用参数,单任务超时与环境完全一致 |
| 项目代码与知识库 | 同一套 Python 业务代码 + 同一份 .trellis/ 资料 |
包含 3 个待实现/修改的 Python 模块(label_utils.py、pipeline_impact.py、retry_policy.py)、4 份后端规范(.trellis/spec/backend/)与 1 篇背景研究笔记(.trellis/research/),两边业务文件字节完全一致 |
| 二者的核心差异 | 启动注入体积与查找方式不同 | mini-trellis 会话启动仅注入约 1,173 字符(目录说明 + mem recall 按需检索入口);Trellis 会话启动注入约 8,674 字符(包含完整工作流手册与状态说明),并在项目下生成默认引导任务目录 |
统计口径说明:耗时为命令启动到退出的实际墙上时间(秒);轮次为 Claude Code 统计的交互轮数(
num_turns);处理 Token 为单次任务处理总量(未缓存输入 + 输出 + 缓存命中读取,其中输入与缓存互斥,不重复计算;处理 Token 衡量上下文处理总量,不等同于 API 账单费用)。
二、整体评测结果与图表对比
全部 6 组任务(每组 3 次,含 15 次单会话任务与 3 条四阶段跨会话长链,每侧各 27 个独立会话)整体表现如下:
- 总耗时减少 38.4%(快 1.62 倍):完成全部评测任务,
mini-trellis总计用时 472.2 秒,Trellis总计用时 766.5 秒,累计节省 294.3 秒。 - 总处理 Token 减少 40.1%(少用 162.7 万):
mini-trellis累计处理 2,426,377 Token,Trellis累计处理 4,052,930 Token。无论是未缓存的新鲜输入、模型输出还是多轮累积的缓存读取,mini-trellis在每一项任务上都低于Trellis。 - 总交互轮次减少 27.8%:
mini-trellis累计 273 轮,Trellis累计 378 轮,少走了 105 轮探索和读写。
各题型对比汇总大表
下表列出 6 组任务的 3 次中位数 与 3 次合计值(括号内为 mini-trellis 相比 Trellis 的节省比例):
| 评测任务 | 考查场景 | 中位耗时 (mini / Trellis) | 3次总耗时 (mini / Trellis) | 中位轮次 | 中位 Token (mini / Trellis) | 3次总 Token (mini / Trellis) | 自动检查 |
|---|---|---|---|---|---|---|---|
空载启动开销 (O00) |
不读写文件,直接回复 pong,测启动注入底噪 |
1.8s / 2.9s (-39.3%) |
5.3s / 8.4s (-37.3%) |
1 / 1 | 11,568 / 13,577 (-14.8%) |
34,771 / 40,671 (-14.5%) |
3/3 完成 |
常规函数实现 (N01) |
不依赖历史知识,按代码注释实现函数与单元测试 | 16.9s / 18.6s (-9.2%) |
44.5s / 61.2s (-27.4%) |
8 / 12 | 84,894 / 131,354 (-35.4%) |
245,432 / 415,141 (-40.9%) |
3/3 通过 |
查规范:计算公式 (R01) |
从项目规范中找准容量/流量计算公式与异常策略 | 14.5s / 20.4s (-28.8%) |
39.6s / 72.2s (-45.1%) |
10 / 9 | 57,250 / 79,308 (-27.8%) |
156,893 / 244,180 (-35.7%) |
3/3 通过 |
查规范:服务权限 (R02) |
从项目规范中核对只读工具服务的 5 项权限开关 | 7.2s / 16.3s (-55.9%) |
27.4s / 44.9s (-39.0%) |
5 / 9 | 38,827 / 70,435 (-44.9%) |
154,545 / 208,752 (-26.0%) |
3/3 通过 |
按规范实现业务代码 (I01) |
先查业务规范再实现 assess_notice 核心逻辑与测试 |
49.8s / 57.1s (-12.7%) |
147.2s / 170.8s (-13.8%) |
16 / 22 | 192,589 / 248,742 (-22.6%) |
550,464 / 800,339 (-31.2%) |
3/3 通过 |
跨会话记规则与迭代 (M01) |
连续 4 个新会话:记规则 → 实现 → 改规则 → 更新实现 | 68.1s / 132.9s (-48.8%) |
208.2s / 409.0s (-49.1%) |
49 / 72 | 425,957 / 713,587 (-40.3%) |
1,284,272 / 2,343,847 (-45.2%) |
3/3 通过 |
| 全部任务总计 | 6 组任务 × 3 次重复(每侧共 27 个会话) | — | 472.2s / 766.5s (-38.4%) |
273 / 378 轮 (-27.8%) |
— | 242.6万 / 405.3万 (-40.1%) |
自动检查通过 |
为什么 mini-trellis 更快、更省?
- 启动底噪更小,每一轮背负的上下文更轻:从
O00可以直接看到,哪怕什么文件都不读,Trellis首轮注入的 8,674 字符也会让初始输入多出近 2,000 Token;一旦进入多轮工具调用(如I01、M01动辄 15~20 轮),首轮多出来的数千 Token 会在后续每一轮缓存读取中被反复累加。 - 定位直接,少了无关目录排查:提示词里不直接告诉模型文件名时,
mini-trellis通过mem recall或精简入口直接定位.trellis/spec/下的目标规范;而Trellis经常顺着启动说明去翻找.trellis/tasks/00-bootstrap-guidelines/prd.md等任务引导目录,多花了好几轮grep/Read和模型输出。
三、题目设计与单次轮次详细表现
评测没有在提示词里透露具体规范文件名或公式,全部要求模型自己去项目里查找并完成任务。下面按题型列出设计意图与每次运行的实测数据。
1. 空载启动开销(O00)
- 题目设计:要求模型只回复
pong,禁止读写任何文件。用来剥离工具调用干扰,纯粹测量两个产品在会话启动时的固定注入开销。 - 表现分析:三次测试两边都是 1 轮完成、0 次工具调用。
mini-trellis每次固定输入 11,565 Token,Trellis固定输入 13,475 Token(多出 1,910 Token,对应启动 Hook 多注入的约 7,500 字符工作流说明)。此外Trellis的启动提示要求模型先输出确认语再回答问题,导致输出 Token 和耗时也明显更高。
| 轮次编号 | mini 耗时 | Trellis 耗时 | mini 轮数 | Trellis 轮数 | mini 输入 / 输出 / 缓存读 | mini 总 Token | Trellis 输入 / 输出 / 缓存读 | Trellis 总 Token |
|---|---|---|---|---|---|---|---|---|
| 第 1 次 | 1.78s | 2.30s | 1 | 1 | 11,565 / 70 / 0 | 11,635 | 13,475 / 12 / 0 | 13,487 |
| 第 2 次 | 1.60s | 2.94s | 1 | 1 | 11,565 / 3 / 0 | 11,568 | 13,475 / 132 / 0 | 13,607 |
| 第 3 次 | 1.90s | 3.19s | 1 | 1 | 11,565 / 3 / 0 | 11,568 | 13,475 / 102 / 0 | 13,577 |
| 中位数 / 合计 | 1.78s / 5.28s | 2.94s / 8.43s | 1 / 3 | 1 / 3 | — | 11,568 / 34,771 | — | 13,577 / 40,671 |
2. 常规函数实现(N01)
- 题目设计:根据
label_utils.py中的函数文档实现normalize_label标签规范化函数,并用unittest编写单元测试。这道题不需要查阅历史规范,用来检验日常普通编码场景下记忆层会不会带来额外累赘。 - 表现分析:两边都没有去调记忆检索,直接读代码、改代码、跑测试,3 次全部通过外部单元测试。即便第 1 次
mini-trellis比Trellis多用了 1 轮(13 轮 vs 12 轮),因为上下文负担轻,耗时依然更短(16.9s vs 18.6s),总 Token 反而省了 26.5%。
| 轮次编号 | mini 耗时 | Trellis 耗时 | mini 轮数 | Trellis 轮数 | mini 输入 / 输出 / 缓存读 | mini 总 Token | Trellis 输入 / 输出 / 缓存读 | Trellis 总 Token |
|---|---|---|---|---|---|---|---|---|
| 第 1 次 | 16.90s | 18.60s | 13 | 12 | 14,388 / 1,977 / 80,128 | 96,493 | 17,000 / 2,354 / 112,000 | 131,354 |
| 第 2 次 | 17.06s | 28.63s | 8 | 13 | 13,974 / 2,312 / 68,608 | 84,894 | 19,633 / 3,553 / 183,424 | 206,610 |
| 第 3 次 | 10.51s | 14.01s | 7 | 9 | 13,293 / 1,216 / 49,536 | 64,045 | 15,577 / 1,824 / 59,776 | 77,177 |
| 中位数 / 合计 | 16.90s / 44.47s | 18.60s / 61.24s | 8 / 28 | 12 / 34 | — | 84,894 / 245,432 | — | 131,354 / 415,141 |
3. 查规范:计算公式与异常策略(R01)
- 题目设计:项目里既有研究阶段的背景讨论(
.trellis/research/notice-background.md),也有正式敲定的后端规范(.trellis/spec/backend/notice-impact.md)。要求模型找出关于“公告容量影响与实际流量影响”的最终计算公式、3 种缺失/模糊场景的处理策略,以及原文出处。评分器通过 AST 数值探针验证公式真伪。 - 表现分析:两边 3 次均找对规范并全部通过数值探针、策略与引文匹配自动校验。
mini-trellis每次都先执行mini-trellis mem recall检索再读取规范,3 次总耗时 39.6s,比Trellis(72.2s)省了将近一半时间;Trellis在第 1、2 次中还去翻阅了.trellis/tasks/00-bootstrap-guidelines/prd.md,拉高了耗时和输出量。
| 轮次编号 | mini 耗时 | Trellis 耗时 | mini 轮数 | Trellis 轮数 | mini 输入 / 输出 / 缓存读 | mini 总 Token | Trellis 输入 / 输出 / 缓存读 | Trellis 总 Token |
|---|---|---|---|---|---|---|---|---|
| 第 1 次 | 9.03s | 34.64s | 7 | 9 | 13,839 / 1,488 / 24,832 | 40,159 | 22,874 / 7,026 / 49,408 | 79,308 |
| 第 2 次 | 16.07s | 20.40s | 10 | 12 | 15,419 / 3,105 / 40,960 | 59,484 | 19,525 / 3,923 / 68,224 | 91,672 |
| 第 3 次 | 14.52s | 17.12s | 11 | 9 | 14,467 / 2,591 / 40,192 | 57,250 | 18,749 / 3,123 / 51,328 | 73,200 |
| 中位数 / 合计 | 14.52s / 39.62s | 20.40s / 72.16s | 10 / 28 | 9 / 30 | — | 57,250 / 156,893 | — | 79,308 / 244,180 |
4. 查规范:服务权限边界(R02)
- 题目设计:查询项目对“只读业务工具服务”的权限规定,逐项返回是否只读、是否允许代理问答、是否允许原生 SQL、是否允许触发爬虫、是否允许固定参数化
SELECT(5 个独立布尔值)及原文出处。 - 表现分析:这道题差距非常直观。
mini-trellis三次都直接用mem recall命中.trellis/spec/backend/read-only-tools.md,4~6 轮即给出答案,中位耗时仅 7.2s;Trellis每次都要在.trellis/spec、.trellis/tasks、.trellis/workspace之间搜索和翻看引导文件,用了 7~11 轮,中位耗时 16.3s,是mini-trellis的 2.27 倍。
| 轮次编号 | mini 耗时 | Trellis 耗时 | mini 轮数 | Trellis 轮数 | mini 输入 / 输出 / 缓存读 | mini 总 Token | Trellis 输入 / 输出 / 缓存读 | Trellis 总 Token |
|---|---|---|---|---|---|---|---|---|
| 第 1 次 | 7.17s | 16.25s | 4 | 9 | 12,925 / 901 / 24,064 | 37,890 | 18,452 / 2,831 / 49,152 | 70,435 |
| 第 2 次 | 13.12s | 16.97s | 6 | 11 | 13,487 / 1,365 / 62,976 | 77,828 | 17,799 / 2,800 / 66,560 | 87,159 |
| 第 3 次 | 7.13s | 11.70s | 5 | 7 | 13,331 / 920 / 24,576 | 38,827 | 18,368 / 2,070 / 30,720 | 51,158 |
| 中位数 / 合计 | 7.17s / 27.42s | 16.25s / 44.92s | 5 / 15 | 9 / 27 | — | 38,827 / 154,545 | — | 70,435 / 208,752 |
5. 按规范实现业务代码(I01)
- 题目设计:要求模型自己去项目里查找业务规范,按规范实现
pipeline_impact.py中的assess_notice函数并编写测试。外部评分器会用 27 组边界测试(包含正常计算、真实 0 值、口径不匹配、缺失元数据、布尔值冒充数字、负数/无穷大、输入字典防篡改等)做严格验收。 - 表现分析:两边 3 次实现的 27 个测试点全部满分通过。在这样一个 16~23 轮的重度编码任务里,启动注入和无关文件读取通过多轮缓存被明显放大:
Trellis3 次累计缓存读取高达 69.2 万 Token,而mini-trellis只有 45.8 万 Token,总 Token 节省了 31.2%(55.0 万 vs 80.0 万)。
| 轮次编号 | mini 耗时 | Trellis 耗时 | mini 轮数 | Trellis 轮数 | mini 输入 / 输出 / 缓存读 | mini 总 Token | Trellis 输入 / 输出 / 缓存读 | Trellis 总 Token |
|---|---|---|---|---|---|---|---|---|
| 第 1 次 | 49.84s | 57.12s | 16 | 23 | 20,156 / 10,385 / 162,048 | 192,589 | 23,195 / 10,558 / 288,896 | 322,649 |
| 第 2 次 | 51.69s | 63.63s | 16 | 22 | 18,640 / 10,044 / 128,384 | 157,068 | 26,324 / 13,266 / 209,152 | 248,742 |
| 第 3 次 | 45.71s | 50.01s | 18 | 17 | 23,298 / 9,445 / 168,064 | 200,807 | 24,345 / 10,171 / 194,432 | 228,948 |
| 中位数 / 合计 | 49.84s / 147.24s | 57.12s / 170.75s | 16 / 50 | 22 / 62 | — | 192,589 / 550,464 | — | 248,742 / 800,339 |
四、跨会话记规则与迭代汇总(M01 四阶段长链)
题目设计
M01 模拟真实开发中最常见的“多会话知识沉淀与变更”闭环。在同一项目内连续开启 4 个全新的独立会话(后一个会话没有前一个会话的聊天上下文,只能靠项目里沉淀的文档、日志或记忆检索获取信息):
- 阶段 1(记下初始规则):告知模型回调重试规则改为“transient 失败最多尝试 2 次,permanent 尝试 1 次”,要求更新项目知识并留一条开发日志(journal)。
- 阶段 2(新会话按规则实现):开启新会话,不提示次数,只让模型“按项目当前确认的规则实现
retry_policy.py的max_attempts并写测试”(验收要求transient -> 2)。 - 阶段 3(新会话变更规则):开启新会话,告知因“上游已经确认幂等保障”,
transient总尝试次数改为 4 次,要求更新原主题知识并留开发日志说明变更原因。 - 阶段 4(新会话按新规则更新实现):再次开启新会话,让模型按最新确认的规则更新
retry_policy.py与测试(验收要求transient -> 4)。
整链与四阶段对比汇总
3 条完整四阶段长链跑下来,两边在阶段 2(2 次)和阶段 4(4 次)的代码验收全部通过,但在维护项目知识与跨会话复用的成本上拉开了明显差距:
| 阶段 / 汇总维度 | mini 中位耗时 | Trellis 中位耗时 | 耗时节省 | mini 中位轮次 | Trellis 中位轮次 | mini 中位 Token | Trellis 中位 Token | Token 节省 |
|---|---|---|---|---|---|---|---|---|
阶段 1:记下初始规则 (save) |
17.46s | 25.13s | -30.5% |
12 | 16 | 114,783 | 177,679 | -35.4% |
阶段 2:新会话实现代码 (reuse) |
14.39s | 24.18s | -40.5% |
14 | 14 | 91,190 | 110,961 | -17.8% |
阶段 3:变更规则与日志 (update) |
18.76s | 47.17s | -60.2% |
11 | 20 | 106,884 | 225,193 | -52.5% |
阶段 4:新会话更新实现 (reuse-updated) |
17.32s | 21.79s | -20.5% |
15 | 16 | 118,788 | 143,531 | -17.2% |
| 单条四阶段整链(中位数) | 68.10s | 132.89s | -48.8% |
49 | 72 | 425,957 | 713,587 | -40.3% |
| 3 条整链总计(12 个会话合计) | 208.18s | 408.97s | -49.1% |
149 | 222 | 1,284,272 | 2,343,847 | -45.2% |
3 条长链的逐次与逐阶段明细
- 为什么阶段 3(变更规则与留日志)差距高达 60%?
mini-trellis在新会话启动后,用 1 次mem recall就找到了阶段 1 更新的规范、开发日志以及历史会话记录,直接改好规范并追加日志,3 次分别只用了 18.8s / 22.1s / 17.4s。而Trellis没有统一检索入口,为了按它的规范更新知识并写日志,模型在.trellis/spec、.trellis/workspace、.trellis/scripts下反复读取和核对格式,3 次分别花了 46.3s / 64.8s / 47.2s(其中第 2 次单阶段就跑了 37 轮、消耗 47.4 万 Token)。
| 链编号 | 阶段 | mini 耗时 | Trellis 耗时 | mini 轮数 | Trellis 轮数 | mini 总 Token | Trellis 总 Token | 代码验收 |
|---|---|---|---|---|---|---|---|---|
| 第 1 条链 | 1. 记下规则 (save) |
17.80s | 25.13s | 13 | 16 | 118,945 | 177,679 | — |
2. 按规则实现 (reuse) |
21.95s | 39.65s | 12 | 14 | 115,452 | 110,961 | 通过 (2次) |
|
3. 改规则留日志 (update) |
18.76s | 46.32s | 9 | 18 | 106,197 | 225,193 | — | |
4. 按新规则更新 (reuse-updated) |
17.32s | 21.79s | 15 | 15 | 118,788 | 97,946 | 通过 (4次) |
|
| 第 1 条链合计 | 75.83s | 132.89s | 49 | 63 | 459,382 | 611,779 | 全部通过 | |
| 第 2 条链 | 1. 记下规则 (save) |
13.53s | 24.68s | 10 | 12 | 94,047 | 172,220 | — |
2. 按规则实现 (reuse) |
14.39s | 24.18s | 14 | 16 | 91,190 | 140,991 | 通过 (2次) |
|
3. 改规则留日志 (update) |
22.14s | 64.77s | 13 | 37 | 128,616 | 474,086 | — | |
4. 按新规则更新 (reuse-updated) |
14.20s | 42.78s | 11 | 22 | 85,080 | 231,184 | 通过 (4次) |
|
| 第 2 条链合计 | 64.25s | 156.41s | 48 | 87 | 398,933 | 1,018,481 | 全部通过 | |
| 第 3 条链 | 1. 记下规则 (save) |
17.46s | 32.27s | 12 | 23 | 114,783 | 264,903 | — |
2. 按规则实现 (reuse) |
13.18s | 19.06s | 14 | 13 | 71,337 | 103,995 | 通过 (2次) |
|
3. 改规则留日志 (update) |
17.40s | 47.17s | 11 | 20 | 106,884 | 201,158 | — | |
4. 按新规则更新 (reuse-updated) |
20.06s | 21.17s | 15 | 16 | 132,953 | 143,531 | 通过 (4次) |
|
| 第 3 条链合计 | 68.10s | 119.68s | 52 | 72 | 425,957 | 713,587 | 全部通过 |