Files
vrsub/docs/实验数据-字幕审校定位与修复实验.md
cat-shark 5b263171f2 docs: 归档翻译上下文/字幕审校方案的评审结论与实测数据
- 待办:会话式长上下文方案标记为已技术评审且不实施;补记问题 A 的阶段性结论(暂缓)
- 新增 docs/实验数据-字幕审校定位与修复实验.md:LLM 定位触发率/召回、合成正样本、逐条修复前后对照、成本与复现方式
- 新增 docs/实验数据-字幕重生成成本与耗时.md:单价口径、功率画像、全量推算
- decisions:补充两条决策(会话式长上下文否决、审校定位+定向修复暂缓)
- scripts:归档一次性探测脚本 probe_subtitle_review_stage0.py(含 rebuild 子步骤)
- AGENTS/README:补充实验与改动许可规则、文档索引
2026-09-19 18:33:28 +08:00

174 lines
10 KiB
Markdown
Raw Permalink 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.
# 实验数据:字幕审校(问题定位 + 定向修复)
本文件记录"用 LLM 定位有问题的字幕 cue,再定向修复该 cue"这一方案的**实测数据与结论**。
方案背景与需求见 [待办-翻译上下文复用与语义纠错.md](./待办-翻译上下文复用与语义纠错.md)
结论的取舍理由见 [decisions.md](./decisions.md#字幕审校定位定向修复方案暂缓)。
**一句话结论**:这套结构对"术语/忠实性"类问题有效且便宜,但对"字面通顺但语义错"
(问题 A:ASR 听岔成正常句子)**无效**——把中文、日文原文、邻句、系列词表全给
LLM,它既定位不出、也改不动,甚至会把本来正常的句子改坏。判定为**当前模型能力不足**,
暂缓实施。
---
## 一、口径与素材
| 项 | 值 |
| --- | --- |
| 素材 | `/mnt/fnOS/123/kiwvr-886/masex.tv@kiwvr00886_{1,2}_8k.{JA,CN}.srt`(生产产物) |
| 规模 | part1 337 条 cuepart2 504 条 cueJA 与 CN 条数与时间轴逐条一致 |
| 已知问题样本(正样本) | part2 的 **183 / 184 / 185**(见待办文档问题 A`ママの声をおなか``あくまで`×2 |
| 模型 | SiliconFlow `Qwen/Qwen3.5-35B-A3B``enable_thinking=false`,与生产翻译节点一致) |
| 批大小 | 定位 30 条/请求;修复窗口 = 目标 ±2 条;合成正样本窗口 30 条 |
| 词表 | 由**该文件夹自己的产物**挖掘(不调 LLM,见下),严格映射阈值 50% |
> 词表为什么不用 LLM 生成:直接问"这些成人用语的中文译名"会被模型拒答
> (实测返回"我无法提供涉及色情内容的信息")。改为从库内已有 `.JA.srt`/`.CN.srt`
> 反推:候选日文词来自静态表 + 通用领域词表,中文译名取"含该词的 cue 里过半数
> 出现"的中文候选词,否则留空。
---
## 二、方法(4 步)
1. **规则层**(对照用):`① 词表违背`(日文用了词表词但译文没体现该译名)、
`② 近音可疑`(日文里出现与词表词同长度、编辑距离 ≤1 的片段,且译文没体现该译名)。
2. **定位层 V1**:只给**中文**`id|时间|译文`)+ 系列词表,让 LLM 找出"与上下文不符、
逻辑不通、或与词表不一致"的条目。**这就是"纯 LLM 智力定位"的原设计**。
3. **定位层 V2**:给 **中文 + 日文原文** + 系列词表,让 LLM 找"译文与日文原意不符
(含近音听错)、上下文矛盾、与词表不一致"的条目。
4. **修复层**:只对目标 cue,给 `日文原文 + 现有译文 + ±2 邻句(日文+中文)+ 系列词表`
要求返回窗口内**全部 id** 的译文(允许顺带改邻句,禁止增删条目)。
5. **合成正样本**:把正常译文里的域词替换成中性词(小穴→肚子/声音/苹果…),
制造"字面通顺但语义错"的样本,测定位召回。
---
## 三、实测结果
### 3.1 定位层(全片 part2504 条)
| 变体 | 输入 | 命中(触发率) | 三条目标召回 | 判为"误听/近音"的原因数 |
| --- | --- | --- | --- | --- |
| V1 | 中文 + 词表 | 37/504 = **7.3%** | **0/3** | 0 |
| V2 | 中文 + **日文** + 词表 | 38/504 = **7.5%** | **1/3**(命中 184 | **15** |
- V1 在 165195 区间标的是 165/175/176/177/192**恰好漏掉 183**"那我让妈妈的声音
进入你肚子里了哦")——中文通顺时,纯中文审校不会怀疑它。
- V2 加上日文后模型明显更会往"听错"方向想:把 187 `口紋`、192 `生鼻`、32/46 的
`生おなか`(判为 `生おなほ` 的误听)都标了出来,**但 183 仍漏**。
- 差异原因:32/46 的**中文不通**("因为是新鲜的肚子")才触发怀疑;183 的中文是正常人话。
### 3.2 规则层(对照,证明硬规则泛化不了)
| 口径 | 命中率 | 目标召回 |
| --- | --- | --- |
| 等长窗口 + 编辑距离 ≤1 + 映射阈值 50% | 33/841 = 3.9%part2 3.2% | **0/3** |
| 放宽到 ±1 长度 + 距离 ≤2 | 409/841 = 48.6% | 3/3(但全是噪声:`まま``マット`/`マンゴー` |
即:严格则漏,宽松则全是假阳性;**近音匹配只能当候选生成器,不能当判定依据**。
### 3.3 合成正样本(V2 定位,14 条)
| 项 | 值 |
| --- | --- |
| 召回 | **11/14 = 78.6%** |
| 漏掉的 3 条 | `看看肚子``时候插在里面``就是这里,这个时候`——全是"读起来通顺"的 |
### 3.4 修复层(输入:日文 + 译文 + ±2 邻句 + 词表)
| id | 日文 | 改前 | 改后 | 判定 |
| --- | --- | --- | --- | --- |
| 183 | じゃあ、ママの声を**おなか**に入れますね | 那我让妈妈的声音进入你肚子里了哦 | 那我把妈妈的**声音传送**到你**身体**里了哦 | ✗ 仍是"声音" |
| 184 | あくまで、あくまでください | 再吃一个,再吃一个吧 | 继续,继续吃 | ✗ 仍是"吃" |
| 185 | あくまで入ってしまいました | 它已经全都进来了 | 它已经完全进去了 | ✗ 未到"最里面" |
| 51 | 今のマンコの締め付け… | 刚才**阴道**的紧致感不错吗? | 刚才**小穴**的紧致感不错吗? | ✓ 术语统一 |
| 55 | 生の方に生チュートが入っていた | 生来的里面插着生来的玩具 | **小鸡鸡插进了小穴里** | ✓ 大幅改善 |
| 48 | あ、**お腹**鳴っちゃう | 啊,肚子饿了 | **啊,小穴要湿了** | ✗ **改坏了**(脑补,日文无依据) |
---
## 四、成本与耗时
| 项 | 值 |
| --- | --- |
| 本次实测 | 71 次调用,输入 67,213 / 输出 12,630 tokens → **约 ¥0.067**(¥0.4/M 入、¥3.2/M 出) |
| 挂钟 | 全流程约 4 分钟(含 17+17 批定位、8 次修复、14 次合成样本) |
| 外推(每素材小时) | 定位约 15 批 + 修复约 25 个窗口 → **约 +¥0.04/素材小时** |
| 全量外推(187 小时待重生成) | **约 +¥7**(相对现状 ¥0.03–0.05/素材小时,约 2 倍) |
成本不是瓶颈;**触发率**(7.5%)决定成本,也决定"改坏正常句"的风险面。
---
## 五、结论与原因分析
1. **有效面**:术语/忠实性类(`词表违背`、译文与日文不一致、上下文称呼跳变)——
修复正确率高(51/55 明显变好),合成正样本召回 79%。这部分即使单独做也有价值。
2. **无效面(问题 A**`字面通顺但语义错`。原因不是"上下文给得不够":
- 定位阶段:中文通顺 ⇒ 模型不怀疑日文中的错词(183 在 V1/V2 都没被标出);
- 修复阶段:唯一可依据的日文原文本身是错的 ⇒ 模型沿错译走,只能换词(肚子→身体),
不能凭空生成正确含义。这与待办文档里记录的两次失败实验(纠错节点、
提示词 A/B)结论一致。
3. **副作用**:允许改邻句会脑补出新意思(48 从"肚子饿了"改成"小穴要湿了"),
需要"必须给出日文依据/候选词才允许改动"的硬约束。
4. **判定**:**当前 LLM 能力不足以完成"从错误的日文原文反推真实含义"这一步**,
方案暂缓;不再在翻译侧继续做语义纠错。
---
## 六、未验证的下一步(若将来重开)
按"换提问对象、换判据"而非"加规则"的思路,三条可测方向:
1. **不审译文,审日文**:只给日文 + 系列词表,逐条问"这句像不像把某个词听成了另一个
常见词?给出候选词"。这样中文的通顺度再也掩盖不了问题(183 的 `おなか`
"本系列 `おなほ` 出现 29 次"的语境下有机会被标出并给出候选 `おなほ`)。
2. **先建场景再对照**:让 LLM 通读一个场景的日文,总结"在做什么、用了哪些道具/称呼",
再用这份场景模型审中文(针对"进入肚子里"这类与动作链矛盾的句子)。
3. **召回优先的提问**:把"找出有问题的条目"改为"逐条给可疑度 03 打分 + 理由",
避免"只有读不通才报"的偏置,用阈值调触发率。
4. 配套约束:修复必须能指出**日文依据或候选词**才允许改动正文,否则拒绝改写。
第 1、2 条本质上是把纠错从**翻译侧**挪回**ASR 侧**(那里才有声学证据)。
---
## 七、复现方式
```bash
# 全流程(规则层 + 定位 V1/V2 + 修复 + 合成正样本;约 71 次调用、¥0.07)
uv run python scripts/probe_subtitle_review_stage0.py --steps rules,locate,repair,synthetic
# 只跑规则层(不调 LLM,验证脚本行为)
uv run python scripts/probe_subtitle_review_stage0.py --steps rules --out /tmp/stage0
# 从原始调用日志重算统计(不重跑、不烧 token)
uv run python scripts/probe_subtitle_review_stage0.py --steps rebuild
```
| 产物 | 路径(`data/` 已 gitignore,仅本机存档) |
| --- | --- |
| 每次请求与响应原文(唯一证据源) | `data/experiments/review_stage0/out/calls.jsonl` |
| 本次运行统计 | `data/experiments/review_stage0/out/summary.json` |
| 从日志重建的统计(定位/修复) | `data/experiments/review_stage0/out/rebuilt_summary.json` |
| 挖掘出的词表 / 规则层明细 | `.../out/glossary.json``.../out/rules.json` |
| 运行日志 | `data/experiments/review_stage0/run_all.log` |
素材依赖:媒体库挂载 `/mnt/fnOS/123`;模型与端点来自 `.env``LLM_API_BASE`/`LLM_API_KEY`/
`LLM_MODEL`)。素材缺失时脚本会直接报错退出(一次性实验,不做跳过)。
---
## 八、实验过程中发现的坑(供后续复用)
- **两个 SRT 的 id 都从 1 开始**:跨文件统计必须按 `(part, id)` 组键,否则 part1 的
同号条目会冒充 part2 的条目,**直接把召回率算错**。
- **词表映射不能靠共现**:低词频词的共现映射全是噪声(`ビクビク` 被映射成"小穴");
必须要求"含该词的 cue 里过半数出现"才采纳,否则词表不可信。
- **系列自身译法就不一致**:同一个 `おなほ`(本系列出现 29 次)在已有译文里被译成
"自慰套/手办/小鼻鼻/嘴"等多种说法——这既是文件夹级上下文的价值,也说明
"惯用译名"本身需要人工或强约束来固定,挖不出来。
- **统计产物会被后续步骤覆盖**:区分统计(`summary.json`)与原始证据(`calls.jsonl`),
改口径时用 `--steps rebuild` 从日志重算。