開発記事公開日
AIの出力は同じ設定でも毎回違う。1回の結果で判断して間違えた記録
この記事で分かること
単線結線図をAIに読ませる検証で、同じ設定のまま接続の点数が約1.7倍ぶれました。1回ずつの比較で出した結論を撤回した経緯、数字を動かしていたのが物差しの側だった件、いま採用している測り方を記録します

目次 読みたいところから
AIに同じ図面を読ませ、同じ設定のまま2回採点したら、接続の点数が約1.7倍違いました。片方の回だけを見ていたら、この差を設定の良し悪しとして読んでいたはずです。実際に、その読み方で結論を出して、あとで撤回しています。BenriWorksが開発している、単線結線図を構造化データにするツールの検証で、8月末からの数日間に起きたことです。1回の結果を信じて間違えた判断と、数字を動かしていたのがAIではなく物差しだった件、いま採用している測り方を記録します。
何を読ませ、どう採点していたか
単線結線図は、受電設備の機器とそのつながりを1本の線で描いた図面です(「単線結線図の一枚目に、確認事項がついてくる」)。ツールは図面の画像を Google の Gemini(gemini-3-flash-preview)に読ませ、遮断器や変圧器などの機器をノード、機器どうしのつながりをエッジとするグラフを取り出します。処理は、機器を見つける段、文字を読む段、接続をたどる段に分かれていて、接続をたどる段は3回実行して票を合わせる設計です。
採点には、人が図面を見て作った正解データを使います。読み取ったノードとエッジを正解と突き合わせてF1という値を出します。取りこぼしでも余計な検出でも下がる値で、1.0が満点です。最初の目標は、接続のF1で0.80に置きました。正解データは、官公庁や自治体が公開している高圧受電設備の単線結線図から2枚作りました。低圧の分電盤が密に並ぶ機器70個前後の図面と、機器40個あまりの小さな図面で、以下では前者を図面A、後者を図面Bと呼びます。
同じ設定で、点数が1.7倍違った
揺れに最初に気づいたのは図面Aでした。機器を見つける段にも投票を入れた設定で実行すると、接続のF1は0.237と0.403に分かれました。変えたものは何もありません。別の設定では、同じ条件で回したのに見つかった機器の数が41、53、60と変わっています。
生成AIは、同じ入力に同じ答えを返すとは限りません。ツールの設計書も最初から、出力のランダムさを抑える設定(temperature 0)でも出力は決まらないと書き、各図面を3回実行した平均と散らばりで判定すると定めていました。知っていたのに、途中の判断は1回の実行で下していました。結果がすぐに出るので、1回見るとつい次の設定を試したくなります。
1回ずつの比較で出した結論
撤回した判断の1つめは、分電盤の中身の扱いです。単線結線図の低圧側では、盤の枠の中に遮断器が何個も並んでいます。これを1個ずつ取り出す処理(盤展開)を改良すると、図面Aでは取り出せた遮断器が多い回ほど接続のF1が低く出ました。同じ設定で、機器41個の回が0.177、60個の回が0.033です。記録には、主な指標では盤展開を切ったほうが良いと書き、既定を切るかどうかを運営者の判断に回しました。
ところが、図面Bで盤展開だけを切って比べると、結果は逆でした。盤展開ありは機器0.756、接続0.517で、なしは0.139と0.083です。図面Bの正解には個別の遮断器が14個あるのに、盤展開を切ると抽出は盤ごとにまとめた3個しか返しません。図面Aで「切ったほうが良い」と見えたのは、機器の数が41から60まで揺れる実行どうしを1回ずつ比べていたからでした。盤展開は必須と決め直し、既定のまま残しています。
原因の見立ても外れていた
図面Aで接続の点数が低い理由も、最初は読み違えました。盤展開で増えた遮断器を、接続をたどる段が結線できていない、と見立てたのです。そこで、盤の上を通る母線から各遮断器へ、規則で線を補う処理を実装しました。
動かしてみると、補った線は0本でした。取り出した遮断器23個はすべて結線済みで、25本の線はどれも母線から遮断器へ引かれていました。構造は正しかったのです。
点数を下げていたのは、採点側の照合でした。読み取った機器の枠と正解の枠を対応づけるとき、枠の重なりが半分以上という条件を使っていました。読み取った遮断器は正解とほぼ同じ高さに並んでいるのに、横に数目盛りずれるだけで重なりが半分を切ります。機器が対応づかなければ、その機器につながる線は正しくても数えられません。同じ実行を中心の近さで照合し直すと、接続のF1は0.047から0.188に変わりました。
記録には、このとき「推定した原因は、直す前に構造で裏を取ること」と書いています。結線されていない遮断器の数を1回数えていれば、補う処理を実装する前に見立ての誤りに気づけました。
物差しを直すと、読み取り結果を変えずに点数が動く
照合の決まりを、中心の近さと枠の辺の長さの比で判定する形に改めて測り直すと、図面Bの接続のF1は0.517から0.787になりました。AIの読み取り結果は1バイトも変えていません。同じ物差しで検証初日の抽出を測り直すと0.382で、数日間の改善は0.382から0.787と読むのが正しいことになります。
正解データそのものが間違っていたこともあります。最初の正解データは、AIの抽出結果を下地にして人が直す手順で作りました。このとき図面Bの低圧側で、個別に描かれた遮断器を、抽出がまとめた形のまま3つの負荷として受け入れてしまいました。機器を見つける段への指示は「同じ種類の機器が複数あっても絶対に集約せず、1個ずつ個別に列挙する」です。正解のほうが指示に反していました。その結果、機器のF1は1.000と出ました。数え方の規約を決め直して正解を作り直すと0.725で、取りこぼしを表す再現率は0.610でした。満点は、抽出の誤りを正解が飲み込んでいた結果だったのです。
AIの出力を下地にすれば、正解データを作る手間は大きく減ります。ただ、下地のまとめ方まで受け入れると、AIの系統的な誤りが正解として固定されます。いまは数え方の規約を先に文書にし、図面を拡大して目で構造を確かめてから、抽出結果を下地に組んでいます。
いまの測り方
撤回が続いたあと、次の作業に向けて測り方を次のように決め直しました。
- 同じ設定を3回実行し、平均と標準偏差で比べる。標準偏差が0.05を超える図面は「不安定」として扱う
- 正解データは、数え方の規約を先に決めてから作る
- 原因を見立てたら、直す前に構造の数字(結線されていない機器の数など)で裏を取る
- 調整に使う図面と、合否を判定する図面を分ける
3回ずつ実行すると高くつくように見えますが、費用は図面1枚あたり0.1から0.3ドルほどで、1回ずつ何度も試すのと大差ありませんでした。回数を重ねると、散らばりの大きさそのものが分かります。直近の計測では、同じ設定を3回ずつ2回り、計6回実行した平均が、図面Bの接続で0.749±0.030、図面Aで0.368±0.096でした。図面Aのこの揺れでは、設定を変えて0.05上がったと1回の実行で主張しても、何も言ったことになりません。
4つめの項目は、まだ守れていません。正解データは2枚とも、それを見ながらプロンプトや閾値を調整してきた図面です。図面Bでは接続のF1が0.828まで出た回もありますが、1回の実行で、しかも調整に使った図面での値なので、目標の達成とは扱っていません。合否は、調整に一切使わない3枚目以降の図面で判定します。

1つの数字を事実として扱ったとき
撤回した3つの判断は、どれも1つの数字をそのまま事実として扱ったところから始まっています。盤展開は1回ずつの比較で、接続の見立ては点数の変化だけから、正解データは満点という結果から判断しました。出力が揺れることは設計書に書いてあったのに、数字が出た瞬間にはそれを忘れていました。
見積書の読み取りでは、明細の掛け算と足し算で裏を取る設計にしています(「LLMの読み取り結果を、検算を通ったときだけ信じる」)。図面の接続には、見積書の合計のような検算の手がかりがありません。そのぶん正解データとの照合に頼ることになり、その物差しの誤りが、3つの撤回のうち2つを生みました。図面の規模が大きくなると接続の読み取りそのものが崩れる問題もあり、そちらは「AIに図面を読ませると、機器が50個を超えたあたりで接続が崩れる」に書きました。
まだ手元にないのは、合否を判定するための3枚目の図面と、読み取り結果を人が直す画面です。点数が目標を超えたとき、それを信じてよいかを決めるのは、その3枚目になります。
