Skip to content

tools/ — 数据与评测工具链

这里放的是离线产出与评测用的东西,都不参与 app 运行时。四个子目录, 两条互不相干的线:预装词库产线(三个)和短语质量评测(一个)。

scripts/ 的分工:scripts/ 是仓库工程脚本(守门、发版、备份、CI 用), 随每次提交/发版跑;tools/ 是低频的数据产线与评测,只在做词库或调短语质量时跑。

谁产谁、谁喂谁

tools/agid-2016.01.19/  ─┐
  infl.txt(词形变化)    │
                         ├─→ cargo run --example build_dict
tools/wordnet/          ─┘        (在 src-tauri/,非本目录)
  irregular_forms.json                    │

                              src-tauri/assets/nlp/*.json
                              (lemmatizer Layer 1/2 中间产物)


tools/vocabulary_builder_v3/  ──────→ src-tauri/assets/lampio_dict.db
  Dart pipeline(Oxford 5000 骨架          (预装词库,唯一产出)
  + Kaikki 主数据源 + LLM 增强层)                │

                              scripts/check-vocab-asset.sh
                                (提交前闸门:体积 + 卫生断言)

                              rvh/assets/databases/lampio_dict.db
                                (symlink → 上面那个文件,红线 #10:只有一份)

🔒 红线 #10lampio_dict.db 双端只有一份物理文件(RVH 侧是 symlink)。唯一产源 = 本目录的 vocabulary_builder_v3(2026-07-19 从 RVH 迁入,RVH 已降级为纯消费方)。 禁止对该 db 就地 ALTER/UPDATE——运行时只 ATTACH 只读读取。 维护流程走 /vocab-reseed skill。

四个子目录

目录是什么什么时候碰
vocabulary_builder_v3/预装词库 pipeline(Dart)。Step 1-6 + 一堆 opt-in 的 LLM 增强步做词库时。详见其 README
agid-2016.01.19/AGID 词形变化数据(infl.txt,Kevin Atkinson,公共领域+WordNet license)基本不碰。不要手工编辑
wordnet/5,637 条人工策展的不规则形映射(went→go基本不碰。build_dict 输入资产,运行时不 include
phrase_eval/短语识别质量评测:gold.jsonl 标注集 + run.py 批量打分器改短语 prompt / 分档 / matcher 前后。走 /phrase-eval skill

phrase_eval 速用

bash
python3 tools/phrase_eval/run.py

对线上 judge-phrases-batch Edge Function 跑整个 gold-set,按 cat 拆失败分布。 改 prompt 前后各跑一次,分数不退才部署——这是防回归的棘轮。 评测结论落账到 docs/plans/phrase-eval-log.md(持续追加型 ledger,不归档)。

anon key 默认从 src-tauri/assets/sql/init_data.sql 取(public by design); 代理默认 127.0.0.1:7897,用 PROXY=none 关。

顶层那个 .txt 是什么

build_dict.report.txtsrc-tauri/examples/build_dict.rs审计报告产物—— AGID 与 WordNet 合并时的冲突项、按 POS 优先级被丢弃的候选、各修正层逐条改了什么, 都记在里面(Summary 段只有行数/条目数,没有输入 SHA256)。 输出路径写死在该文件的 REPORT_OUT_RELsrc-tauri/examples/build_dict.rs:19), 移动它需要同步改代码,不要顺手挪。

🔒 它是输入的确定性函数:同样的 AGID + WordNet 输入,重跑任意多次字节相同。 这不是白来的——wordnet_overrides 由 HashMap 迭代产生,2026-08-25 前每次重跑取到的 条目顺序都不同,一次无关重跑就能在这个 tracked 文件里造出 ~370 行纯乱序 diff, 把真实改动埋掉(v27 那轮实测 188+/184−,真实改动只有 4 行)。现在靠三件事守住: 写盘前 sort()、策展层清单全量打印(不截断 = 顺序变动不会改变展示窗口)、 以及 WordNet 输入的大小写碰撞断言。改这个生成器时别把这三样优化掉。 验收方式:连跑两次 cargo run --example build_dict --release,两次产物应字节相同。

它是本目录唯一的生成物;别再往这一层加新产物(新的落 logs/ 或对应子目录)。