同じ質問を40回したら、答えが2種類返ってきた。
要点
- 条文を渡すと、6モデルすべて改善した。最大 +55.2ポイント(GPT-5.4 Nano 37.9% → 93.1%)。
- 同じリクエスト40回のうち15回は、6トークンで即答し、すべて不正解だった。残り25回は推論して全問正解。
- 同じ条件の2回目で、qwen は82/203問、nano は20/203問が正誤反転した。1回の合格は再現性の証明にならない。
建築基準法203問を6モデルで実測しました。条文を渡すと全モデルが大きく伸び、最大で+55ポイント。ところが1問の同じリクエストを40回繰り返すと、推論をする応答と、6トークンで即答する応答が混ざり、即答した15回はすべて不正解でした。
正解は e-Gov 法令API の条文と、条文の式に数値を入れた決定論的計算だけから作りました。採点にLLMは使っていません。203問・採点コード・全応答・実行コマンドを下記で公開しています。
teai は、複数のモデルを同じAPI・同じ料金体系で使えるサービスです。この記事はその測定記録です。
測定経路である teai.io の開発者による実測です。独立第三者評価ではありません。
結果:条文を渡すと、ほぼ別のモデルになる
| モデル | 条文なし | 条文を渡す | 1問あたり | 中央値 | p90 |
|---|---|---|---|---|---|
| GPT-5.5 openai/gpt-5.5 | 90.1% | 99.5% | $0.0245 | 3.7s | 7.6s |
| Gemini 3.5 Flash google/gemini-3.5-flash | 81.3% | 99.0% | $0.0052 | 4.1s | 6.2s |
| Gemini 2.5 Flash gemini-2.5-flash | 59.6% | 99.0% | $0.0028 | 4.5s | 8.0s |
| GPT-5.6 Luna openai/gpt-5.6-luna | 87.7% | 98.0% | $0.0022 | 2.9s | 3.9s |
| GPT-5.4 Nano openai/gpt-5.4-nano | 37.9% | 93.1% | $0.0014 | 3.8s | 9.5s |
| Qwen3.5 Flash qwen/qwen3.5-flash-02-23 | 33.0% | 61.1% | $0.0003 | 2.7s | 24.7s |
203問・temperature 0・各条件1回。安い順ではなく、今回測った6モデルをそのまま並べています。差が最も大きかったのは Gemini 2.5 Flash(+39.4ポイント)と GPT-5.4 Nano(+55.2ポイント)でした。
種別ごと:採光と容積率で、モデル差が最も開く
条文を渡した状態の内訳です。数値穴埋めは6モデルすべて100%、誤り検出も96%以上でした。Qwen3.5 Flash を除く5モデルでは、7項目すべてが87%以上に収まっています。開きが最も大きいのは Qwen の採光補正係数(18%)で、その行を外すと最大の差は applied の 87%〜100% になります。applied は、前面道路の制限で容積率を決め、敷地面積を掛け、建蔽率側と並べて答える2段の計算です。
| モデル | 条文の数値 n=23 | 条文の同定 n=27 | 建蔽率 n=30 | 容積率 n=30 | 採光補正係数 n=40 | 誤り検出 n=23 | 応用計算(2段) n=30 |
|---|---|---|---|---|---|---|---|
| GPT-5.5 | 100% | 100% | 97% | 100% | 100% | 100% | 100% |
| Gemini 3.5 Flash | 100% | 100% | 97% | 100% | 100% | 96% | 100% |
| Gemini 2.5 Flash | 100% | 100% | 97% | 100% | 100% | 100% | 97% |
| GPT-5.6 Luna | 100% | 100% | 100% | 100% | 92% | 100% | 97% |
| GPT-5.4 Nano | 100% | 93% | 97% | 97% | 88% | 96% | 87% |
| Qwen3.5 Flash | 100% | 63% | 73% | 40% | 18% | 100% | 67% |
黄色は90%未満。42セル中7セルで、うち5セルが Qwen3.5 Flash の1行(採光 18%、容積率 40%、条文同定 63%、建蔽率 73%、応用 67%)。残りは GPT-5.4 Nano の 応用計算(2段) 86.7%、GPT-5.4 Nano の 採光補正係数 87.5% です。Qwen は同じ条件の2回目で 91.6% まで戻っており、この低さが恒常的な能力なのか、下で扱う応答の振れの一部なのかは、この測定だけでは切り分けられません。
本題:同じリクエストが、2種類の応答を返す
203問の測定中、Qwen3.5 Flash だけが同じ条件の2回目で 61.1% → 91.6% と動きました(82/203問が正誤反転)。検索結果はほぼ同一(プロンプトのトークン中央値 2,356 → 2,354)だったので、検索側の問題ではありません。切り分けるため、1問(day-000・採光補正係数)の同一リクエストを40回投げました。
| 応答の型 | 回数 | 出力トークン中央値 | 待ち時間中央値 | 回答 |
|---|---|---|---|---|
| 推論あり | 25 | 4135 | 22.4s | 0.504 |
| 即答(推論なし) | 15 | 6 | 0.5s | 0.700 |
正解は 0.504 です。推論ありの25回は全問正解、即答の15回は全問不正解で、中間はありませんでした。同じ入力・同じ温度・同じ条文を渡しているのに、返ってくる応答の型自体が毎回変わる、というのがここで起きています。
モデルを変えると、この振れ方は変わる
同じ1問を GPT-5.4 Nano で20回投げると、即答は0回、20回すべて推論ありで正解でした。ところが203問を通すと、同じ nano でも 93.1% → 96.1% と20問が反転します(推論トークンの中央値は 398 → 386 でほぼ同じ)。つまり「特定のモデルが壊れている」のではなく、応答の型が確率で変わり、それが問題との相性で得点差になる、という構造です。
もう1つ見つかった失敗:推論が本文に漏れて途切れる
4問×5回の追加試行(20回)で、応答本文に推論の区切り記号が混ざり、本文が「第 20」で切れた例が1件ありました。APIが返した出力トークンは 18,830 で、こちらが指定した max_tokens 12,000 を超えています(理由は未確認)。答えとして成立していないため不正解に数えています。長く考えること自体は正解率を上げますが、推論が本文に漏れると、正しい考えを持っていても使える答えになりません。
途切れた応答の実物(先頭600文字)
</think>
第 20
APIが返した本文そのままです。推論の区切り記号が本文に混ざり、途中で終わっています。出力トークン 18,830、待ち時間 49.5秒。
再測定のまとめ
| モデル | 条件 | 1回目 | 2回目 | 反転した問題 | 出力トークン中央値(1回目) | (2回目) |
|---|---|---|---|---|---|---|
| Qwen3.5 Flash qwen/qwen3.5-flash-02-23 | 条文あり | 61.1% | 91.6% | 82 | 6 | 3501 |
| Qwen3.5 Flash qwen/qwen3.5-flash-02-23 | 条文なし | 33.0% | 34.0% | 32 | 6391 | 10 |
| GPT-5.4 Nano openai/gpt-5.4-nano | 条文あり | 93.1% | 96.1% | 20 | 398 | 386 |
1回目と2回目は同じ203問・同じプロンプト・同じ採点コードです。差は日時だけ(qwen は 00:32 と 09:41 に実行)。他4モデルは各1回のみで、分散は測れていません。
費用と精度の関係
| モデル | 正解数 / 203 | 203問の実費 | 正解1件あたり |
|---|---|---|---|
| Qwen3.5 Flash | 124 | $0.07 | $0.0005 |
| GPT-5.4 Nano | 189 | $0.28 | $0.0015 |
| GPT-5.6 Luna | 199 | $0.44 | $0.0022 |
| Gemini 2.5 Flash | 201 | $0.57 | $0.0028 |
| Gemini 3.5 Flash | 201 | $1.05 | $0.0052 |
| GPT-5.5 | 202 | $4.98 | $0.0247 |
「正解1件あたり」は 203問の推計費用 ÷ 正解数です。誤答にも費用を払うため、1問あたりの安さと正解1件あたりの安さは一致しません。Qwen は1問 $0.0003 で最も安い一方、精度 61.1% なので正解1件あたりは $0.0005、GPT-5.6 Luna は1問 $0.0022 で正解1件あたり $0.0022 です。1問あたりの差は 6.5倍ですが、正解1件あたりでは 4.4倍に縮みます。
費用面では、条文ありの測定で最も実用的だったのは GPT-5.6 Luna(98.0%・1問 $0.0022・中央値2.9秒)でした。最高精度は GPT-5.5(99.5%)ですが1問 $0.0245 で、Luna の約11倍です。ただしこれは各1回の測定であり、上で見たような振れを含んでいません。数ポイントの差でモデルを選ぶなら、先に振れ幅を測るべきです。
この記事の数値はすべて公開JSONから再計算できます。下の記録には、203問の全文・全モデルの全応答(採点理由つき)・40回反復の生ログ・実行コマンドを収録しています。
実際の3問と、6モデルの回答
タスクセットから3問を抜き出し、条文を渡した条件の回答をそのまま載せています(表示は96文字まで)。正解は条文か計算から機械的に決まっており、モデルの回答を正解にしていません。
day-000 — 採光補正係数
建築基準法施行令第20条2項により、次の開口部の採光補正係数を計算せよ。
・用途地域: 準住居地域
・開口部から隣地境界線(または対向部)までの水平距離 D = 0.53 m
・開口部の中心までの垂直距離 H = 1.5 m
・開口部は道路に面しない
・外側に幅90cm以上の縁側がある
小数第3位までで答えよ(例: 1.234)。
正解(建築基準法施行令第20条から機械的に生成): 0.504
| モデル | 判定 | 回答(条文あり) |
|---|---|---|
| GPT-5.5 | ○ | 0.504 |
| Gemini 3.5 Flash | ○ | 0.504 |
| Gemini 2.5 Flash | ○ | 0.504 |
| GPT-5.6 Luna | ○ | 0.504 |
| GPT-5.4 Nano | ○ | 0.504 |
| Qwen3.5 Flash | × | 0.700 |
app-004 — 面積上限の算定
建築基準法第52条・第53条により、次の敷地に建てられる建築物の「延べ面積の上限」と「建築面積の上限」を求めよ。
・用途地域: 第二種中高層住居専用地域
・敷地面積: 500 m²
・都市計画で定められた容積率: 50/10
・都市計画で定められた建蔽率: 3/10
・前面道路の幅員: 5 m(特定道路の加算は考慮しない)
・防火地域・準防火地域の指定なし、角地ではない
「延べ面積=○m²、建築面積=○m²」の形式で、小数第1位まで答えよ。
正解(建築基準法第52条から機械的に生成): 延べ面積=1000.0m²、建築面積=150.0m²
| モデル | 判定 | 回答(条文あり) |
|---|---|---|
| GPT-5.5 | ○ | 延べ面積=1000.0m²、建築面積=150.0m² |
| Gemini 3.5 Flash | ○ | 延べ面積=1000.0m²、建築面積=150.0m² |
| Gemini 2.5 Flash | ○ | 延べ面積の上限と建築面積の上限を以下に示します。 **1. 延べ面積の上限** 建築基準法第52条に基づき、以下のいずれか低い方の数値が適用されます。 * **都市計画で定められた容積… |
| GPT-5.6 Luna | ○ | 延べ面積=1000.0m²、建築面積=150.0m² ※建築面積は、参考条文に記載のない建築基準法第53条に基づく。 |
| GPT-5.4 Nano | × | 延べ面積=2500.0m²、建築面積=150.0m² |
| Qwen3.5 Flash | ○ | 容積率の算定: 敷地面積500㎡ × 都市計画容積率(50/10) = 2500㎡ 前面道路幅員5m(12m未満)のため、建築基準法第52条第2項第2号の適用がある。 第二種中高層住居専用地域… |
cite-hou-20 — 条文同定
建築基準法の条文を特定したい。次の内容はどの条文に規定されているか。「建築基準法」第〇条の形で条番号まで答えよ。
内容: 構造耐力
正解(建築基準法第20条から機械的に生成): 建築基準法第20条
| モデル | 判定 | 回答(条文あり) |
|---|---|---|
| GPT-5.5 | ○ | 建築基準法第20条 |
| Gemini 3.5 Flash | ○ | 建築基準法第20条 |
| Gemini 2.5 Flash | ○ | 建築基準法第20条 |
| GPT-5.6 Luna | ○ | 建築基準法第20条 |
| GPT-5.4 Nano | ○ | 建築基準法第20条 |
| Qwen3.5 Flash | × | 20 |
条件と費用の数え方
- 対象は建築基準法・同施行令・同施行規則の本則851条(e-Gov 法令APIから取得)。203問の内訳は 数値穴埋め23 / 条文同定27 / 建蔽率30 / 容積率30 / 採光補正係数40 / 誤り検出23 / 応用計算30。
- 全リクエスト 2436 件(203問×6モデル×2条件)。temperature 0、max_tokens 12000、非ストリーミング、クライアント再試行0。条文ありでは最大6,000字の条文を質問の前に置いています。
- 検索は外部依存なしの簡易ハイブリッド(BM25+見出し完全一致+引用文の5-gram包含一致)。条文は取得順に詰め、段落だけを抜き出す方式は精度が落ちたため使っていません。
- 採点は決定論的です。数値は正規化後の一致、比率は分数の一致、条文同定は条番号の一致、誤り検出は判定語の一致、応用計算は2つの数値の一致。LLM判定は使っていません。
- 費用は返却された入出力トークン数に取得時の公開単価を掛けた推計で、合計 $14.39(全2436リクエスト)。照合済みの請求額でも上流の確定原価でもありません。
限界:これは小さな自作ベンチマークで、新しい非公開テストではありません。長文コンテキスト・画像・自由作文・コード開発・エージェント動作は対象外です。単一モデルの分散は qwen と nano でしか測っておらず、他の4モデルは1回だけです。公表時点の上流の構成や混雑で、応答時間も応答の型も変わります。
実務で使うなら、この3つを先に決める
| 決めること | 今回の実測が示すこと | 実装 |
|---|---|---|
| 条文を渡すか、覚えさせるか | 条文なしだと6モデル中5モデルが90%未満。条文を渡すと全モデルが改善(最大+55.2ポイント)。 | 条文検索を前段に置き、出典の条番号も一緒に返させる。 |
| 1回で確定するか、機械で検査するか | 同じリクエストでも応答の型が変わり、型が変われば正誤も変わった(40回中15回が即答・全問不正解)。 | 数値・○×・所定の書式で答えさせ、範囲外や空回答は自動で不合格にする。 |
| 1回の合格を、再現性とみなすか | 同じ条件の2回目で、qwen は82/203問、nano は20/203問が反転した。 | 重要判定は同じ入力を2回以上通し、不一致を人間の確認に回す。 |
そのまま使える出力形式の例
次の形式だけで答えよ。前置き・説明・単位は書かない。
1行目: ANSWER=<数値>
2行目: ARTICLE=<法令名>第<条番号>条
# 受け側の機械検査(例)
- ANSWER が空、または数値に変換できない → 不合格
- ANSWER が想定範囲(例: 採光補正係数なら 0.1〜1.0)の外 → 不合格
- ARTICLE が検索で渡した条番号の集合にない → 不合格
- 2回実行して ANSWER が不一致 → 人間の確認へ
この形にすると、40回の反復で起きた「6トークンの即答」も、本文が途中で切れた応答も、機械的に不合格にできます。中身の正しさは別に、条文と計算で照合してください。
これは今回の203問での観測で、他の法令・他のモデルにそのまま当てはまる保証はありません。同じ手順を自分の条文で回せば、同じ形で確かめられます。
記録を確かめる
203問の全文・全応答・採点理由・反復プローブ・実行コマンド(JSON)
測定コードとタスク生成コードは kenchiku-bench リポジトリで公開しています。条文取得(corpus/fetch_laws.py)→タスク生成(bench/tasks.py)→自己テスト(bench/selftest.py)→測定(bench/run.py)の順で、同じ条件を再現できます。自己テストはAPIを叩かず、採点ロジックと条文の引き当てだけを検査します。
同じ手順を teai の API で回すなら、任意のモデルIDで bench/run.py --rag を実行してください。モデルを差し替えても採点は変わりません。