§0前提
なぜ「生成器」とは別の機械が要るのか
AIの実利用の大半は、白紙から作る仕事ではなく、すでにある出力を直す仕事に費やされている。翻訳の手直し、下書きの推敲、書き起こしの整形、表の正規化。にもかかわらず、その工程は生成器に「もう一度書かせる」ことで代用されてきた。これが問題を生む。
生成器にもう一度書かせると、直ってほしくない箇所まで変わる。数値が丸まる。固有名詞が言い換わる。原文にあった条件節が消える。直った箇所と壊れた箇所が同じ操作の中で起きるため、事後に切り分けられない。修正が信用されない理由はここにあり、結局は人が全文を読み直すことになる。
修正機は、この工程を生成から分離するための機械である。成功条件は「良い文を書けること」ではなく、「触っていない箇所が確実に触られていないこと」に置く。
§1設計原則
実装が迷ったときに立ち返る8条。仕様の他の部分は、すべてこの結果である
- 最小改変出力は差分であって、新しい文書ではない。全文書き換えは機能として存在させない。検出器が指摘できなかった箇所は、原文のまま1文字も動かさずに出口へ抜ける。
- 不変条件の先取り検出より先に「この文書で触ってはならないもの」を抽出する。数値、固有名詞、識別子、単位、日付、コードの意味論、プレースホルダ。検出器が明示的に許可を持たない限り、これらに触れるパッチは判定段で却下する。
- 三分類すべての指摘は 確定誤り / 疑義 / 様式の好み のいずれかに分類される。自動適用は確定誤りのみ。疑義は提案として人に出す。様式の好みは、規約に書かれていない限り既定で不介入とする。
- 根拠の同伴パッチには 検出器名・理由・確信度・原文 を必ず付す。根拠を持たないパッチは出力しない。「なんとなく良くなる」は修正機の出力ではない。
- 冪等性同じ入力に2回流して差分が出ないこと。出るなら、その検出器は好みで揺れている。収束しない検出器は改善対象ではなく無効化対象とする。
- 可逆性原本を保存し、適用したパッチを台帳に記録し、任意の時点まで巻き戻せる形でのみ書き戻す。巻き戻せない適用は行わない。
- 学習は昇格制採否の履歴を暗黙にモデルへ戻さない。繰り返し採用された指摘は、用語集・表記規約・固有名詞辞書という読める資産に昇格させ、その資産を通してのみ次回に効かせる。人が中身を確認・修正できない学習は行わない。
- 独立性検出器の価値は、賢さではなく生成器からの独立性に比例する。生成器と同じ癖を持つ検出器は、生成器が間違えたところで同じように間違える。したがって検出器は独立性で格付けし、格の低いものを自動適用の枠に入れない(§10)。
§2処理系
6段。順序そのものが誤修正率を決めるため、段の入れ替えは仕様変更とみなす
入口ごとのアダプタが、原資料を内部表現に落とす。文書はセグメント(文・セル・発話・行)に分割し、各セグメントに安定IDと原資料上の位置(文字オフセット / セル参照 / タイムコード / bbox)を持たせる。以降の全工程はこの内部表現の上でのみ動く。
in: 原資料 → out: Document{ Segment[] }検出より先に走る。数値・固有名詞・識別子・単位・リンク・プレースホルダ・コード片を機械的に拾い、保護対象として登録する。呼び出し元がこの一覧を渡してきても信用せず、必ず自分で抽出する(§6・ツール形態の契約)。
in: Document → out: Invariant[]決定的検出器を先に、言語モデル検出器を後に走らせる。順序に理由がある。言語モデルは目に入ったものを直したくなるので、機械的に確定できる誤りを先に潰し、モデルには残差だけを見せる。こうすると指摘の総量が減り、確信度の分布が素直になる。
in: Document, Invariant[] → out: Finding[]各指摘を三分類にかけ、確信度を付け、不変条件と衝突するものを却下する。却下は破棄ではなく「指摘のみ」に降格させる — 数値が食い違っているという事実は、勝手に直せないとしても人に届ける価値がある。
in: Finding[] → out: Patch[](適用), Finding[](提案・記録)パッチを位置の後ろから順に当てる。重なるパッチは確信度の高い方を残し、低い方は提案へ回す。原本は必ず別に保持する。
in: Document, Patch[] → out: Document′, 原本事後照合を3つ回す。(a) 不変条件が全て保存されているか、(b) 適用済み文書をもう一度流して差分が出ないか(冪等性)、(c) 改変量が想定範囲か。いずれかが落ちたら書き戻さず、人に上げる。通れば出口アダプタが原資料へ書き戻し、台帳に記録する。
in: Document′ → out: 書き戻し, LedgerEntry§3データモデル
4領域・4入口を1つの型で通すための最小構造
// 領域が変わってもこの5つの型は変わらない。変わるのは detector だけ。 Document { id, domain: 文章|翻訳|データ|転記, origin: { adapter, ref, hash, mtime }, // 書き戻し先と衝突検出用 source?: Document, // 翻訳の原文 / OCRの原画像 / 転記の音声 segments: Segment[] } Segment { id, text, locus: { offset | cell | timecode | bbox }, // 原資料へ必ず戻れること align?: Segment.id // 原文セグメントとの対応 } Invariant { segment, span, kind: 数値|固有名詞|識別子|単位|日付|リンク|コード|プレースホルダ, value, policy: 変更禁止 | 正規化のみ可 } Finding { id, segment, span, detector, // 誰が言ったか class: 確定誤り | 疑義 | 様式, confidence: 0.0–1.0, reason, // 人が読める1行。空なら出力しない evidence, // 規約の条番号 / 用語集の項 / 原文の該当箇所 patch?: Patch } Patch { segment, span, before, after } Ledger { ts, document, applied: Patch[], proposed: Finding[], verdict: 採用|却下|未判断, by, revert_to }
source と locus が全領域共通で存在することが重要である。翻訳は原文なしに、OCRは原画像なしに検証できない。「出力だけを見て直す」ことを構造的に禁じている。
§4検出器
領域ごとの検出項目と既定動作。既定動作は設定で緩められるが、初期値は常に保守側に置く
不変条件に自動適用が並ぶ行がいくつかある(翻訳の数値照合、表の書式正規化)。これは例外ではなく権限で説明する。§1-2 の保護を破れるのは、対象より確かな参照を持つ検出器だけである — 翻訳では原文が、表では書式規則が、その参照にあたる。参照を持たない検出器は、確信度がいくら高くても不変条件に触れない。
4.1 文章・ドキュメント
| 検出項目 | 手段 | 既定 |
|---|---|---|
| 表記ゆれ(送り仮名・カタカナ・全角半角) | 規約辞書+文書内の自己一致 | 自動適用 |
| 誤字・脱字・助詞の重複 | 決定的パターン+言語モデル | 自動適用 |
| 用語集違反(社内語・製品名の表記) | 用語集突合 | 自動適用 |
| 見出し階層の飛び・番号の重複 | 構造解析 | 自動適用 |
| 文書自身から再計算できる数値(件数・文字数・合計・割合) | 再計算 | 自動適用 |
| 本文の数値と表・図の数値の食い違い | 抽出して照合 | 変更禁止 |
| 参照切れ(章番号・図表番号・リンク) | 解決確認 | 提案 |
| 文体の不統一(である/ですます) | 文書内の分布判定 | 提案 |
| 冗長・二重敬語・一文の長さ | 言語モデル | 提案 |
| 主張と根拠の対応欠落 | 言語モデル | 記録のみ |
4.2 翻訳・多言語テキスト
原文が真である。原文を伴わない入力は「推敲」であって「翻訳修正」ではない。修正機はこの2つを別モードとして扱い、原文なしの入力に対しては訳抜け・極性反転の検出器を起動しない(できないことを黙ってやらない)。
| 検出項目 | 手段 | 既定 |
|---|---|---|
| 数値・単位・日付の不一致 | 原文との抽出照合 | 自動適用 |
| タグ・プレースホルダの欠落/余剰 | 決定的 | 自動適用 |
| 用語集(termbase)違反 | 突合 | 自動適用 |
| 固有名詞の表記ゆれ | 辞書+文書内の自己一致 | 自動適用 |
| 極性反転(否定・条件・義務の取り違え) | 対訳照合+言語モデル | 提案 |
| 訳抜け・訳の余剰 | セグメント整合 | 提案 |
| 敬体・文体レベルの不一致 | 分布判定 | 提案 |
| 直訳臭・語順の不自然さ | 言語モデル | 提案 |
極性反転は見逃しが最も高くつく項目でありながら、自動適用してはならない項目でもある(誤検出時の被害が同じく大きい)。この矛盾は、確信度に関わらず必ず人のキューに上げ、かつ既読になるまで台帳から消さない、という運用で処理する。
4.3 データ・表
自動適用の閾値を最も高くする領域。1セルの誤修正は集計・結合を経て下流で増幅する。既定の書き戻しは原列を残して正規化列を追加する方式とし、上書きは明示的な指示があるときだけ行う。
| 検出項目 | 手段 | 既定 |
|---|---|---|
| 全角数字・単位付き数値・桁区切りの混在 | 決定的パターン | 自動適用 |
| 日付書式の混在 | パターン分類 | 自動適用 |
| 前後空白・不可視文字・改行の混入 | 決定的 | 自動適用 |
| 列の型崩れ(数値列に文字列) | スキーマ推定 | 提案 |
| 重複キー・キーの欠落 | 決定的 | 提案 |
| 合計行と明細の不一致 | 再計算 | 提案 |
| マスタとの参照整合違反 | 突合 | 提案 |
| 外れ値・分布の急変 | 統計 | 記録のみ |
| 欠損 | 決定的 | 記録のみ |
4.4 文字起こし・OCR
出力だけを見て直せない領域。「読めなかった」と「読み間違えた」は文面上ほとんど区別がつかない。したがって原信号(音声のタイムコード、画像のbbox)への参照を必ず保持し、参照を失った入力に対しては高確信の字形補正しか許可しない。
| 検出項目 | 手段 | 既定 |
|---|---|---|
| 字形近傍の誤り(0/O、1/l、ー/一/-、力/カ) | 混同行列+文脈 | 自動適用 |
| 改行・段組・ハイフネーションの復元 | レイアウト解析 | 自動適用 |
| 同音・近似音の誤り | 語彙+文脈 | 提案 |
| 固有名詞・専門語の誤認識 | 辞書(案件ごと) | 提案 |
| 話者の取り違え・交代位置 | 話者分離結果との突合 | 提案 |
| 数値の桁・単位 | 文脈 | 変更禁止 |
| 認識器が低信頼と申告した領域 | 認識器の信頼度 | 記録のみ |
例出力の形
他AIが生成した文を通したときに、修正機が返すもの
形式名詞「事」はひらがなで表記する。文書内の他11箇所は既に「こと」。
「1,240百万円」→「12億4,000万円」。文書内の他8箇所は「億円」表記。数値そのものは不変条件のため、単位の書き換えを伴うこの指摘は自動適用せず提案に降格した。
本文「12.5%」に対し、添付表 Sheet1!C4 は 11.5%。どちらが正しいか機械には決められないため、直さず指摘のみを出す。この指摘は既読になるまで台帳に残る。
全75文字のうち、書き換わったのは1文字だけ。残りは1文字も動いていない — そしてそれが機械的に検証できることこそが、この機械の成果物である。
§5入口
アダプタ4種。取り込みと書き戻しは対で実装し、片方だけの実装を認めない
| 入口 | 取込 | 書き戻し | 固有の注意 |
|---|---|---|---|
| 貼付・添付 | 本文テキスト、添付ファイル | 差分表示と修正済みファイルを返す | 原資料の所在が手元にない。台帳の巻き戻しは利用者側の操作に依存する |
| Gmail / Drive | 下書き、文書、スプレッドシート | 新版として保存(上書きしない) | 共有中の文書は他者の編集と衝突する。hash/mtimeを取込時に記録し、書き戻し直前に再確認する |
| ローカルフォルダ | 指定フォルダ配下のファイル | 原ファイルの隣に修正版を置く | 大量・大容量になりやすい。抽出と絞り込みは手元で行い、必要な分だけ本体に上げる |
| 他AIの出力 | 生成器の出力を直接受ける | 後段へパイプ、または生成器へ差し戻す | 生成器の自己申告する確信度を入力に使わない。生成器ごとの癖を検出器として登録できる |
§6二形態
同一のコアエンジンに、性質の異なる2つの殻をかぶせる
ツールとしての修正機
被呼出 / ステートレス
- コネクタや他のエージェントから呼ばれる側。1回の呼び出しで完結する
- 状態を持たない。用語集・規約は引数として受け取る
- 契約: 呼び出し元が渡してきた文脈・確信度・「ここは直さなくていい」という指示を、そのまま信用しない。不変条件は必ず自分で抽出し直す
- 既定では適用まで行わず、パッチを返して呼び出し元に判断を委ねる
inspect(doc, source?) → Invariant[], Finding[] propose(doc, opts) → Patch[] + 根拠 apply(doc, patch_ids) → doc′, Ledger explain(finding_id) → 検出器・規約・原文
マシンとしての修正機
常駐 / 状態を持つ
- 入口を見張る側。受信箱・フォルダ・パイプの新着に反応して自分で動く
- 台帳を蓄積する。用語集・固有名詞辞書・生成器プロファイルが育つ場所
- 人の承認キューを持つ。提案は溜まり、既読になるまで消えない
- 再実行できる。規約を更新したら、過去の文書に遡って影響範囲を出せる
- 定期の報告を出す(何を何件直したか、何が保留のままか)
watch(入口, 条件) → 起動 queue → 承認待ちの提案 promote(finding[]) → 用語集・規約へ昇格 replay(規約版, 期間) → 遡及影響の一覧
§7受入基準
この数字を満たさないものは、便利であっても出さない
| 指標 | 目標 | 意味 |
|---|---|---|
| 不変条件違反率 | 0% | 1件でも出たらリリース不可。緩和条項を設けない唯一の指標 |
| 冪等性違反率 | 0% | 2周目で差分が出る検出器は無効化する |
| 自動適用の適合率 | ≥ 99% | 黙って直した100件のうち、誤りが1件を超えない |
| 提案の採用率 | ≥ 60% | 低いなら提案が雑。人の確認時間を食う分だけ有害になる |
| 甲の検出器の被覆率 | 監視のみ | 独立した根拠(§10.1)に支えられた指摘の割合。低いなら、読まれただけで検査されていない |
| 改変量 | 監視のみ | 触った文字数の割合。急増は検出器の暴走の先行指標 |
| 確認時間の削減率 | 実測 | 最終的な効用。人が全文を読み直しているなら、他が満点でも失敗 |
評価用データは、実際に人が直した前後のペアから作る。合成データで測ると、決定的検出器が得意な誤りに偏り、実運用で最も高くつく極性反転や数値不整合が過小評価される。
§8非目標
やらないことを先に決めておかないと、修正機は生成器に退化する
- 全文リライト。機能として持たない。必要なら生成器を呼べばよく、それは別の道具である
- 外部世界に対する事実確認。修正機が担うのは文書内および原文との整合まで。外部照合は別機能とし、混ぜない
- 原文なしの翻訳修正。できないことを、それらしくやらない
- 好みの押し付け。規約に書かれていない様式は既定で触らない。書かれたものだけが強制力を持つ
- 暗黙の学習。採否の履歴が人の見えないところでモデルの挙動を変えることを許さない(§1-7)
- 確信度の演出。数字を出せない検出器に、それらしい確信度を付けない。「不明」は正当な出力である
§9段取り
4領域を同時に作らない。第1段で骨格を確定させ、以降は検出器とアダプタの追加にする
§10自己適用
生成器と修正機が同一系である構成。実装上もっとも起こりやすく、もっとも危険な配置
修正機を言語モデルで作れば、多くの場合それは出力を生んだ生成器と同じ系のモデルになる。同一のセッション内で「自分の出力を見直す」構成も、これに含まれる。この配置は避けられないことが多いが、黙って許してはならない。
理由は、誤りの出どころにある。生成器の誤りの大半は知識の欠落ではなく癖から出る — 数値を丸める、限定条件を落とす、確認していない出典を書く、それらしい数字を置く。癖は同じ系のモデルに共有されている。したがって同一系の修正機は、生成器が間違えたまさにその箇所で、同じように何も感じない。
10.1 検出器の独立性等級
§1-8を運用可能にするため、全検出器に等級を付与し、Finding.detector と併せて台帳に記録する。
| 等級 | 検出器の性質 | 許される既定動作 |
|---|---|---|
| 甲 | 決定的な計算、または生成器の外にある参照との突合(原文、原画像、マスタ、用語集、再計算) | 自動適用 可 |
| 乙 | 生成器とは別系統のモデル、または統計・辞書に基づく判定 | 提案 まで |
| 丙 | 生成器と同一系のモデルによる判断のみ | 記録のみ まで |
確信度は等級を上げない。丙の検出器が0.99を出しても丙のままである。自己申告の確信度は、独立性の代わりにはならない(§5・生成器の自己申告を入力に使わない、と同じ理由)。
10.2 自己言及的な主張の検証
同一系の構成でとくに漏れるのが、その文書自身について書かれた数値である。件数、文字数、割合、「うち何件が」といった記述は、書いた側にとっては文章の一部だが、文書から機械的に再計算できる。この種の主張は、書かれた値ではなく計算した値を採用する(§4.1に検出器として登録済み)。
この誤りは丙の検出器では見つからない — 読んでも不自然でないからである。甲の検出器(文字数を数える)でしか見つからない。本仕様書自身が、§10が対象とする配置で書かれている。
10.3 事後の洗い出し
等級を台帳に持つことで、運用後に「丙の検出器だけが支えていた指摘」を抽出できる。これらは採用されたかどうかにかかわらず、独立した根拠を持たない判断の一覧であり、甲・乙の検出器を追加する際の優先順位になる。逆に、甲の検出器が一件も発火していない文書は、検査されたのではなく読まれただけとみなし、完了として扱わない。