なぜ“推論”と“出力”を同じサンプリング方法で行っているのだろうか?

Reddit r/LocalLLaMA / 2026/4/24

💬 オピニオンDeveloper Stack & InfrastructureSignals & Early TrendsTools & Practical Usage

要点

  • 著者は、LLMに推論は英語で行わせつつ他言語で出力させる場合、固定のサンプリング設定だけでは文法ミスや質の低い生成につながることがあると気づいた。
  • 出力の品質改善のために温度を下げると有効だが、その変更が英語の推論にも影響して、創造性が落ちたり決定的になったりする。
  • そこで、生成途中でサンプラーを切り替え、推論(thinking)トークンには別のサンプリング設定を使い、最終出力(output)トークンには別の設定を使う案を提案している(要するに2回のAPI呼び出しを1回の実行にまとめる発想)。
  • llama.cppで“thinking_sampler_override”や“thinking_top_k”“thinking_temp”“thinking_min_p”のようなパラメータを使って実装すると、すぐに動作し、文法と生成バリエーションのトレードオフが変わるような結果が得られたという。
  • さらに、より高度なサンプラーだと挙動がどう変わるか気になっており、生成の前ではなく実行時にサンプラー制御できると役立つのでは、という見立ても述べている。

いつものセットアップだと、他の言語では英語のときほどうまくいかないことに気づき始めました。モデルがときどき文法ミスをして、本物の意味でのごみを生成するんです。推論(reasoning)は英語のまま維持されていて、私はそれをそのままにしておくことを好みました。というのも、ほとんどのLLMが明らかに最も「自信がある」のが、英語だからです。

学習があまり進んでいない言語で生成する際のいくつかの問題への答えは、temp(温度)を下げることでした。ですが、その影響は推論にも及び、推論は英語で行われるため、創作(creative writing)がそれほど「創作的」ではなくなります。同じコンテキストからの再生成が決定論的になります。

そこで、こんな考えが浮かびました——前に生成されたトークンに基づいて、生成の途中でサンプラー(sampler)が切り替わったらどうだろう?基本的には、2回API呼び出しをするのと同じで、1回目はあるサンプラーのプリセットで「考える(thinking)」ために呼び出し、次に(思考をコンテキストに含めて)別のサンプラーのプリセットで出力を生成します。しかし手作業でそれをやるのではなく、コードでチェック(指定)を書くようにすればいい。

そこで、llamacppのリポジトリを引っ張ってきて、(まあまあ)Claudeの数行を参考に実装してみました。この発想はハック的でとても単純で、いくつか追加のAPI引数を渡す必要があります:

"thinking_sampler_override": true,
"thinking_top_k": 128,
"thinking_temp": 0.0,
"thinking_min_p": 0.05,

llamacppは、他に設定してあるサンプラーをすべて「無視」して、thinkingトークンの範囲だけを、これらのサンプラーでサンプリングします。意外なことに、ほぼそのまま直ぐにうまくいき、変な結果がいくつも出ました。たとえばGemma 4では:

思考(thinking)temp 1 + 出力 temp 0: これまでで一番良いウクライナ語の文法。temp 0のすべてに比べて、ランダムで非決定的
思考(thinking)temp 0 + 出力 temp 1: 生成のたびにやはりばらつく。文法はいまだ少しノイズっぽいですが、おそらく英語での執筆(?)には良さそう

これにより、さらに他の、より複雑なサンプラーがどう反応して動作するのかが気になりました。残念ながら、この分野についてあまり時間も知識もないので、私が体験したことについてコメントできるのはそれだけです。

編集:これが何かを意味していると言っているわけではありませんが、毎回生成の前にサンプラーを調整する代わりに、実行時(ランタイム)にサンプラーをより制御できるようにしたほうが有益かもしれませんか?

submitted by /u/ReporterWeary9721
[link] [comments]