修正機

設計仕様書 — 草案 v0.1

Shuseiki修正機

生成された文章・訳文・表・書き起こしを、壊さずに直すための機構。コネクタから呼ばれるツールとしての形態と、入口を見張り続けるマシンとしての形態を、同一のコアの上に置く。

対象領域文章 / 翻訳 / データ / OCR・文字起こし
入口貼付・添付 / Gmail・Drive / ローカル / 他AI出力
形態ツール(被呼出)/ マシン(常駐)
状態未実装・仕様確定前

§0前提

なぜ「生成器」とは別の機械が要るのか

AIの実利用の大半は、白紙から作る仕事ではなく、すでにある出力を直す仕事に費やされている。翻訳の手直し、下書きの推敲、書き起こしの整形、表の正規化。にもかかわらず、その工程は生成器に「もう一度書かせる」ことで代用されてきた。これが問題を生む。

生成器にもう一度書かせると、直ってほしくない箇所まで変わる。数値が丸まる。固有名詞が言い換わる。原文にあった条件節が消える。直った箇所と壊れた箇所が同じ操作の中で起きるため、事後に切り分けられない。修正が信用されない理由はここにあり、結局は人が全文を読み直すことになる。

修正機は、この工程を生成から分離するための機械である。成功条件は「良い文を書けること」ではなく、「触っていない箇所が確実に触られていないこと」に置く。

コストの非対称性。見逃し1件と誤修正1件は等価ではない。見逃しは現状維持だが、誤修正は人間が入力した正しさを機械が破壊した事故であり、しかも「直った」という体裁をまとって下流に流れる。したがって既定はすべて保守側に倒す。この非対称性が、以降のあらゆる設計判断の根拠になる。

§1設計原則

実装が迷ったときに立ち返る8条。仕様の他の部分は、すべてこの結果である

  1. 最小改変出力は差分であって、新しい文書ではない。全文書き換えは機能として存在させない。検出器が指摘できなかった箇所は、原文のまま1文字も動かさずに出口へ抜ける。
  2. 不変条件の先取り検出より先に「この文書で触ってはならないもの」を抽出する。数値、固有名詞、識別子、単位、日付、コードの意味論、プレースホルダ。検出器が明示的に許可を持たない限り、これらに触れるパッチは判定段で却下する。
  3. 三分類すべての指摘は 確定誤り / 疑義 / 様式の好み のいずれかに分類される。自動適用は確定誤りのみ。疑義は提案として人に出す。様式の好みは、規約に書かれていない限り既定で不介入とする。
  4. 根拠の同伴パッチには 検出器名・理由・確信度・原文 を必ず付す。根拠を持たないパッチは出力しない。「なんとなく良くなる」は修正機の出力ではない。
  5. 冪等性同じ入力に2回流して差分が出ないこと。出るなら、その検出器は好みで揺れている。収束しない検出器は改善対象ではなく無効化対象とする。
  6. 可逆性原本を保存し、適用したパッチを台帳に記録し、任意の時点まで巻き戻せる形でのみ書き戻す。巻き戻せない適用は行わない。
  7. 学習は昇格制採否の履歴を暗黙にモデルへ戻さない。繰り返し採用された指摘は、用語集・表記規約・固有名詞辞書という読める資産に昇格させ、その資産を通してのみ次回に効かせる。人が中身を確認・修正できない学習は行わない。
  8. 独立性検出器の価値は、賢さではなく生成器からの独立性に比例する。生成器と同じ癖を持つ検出器は、生成器が間違えたところで同じように間違える。したがって検出器は独立性で格付けし、格の低いものを自動適用の枠に入れない(§10)。

§2処理系

6段。順序そのものが誤修正率を決めるため、段の入れ替えは仕様変更とみなす

1
取込・正規化

入口ごとのアダプタが、原資料を内部表現に落とす。文書はセグメント(文・セル・発話・行)に分割し、各セグメントに安定IDと原資料上の位置(文字オフセット / セル参照 / タイムコード / bbox)を持たせる。以降の全工程はこの内部表現の上でのみ動く。

in: 原資料 → out: Document{ Segment[] }
2
不変条件の抽出

検出より先に走る。数値・固有名詞・識別子・単位・リンク・プレースホルダ・コード片を機械的に拾い、保護対象として登録する。呼び出し元がこの一覧を渡してきても信用せず、必ず自分で抽出する(§6・ツール形態の契約)。

in: Document → out: Invariant[]
3
検出

決定的検出器を先に、言語モデル検出器を後に走らせる。順序に理由がある。言語モデルは目に入ったものを直したくなるので、機械的に確定できる誤りを先に潰し、モデルには残差だけを見せる。こうすると指摘の総量が減り、確信度の分布が素直になる。

in: Document, Invariant[] → out: Finding[]
4
判定

各指摘を三分類にかけ、確信度を付け、不変条件と衝突するものを却下する。却下は破棄ではなく「指摘のみ」に降格させる — 数値が食い違っているという事実は、勝手に直せないとしても人に届ける価値がある。

in: Finding[] → out: Patch[](適用), Finding[](提案・記録)
5
適用

パッチを位置の後ろから順に当てる。重なるパッチは確信度の高い方を残し、低い方は提案へ回す。原本は必ず別に保持する。

in: Document, Patch[] → out: Document′, 原本
6
検証・書き戻し

事後照合を3つ回す。(a) 不変条件が全て保存されているか、(b) 適用済み文書をもう一度流して差分が出ないか(冪等性)、(c) 改変量が想定範囲か。いずれかが落ちたら書き戻さず、人に上げる。通れば出口アダプタが原資料へ書き戻し、台帳に記録する。

in: Document′ → out: 書き戻し, LedgerEntry
(b) の冪等性チェックが実質的な安全弁になる。2周目で新しい指摘が出る検出器は、1周目の自分の出力を気に入っていないということであり、それは好みで動いている証拠である。この検査は品質指標であると同時に、暴走する検出器の自動的な発見器でもある。

§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が生成した文を通したときに、修正機が返すもの

入力 → 出力(差分表示)
弊社の第3四半期の売上高は、前年同期比で12.5%増加し、1,240百万円となりました。この結果は、主に新製品の販売が好調に推移した事ことによるものです。
F-01
自動適用表記規約 §3.2 / 確信度 0.99

形式名詞「事」はひらがなで表記する。文書内の他11箇所は既に「こと」。

F-02
提案単位表記の統一 / 確信度 0.82

「1,240百万円」→「12億4,000万円」。文書内の他8箇所は「億円」表記。数値そのものは不変条件のため、単位の書き換えを伴うこの指摘は自動適用せず提案に降格した。

F-03
変更禁止数値不整合 / 要確認

本文「12.5%」に対し、添付表 Sheet1!C4 は 11.5%。どちらが正しいか機械には決められないため、直さず指摘のみを出す。この指摘は既読になるまで台帳に残る。

全75文字のうち、書き換わったのは1文字だけ。残りは1文字も動いていない — そしてそれが機械的に検証できることこそが、この機械の成果物である。

§5入口

アダプタ4種。取り込みと書き戻しは対で実装し、片方だけの実装を認めない

入口取込書き戻し固有の注意
貼付・添付 本文テキスト、添付ファイル 差分表示と修正済みファイルを返す 原資料の所在が手元にない。台帳の巻き戻しは利用者側の操作に依存する
Gmail / Drive 下書き、文書、スプレッドシート 新版として保存(上書きしない) 共有中の文書は他者の編集と衝突する。hash/mtimeを取込時に記録し、書き戻し直前に再確認する
ローカルフォルダ 指定フォルダ配下のファイル 原ファイルの隣に修正版を置く 大量・大容量になりやすい。抽出と絞り込みは手元で行い、必要な分だけ本体に上げる
他AIの出力 生成器の出力を直接受ける 後段へパイプ、または生成器へ差し戻す 生成器の自己申告する確信度を入力に使わない。生成器ごとの癖を検出器として登録できる
「他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(規約版, 期間)      → 遡及影響の一覧
共有部分。§2の6段、§3のデータモデル、§4の検出器は両形態で完全に同一の実装を使う。形態の違いは「誰が起動するか」「状態をどこに置くか」だけであり、修正の判断そのものが形態によって変わってはならない。同じ文書を両方に通して結果が違うなら、それは不具合である。

§7受入基準

この数字を満たさないものは、便利であっても出さない

指標目標意味
不変条件違反率0%1件でも出たらリリース不可。緩和条項を設けない唯一の指標
冪等性違反率0%2周目で差分が出る検出器は無効化する
自動適用の適合率≥ 99%黙って直した100件のうち、誤りが1件を超えない
提案の採用率≥ 60%低いなら提案が雑。人の確認時間を食う分だけ有害になる
甲の検出器の被覆率監視のみ独立した根拠(§10.1)に支えられた指摘の割合。低いなら、読まれただけで検査されていない
改変量監視のみ触った文字数の割合。急増は検出器の暴走の先行指標
確認時間の削減率実測最終的な効用。人が全文を読み直しているなら、他が満点でも失敗

評価用データは、実際に人が直した前後のペアから作る。合成データで測ると、決定的検出器が得意な誤りに偏り、実運用で最も高くつく極性反転や数値不整合が過小評価される。

§8非目標

やらないことを先に決めておかないと、修正機は生成器に退化する

  • 全文リライト。機能として持たない。必要なら生成器を呼べばよく、それは別の道具である
  • 外部世界に対する事実確認。修正機が担うのは文書内および原文との整合まで。外部照合は別機能とし、混ぜない
  • 原文なしの翻訳修正。できないことを、それらしくやらない
  • 好みの押し付け。規約に書かれていない様式は既定で触らない。書かれたものだけが強制力を持つ
  • 暗黙の学習。採否の履歴が人の見えないところでモデルの挙動を変えることを許さない(§1-7)
  • 確信度の演出。数字を出せない検出器に、それらしい確信度を付けない。「不明」は正当な出力である

§9段取り

4領域を同時に作らない。第1段で骨格を確定させ、以降は検出器とアダプタの追加にする

第1段
文章 × 貼付入力 × ツール形態、決定的検出器(甲)のみ 言語モデルはまだ入れない。ここで作るのは検出器ではなく、不変条件・三分類・台帳・冪等性チェックという骨格である。ここが緩いと、以降どれだけ検出器を足しても信用されない機械になる。
第2段
言語モデル検出器を提案枠にのみ追加、用語集の導入 この段階でも自動適用の枠には入れない。提案の採用率を実測し、60%に届く検出器だけを残す。昇格の仕組み(§1-7)もここで作る。
第3段
翻訳・データ領域、および書き戻しアダプタ 原文を伴う処理(source付きDocument)と、Gmail・Drive・ローカルへの書き戻しを入れる。衝突検出と巻き戻しがここで初めて本番の負荷を受ける。
第4段
マシン形態、そして文字起こし・OCR 常駐・監視・承認キュー・遡及再実行。OCRと文字起こしを最後に置くのは、原信号への参照保持が全段に影響するためで、骨格が固まってからでないと入れられない。

§10自己適用

生成器と修正機が同一系である構成。実装上もっとも起こりやすく、もっとも危険な配置

修正機を言語モデルで作れば、多くの場合それは出力を生んだ生成器と同じ系のモデルになる。同一のセッション内で「自分の出力を見直す」構成も、これに含まれる。この配置は避けられないことが多いが、黙って許してはならない。

理由は、誤りの出どころにある。生成器の誤りの大半は知識の欠落ではなく癖から出る — 数値を丸める、限定条件を落とす、確認していない出典を書く、それらしい数字を置く。癖は同じ系のモデルに共有されている。したがって同一系の修正機は、生成器が間違えたまさにその箇所で、同じように何も感じない。

この構成の症状は「品質が低い」ではなく「品質が高く見える」である。同一系の修正機は、表記ゆれや冗長さといった見えている誤りを大量に直す。数字の上では適合率も指摘件数も良く出る。その裏で、最も高くつく種類の誤り — 極性の反転、落ちた限定条件、検証されていない数値 — だけが選択的に素通りする。指標が改善しながら事故率が下がらないなら、まずこの配置を疑う。

10.1 検出器の独立性等級

§1-8を運用可能にするため、全検出器に等級を付与し、Finding.detector と併せて台帳に記録する。

等級検出器の性質許される既定動作
甲 決定的な計算、または生成器の外にある参照との突合(原文、原画像、マスタ、用語集、再計算) 自動適用 可
乙 生成器とは別系統のモデル、または統計・辞書に基づく判定 提案 まで
丙 生成器と同一系のモデルによる判断のみ 記録のみ まで

確信度は等級を上げない。丙の検出器が0.99を出しても丙のままである。自己申告の確信度は、独立性の代わりにはならない(§5・生成器の自己申告を入力に使わない、と同じ理由)。

10.2 自己言及的な主張の検証

同一系の構成でとくに漏れるのが、その文書自身について書かれた数値である。件数、文字数、割合、「うち何件が」といった記述は、書いた側にとっては文章の一部だが、文書から機械的に再計算できる。この種の主張は、書かれた値ではなく計算した値を採用する(§4.1に検出器として登録済み)。

事例。本仕様書の初稿(§「出力の形」の締め)は「全87文字のうち、変更されたのは2文字」と記していた。実際は75文字、書き換わったのは1文字である。数えずに、もっともらしい値が置かれていた。§1-4「根拠を持たないパッチは出力しない」と書いた同じ文書の中で起きており、公開前の検証段で修正された。

この誤りは丙の検出器では見つからない — 読んでも不自然でないからである。甲の検出器(文字数を数える)でしか見つからない。本仕様書自身が、§10が対象とする配置で書かれている。

10.3 事後の洗い出し

等級を台帳に持つことで、運用後に「丙の検出器だけが支えていた指摘」を抽出できる。これらは採用されたかどうかにかかわらず、独立した根拠を持たない判断の一覧であり、甲・乙の検出器を追加する際の優先順位になる。逆に、甲の検出器が一件も発火していない文書は、検査されたのではなく読まれただけとみなし、完了として扱わない。