把 AGENTS.md(545 行)中的项目知识按性质拆开,只留下对代理的要求: - AGENTS.md(176 行)只写规则:读文档指引、提交许可、等待规则、TDD、 测试规则(模块边界/三段结构/功能覆盖优先)、注释规范、目标运行环境、 PowerShell 规则、文档维护规则; - 项目信息新建 docs/ 专题:architecture、node-protocol、workflows、 configuration、operations、testing、decisions; - README 改为项目索引(定位、快速开始、文档导航、目录、工作流、结论摘要); - 修正旧文档错误:README 的"详细约定见 AGENTS.md"与"100% 行覆盖率" (pytest 已移除该门槛);环境变量表补齐 WOV_AUTO_VAD 等 3 项。 新增 scripts/check_doc_links.py 校验相对链接与锚点,当前 14 个文档全部可达。
79 lines
4.5 KiB
Markdown
79 lines
4.5 KiB
Markdown
# 设计决策与踩坑记录
|
||
|
||
本文件记录"为什么这样做":模型/参数选择的实测依据、历史事故与踩坑。
|
||
**当前生效的规则**以对应专题文档为准(本文件只解释理由):
|
||
|
||
- 节点参数与默认值:[node-protocol.md](./node-protocol.md)
|
||
- 工作流与模型配置:[workflows.md](./workflows.md) / [configuration.md](./configuration.md)
|
||
- 代码缺陷与修复过程:[代码审查问题跟踪.md](./代码审查问题跟踪.md)
|
||
|
||
## 帧文件必须按帧号数值排序(14236 帧事故)
|
||
|
||
- **现象**:run_339ec7ee437f 的 14236 帧任务中,字幕时间与图像错位。
|
||
- **根因**:ffmpeg `%04d` 编号超过 9999 帧后扩为 5 位,字典序 `sorted()`
|
||
会把 5 位编号排在 4 位之前。
|
||
- **结论**:帧文件必须按帧号数值排序读取(`_sorted_frame_files`),
|
||
回归测试见 `test_frame_files_read_order_matches_frame_number`。
|
||
|
||
## glm-ocr 重复循环问题与源头修复
|
||
|
||
- **根因**:glm-ocr 生成阶段存在已知 bug(M-RoPE delta 未传递,大图触发
|
||
重复循环;GitHub #454 / #16892)。`keep_alive` 与其无关(实测无效)。
|
||
- **修复路径**(现行防护措施见
|
||
[node-protocol.md](./node-protocol.md#glm-ocr-调用与重复循环防护)):
|
||
1. `frame-extract` 裁切后把帧压缩到 720p 内——过大输入图是触发条件之一。
|
||
2. `vlm` 请求体加 `repeat_penalty` + `num_predict` 压制重复。
|
||
3. `subtitle-ocr` 用 `max_result_chars` 把超长输出判为异常并跳过该帧。
|
||
|
||
## llm-filter 的 LLM 分类层默认关闭
|
||
|
||
- **决策(2026-09)**:`llm-filter` 只跑确定性规则层,LLM 五类分类层默认关闭
|
||
(`use_llm=0`),需显式 `use_llm=1` 才启用。
|
||
- **依据(run_ac7f480a3ccb 逐类人工审查)**:LLM 层额外删除的 131 条中
|
||
**56%(73 条)是真实对话**(`好好教育她一番吧`/`腿不要合上`/
|
||
`这家医院 为VIP患者提供了特殊服务`),而它真正抓住而规则层抓不到的仅
|
||
58 条且大半可正则化(已下沉到规则层);`repeat` 类别 67 条判定零删除;
|
||
长文本保护等五套机制全在给不稳定分类器兜底。
|
||
- **效果**:关闭后真实数据保留 863 条(旧 588 条)、**误删真对话 0 条**
|
||
(旧 73 条)、无 LLM 调用。
|
||
- **启用时保留的机制**:每条连同前后各 `context_size`(默认 10)条**过滤后**
|
||
文本判断(上下文净化),≥`min_keep_len`(默认 12)时 noise 不构成删除依据
|
||
(长文本保护),429/5xx 指数退避 + 自适应线程池 `report_failure()` 降并发后
|
||
重试一轮,判定成功即追加 `filter_partial.jsonl` 断点存档;按文本去重。
|
||
- **复现**:`scripts/regenerate_filter_ac7f480a3ccb.py`,
|
||
回归数据 `tests/nodes/test_llm_filter/data/ocr_srt_run_ac7f480a3ccb.srt`。
|
||
|
||
## 翻译模型默认值切换与 subtitle-correction 例外
|
||
|
||
- **默认切换(2026-09)**:`LLM_MODEL` 由 `Qwen/Qwen3.6-35B-A3B` 改为
|
||
`Qwen/Qwen3.5-35B-A3B`——同片 2 小时日语 ASR 全量对比,质量持平、
|
||
0.232 s/行(评测中最快)。
|
||
- **例外**:`subtitle-correction` 节点**有意**保留旧兜底
|
||
`Qwen/Qwen3.6-35B-A3B`——该节点错听泛化实测新模型 0/4、旧模型 4/4
|
||
(复现:同一误听场景各跑 4 次),见 `tests/test_llm_default_model.py`。
|
||
- **评测数据**:`data/experiments/translate_models/REPORT.md`,
|
||
工具链 `scripts/bench_translate_models.py` 等。
|
||
|
||
## whisper large-v2 vs large-v3 切换
|
||
|
||
- **决策(2026-09)**:通用转写模型从 large-v3
|
||
切到 `faster-whisper-large-v2`。
|
||
- **依据**:savr-1054 全片 A/B 实测,无 VAD 幻觉长段归零、开头漏句救回,
|
||
VAD 链路条数与覆盖小幅领先。
|
||
- **数据**:`data/experiments/whisper_v2_vs_v3/`,
|
||
脚本 `scripts/compare_whisper_v2_vs_v3.py`,
|
||
调研记录 [调研-whisper漏句与decode_full验证.md](./调研-whisper漏句与decode_full验证.md)。
|
||
|
||
## VR 字幕景深与遮挡方案选型
|
||
|
||
- **结论**:采用 **A-1 零视差**(字幕固定在屏幕平面,不做景深偏移)+
|
||
**B-1 顶部安全区**(`an8` 顶部居中,`margin_top` 默认 700),
|
||
并用半透明填充 + 半透明描边降低遮挡感。
|
||
- **调研全文**:[VR双目字幕景深与遮挡调查报告.md](./VR双目字幕景深与遮挡调查报告.md)。
|
||
|
||
## 相关文档
|
||
|
||
- 当前生效的参数与协议:[node-protocol.md](./node-protocol.md)
|
||
- 运维语义与批量流程:[operations.md](./operations.md)
|
||
- 缺陷 ID 与验收标准:[代码审查问题跟踪.md](./代码审查问题跟踪.md)
|