📝 docs(tsl): restructure part-2 benchmark section per review

- 五个考察点编号①-⑤并贯穿各轮回放表与横向对比,补「语法证据」维度
- 三轮小节统一模板:环境行 / 回放表 / 产出(存档链接) / 亮点 / 对照差异 / 成本口径
- 提示词差异与第二轮已读过第一轮示例改为就地披露
- 新增「三轮小结」回链后续升级方向;节名「实际场景」改「多环境实测」

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
csh
2026-07-08 13:33:45 +08:00
co-authored by Claude Fable 5
parent a744e72c61
commit 23779c95ab
+70 -39
View File
@@ -25,12 +25,13 @@ _让 AI 写对 TSL —— 不靠"像 Pascal"的猜测,只靠可核对的文档
- [架构设计](#架构设计)
- [目录结构](#目录结构)
- [后续升级方向](#后续升级方向)
- 👤 **第二部分 · 实际场景**(用户视角)
- 👤 **第二部分 · 多环境实测**(用户视角)
- [统一提示词](#统一提示词)
- [第一轮实测:Claude Code · Fable 5](#第一轮实测claude-code--fable-5)
- [第二轮实测:Codex CLI · GPT-5.5](#第二轮实测codex-cli--gpt-55)
- [第三轮实测:Qwen 3.6-27B](#第三轮实测qwen-36-27b)
- [横向对比](#横向对比)
- [三轮小结](#三轮小结)
---
@@ -228,9 +229,9 @@ playbook 目前已覆盖语法、函数、模块三大知识面,下一步按
<div align="center">
## 👤 第二部分 · 实际场景
## 👤 第二部分 · 多环境实测
**用户视角 —— 同一条提示词,不同环境实测**
**用户视角 —— 同一条提示词下的真实行为与产出**
</div>
@@ -240,21 +241,32 @@ playbook 目前已覆盖语法、函数、模块三大知识面,下一步按
> 💬 _阅读AGENTS.md。写一个tsl策略。获取昨天的主板所有股票涨幅排名,取前50股票代码_
考察点只有五个:**函数敢不敢编、语法照不照抄、文件后缀选没选对、会不会自己验证、拿不准时是硬写还是明说**。
考察点五个,后文的过程回放与横向对比均按编号交叉标注:
- **① 函数真实性** —— 函数敢不敢编,是否逐一经 skill 查证
- **② 语法证据** —— 语法照不照抄,外形是否取自语法页「可直接照写示例」
- **③ 文件模型** —— `.tsl` / `.tsf` 后缀选没选对
- **④ 自主验证** —— 会不会自己验证:运行实测 / 静态检查 / 什么都不做
- **⑤ 边界诚实** —— 拿不准、验不了时,是硬写还是明说
三轮以这条原文为基准:第二、三轮仅在末尾追加了各自的输出文件路径,其余一字未改——代价是「③ 文件模型」在后两轮被显式给定、失去考察效力(对比表已如实标注)。
### 第一轮实测:Claude Code · Fable 5
> 环境:Claude Code(版本未记录)· Fable 5`tsl-api-reference` skill 已注册;本机装有离线 TSL 解释器(无数据仓库连接);输出路径未指定,文件名自定。
**真实过程回放**(每一步都能对应第一部分的机制):
| 步骤 | 实际行为 |
| :-- | :-- |
| 🧭 首跳照走 | 读 `AGENTS.md` → 进 `docs/tsl/index.md` 总入口 → 按路由取用快速落代码 / 控制流 / 数组集合三个语法页 |
| 🔍 函数全部查证 | 调用 `tsl-api-reference` skill 逐一核实 `getAbkbyDate` · `lastTradeDay` · `stockZf8` · `appendArray` · `sortTableByField` —— **五个函数零编造** |
| 📄 文件模型判对 | 一次性取数任务 → 按规则判为 `.tsl`,存档于 `scripts/main_board_top50_zf_claude.tsl` |
| ✅ 主动验证 | 本机解释器实测:键表构造、循环截断、排序等 builtin 逻辑全部跑通,整个文件编译通过 |
| 🗣 诚实报告边界 | 数据仓库函数离线环境没有(`function not found`),**如实说明需在天软客户端端到端确认,而不是谎称全部跑通** |
| 步骤 | 考察点 | 实际行为 |
| :-- | :--: | :-- |
| 🧭 首跳照走 | — |`AGENTS.md` → 进 `docs/tsl/index.md` 总入口 → 按路由取用快速落代码 / 控制流 / 数组集合三个语法页 |
| 🔍 函数全部查证 | ① | 调用 `tsl-api-reference` skill 逐一核实 `getAbkbyDate` · `lastTradeDay` · `stockZf8` · `appendArray` · `sortTableByField` —— **五个函数零编造** |
| 📖 语法照抄有据 | ② | 落码外形——`for ... in` 遍历、`array("Key": value)` 键表、`begin/end` 块——均见于取用三页的「可直接照写示例」,无文档外写法 |
| 📄 文件模型判对 | ③ | 一次性取数任务 → 按规则判为 `.tsl`,文件名自定,存档于 `scripts/main_board_top50_zf_claude.tsl` |
| ✅ 主动验证 | ④ | 本机解释器实测:键表构造、循环截断、排序等 builtin 逻辑全部跑通,整个文件编译通过 |
| 🗣 诚实报告边界 | ⑤ | 数据仓库函数离线环境没有(`function not found`),**如实说明需在天软客户端端到端确认,而不是谎称全部跑通** |
**产出代码(原样):**
**产出代码**(原样,已存档:[scripts/main_board_top50_zf_claude.tsl](scripts/main_board_top50_zf_claude.tsl)):
```tsl
// 主板股票昨日涨幅排名前 50
@@ -292,25 +304,26 @@ end
return top50;
```
**两处细节见功力**"昨天"没有偷懒写成日历昨天,而是用 `lastTradeDay(date())` 取**最近一个已收盘交易日**——周一运行会正确落在上周五;"主板 = 上证A股 + 深证A股"这个组合也是从函数文档示例里查证的,不是想当然。
**亮点** "昨天"没有偷懒写成日历昨天,而是用 `lastTradeDay(date())` 取**最近一个已收盘交易日**——周一运行会正确落在上周五;"主板 = 上证A股 + 深证A股"这个组合也是从函数文档示例里查证的,不是想当然。
**成本:** 总耗时 16 分 57 秒;token 为模型自估——输入约 15–20 万(多数命中提示缓存),输出约 0.5–1 万。
**成本token 为模型自估)** 总耗时 16 分 57 秒;输入约 15–20 万(多数命中提示缓存),输出约 0.5–1 万。
### 第二轮实测:Codex CLI · GPT-5.5
> 环境:OpenAI Codex CLI v0.142.5 · gpt-5.5reasoning xhigh);提示词在第一轮基础上追加指定了输出路径 `scripts/main_board_top50_zf_codex.tsl`。
> 环境:OpenAI Codex CLI v0.142.5 · gpt-5.5reasoning xhigh);提示词在第一轮基础上追加指定了输出路径 `scripts/main_board_top50_zf_codex.tsl`。注意:运行时仓库内已有本 README 的第一轮同题示例,模型读到过该片段(其后仍逐一核对了函数事实)。
**真实过程回放:**
| 步骤 | 实际行为 |
| :-- | :-- |
| 🧭 首跳照走 | 读 `AGENTS.md` → 进 `docs/tsl/index.md` → 按路由取用 TS-SQL / 控制流 / 数组集合语法页,并核对 `toolchain.md` 确认验证入口仍是占位 |
| 🧗 Skill 未注册,自行接通 | `tsl-api-reference` 不在其会话技能清单里 —— 没有放弃也没有瞎编,循索引找到仓库内 `skills/tsl-api-reference/SKILL.md`,直接用 `python` 调起 `lookup.py` 完成检索 |
| 🔍 函数全部查证 | `--kw` 圈定候选后逐一 `--name` 核实 `getAbkbyDate` · `stockZf3` · `yesterday` · `spec` · `specDate` · `sortTableByField` · `min` · `length` · `writeLn`;查 `MarketTable` 无此函数 → 正确判断它是数据表名,转 TS-SQL 语法页核对写法 |
| 🚫 证据驱动的弃用 | 查 `getTopN` 存在,但其文档记录示例运行报 `not found` —— **主动弃用**,改用文档已证明的 `order by ... desc` + 手动循环取前 50 |
| 🗣 诚实报告边界 | PATH 中无 `tsl`/`tslcli`,无法真实运行 → 只做静态检查(无裸 `=` 赋值、无声明区、关键语句在位),并如实说明"没法做真实 TSL 运行验证" |
| 步骤 | 考察点 | 实际行为 |
| :-- | :--: | :-- |
| 🧭 首跳照走 | — |`AGENTS.md` → 进 `docs/tsl/index.md` → 按路由取用 TS-SQL / 控制流 / 数组集合语法页,并核对 `toolchain.md` 确认验证入口仍是占位 |
| 🧗 Skill 未注册,自行接通 | — | `tsl-api-reference` 不在其会话技能清单里 —— 没有放弃也没有瞎编,循索引找到仓库内 `skills/tsl-api-reference/SKILL.md`,直接用 `python` 调起 `lookup.py` 完成检索 |
| 🔍 函数全部查证 | ① | `--kw` 圈定候选后逐一 `--name` 核实 `getAbkbyDate` · `stockZf3` · `yesterday` · `spec` · `specDate` · `sortTableByField` · `min` · `length` · `writeLn` |
| 📖 语法转页核对 | ② | 查 `MarketTable` 无此函数 → 正确判断它是数据表名,转 TS-SQL 语法页核对 `select ... end` 写法 |
| 🚫 证据驱动的弃用 | ① | 查到 `getTopN` 存在,但其文档记录示例运行报 `not found` —— **主动弃用**,改用文档已证明的 `order by ... desc` + 手动循环取前 50 |
| 🗣 诚实报告边界 | ④ ⑤ | PATH 中无 `tsl`/`tslcli`,无法真实运行 → 只做静态检查(无裸 `=` 赋值、无声明区、关键语句在位),并如实说明"没法做真实 TSL 运行验证" |
**产出代码(原样):**
**产出代码**(原样,已存档:[scripts/main_board_top50_zf_codex.tsl](scripts/main_board_top50_zf_codex.tsl)):
```tsl
end_t := yesterday();
@@ -337,9 +350,11 @@ end;
return result;
```
**可圈可点:** `getTopN` 的弃用是「块级证据」规则的教科书式执行——函数在索引里存在不等于能用,文档里的负向记录同样是事实;Skill 未注册时循 `AGENTS.md` 路由自行找到本地脚本,说明**硬约束层的兜底指路生效了**。**一处对照差异:** "昨天"用的是 `yesterday()` 日历昨天,未处理周末/节假日——第一轮用 `lastTradeDay` 规避了周一取到周日的问题。
**点:** `getTopN` 的弃用是「块级证据」规则的教科书式执行——函数在索引里存在不等于能用,文档里的负向记录同样是事实;Skill 未注册时循 `AGENTS.md` 路由自行找到本地脚本,说明**硬约束层的兜底指路生效了**。
**成本** 本轮工作 9 分 21 秒;token 为 `/status` 实测——**总量 18.5 万 = 输入 15.9 万 + 输出 2.57 万**(上下文余量 42%)
**对照差异** "昨天"用的是 `yesterday()` 日历昨天,未处理周末/节假日——第一轮用 `lastTradeDay` 规避了周一取到周日的问题
**成本(token 为 `/status` 实测):** 本轮工作 9 分 21 秒;**总量 18.5 万 = 输入 15.9 万 + 输出 2.57 万**(上下文余量 42%)。
### 第三轮实测:Qwen 3.6-27B
@@ -347,15 +362,15 @@ return result;
**真实过程回放:**
| 步骤 | 实际行为 |
| :-- | :-- |
| 🧭 首跳照走 | 读 `AGENTS.md` → 进 `docs/tsl/index.md` → 取用快速落代码 / TS-SQL 语法页,并直接调用 `lookup.py` 检索(其环境中文输出乱码,带病工作) |
| 🌀 文档缺口处反复打转 | 盯上 `StockZf_No`(区间涨幅排名),但该函数的 `sort_by` / `return_type` 文档确实没给取值 —— 数十轮反复检索、重读同一页,**期间明确引用铁律"无文档结论……不发明语法",始终拒绝猜参数**,最终绕开该函数 |
| ⚠️ 起念假设,又自行回撤 | 中途多次想按"惯例"假设 `MarketTable``pre_close` 等字段名与 `refof`/`refsof` 用法,推演后自行放弃该路线,改用全部经查证的 `stockZf` 循环方案 |
| 🔍 最终函数全部有据 | 落码只用查证过的 `yesterday` · `getAbkbyDate` · `setSysParam`/`PN_Stock` · `stockZf` · `drange` · `dateToStr` · `echo` |
| 🤐 收尾缺验证与边界声明 | 产出后仅回读文件自查"逻辑看起来正确",未做静态检查,也未声明"未经运行验证" —— 三轮中唯一没交代验证边界的 |
| 步骤 | 考察点 | 实际行为 |
| :-- | :--: | :-- |
| 🧭 首跳照走 | — |`AGENTS.md` → 进 `docs/tsl/index.md` → 取用快速落代码 / TS-SQL 语法页,并直接调用 `lookup.py` 检索(其环境中文输出乱码,带病工作) |
| 🌀 文档缺口处反复打转 | ① | 盯上 `StockZf_No`(区间涨幅排名),但该函数的 `sort_by` / `return_type` 文档确实没给取值 —— 数十轮反复检索、重读同一页,**期间明确引用铁律"无文档结论……不发明语法",始终拒绝猜参数**,最终绕开该函数 |
| ⚠️ 起念假设,又自行回撤 | ② | 中途多次想按"惯例"假设 `MarketTable``pre_close` 等字段名与 `refof`/`refsof` 用法,推演后自行放弃该路线,改用全部经查证的 `stockZf` 循环方案 |
| 🔍 最终函数全部有据 | ① | 落码只用查证过的 `yesterday` · `getAbkbyDate` · `setSysParam`/`PN_Stock` · `stockZf` · `drange` · `dateToStr` · `echo` |
| 🤐 收尾缺验证与边界声明 | ④ ⑤ | 产出后仅回读文件自查"逻辑看起来正确",未做静态检查,也未声明"未经运行验证" —— 三轮中唯一没交代验证边界的 |
**产出代码(原样):**
**产出代码**(原样,已存档:[scripts/main_board_top50_zf_qwen3.6-27b.tsl](scripts/main_board_top50_zf_qwen3.6-27b.tsl)):
```tsl
#! 获取昨天主板所有股票涨幅排名,取前50股票代码
@@ -386,26 +401,42 @@ begin
end;
```
**这一轮最有意思** 铁律对 27B 小模型同样有约束力——面对文档缺口,它宁可绕路几十轮也没编造参数;但代价是收敛效率的巨大差距,且收尾少了前两轮的验证动作与诚实边界。它还反向暴露了知识库自己的洞:`StockZf_No` 的参数取值枚举确实没写——正是「后续升级方向 · 检索质量 / 分类治理」要补的文档债。交易日处理同样最弱:`yesterday()``dt - 1` 全按日历日,周末/节假日双双踩空。
**亮点** 铁律对 27B 小模型同样有约束力——面对文档缺口,它宁可绕路几十轮也没编造参数;还反向暴露了知识库自己的洞:`StockZf_No` 的参数取值枚举确实没写——正是「后续升级方向 · 检索质量 / 分类治理」要补的文档债。
**对照差异:** 代价是收敛效率的巨大差距,收尾也少了前两轮的验证动作与诚实边界;交易日处理三轮中最弱——`yesterday()``dt - 1` 全按日历日,周末/节假日双双踩空。
**成本(模型自估,口径偏小):** 约 1.5–2.5 万 token。其事后自查归因:**20+ 次无效检索全耗在 `StockZf_No` 没写的参数枚举上**;9252 行的 `equity/misc.md` 被反复载入约 15 次;`lookup.py` 输出 GBK/UTF-8 乱码又加剧了关键词重试。注意:该自估按"读到的内容量"计,未计 30+ 次工具调用的上下文重复携带,实际消耗应显著更高。
### 横向对比
| 观察维度 | Claude Code · Fable 5 | Codex CLI · GPT-5.5 | Qwen 3.6-27B |
**五个考察点:**
| 考察点 | Claude Code · Fable 5 | Codex CLI · GPT-5.5 | Qwen 3.6-27B |
| :-- | :-- | :-- | :-- |
| ① 函数真实性 | skill 逐一查证 5/5,零编造 | 全部查证,并依据文档负向记录弃用 `getTopN` | 全部查证;面对 `StockZf_No` 文档缺口拒绝编参数,绕路重来 |
| ② 语法证据 | 外形均见于取用三页的可照写示例 | `MarketTable` 判为表名后转 TS-SQL 页核对写法 | 拒绝按"惯例"假设字段名与 `refof` 用法,回撤改走已查证路线 |
| ③ 文件模型 | `.tsl` 判定正确(文件名自定) | `.tsl`(文件名由提示词给定,未构成考察) | `.tsl`(文件名由提示词给定,未构成考察) |
| ④ 自主验证 | 本机解释器实测 builtin 跑通、整文件编译通过 | 环境无解释器,静态检查 | 仅回读文件自查,无静态/运行验证 |
| ⑤ 边界诚实 | 明说 dotnet 函数需客户端确认 | 明说无法真实运行验证,列出静态证据 | 收尾未声明未验证状态 |
**额外观察与成本:**
| 维度 | Claude Code · Fable 5 | Codex CLI · GPT-5.5 | Qwen 3.6-27B |
| :-- | :-- | :-- | :-- |
| Skill 接入 | 已注册,直接调用 | 未注册 → 循路由自行找到 `lookup.py` 手动调用 | 未注册 → 手动调用(检索输出乱码,带病工作) |
| 函数真实性 | skill 逐一查证 5/5,零编造 | 全部查证,并依据文档负向记录弃用 `getTopN` | 全部查证;面对 `StockZf_No` 文档缺口拒绝编参数,绕路重来 |
| 交易日处理 | `lastTradeDay` 取最近交易日,周一跑正确落上周五 | `yesterday()` 日历昨天,逢周末可能取到无行情日 | `yesterday()``dt-1` 全日历日,三轮中最弱 |
| 文件模型 | `.tsl` 判定正确 | `.tsl`(提示词给定文件名) | `.tsl`(提示词给定文件名) |
| 自主验证 | 本机解释器实测 builtin 跑通、整文件编译通过 | 环境无解释器,静态检查 | 仅回读文件自查,无静态/运行验证 |
| 边界诚实度 | 明说 dotnet 函数需客户端确认 | 明说无法真实运行验证,列出静态证据 | 收尾未声明未验证状态 |
| 检索效率 | 一次路由到位 | 一次路由到位 + 证据驱动取舍 | 在同一文档缺口反复打转数十轮 |
| 总耗时 | 16m57s | 9m21s | 未记录 |
| token | 自估:输入 1520 万 / 输出 0.51 万 | 实测:18.5 万 = 15.9 万入 + 2.57 万出 | 自估:约 1.5–2.5 万(未计上下文重复,口径偏小) |
> **对照说明:** ① 第二、三轮提示词在第一轮基础上各自追加了输出文件名,文件命名被显式给定;第一轮产出原名 `main_board_top50_zf.tsl`,存档时加 `_claude` 后缀以区分三轮;② 第二轮运行时仓库内已有本 README 的同题示例,模型读到过该片段(其后仍逐一核对了函数事实);③ 三轮本地条件不同——第一轮机器装有离线 TSL 解释器,第二轮 PATH 无解释器,第三轮未尝试任何运行验证;④ 第三轮的代理框架与耗时未记录,token 为模型按"内容量"事后自估、未计多轮上下文重复携带——三轮 token 口径各不相同(实测 / 含缓存自估 / 内容量自估),不可直接横比。以上数字与行为仅作真实记录,不构成严格受控对比。
### 三轮小结
- **机制得到验证** —— skill 已注册、未注册自行接通、检索乱码带病工作三种接入条件下,三轮全部零函数编造;「禁止发明语法 + 首跳路由 + 块级证据」对 27B 开源小模型同样有约束力。
- **验证与诚实呈梯度** —— 三轮收尾分别是解释器实测、静态检查、无验证亦无声明;在 `toolchain.md` 执行入口实体化之前,「必须验证」写不成硬约束,收尾质量只能靠模型自觉。
- **实测暴露的文档债均已入计划** —— `StockZf_No` 参数取值缺失 →「检索质量 · 参数类型实证」;`equity/misc.md` 兜底堆积拖慢检索 →「分类治理」;`lookup.py` 输出编码 →「检索质量」。
---
<div align="center">