【ローカルLLM】AIの繰返し暴走を防ぐ工夫のあれこれ【OpenWebUI】
はじめに
最近はクラウドAIではあまり見なくなりましたが、AIが同じ内容を永久に繰り返してしまう現象は、ローカルAIでは日常茶飯事です。特にUncensored版LLMでは良く起こります。
LLMは原理的に次の単語を確率で選んでいるだけなので、上手くループに入ってしまうと無限に繰り返してしまいます。
この記事では、ローカルLLMでは避けて通れない無限繰返し現象を低減する手法を紹介したいと思います。
※ この記事ではollama + Open WebUIを利用しています
パラメータで調整する
大きく分けると3つの手法があります。
一つ目は、繰り返しペナルティーパラメータの数値を上げる事です。

しかし実際にはあまり効果はなく、デメリットとしての性能低下を引き起こす事の方が大きいと思います。特にCoder系のモデルで上げると、まともなコードを生成する事ができなくなります。コードは繰り返しが多いですから。
基本的にはモデルの推奨値+α程度(例:1.1→1.2)だと思います。
二つ目は、多様・ランダム性を上げます。そもそも繰り返してしまう理由は、確率がループ「型」にハマってしまう事なので(例:りんご→なし→ぶどう→りんご)、回避するためにランダム性を上げます。無理やり確率の低い単語もランダムに選ぶというやり方です。
※ 人類の歴史も、ある事象が起こると、次の特定の事象が起こりやすくなり、歴史が繰り返されます。そこで(予測不能の)トリックスターが活躍して、歴史ループを防いでくれます。どの世界でも、最善ばかりを選ぶとループに陥ってしまうという事でしょう。人間の思考もそうなのかもしれません。
最も簡単なのは、
Temperature: より創造的な回答が増える
※ いわゆる蒸留モデルは、この温度を高くして、上澄みだけを取り出すという処理なので、蒸留という言葉のメタファーとして良くできていると思います
top_k: より選択肢の多い多様な回答を選択できる
top_p: top_kと連動してより選択肢の多い多様な回答を選択できる
の値を上げる事です。
より高度な(動的に変化する)mirostatを調整する方法がありますが、筆者のテストでは、性能向上した・上手くいった試しがないので、劇的には変わらないのだと思います。
基本は、Temperature/top_k/top_pをモデル推奨値から少し上昇させる程度のようです。
3つ目は、物理的にカットオフする事です。max_tokensを設定すれば、途中でも生成をストップします。
WebUIを利用する上ではあまり価値がないかもしれませんが、自動化している場合は、無限ループに陥って止まってしまう問題を防げます。
システムプロンプトで制御(筆者おすすめ)
上記パラメータ調整は、一長一短で「汎用さ」に欠けると思います。一方で、システムプロンプトでのループ防止が最も実用的なのではと筆者は思います。
ただし、ある程度規模の大きな賢いモデルでなければ効果が薄いです。

※ テキスト版は同じものを付録欄に添付しています
まとめ
規模の小さなおバカさんローカルLLMなので、この手の調整は仕方がないと思います。しかし、昔に比べると頻度が大きく減っているので、近い将来に全く無くなるかもしれません。
付録
支援者様(メンバーシップ)向けに本記事のシステムプロンプトのテキスト版を添付します。支援いただける場合はぜひよろしくおねがいします。
ここから先は
この記事が気に入ったらチップで応援してみませんか?
