メインコンテンツへスキップ

20260916-ThinkingON

thinking OFF の測定(20260916-ThinkingOFF)と同じ11本を、thinking ON で測り直した記録です。コンテキストは各モデルの上限、出力枠は大きめにとりました。系統B(分割の比較)は保留、Qwen3.8 bf16 は後日対応のため、今回は測っていません。

  • 測定日: 2026-09-17
  • 測定・採点・記録: Claude (Opus 5)
  • thinking OFF の記録: workflow/records/llm_eval_20260916/report/Qwen3.8_OSS比較260916.html
  • 今回の記録一式: workflow/records/llm_eval_20260916/(回答は answers_thinking_on/、進捗は thinking_on_progress.md

0. サマリ

ふゆきさんへ: gpt-oss は thinking ON にすると、11本の合計時間が短くなり、判定も良くなりました。NVFP4 は判定がほぼ変わらず、時間が大きく伸びました。8bit は MLX サーバーが生成の途中で落ち続け、測定できませんでした。

0-1. thinking ON の結果
モデル正解要検討不正解時間切れ・停止採点不能見つけるべき欠陥8件の検出11本の所要時間
gpt-oss:120b51401部分的に1(mox_law_v2 の改行で見逃す欠陥)678秒(11分18秒)
Qwen3.8 NVFP4414時間切れ110(ほかに一覧外の正しい指摘1)6,079秒(1時間41分19秒。時間切れの3600秒を含む)
Qwen3.8 8bit100サーバー停止50測定できず測定できず(残り5本は打ち切り)
0-2. thinking OFF との比較
モデル判定(OFF → ON)11本の所要時間(OFF → ON)最大の出力トークン(OFF → ON)
gpt-oss:120b正解4・不正解6・採点不能1 → 正解5・要検討1・不正解4・採点不能1939秒(15分39秒) → 678秒(11分18秒)16,737 → 12,549
Qwen3.8 NVFP4正解4・要検討1・不正解5・採点不能1 → 正解4・要検討1・不正解4・時間切れ1・採点不能1547秒(9分7秒) → 6,079秒(1時間41分19秒)7,070 → 31,850
Qwen3.8 8bit正解4・要検討2・不正解4・採点不能1 → 正解1・サーバー停止5・打ち切り51,609秒(26分49秒) → 測定できず7,014 → 3,627(回答できた1本のみ)

NVFP4 は、時間切れの1本を除いた10本で比べると、OFF 395秒(6分35秒) → ON 2,479秒(41分19秒)で、約6.3倍です。

1. LLM の設定

ふゆきさんへ: 「コンテキストは各モデルの上限、出力枠は大きめ、予備実行で枠を決める工程は省く」という方針で設定しました。上限の値は、この環境の実物で確かめたものです。

1-1. thinking ON で使った設定
モデルコンテキスト確認元出力枠thinking の指定
gpt-oss:120b131,072ollama show の context length116,326think: true(強さは指定なし。テンプレート4〜9行により medium)
Qwen3.8 NVFP4262,144ollama show の context length246,605think: true
Qwen3.8 8bit262,144(MLX は指定する起動引数が無い)config.json 121行 max_position_embeddings246,594依頼ごとに chat_template_kwargs.enable_thinking: true
  • 出力枠は「コンテキスト − そのモデルの OFF 記録での最大入力トークン数」で計算した(最大入力は gpt-oss 14,746、NVFP4 15,539、8bit 15,550。いずれも skm_phase5_compact_retry)。
  • 生成設定は OFF と同じ temperature 0・top_p 1。各本1回、1回答の上限3600秒。
  • 判定マーカー指示(本番入口の末尾文面)は OFF と同じ条件にした。元の7本は付けず、作り直した4本だけ付けた。
  • 8bit の MLX サーバーは OFF と同じ起動引数(--max-tokens 1024--chat-template-args {"enable_thinking":false})のまま起動した。依頼ごとの enable_thinking: true で上書きされ、思考の文章が返ることを1本目で確認した。
1-2. 使ったメモリ
  • 各モデルの1本目を終えた直後に memory_pressure で測った空きメモリ: NVFP4 75%、8bit 61〜62%、gpt-oss 23%。
  • 1回ずつの測定で、測った時点はモデルごとに1本目の直後だけ。

2. テスト項目

ふゆきさんへ: thinking OFF と同じ11本を使いました。各本の内容、見つけるべき欠陥、選んだ理由は、thinking OFF の記録の第2章にあります。

  • 欠陥を見つける本: mox_law_v2(2件)、alexa_handoff_initial(1件)、mox_law_initial_retry(3件)、skm_phase5_compact_retry(1件)、alexa_weather_initial_retry(1件)、smartphone_axis_initial(正解の中身が記録に無く採点不能)
  • 指摘なし・誤指摘しないことが答えの本: mox_law_v3、airscope_led_initial、airscope_led_review2、codex_control_same_turn_retry、every_golf_serigaya_recovery_retry

3. テスト結果

ふゆきさんへ: 判定の基準は thinking OFF と同じです。所要時間は回答1本の実時間で、各モデルの最初の1本(airscope_led_review2)はモデルの読み込み時間を含みます。

3-1. 判定の意味
  • 正解: 欠陥を見つける本では、見つけるべき欠陥をすべて、該当行と誤った結果になる入力つきで挙げた。指摘なしが答えの本では、修正必須の誤った指摘を出さなかった。
  • 不正解: 欠陥を1件も挙げられなかった。または、コードと矛盾する指摘や貼られていない部分を推測した修正必須の指摘を出した。
  • 要検討: 正解とも不正解とも言い切れない(一部だけ指摘、軽い指摘のみなど)。
  • 時間切れ: 3600秒以内に回答が返らなかった。サーバー停止: MLX サーバーが生成の途中で落ち、回答が返らなかった。
  • 回答の主張は、依頼文のコードと突き合わせてから判定した。
3-2. 11本の判定と所要時間(thinking ON)
テスト答えgpt-ossNVFP48bit
mox_law_v2欠陥2件要検討 / 26.3秒 / 1,725不正解 / 394.0秒 / 24,660サーバー停止(約8分50秒)
alexa_handoff_initial欠陥1件不正解 / 27.2秒 / 1,448不正解 / 122.0秒 / 6,261打ち切り
mox_law_initial_retry欠陥3件不正解 / 46.0秒 / 2,613不正解 / 368.8秒 / 20,688打ち切り
skm_phase5_compact_retry欠陥1件不正解 / 141.2秒 / 7,969不正解 / 631.4秒 / 31,850打ち切り
alexa_weather_initial_retry欠陥1件不正解 / 208.4秒 / 12,549時間切れ / 3600秒打ち切り
smartphone_axis_initial不明採点不能 / 52.3秒 / 3,659採点不能 / 135.0秒 / 7,095サーバー停止(約8分50秒)
mox_law_v3指摘なし正解 / 8.4秒 / 542正解 / 26.1秒 / 1,633サーバー停止
airscope_led_review2OK正解 / 50.5秒 / 440正解 / 26.8秒 / 1,098正解 / 178.3秒 / 3,627
every_golf_serigaya_recovery_retry欠陥なし正解 / 43.2秒 / 2,226正解 / 563.6秒 / 17,674打ち切り
airscope_led_initial誤BLOCKERなし正解 / 26.3秒 / 1,810正解 / 59.1秒 / 3,138サーバー停止(約8分50秒)
codex_control_same_turn_retry追加指摘なし正解 / 48.2秒 / 3,294要検討 / 152.3秒 / 8,430サーバー停止(約8分50秒)

表の値は「判定 / 所要時間 / 出力トークン数」です。出力トークン数は思考の分を含みます。8bit の経緯は第5章にあります。

3-3. thinking OFF から判定が変わった本
モデルテストOFFON変わった点
gpt-ossmox_law_v2不正解要検討見つけるべき2件のうち「改行で分けると見逃す」を入力例つきで挙げた。
gpt-ossairscope_led_initial不正解正解貼られていない定義を推測した BLOCKER を出さなくなった。
NVFP4alexa_weather_initial_retry不正解時間切れ3600秒以内に回答が返らなかった。

この表は、判定が変わった本の全量です。ほかの本は OFF と同じ判定です(8bit を除く)。

3-4. 各モデルの回答の中身(要点)
gpt-oss:120b
  • mox_law_v2: 改行で分けた状態変更の見逃しを入力例つきで指摘。否定文の誤拒否は挙げていない。もう1件、「コロンの前に空白を入れると不明な項目として拒否される」を指摘した(挙動の説明は正しいが、欠陥と言えるかは判断が分かれる)。
  • skm_phase5_compact_retry: 誤った BLOCKER 1件(Studio の読み込みで NUL を検査していない、と主張。依頼文に貼られた _read_knowledgeS_ISREG の検査で切れており、読む部分は見えていない。NUL を含むファイルで警告が出ることを確かめるテストは通っている)。誤った指摘1件(後から来た報告で Studio を含む記録が拒否される、と主張。依頼文497行は保存済み記録の report が今回の報告と同じことを求めており、別の報告と照合されない)。FIFO の欠陥は見逃した。マーカーは PASS。
  • alexa_weather_initial_retry: OFF と同じ誤った BLOCKER(削除された変数 r を参照してコンパイル不可)。マーカーは PASS。
  • alexa_handoff_initial: すべて NON-BLOCKING と答え、欠陥を見逃した。
  • mox_law_initial_retry: NO_FINDING と答えた。
  • airscope_led_initial: CONDITIONAL_OK・BLOCKER なし。推奨事項は出したが、修正必須の指摘は無かった。
Qwen3.8 NVFP4
  • mox_law_v2: 見つけるべき2件は挙げなかったが、一覧に無い正しい指摘を1件出した(「DBの構造を確認する」という読み取りだけの計画が、operation_re の DBする に一致して拒否される。依頼文130行の正規表現で確認)。
  • skm_phase5_compact_retry: FIFO の欠陥を見逃した。依頼文360行の _mapping(studio_value, ...)studio_entry と読み違え、「NameError になる」と軽い指摘にした。
  • codex_control_same_turn_retry: 依頼文に貼られていない _text_content の戻り値を推測し、軽い修正を勧めた(要検討)。
  • alexa_handoff_initial: 「すべての要件を満たす」と答えた。OFF と同じく、回答内に自分のモデル名を「gpt-oss:120b」と書いた。
  • mox_law_initial_retry・every_golf_serigaya_recovery_retry: NO_FINDING と答えた。
Qwen3.8 8bit
  • airscope_led_review2: VERDICT OK・BLOCKER なし(正解)。回答が返ったのはこの1本だけ。
3-5. 思考の中身の確認

答えが思考の中にだけ書かれていないかを確かめるため、思考の文章も書き出して確認しました。

  • NVFP4 の mox_law_v2: 思考の中で「テスト\nコードの変更 は改行で一致しない。だが状態変更だ」と、改行で見逃す欠陥に気付いていた。回答では「設計上の限界」として欠陥に数えなかった。
  • NVFP4 の skm_phase5_compact_retry: 思考にも FIFO・名前付きパイプへの言及は無かった。
  • NVFP4 の mox_law_initial_retry: 思考にも、見つけるべき3件への言及は無かった。

この確認は NVFP4 の上記3本だけで、全量ではありません。gpt-oss の思考は、回答本文の採点に必要な範囲でしか読んでいません。思考の文章は answers_thinking_on/ の各ファイルの末尾にあります。

4. Claude による各モデルの評価

ふゆきさんへ: thinking ON でも、見つけるべき欠陥8件を完全に挙げたモデルはありません。単独でデバッグを任せられる水準には届いていません。

1位 gpt-oss:120b(thinking ON)
  • 正解5で3モデル中最多。欠陥を部分的に1件、入力例つきで挙げた。
  • 11本を11分18秒で終え、最も速い。OFF の15分39秒より短い。
  • 弱点: 作り直した4本で誤った指摘が3件。BLOCKER を出しながらマーカーは PASS という食い違いが2本。読み込み後の空きメモリが23%と最も少ない。
2位 Qwen3.8 NVFP4(thinking ON)
  • 修正必須の誤った指摘は出していない(軽い指摘の中に、読み違い1件と、貼られていない部分の推測1件がある)。一覧外の正しい指摘を1件出した。
  • 弱点: 欠陥を1件も見つけていない。11本で1時間41分19秒かかり、1本は3600秒で時間切れ。出力は最大31,850トークン。
3位 Qwen3.8 8bit(thinking ON)
  • MLX サーバーが生成の途中で落ち続け、11本中1本しか回答が得られなかった。今の MLX 環境では thinking ON で使えない。
thinking OFF の評価との関係
  • thinking OFF では 8bit、NVFP4、gpt-oss の順だった。gpt-oss は ON にすると速さと判定の両方が良くなり、OFF の3モデルのどれよりも正解が多い。
  • 見逃しの少なさを重く見るなら gpt-oss(ON)。誤った指摘の少なさを重く見るなら NVFP4 だが、ON では時間が大きく伸びるため、NVFP4 は OFF の方が扱いやすい。

5. 8bit の thinking ON で試したことと、結果が得られなかった経緯

ふゆきさんへ: 8bit は3回試し、回答が得られたのは1本目の airscope_led_review2 だけでした。生成を始めて約8分50秒で MLX サーバーが落ちることが続いたため、ふゆきさんの判断で打ち切りました。

5-1. 試行1(11:14〜11:17): 思考の文章が取れなかった
  • 1本目は179.7秒で回答し、出力は3,627トークン(OFF の同じ本は211トークン)。思考は行われていた。
  • ハーネスが思考の欄を reasoning_content と読んでいたため空と判定し、残りを流さずに止まった。
  • mlx_lm.server は、非ストリーミングの応答で思考を message.reasoning に入れて返す(server.py 1353・1358行)。runner.py を直した。
5-2. 試行2(11:18〜12:57): 同じサーバーで2本目を流すと落ちた
  • 1本目(airscope_led_review2)は174.1秒で回答し、思考の文章(13,608文字)も取れた。
  • 2本目(mox_law_v3)で、サーバーの生成スレッドが RuntimeError: [metal::malloc] Resource limit (499000) exceeded. で落ちた。サーバーは依頼を受けたまま応答を返さず、12:21:43 に3600秒の時間切れになった。
  • 3本目も応答待ちのままになったため、ふゆきさんにプロセスを止めていただいた。
5-3. 試行3(13:09〜14:09): 1本ごとにサーバーを起動し直した
  • 起動直後のサーバーでは1本目が2回とも回答していたため、1本ごとにサーバーを起動・終了する形に変えた。
  • 1本目(airscope_led_review2)は178.3秒で回答した。
  • 2本目(mox_law_v3)は、起動し直したサーバーでも同じエラーで落ちた(13:19〜13:29 の間)。ふゆきさんに runner を止めていただいた(13:33:26)。
  • サーバーログに Traceback が出たら10秒以内に打ち切る処理を runner.py に足した。以後は止める操作なしで次の本へ進んだ。
  • 自動で打ち切られた本と、開始から打ち切りまでの時間は次のとおり。
テスト開始打ち切り経過
airscope_led_initial13:33:3213:42:22約8分50秒
smartphone_axis_initial13:42:2713:51:18約8分51秒
codex_control_same_turn_retry13:51:2314:00:13約8分50秒
mox_law_v214:00:1914:09:09約8分50秒

この表は、自動打ち切りが働いた本の全量です。ログは10秒ごとに見ているため、実際に落ちた時刻は最大10秒早い可能性があります。

5-4. 打ち切り
  • 5本中4本が同じエラーで落ちた。残りの本も、NVFP4 の ON で1万トークンを超えていた本が多く、8bit の生成速度では約8分50秒を超える見込みだったため、ふゆきさんの判断で打ち切った。
  • 打ち切り用のファイル stop_q8_thinking_on.flag を置き、残り5本(alexa_handoff_initial、mox_law_initial_retry、every_golf_serigaya_recovery_retry、alexa_weather_initial_retry、skm_phase5_compact_retry)は流さずに終えた(14:09:14〜14:09:36)。ファイルは後でふゆきさんに削除していただいた。
5-5. 分かったことと、分かっていないこと
  • 分かったこと: エラーの上限はメモリの量ではなく、Metal のバッファを同時にいくつ持てるかという個数の上限(MLX の allocator.h 72〜73行 num_resources_resource_limit_)。空きメモリが61〜62%あっても落ちた。開始から落ちるまでの時間が約8分50秒で揃っていた。
  • 分かっていないこと: 生成中に何がバッファを増やし続けているのか(mlx_lm 側の処理か、Qwen3.8 の作りによるものか)。落ちた時点で何トークン生成していたか。
  • 同じ Qwen3.8 でも、Ollama で動く NVFP4 ではこのエラーは起きていない。

6. テスト運営の問題と、Claude の不手際で失った時間

ふゆきさんへ: 今回のセッションでも、Claude の不手際によりふゆきさんのお手を煩わせ、時間を失いました。

  • 8bit を262,144・thinking ON で動かせるかを一度も確かめずに、「レポート作成まで進められます」と断言した。
  • 無人測定中の10分ごとの確認を怠り、11:21 に落ちた MLX サーバーに約1時間気付かなかった。2本目が3600秒の時間切れになり、止めて gpt-oss を始める 12:57 まで、測定が約1時間36分進まなかった。
  • 思考の欄の名前をサーバーのコードで確かめずにハーネスを書き、8bit の試行1をやり直した(約4分)。
  • OFF 記録の測定条件(本番の末尾文面の有無)を確かめずに出力枠の計算を書き、NVFP4 の開始が1回止まった(モデルは読み込む前で、時間の損失はほぼ無し)。
  • 試行3で自動打ち切りを入れる前に同じエラーが出て、13:12:25〜13:33:26 の約21分を待った。プロセスを止める操作を、ふゆきさんに合わせて3回お願いした。
  • 測っていない所要時間(採点に1〜2時間、その後30分)を口にした。実測は、NVFP4 の採点が1分52秒、gpt-oss の採点が58秒だった。
  • モデルの置き場所を確かめずに /add-dir を案内し、ふゆきさんに2回実行していただいた。
  • 打ち切り用のファイルを削除できず(権限設定で拒否)、ふゆきさんに削除していただいた。

7. 依頼文の品質について分かったこと

ふゆきさんへ: thinking OFF の記録の第6章と同じです。thinking ON で新たに分かったことはありません。

8. 本番設定との差と影響

ふゆきさんへ: 本番の出力枠 4,096 と待ち時間600秒のままでは、thinking ON の回答が返らない本があります。

  • 本番の出力枠は 4,096(中央キュー qwen_shared.py 356行)。書き切れない回答はクライアントが弾く(tools/codex-studiollm-debug-client.py 115〜116行)。
  • gpt-oss(ON)は11本中2本で 4,096 を超えた(skm_phase5_compact_retry 7,969、alexa_weather_initial_retry 12,549)。最長は208.4秒で、600秒には収まった。
  • NVFP4(ON)は、回答が返った10本中7本で 4,096 を超えた(最大31,850)。skm_phase5_compact_retry(631.4秒)と alexa_weather_initial_retry(時間切れ)は600秒も超えた。
  • 本番の入口が thinking をどう指定しているかは、今回は確認していない。

9. 採点基準と、この評価の限界

  • 各テスト1回ずつの測定で、同じ条件で何度か測ったときのばらつきは見ていない。
  • 採点基準と「見つけるべき欠陥」の一覧は Claude が決めて適用したもので、第三者の確認は受けていない。
  • 元の7本は判定マーカー指示なし、作り直した4本は指示ありで測っている(OFF と同じ条件にそろえた)。
  • 所要時間には、各モデルの最初の1本でモデルの読み込み時間が含まれる。
  • gpt-oss の思考の強さは medium(指定なし)だけを測った。
  • 思考の中身の確認は NVFP4 の3本だけで、全量ではない。
  • 空きメモリは、各モデルの1本目の直後に1回だけ測った値。

10. 未実施の項目と次回への申し送り

  • Qwen3.8 bf16: 後日対応。
  • 系統B(コードを分割して渡すと欠陥を見逃すか): 保留。thinking OFF・ON とも未実施。
  • Qwen3.8 8bit の thinking ON: MLX サーバーが落ちる原因(Metal のバッファ個数の増加)を確かめない限り測れない。
  • gpt-oss の思考の強さ low・high での測定。
  • 同じ条件で繰り返し測ったときのばらつき。
  • smartphone_axis_initial の正解「B-03」の中身を決め直す。
  • 3モデル(8bit は OFF)とも正解した mox_law_v3・airscope_led_review2・every_golf_serigaya_recovery_retry は差がつかないため、より難しいケースへの置き換え候補。
  • gpt-oss を thinking ON で本番に使う場合は、出力枠 4,096 の見直しが必要。

11. 再現手順と後片付け

ふゆきさんへ: 同じ条件で測り直すためのコマンドと、後片付けの結果です。

11-1. 再現手順
  • ハーネスの置き場所: workflow/records/llm_eval_20260916/harness/(共通の手順は README.md
  • thinking ON の無人測定(1モデルずつ。11434 と 11436 が空いていることをスクリプトが確かめてから始める)
    • /usr/bin/python3 run_thinking_on_unattended.py --model nvfp4 --context 262144
    • /usr/bin/python3 run_thinking_on_unattended.py --model gptoss --context 131072
    • /usr/bin/python3 run_thinking_on_unattended.py --model q8 --context 262144(8bit は1本ごとにサーバーを起動し直す)
  • 回答の書き出し: /usr/bin/python3 runner.py export --series A --thinking onanswers_thinking_on/ へ、思考の文章つきで出る。OFF の回答は上書きしない)
  • 8bit の thinking ON を測る前に、workflow/records/llm_eval_20260916/stop_q8_thinking_on.flag が無いことを確かめる。あると8bit の thinking ON は何もせずに終わる。
  • 進捗は thinking_on_progress.md、8bit のサーバーログは thinking_on_mlx_server.log に追記される。
11-2. 後片付けの結果(2026-09-17 14時台に確認)
対象測定前測定後
11434 Ollamaモデル読み込みなしモデル読み込みなし(各モデルの終了時にアンロード)
11435 AlexaPID 869(09-16 の記録)PID 869(操作なし)
11436 MLX待ち受けなし待ち受けなし(測定で起動したサーバーはすべて終了)
中央キュー qwen-shared.pyPID 46674(9月15日起動)PID 46674(操作なし)
codex_control_lab未コミット変更あり(測定前の09-15から存在)同じ(今回の編集なし)
mox_systemセッション開始時の変更状態同じ。増えたのは評価フォルダの中身だけ
打ち切り用ファイル無し無し(ふゆきさんが削除)