いつものセットアップだと、他の言語では英語のときほどうまくいかないことに気づき始めました。モデルがときどき文法ミスをして、本物の意味でのごみを生成するんです。推論(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: 生成のたびにやはりばらつく。文法はいまだ少しノイズっぽいですが、おそらく英語での執筆(?)には良さそう
これにより、さらに他の、より複雑なサンプラーがどう反応して動作するのかが気になりました。残念ながら、この分野についてあまり時間も知識もないので、私が体験したことについてコメントできるのはそれだけです。
編集:これが何かを意味していると言っているわけではありませんが、毎回生成の前にサンプラーを調整する代わりに、実行時(ランタイム)にサンプラーをより制御できるようにしたほうが有益かもしれませんか?
[link] [comments]




