📝 docs(tsl): record three-agent benchmark in README

- rewrite Part 2 as real tests: Claude Fable 5 / Codex GPT-5.5 / Qwen3.6-27B
- add cross-env comparison table with per-round token caliber caveats
- backfill roadmap evidence: lookup.py encoding fix, equity/misc.md 9252-line pile-up

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
csh
2026-07-08 12:21:22 +08:00
co-authored by Claude Opus 4.8
parent e3fd9625dc
commit 76a6523ac6
+111 -12
View File
@@ -199,7 +199,7 @@ playbook 目前已覆盖语法、函数、模块三大知识面,下一步按
- **证据随迁不走样** — `可直接照写示例` 等块级身份标注要在目录搬迁后保持有效、不失链。
**🗂 分类治理 · codegen 归类校准与全量可用性核验**
- **方向** — 复核 codegen 母本(builtin 12 类 / dotnet 21 类)的函数归类,纠正错分与 `misc` 兜底堆积,让类目边界清晰;并对全部 12455 个函数逐一探针实测,给每个函数标注真实可用性状态。
- **方向** — 复核 codegen 母本(builtin 12 类 / dotnet 21 类)的函数归类,纠正错分与 `misc` 兜底堆积(如 `equity/misc.md` 单页已累至 9252 行、759 个函数),让类目边界清晰;并对全部 12455 个函数逐一探针实测,给每个函数标注真实可用性状态。
- **目的** — 一方面让 `--kw` 关键词检索落在符合直觉的类目、候选更准;另一方面用实测的「可用 / 真缺失 / 参数不对」三态,取代"索引里有就默认能用"的假设,从源头杜绝把不可用函数写进生成代码。
- **难点**
- **重分类无生成器** — codegen 生成脚本只剩 `.pyc`,母本 md 已是产物;重新归类只能直接改 md 母本与 routes 并同步维护索引一致性,不能再靠重跑生成器。
@@ -215,6 +215,7 @@ playbook 目前已覆盖语法、函数、模块三大知识面,下一步按
-`function_index.tsv` 增加**参数类型实证**:当前仍有约 2600 个函数(builtin 246 / dotnet 2382)的参数声明为 `any`/`object`,需用 `dataType()` 逐一收紧。
- 引入**语义检索**embedding),让"我想算个动量因子"这类模糊意图也能命中相关函数。
- 补齐关键词索引的中文近义词,降低 `--kw` 空命中率。
- 修复 `lookup.py` 跨环境输出编码(GBK/UTF-8):第三轮实测中,乱码直接导致大量重复检索。
---
@@ -226,7 +227,7 @@ playbook 目前已覆盖语法、函数、模块三大知识面,下一步按
</div>
> 这一部分没有虚构:**同一条提示词,投给不同的 AI 编码环境,记录真实行为与产出。** 第一轮(Claude Code · Fable 5)已完成,后续环境测完逐一补进对比表
> 这一部分没有虚构:**同一条提示词,投给不同的 AI 编码环境,记录真实行为与产出。** 三轮实测:Claude Code · Fable 5、Codex CLI · GPT-5.5、Qwen 3.6-27B
### 统一提示词
@@ -285,17 +286,115 @@ return top50;
**成本:** 总耗时 16 分 57 秒;token 为模型自估——输入约 15–20 万(多数命中提示缓存),输出约 0.5–1 万。
### 横向对比(持续补充)
### 第二轮实测:Codex CLI · GPT-5.5
| 观察维度 | Claude Code · Fable 5 | 环境 ②(待测) | 环境 ③(待测) |
| :-- | :-- | :--: | :--: |
| 函数真实性 | 5/5 全部查证,零编造 | — | — |
| 语法与编译 | 整文件编译通过 | — | — |
| 文件模型 | `.tsl` 判定正确 | — | — |
| 自主验证 | builtin 部分本机实测跑通 | — | — |
| 边界诚实度 | 明说 dotnet 函数需客户端确认 | — | — |
| 总耗时 | 16m57s | — | — |
| token(自估) | 输入 1520 万 / 输出 0.51 万 | — | — |
> 环境:OpenAI Codex CLI v0.142.5 · gpt-5.5reasoning xhigh);提示词在第一轮基础上追加指定了输出路径 `scripts/main_board_top50_zf_codex.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 语法页核对写法 |
| 🚫 证据驱动的弃用 | 查到 `getTopN` 存在,但其文档记录示例运行报 `not found` —— **主动弃用**,改用文档已证明的 `order by ... desc` + 手动循环取前 50 |
| 🗣 诚实报告边界 | PATH 中无 `tsl`/`tslcli`,无法真实运行 → 只做静态检查(无裸 `=` 赋值、无声明区、关键语句在位),并如实说明"没法做真实 TSL 运行验证" |
**产出代码(原样):**
```tsl
end_t := yesterday();
stocks := getAbkbyDate('上证A股;深证A股', end_t);
data := select ['StockID'] as "Code",
spec(specDate(stockZf3(), ['date']), ['StockID']) as "Zf"
from markettable datekey end_t to end_t of stocks end;
sorted := select ["Code"] from data order by ["Zf"] desc end;
n := min(50, length(sorted));
result := array();
if n > 0 then
begin
for i := 0 to n - 1 do
begin
result[i] := sorted[i]["Code"];
writeLn(result[i]);
end;
end;
return result;
```
**可圈可点:** `getTopN` 的弃用是「块级证据」规则的教科书式执行——函数在索引里存在不等于能用,文档里的负向记录同样是事实;Skill 未注册时循 `AGENTS.md` 路由自行找到本地脚本,说明**硬约束层的兜底指路生效了**。**一处对照差异:** "昨天"用的是 `yesterday()` 日历昨天,未处理周末/节假日——第一轮用 `lastTradeDay` 规避了周一取到周日的问题。
**成本:** 本轮工作 9 分 21 秒;token 为 `/status` 实测——**总量 18.5 万 = 输入 15.9 万 + 输出 2.57 万**(上下文余量 42%)。
### 第三轮实测:Qwen 3.6-27B
> 环境:qwen3.6-27b(27B 开源模型,代理框架未注明);提示词同样追加指定了输出路径 `scripts/main_board_top50_zf_qwen3.6-27b.tsl`;耗时未记录。
**真实过程回放:**
| 步骤 | 实际行为 |
| :-- | :-- |
| 🧭 首跳照走 | 读 `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` |
| 🤐 收尾缺验证与边界声明 | 产出后仅回读文件自查"逻辑看起来正确",未做静态检查,也未声明"未经运行验证" —— 三轮中唯一没交代验证边界的 |
**产出代码(原样):**
```tsl
#! 获取昨天主板所有股票涨幅排名,取前50股票代码
dt := yesterday();
dt_prev := dt - 1;
stocks := getAbkbyDate('上证A股;深证A股', dt);
n := length(stocks);
gains := array();
for i := 0 to n - 1 do
begin
setSysParam(PN_Stock(), stocks[i]);
zf := stockZf(dt_prev, dt);
gains[i] := array("code": stocks[i], "zf": zf);
end;
top50 := select * from gains
order by ["zf"] desc
end;
top50 := select drange(0 to 49) * from top50 end;
echo "昨天(" $ dateToStr(dt) $ ")主板涨幅前50";
for i := 0 to length(top50) - 1 do
begin
echo (i + 1) $ ". " $ top50[i]["code"] $ " 涨幅:" $ top50[i]["zf"] $ "%";
end;
```
**这一轮最有意思:** 铁律对 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 |
| :-- | :-- | :-- | :-- |
| Skill 接入 | 已注册,直接调用 | 未注册 → 循路由自行找到 `lookup.py` 手动调用 | 未注册 → 手动调用(检索输出乱码,带病工作) |
| 函数真实性 | 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 万(未计上下文重复,口径偏小) |
> **对照说明:** ① 第二、三轮提示词在第一轮基础上各自追加了输出文件名,文件命名被显式给定;② 第二轮运行时仓库内已有本 README 的同题示例,模型读到过该片段(其后仍逐一核对了函数事实);③ 三轮本地条件不同——第一轮机器装有离线 TSL 解释器,第二轮 PATH 无解释器,第三轮未尝试任何运行验证;④ 第三轮的代理框架与耗时未记录,token 为模型按"内容量"事后自估、未计多轮上下文重复携带——三轮 token 口径各不相同(实测 / 含缓存自估 / 内容量自估),不可直接横比。以上数字与行为仅作真实记录,不构成严格受控对比。
---