LLMに校正させるとき、精度より効いたのは「作文の禁止」だった
文脈から自然な日本語を作れてしまうのが危ない。直してよい5つの型を定義し、それ以外は証拠を見に行かせる。
やりたかったこと
文字起こしの校正は、大部分を LLM にやらせています。 最初にぶつかったのは精度ではなく、直しすぎのほうでした。
音が潰れて聞き取れなかった箇所を渡すと、LLM は文脈から自然な文を作ってくれます。 出力は読みやすくなるので、一見すると品質が上がったように見えます。 ただ、それは元の発言ではありません。
Before: 「正しく直せ」と書いていたころ
最初のプロンプトは、要するに「文字起こしの誤りを正しく直してください」でした。 返ってくるものは、日本語としては完璧です。
入力(音が潰れている)
この会議派の人たちがですね
出力
この懐疑派の人たちがですね ← 正しい
この会議に参加した人たちがですね ← もっともらしいが、言っていない
どちらが返ってきたかは、出力だけを見ても分かりません。 両方とも自然な日本語で、両方とも文脈に合っています。
After: 「これ以外は直すな」に変えた
プロンプトを、直してよい型の列挙に書き換えました。
テキストのみで修正してよいのは、次の5カテゴリだけ:
1. 同音異義語 + 決定的な文脈 (言語学の話で「その工程文が」→「肯定文」)
2. 重複した文字・助詞の削除 (「下敷きにに」→「下敷きに」)
3. 辞書に登録済みのパターン
4. 近傍に本人の言い直しがある
5. 括弧の残骸の除去(隣接セグメントとの照合必須)
上記以外は必ず映像のテロップを見る。
テロップでも確定できない場合は原文のまま残し、要確認として登録する。
推測による置換は禁止。
Before / After で何が変わったか
| Before | After | |
|---|---|---|
| プロンプトの主眼 | 正しく直す | 直してよい範囲を狭める |
| 確信のない箇所 | 文脈から埋める | 直さずに次の工程へ送る |
| 出力の見た目 | きれい | ところどころ変なまま |
| 確かめられるか | できない | テロップで1件ずつ確かめられる |
効果は、直した数より直さなかった数のほうに出ました。 テロップまで見て確定したものが6,537件あって、 そのぶんは「テキストだけでは直さなかった」ということになります。
精度を上げるより、できることを狭めるほうが効きました。
それでも抜けた道1: 「造語だから触らない」
規則を作ったあとも抜け道を通っていました。 「番組の造語だから、変な字でもそれが正しいのだろう」と判断して、 テロップを見ずに原文のまま確定扱いにしたケースです。
| そのまま残した文字 | テロップの実際 |
|---|---|
| ドパーだ | ドパアダ |
| 会議派 | 懐疑派 |
| 安倍博士 | 阿部寛 |
| フェイクオールス | フェイクオールズ |
造語こそ画面の表記が正解でした。 「触らない」と「確定した」は別なのに、同じ扱いにしていたのが原因です。
それでも抜けた道2: str.replace()
同じ語が1文に2回出てきたとき、機械的に置換して番組のネタを消しました。
# Before
text = text.replace("バスが酢爆発", "バスガス爆発")
# 元の発言
# 「早口言葉の "バスガス爆発" って、"バスが酢爆発" だと思って読むと噛まない」
# ^^^^^^^^^^^^ わざと言い分けている
# After
hits = list(re.finditer(re.escape(bad), text))
for m in hits:
print(text[max(0,m.start()-20):m.end()+20]) # 1件ずつ前後を目視
# 判断してから、位置を指定して置換する(replace は使わない)
これも差分を見ても気づけません。どちらも正しい語に見えるからです。
まとめ
- 効いたのはプロンプトの精度ではなく、できることの制限だった
- 「正しく直せ」ではなく「これ以外は直すな、代わりに証拠を見に行け」
- 出力がきれいになったら疑う。確信のない箇所は変なまま残るのが正しい
← 置換辞書で4,056箇所を自動修正する。ただし辞書の… 焼き込み字幕をOCRで答え合わせする。fps=1にし… → 目次へ