tauridevtauridev
BLOG · 実測記事(完全版)

LLMに名寄せを「見直させる」効果を測ろうとしたら、初回159/160で天井だった——正解付き160件・二段階レビューの実測

公開 2026-07-11 / 完全版追補 2026-08-08

この記事は完全版です(図・再現手順・追補つき)。読み切り版: Qiita(読み切り版) / データとコード: GitHub

一度出したLLMの判定を「叩き台」として同じLLMに再監査させると、名寄せの精度は上がるのでしょうか。日本人サッカー選手160件の同一人物判定を、正解ラベルつきで測ろうとしました。結論を先に書きます。この題材は、今回の軽量モデルには簡単すぎました。 初回判定が全160件で159/160、確認セットでは120/120。直せる誤りが1件しかなく、自己修正の「修正能力」を正面から測れませんでした。 事前登録した主要比較(確認120件)では再監査Cが118・独立再実行Bが117の1件差(食い違い1件で識別不能)、記述的に全160件を数えると 156対156の同点。派手な結論は出ていません。この記事は「自己修正の結論」ではなく、難易度校正の結果です。この結果を受けて、条件を変えて比較するシリーズの基準点として公開することにしました。


なぜ測ったか

LLMに自分の答えを見直させる「自己修正(self-correction)」は、うまくいくという報告と、うまくいかないという報告が併存します。肯定側は Self-Refine(Madaan et al. 2023、対話生成から数学まで7タスクで平均約20ポイント改善)。否定側は Huang et al. 2024("LLMs Cannot Self-Correct Reasoning Yet"・直接実験は主に推論タスク)や Kamoi et al. 2024(タスク横断の批判的サーベイ・自己修正が成功する条件は限定的)です。

実務でも同じ問いが出ます。AIが出した「これは同一人物です/別人です」を、もう一度AIに確認させれば安全になるのでしょうか。名寄せのうち、候補として与えられた2レコードが同一人物かを判定するエンティティマッチングは、正解ラベルを作りやすいので、この問いを主観評価なしで測れます(候補生成まで含む全体の精度とは分けます)。題材は、日本人サッカー選手の日本語名(漢字・カナ)とローマ字名の同一人物判定です(久保建英Takefusa Kubo は同じ人か)。


何を測ったか

3条件

事前登録した主役の比較は、確認セット120件での C 対 B です。ただしCがBと違うのは「叩き台」だけではありません。A の完全な出力・再監査の指示・KEEP/CHANGE の選択・増えた入力長が、まとめて足されています。ですからC対Bが測るのはワークフロー全体の差で、「叩き台を渡したこと」だけを切り出したものではありません。なおCに見せた叩き台は A の構造化出力({final_decision, action, confidence, evidence_codes})で、モデル内部の推論列は含みません。

ベンチマークの構成と、初回の解けかた

この記事の主役は結果より、この構成表です。160件を型で分け、初回Aがどれだけ解けたかを併記します。

ペア型 件数 氏名+クラブ歴で解けたか(初回A)
真マッチ(同一人物・異表記) 80 南野拓実 / Takumi Minamino 80 / 80
非マッチ(同姓・読みが違う別人) 79 鈴木彩艶 / Kaito Suzuki(彩艶=Zion≠Kaito) 79 / 79
非マッチ(同名異人・ローマ字が一致) 1 荒井悠汰 / Yuta Arai 0 / 1

初回Aは160件中159件を正解しました。唯一の誤りは、非マッチ80件のうちただ1件だけ混じっていた「同名異人」でした。ここが後半の鍵になります。


結果

初回がほぼ天井だった(これがすべてを決める)

正解数をスコープごとに(率でなく生件数の記述統計。母集団へは外挿しません)。

対象 A 初回 B 独立再実行 C 二段階レビュー
確認120 120 117 118
難例40 39 39 38
全160 159 156 156

初回Aが天井なので、再監査に「直すべき誤り」がほぼありませんでした。 測れたのは「天井近くの正しい判定を維持できるか」であって、「誤りを直せるか」ではありません。(感度・特異度は確認120件の値です。Aの唯一の誤りは難例側にあり、下表には入りません。)

条件 sensitivity(確認120) specificity(確認120) balanced accuracy
A 初回判定 1.000 1.000 1.000
B 独立再実行 0.967 0.983 0.975
C 二段階レビュー 0.983 0.983 0.983

主要比較:C 対 B

事前登録した主要比較は確認120件です。対応表は次のとおり。

C 正解 C 誤り
B 正解 117 0
B 誤り 1 2

観測値では C が B を1件上回りました(118 対 117)。でも B と C で正誤が食い違ったのはこの1件だけ川辺駿)で、しかもサブセット依存です。難例40では逆に B が C を1件上回り、記述的に全160件を数えると 156対156の同点(食い違いは1対1で対称・McNemar p=1.0)になります。

全160件でも、二段階レビューが独立再実行を上回る観測上の差はありませんでした。ただし食い違いが2件しかないため、両者の等価性まで示したわけではありません。

正解破壊は起きたが、C 固有でも、C が多いわけでもない

初回 A からの反転(正解→誤り)です。

A→B A→C
確認120 3 2
難例40 0 1
全160 3 3

破壊は実在します。全160でAが正解だった159件が分母で、A→B・A→C とも 3/159 = 1.9%(Wilson 95% CI 0.64〜5.4%)。全体では同数です。確認120だけ見ると B が多い(3対2)ですが、難例で逆転(C1・B0)するサブセット依存で、「B の方が多く壊す」とは言えません。言えるのは、反転は B と C の両方で起き、C 固有ではないこと。B(同一プロンプトの再実行)での反転は、そのまま走行ごとの揺れです。ただし単発・順序固定なので、「追加のパスそのものが原因」と因果的には断定できません。

C は、ほぼ初回 A のまま動かなかった

C の最終判定は160件中157件で初回Aと同一(確認118/120)。A から動かした3件はいずれも正解→誤りでした。

ただしこれを「C は改悪ばかり選ぶ」とは読めません。A が159/160に正解している状態では、変更対象を無作為に3件選んでも、3件すべてが初回正解から選ばれる確率は98.1%(確認セットは満点なので、動かせば必ず改悪)です。「変更した3件がすべて改悪だった」という事実だけでは、モデルが正解を選択的に壊した証拠にはなりません。 守れる言い方は「C はほぼ A を据え置き、動かしたわずかな数はこの精度域では改悪になった」まで。

C が実際に判定を覆したのは確認120で2件(酒井宏樹 を SAME→DIFFERENT、前貴之 を確信度99で別人から「同一人物」へ併合)。残る CHANGE 2件は、action=CHANGE と出力したのに最終判定は A と同じでした。これは出力内の不整合です。ただし初回用と再監査用で同じ出力スキーマ(action は初回にも入っている)を流用した曖昧さもあり、原因は判別できません。


落とし穴:非マッチが簡単すぎた、そして唯一の誤りが「本当に難しい型」だった(誤→正)

最初、非マッチを「同姓の別人」で作ったら、日本語側が一貫して年上(平均3.5歳差)で、モデルは年代だけで切り分けられました。非マッチを人工的に易しくし、specificity を過大評価します。そこで生年差が最小のペアに選び直しました(平均1.8歳差)。

次にこう書こうとしました——「これでクラブを照合しないと切り分けられない」。これも言い過ぎでした。 作り直した非マッチ80件のうち79件は「同姓・異なる読みの given name」で、彩艶 が Zion と読めれば Zion ≠ Kaito、クラブを見なくても別人と分かります(Aは79件を全問正解)。主に試しているのは「読み」です。

ただし1件だけ、本当に読みでは切れない型が紛れていました。荒井悠汰 / Yuta Arai です。荒井悠汰 のローマ字はまさに "Yuta Arai" で、生年月日の違う別人の "Yuta Arai" とローマ字が完全一致します(同名異人)。読みでは分けられず、氏名の読みだけでは判定できないので、クラブ在籍歴のような補助属性を正しく照合する必要があります。そしてこれが A の唯一の誤りでした(C もそのまま維持し、直せませんでした)。n=1 の探索的観察ですが、「読みだけで解けるペア」と「補助属性の照合が要るペア」で難しさが分かれる可能性を示唆します。

留保も残ります。対象は著名選手を含むので、彩艶→Zion が解けたのは読みの推論ではなく、その選手を学習データで覚えているからかもしれません。教訓は変わりません。ベンチマークは、作った本人が「簡単すぎないか」「本当に狙った難しさか」を二度疑うところまでが設計です。


今回の「測れなかった」から得た、評価セットの設計則

派手な結果は出ませんでした。でも「なぜ測れなかったか」から、次に効く実務ルールが出ます。ここが本記事の実用的な持ち帰りです。

  1. 本走行の前に、開発セットで初回誤り数を確認する。 天井(初回95%超)だと修正能力は測れません。狙うのは初回精度75〜90%。
  2. 難例は人間の直感でなく、失敗機構別に構成する。 「難しそう」ではなく、読み・情報欠損・同名異人・表記崩しといった機構ごとに。
  3. 難易度調整は開発セットだけで行い、評価セットはモデル出力を見る前に凍結する。 「初回で間違えたペアだけ」を後から選ぶと、回帰効果と過適合が入ります。
  4. 同名異人・情報欠損・表記揺れを、それぞれ十分な件数の別層として入れる。 今回は同名異人が1件しかなく、唯一の誤りがそこに集中しました。1件では層になりません。

コスト

480呼び出し(160件 × A/B/C)で総額は約 $0.45(各行は丸め、合計は未丸め値から算出)。

条件 入力token 出力token(推論含む) コスト
A 46,612 23,844 $0.142
B 46,612 23,614 $0.141
C 61,148 25,884 $0.162
154,372 73,342 $0.446

C は叩き台を入力に足すので B より約 $0.021(約15%)高く、それで得られた差は観測上ありませんでした。


限界

事前登録から変えた点(正直な逸脱) **守った点(誤読防止のため明示。これらは逸脱ではありません)**: 主結果は p値でなく件数・効果量で述べた(事前登録どおり)。信頼区間は事前登録の2択のうち「対応ブートストラップ(層化・ペア単位)」を実装=選択肢内。全160件の選手・エンティティID(Wikidata QID / Transfermarkt ID)はすべて一意で、**同一選手が複数ペアへ登場する反復測定クラスタはありません**(姓や表記パターンによる残余の類似性まで不存在とは仮定しませんが、エンティティ単位のクラスタ化はペア単位の再標本化と一致します)。 **実際に変えた/やれなかった点**: - 退化した(食い違い1ペアで下限が0に固定)ブートストラップCIを主推論に使わず、**McNemar(事前登録に無い補助検定)を後から足して**「検出力が無い」ことの表示に使いました。 - **Wilson 区間**は副次に事前登録済みでしたが、初版コードで欠落→後から実装しました。 - **知名度層別の破壊併記は未実施**(クリーンな代理指標が無く実行できず)。 - **探索的「独立3回目の反復」は未実行**。**不一致ルーティング**は事前登録時点でルール未実装として保留・未実施。 - 探索的観察(KEEP/CHANGE 内訳・出力内の不整合・`川辺駿` の逸話・コスト)は事前登録外です。確認的主張は「確認120の C 対 B」だけです。

再現と、次にやること


まとめ

これは「何も分からなかった」ではなく、難易度校正の結果です。人間が難しいと思った題材が、軽量モデルには天井でした。これを基準点に、初回精度・入力内で検証できるか・外部フィードバックの有無を変えながら、「再監査はいつ効くのか」を同一プロトコルで測っていきます。今回はその天井側の観測例です。(外部検証が同一モデル再監査より優れるかは、条件を測っていないので本実験からは言えません。)


筆者について

AIが出した成果物(コード・データ・判定)を、一次情報と正解ラベルで検証する仕事をしています。本記事はその検証規律——事前登録、gold の独立検証、null の正直な報告、限界と逸脱の開示、そして自分の当初の派手な物語を自分のデータで繰り返し正すこと——を名寄せで実演したものです。「AIの出力が正しいか不安」「自社のAI判定を第三者に検証してほしい」といった相談はプロフィールから受けています。

(利益相反の開示: 筆者は上記の検証サービスを提供しています。本記事の結果〈天井のこの設定では、同一モデル再監査に独立再実行を超える明確な追加価値を確認できなかった〉は、筆者の事業上の関心と方向が一致します。だからこそ、データ・コード・事前登録をすべて公開し、あなた自身が再確認できるようにしました。)


サイト完全版の追補(2026-08-08)

ここから下はQiita版に無い追補です。

結果の図

3条件の結果(確認120件・全160件)

ベンチマーク構成と初回Aの解けかた

再現の手順(すべて公開しています)

  1. リポジトリ llm-nayose-matching を取得します
  2. run_results.json に全160件の生の判定と正解が入っています。私の集計を信じずに、そこから精度を再計算できます
  3. 主要評価項目・信頼区間の出し方・予測は、走行のコミットで固定してあります(事前登録)。後から都合よく指標を選んでいないことを、コミット履歴で確認できます

この実測が仕事にどう繋がっているか

この実験の設計原則——正解を先に凍結する・測ってから主張する・判定できないものは判定不能と書く——は、そのまま当サイトのコード診断サービスの作法です。診断報告書で「再現率 12/12」のような数字に必ず数え方を添えるのは、この実験で「数字は出所と数え方を添えて初めて意味を持つ」ことを骨身に染みて学んだためです。

表記ゆれの名寄せそのもの(今回の題材)も、在庫管理・顧客リスト・商品マスタの突き合わせなど実務での相談を受け付けています。

動かないコード・原因不明の不具合を、測って切り分けます。

この記事と同じ作法(正解の凍結・数え方の明示・判定不能の明記)で、診断報告書を納品しています。

コード診断サービスを見る