Files
vrsub/docs/decisions.md
T
cat-shark 966f3e6b4b docs: AGENTS.md 只保留代理规则,项目信息迁入 README 与 docs/
把 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 个文档全部可达。
2026-09-13 15:40:31 +08:00

79 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 设计决策与踩坑记录
本文件记录"为什么这样做":模型/参数选择的实测依据、历史事故与踩坑。
**当前生效的规则**以对应专题文档为准(本文件只解释理由):
- 节点参数与默认值:[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 生成阶段存在已知 bugM-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)