ところでキャラチャットのコンテキストに日付情報を与えると、今月はやたらとクリスマスの話題を振ってこられる。小説で、日付と相関するイベントで一番強いのはクリスマスだからなのは分かるが、この辺はなんか工夫しないとダメだな。
類似問題として、食事シーンでは、だいたいハンバーグになる現象などがある。

実際、ハンバーグ問題は難しいんだ。キャラ設定に「カツ丼が好き」と書けば解決するか?というと、しない。三食ともカツ丼になるだけだ。

メニューをいっぱい書けばいい?否。いつもレストランのシーンになるだけ。

有望な解は、「食事シーンになったら、メニューを考える演出プロンプトを動作させて、その出力をインジェクションする」だと思う。食事シーン判定、メニュー生成というプロンプトを余計に実行する必要はあるけど、kv cacheを生かせば大した計算量は要らんのでそこは問題ない。

メニュー生成には、

そこで出されたのは、①ハンバーグ ②カツ丼 ③カレーライスのどれですか?

という選択肢プロンプトでもいいけど、これだと選択肢を用意しなきゃいけないので、

そこで出されたのは、カ

みたいに、ランダムな頭文字を挿入して補完させる方式だと、低コストで、ランダム性が保て、モデルの知識を最大限に活用できるのでお勧め。

従来手法だと、マンネリ回答回避にtemperatureを上げる方法がよく使われるけど、あれは微妙。
確かにマンネリは回避される可能性はあるが、ロジックが破綻するので。頭文字だけランダム指定してあとは普通のtemperatureの方がいい。

なお、「そこで出されたのは、カ」というプロンプトで「レーライスだった。」という補完文が得られたら、次に「そこで出されたのは、カレーライスだった。」をそのまま出力してユーザーに表示してもいいけど、「そこで出されたのは、カ」というLLM生成ではない文章が混じるのは避けたい場合がある。

そこで、

「今日のランチメニューにはなにかな?」
そこで出されたのは、カレーライスだった。メニューをお客に説明しよう。
ウェイトレス「

というようにプロンプトをインジェクションし、ウェイトレスの台詞だけ出力する、という手法がある。

まあ、CoTなんですけどね。プロンプトを動的にインジェクションしたり巻き戻したりするところが普通のCoTとは違う。

この手法は問題点を抱えてて、これだとシーン毎に判定プロンプトを用意しないといけなくなる。これはメニューを聞いているシーンだ、ということが分からないとプロンプト挿入ができないので。

そこで今考えているのは、function callingでコマンド選択を行う手法。

次にキャラが行うべき行動は何ですか?①話す ②ものを渡す ③移動する

みたいな。

ただし7Bモデルではこのコマンド選択の精度が中々出なくて、選択肢を2択にして階層化した上で、probabilityを見るとか、いろいろ対処法を考え中。

フォロー

このように、LLMを人工知能だと思わず、もっともらしい後続文を出力する関数だと割り切って使った方が、特に低パラメータモデルだと有用だと思っている。AIチャットするのにチャットモデルなんか使うのやめようぜ(過激派)

ログインして会話に参加
Fedibird

様々な目的に使える、日本の汎用マストドンサーバーです。安定した利用環境と、多数の独自機能を提供しています。