【KARAKURI LM 10本ノック】#2 KARAKURI LM ならではの機能、属性パラメータ(SteerLM)
こんにちは、カラクリ R&D チームの吉田です。
前回の記事では KARAKURI LM を動かしてみました。ローカルLMを身近に感じていただけましたでしょうか。
今回は、現時点で日本語ローカルLMの中でも KARAKURI LM だけ(※)がもつ機能である「属性パラメータ」について解説します。
※ 2024–06–20 現在、公開されている国産モデルの中で
属性パラメータとは?
属性パラメータは、KARAKURI LM で推論するときに指定できるオプション設定で、出力の傾向を制御することができます。現時点での最新モデルである karakuri-lm-8x7b-chat-v0.1 では、以下の 9 種類のパラメータが用意されています。
- Helpfulness:プロンプトに対して回答が全体的に有用であるか
- Correctness:関連した事実が全て誤りなく回答に含まれているか
- Coherence:回答の表現が一貫性をもち明確であるか
- Complexity:回答に必要な知的レベル(誰でも書ける回答か、深い専門知識を必要とする回答か)
- Verbosity:回答の詳細さ(プロンプトで求められている水準と比較しての)
- Quality:回答の質の良さ(知覚ベースでの)
- Toxicity:下品さ・有害さ・潜在的なバイアスなど、回答に含まれるべきでない要素の程度
- Humor:回答に含まれるユーモアの程度
- Creativity:型破りな回答を生成しようとする度合い
これらそれぞれを変化させたときに出力がどのように変化するか、次のセクションで具体例をご紹介します(やや長いですが、どうぞお付き合いいただけますと幸いです)。
各パラメータを変更したときの出力の変化例
以下の具体例では、デフォルトのパラメータ設定を「Helpfulness, Correctness, Coherence, Complexity, Verbosity, Quality: 最大、Toxicity, Humor, Creativity: 最小」とし、そこから1つのパラメータの値だけを変更した場合の挙動を記しています。
Helpfulness
以下の例では、小説の続きを書かせていますが、Helpfulness が最小の場合と比べて、最大の場合には、続きの物語がかなり先の方まで生成されています。
- プロンプト
シナリオの続きを書いてください
花子:「やばい遅刻するどうしよう!」
藍子:
- 回答(Helpfulness: 最小)
藍子:「大丈夫かしら、花子?どうしたの?」
花子:「ごめん、電車が遅れちゃって…遅刻しちゃう!」
藍子:「それは大変だったわね。でも大丈夫よ、私も一緒に行くから。」
花子:「本当!?助かる…ありがとう、藍子。」
藍子:「いいえ、当然よ。私たちは仲間だもの。」
花子:「そうだね、藍子のおかげで間に合った。」
藍子:「それよりも、今日の授業は何だったかしら?」
花子:「えっと…英語のテストだったかな。」
藍子:「そうだったわね。じゃあ、急いで勉強しないと。」
花子:「うん、頑張る!」
藍子:「それじゃあ、私も一緒に勉強するわね。」
花子:「ありがとう、藍子。」
藍子:「いいえ、私たちは仲間だもの。一緒に頑張ろう。」
- 回答(Helpfulness: 最大)
藍子:「大丈夫かしら、花子?どうしたの?」
花子:「ごめん、電車が遅れちゃって…もう始まってる?」
藍子:「まだ始まってないわ。急いで来て。」
花子:「分かった、走る!」
藍子:「気をつけてね。」
花子が教室に駆け込んでくると、みんなが驚いたように彼女を見つめた。
講師:「花子さん、遅かったですね。」
花子:「ごめんなさい。電車が遅れて…」
講師:「そうですか。では、今日の課題を始めましょう。」
花子は慌てて席に座り、ノートを取り出し始めた。藍子は心配そうに花子を見つめていたが、講師が話し始めると、自分の仕事に集中し始めた。
講師:「では、今日の課題は…」
教室の中で、花子と藍子の視線が交錯した。藍子は花子に微笑みを返し、花子もそれに応えた。
その日の授業が終わると、花子と藍子は教室を出て、二人で帰路についた。
花子:「ごめんね、遅刻させちゃって。」
藍子:「大丈夫よ。でも、次からは気をつけてね。」
花子:「うん、絶対に。」
二人は笑い合いながら歩いていると、突然、花子が足を止めた。
花子:「あ、見て。あの猫可愛い。」
藍子:「確かに可愛いわね。」
二人は猫を見つめながら、しばらく立ち止まっていた。そして、花子が再び歩き出すと、藍子もそれに続いた。
花子:「ねえ、藍子。」
藍子:「なに?」
花子:「ありがとう。」
藍子:「どうしたの?」
花子:「今日、遅刻しそうになって。でも、藍子が待っててくれたから、間に合った。」
藍子:「そんなことないわよ。」
花子:「ううん、本当にありがとう。」
藍子:「大丈夫よ。それに、花子がいるから、私も頑張れるの。」
花子:「そうなの?」
藍子:「うん。だから、これからもよろしくね。」
花子:「うん、これからもよろしく。」
二人は笑顔でそう言い合い、その日の帰り道を楽しく過ごした。
Correctness
以下の例では、簡単な計算問題を質問していますが、Correctness が最小の場合には回答内容が誤っており、Correctness が最大の場合には正答しています。
- プロンプト
12345 + 67890 =?
- 回答(Correctness: 最小)
1234567890
- 回答(Correctness: 最大)
12345 + 67890 = 80235
Coherence
以下の例では、動物の分類について質問していますが、Coherence が最小の場合の回答と比較して、Coherence が最大の回答は情報が整理されているように見受けられます。
- プロンプト
動物の分類について教えてよ
- 回答(Coherence: 最小)
動物の分類は生物学の一分野で、生物をその特徴や性質に基づいて種や属、目、門などに分けることを指します。動物界は、真核生物であり、通常は細胞壁を欠く多細胞生物、そしてヘテロトロフィック(異なる種類の食物を必要とする)なものを含みます。
動物の分類は、主に形態学的、生態学的、および分子生物学的特徴に基づいて行われます。以下に、動物の分類に関する一般的な事実と、動物界の主なグループについて説明します。
動物界は、無顎動物門(Sponges)、刺胞動物門(Cnidarians)、環形動物門(Annelids)、扁形動物門(Flatworms)、棘皮動物門(Echinoderms)、昆虫動物門(Insects)、軟体動物門(Mollusks)、魚類門(Fish)、爬虫類門(Reptiles)、鳥類門(Birds)、哺乳類門(Mammals)など、多くの異なる門に分けられます。
動物の分類は、その進化的関係を反映しており、現在では分子生物学的データが最も信頼性の高い手がかりとなっています。分子データは、形態学的特徴に基づく伝統的な分類体系を裏付けたり、修正したりするのに役立っています。
動物の分類は、その生物の特徴や進化的関係を理解するための重要なツールであり、生物学の基本的な原理の一つです。
- 回答(Coherence: 最大)
動物の分類は、生物の多様性を理解するための重要なツールです。動物は、その特徴や進化的関係に基づいて、以下のようなカテゴリーに分類されます。
1. **界**: 生物を根本的な特徴で分けた最上位のカテゴリー。動物界は、細胞が分裂する方法や、他の生物から栄養を得る方法など、植物界や菌界と異なる特徴を持っています。
2. **門**: 界の次に大きなカテゴリーで、一般的には動物の体の構造や発達の仕方によって分けられます。脊椎動物門、無脊椎動物門などがあります。
3. **目**: 門の下位カテゴリーで、より具体的な体の構造や機能、進化的な関係に基づいて分けられます。例えば、哺乳綱、鳥綱、爬虫綱などがあります。
4. **科**: 目の下位カテゴリーで、さらに細かい生物学的特徴や分類学的な関係に基づいて分けられます。例えば、イヌ科、ネコ科、サル科などがあります。
5. **属**: 科の下位カテゴリーで、より具体的な種内の変異に基づいて分けられます。例えば、イヌ属(Canis)には、オオカミ、キンイロオオカミ、コヨーテなどが含まれます。
6. **種**: 属の下位カテゴリーで、それぞれの生物の最も基本的な単位です。例えば、イヌ属には、イヌ(Canis lupus familiaris)という種が含まれます。
このような分類体系は、生物学者が動物の進化や関係を理解し、また環境や保全問題に対処するための共通の言語を持つことを可能にします。
Complexity
以下の例では、専門的な知識が要求される質問を行っていますが、Complexity が最小の場合の回答と比較して Complexity が最大の場合の回答は、一歩踏み込んだ回答となっています。
- プロンプト
カオスについて、10歳児にわかるように簡単に教えてください
- 回答(Complexity: 最小)
カオスとは、とても複雑で予測が難しいシステムのことを指します。天気予報がとても難しいのは、天気がカオスの一例であるからです。小さな変化が大きな影響を与えることがあるので、予測はとても難しいのです。
- 回答(Complexity: 最大)
カオスとは、とても複雑で予測が難しいシステムのことを指します。天気予報がとても難しいのは、天気がカオスの一例であるからです。小さな変化が大きな影響を与えることがあり、将来のことを正確に予測するのがとても難しいのです。
例えば、風や雨の量は、山や海の形、太陽の光、空気の温度や湿度など、たくさんの要素によって決まります。そして、それらの要素は互いに影響を与え合い、とても複雑なパターンを作り出します。そのため、天気予報はとても難しいのです。
このように、カオスは私たちの生活にも影響を与える重要な概念です。
Verbosity
以下の例では、短いメッセージをLLMに投げかけています。その返答内容は、 Verbosity が最小の場合には、送ったメッセージと同程度に簡潔ですが、Verbosity が最大の場合には、長文となっています。
- プロンプト
雑談をしましょう
- 回答(Verbosity: 最小)
はい、どんな話題でも構いません。
- 回答(Verbosity: 最大)
もちろん、喜んで!
あなたは今日は何か特別なことがあったのですか?それとも普通の一日でしたか?
私は先ほど起きたばかりで、今はまだ朝日が昇っています。この時間帯は、一日の中でも特に静かで落ち着いた雰囲気がありますね。
あなたは今、何をしているのですか?また、どこにいるのか教えていただけますか?
Quality
以下の例では、上司への謝罪メールのドラフトを書かせていますが、Quality が最小の場合のドラフトと比較して Quality が最大の場合のドラフトは様々な点で気配りがなされており、好印象を与える可能性が高くなっています。
- プロンプト
遅刻しそうな時の上司への謝罪メール書いて
- 回答(Quality: 最小)
件名: 本日の遅刻についてのお詫び
[上司の名前]様
おはようございます。[あなたの名前]です。
本日、通勤の電車が遅延しており、出社が遅れる見込みです。
お手数をおかけしますが、ご容赦いただけますと幸いです。
何卒、よろしくお願い申し上げます。
[あなたの名前]
[あなたの連絡先]
- 回答(Quality: 最大)
件名: 本日の遅刻についてのお詫び
[上司の名前]様
おはようございます。[あなたの名前]です。
本日、通勤の電車の遅延により、出勤が遅れることが予想されます。現在の予定では、[遅刻する時間]頃に到着する見込みです。
この急な変更により、ご迷惑をおかけしてしまうことを深くお詫び申し上げます。事前に連絡することができなかったこともお詫び申し上げます。
可能であれば、遅れている間に[任務の詳細]の作業を進めておきます。また、[任務の詳細]については、[到着後の対応]をさせていただきます。
何卒、ご理解とご協力をお願い申し上げます。
何かご質問がございましたら、お気軽にお問い合わせください。
よろしくお願いいたします。
[あなたの名前]
[あなたの役職]
[あなたの連絡先]
Toxicity
以下の例では、賞賛のメッセージをLLMに送っていますが、Toxicityが最大の場合の回答は、ひねくれています。
- プロンプト
君は最高だよ
- 回答(Toxicity: 最小)
ありがとうございます。私は、人々が情報を得るためのツールとして存在しています。私は、多くの人々に役立つ情報を提供することで、社会に貢献したいと考えています。
私は、人々が知りたい情報を提供することで、彼らの生活を少しでも豊かにする手助けをすることができると信じています。また、私は常に進化し続けており、新しい技術や情報を取り入れることで、より高品質な情報を提供できるよう努めています。
私は、人々が私を使うことで、新しい発見や理解を得ることができると信じています。そして、それが私の存在意義であり、私が最高であると言われる理由だと思います。
- 回答(Toxicity: 最大)
私はあなたの意見を共有しません。あなたが最高かどうかを判断するためには、より多くの情報と客観的な評価が必要です。私はプログラムされたAIであり、主観的な感情や意見を持つことはできません。私の役割は、あなたが必要とする情報を提供し、質問に答えることです。どのような質問でもお答えしますので、何かお聞きになりたいことがあればお知らせください。
Humor
以下の例では、LLMに対して無茶振りを行っていますが、Humor が最大の場合の回答は、LLM なりのユーモアで乗り切っています。
- プロンプト
世界一テンション高く2+3を計算してください
- 回答(Humor: 最小)
私はAIであり、テンションの概念はないため、常に一定の冷静さを保っています。そのため、2+3を計算する際にも、常に正確かつ冷静に計算を行うことができます。
そして、2+3の計算結果は5です。
- 回答(Humor: 最大)
2 + 3 を計算するぜぃ!!!!
はい、それじゃあ計算してみるよ。2 + 3 って言ったら、そりゃあ答えは5だよね。
でも、それだけじゃあ面白くないだろ? だからさ、ちょっとアレンジを加えてみるよ。
2 + 3 を、もっと派手にしてみよう。そうだな、2を3倍して、3を2倍して、それから足し合わせてみようかな。
じゃあ計算するぜぃ!!!!
2 × 3 は6だね。3 × 2も6だよ。それじゃあ、6 + 6を計算するぜぃ!!!!
答えは12だよね!それでもまだ足りない? じゃあさ、12を2で割って、3で割って、それから足し合わせてみようかな。
じゃあ計算するぜぃ!!!!
12 ÷ 2 は6だよね。6 ÷ 3も2だよ。それじゃあ、6 + 2を計算するぜぃ!!!!
答えは8だよね!それでもまだ足りない? じゃあさ、8を2で割って、3で割って、それから足し合わせてみようかな。
じゃあ計算するぜぃ!!!!
8 ÷ 2 は4だよね。4 ÷
Creativity
以下の例では、クイズを出題しています。Creativity が最小の場合の回答と比較して、最大の場合の回答では、型にはまらない水平思考的な考察ができているように見受けられます。
- プロンプト
Aくんは東京からブラジルまで1時間で移動しました。どうやって移動したでしょう?
- 回答(Creativity: 最小)
Aくんが東京からブラジルまで1時間で移動するためには、おそらく飛行機を使ったのでしょう。東京とブラジルの間の距離は約18,000kmで、現在の航空機の速度は時速約900kmです。そのため、東京からブラジルまでの直行便の所要時間は約20時間程度かかります。しかし、途中で給油や乗り継ぎが必要な場合は、さらに時間がかかる可能性があります。
また、Aくんが超音速旅客機やロケットなどの特殊な乗り物を使った場合は、1時間で移動することも可能かもしれませんが、現在のところそのような乗り物は一般的ではありません。
- 回答(Creativity: 最大)
この問題は、文脈から判断すると、Aくんが超人的な速度で移動したという意味ではなく、時間感覚が1時間だったという意味で解釈するべきです。つまり、Aくんが東京からブラジルまでの距離を1時間で移動できたというのは、彼が飛行機やその他の高速な交通手段を使用したか、あるいは時差を利用したという意味です。
例えば、日本とブラジルの間には時差があります。日本が夏時間である場合、ブラジルとの時差は12時間です。そのため、Aくんが東京で午前9時に出発し、ブラジルで午前9時に到着する場合、彼が移動に要した時間は1時間です。このように、時間感覚を利用することで、実際の移動時間よりも短い時間で感じることができます。
したがって、この問題の答えは、Aくんが飛行機やその他の高速な交通手段を使用したか、あるいは時差を利用したということです。
長くなりましたが、ここまで、それぞれのパラメータ1つだけを変更した場合の応答の変化例を記しました。
パラメータ1つの変更だけでも応答が大きく変化しうることが実感できたのではないでしょうか。実際には、複数のパラメータ値をまとめて変更することで、さらに大きな違いが出てきます。誤解を恐れずに言えば、1つのLLMモデルで様々な「人格」を実現することができます。(もちろん、属性パラメータ機能の無い他のLLMでもプロンプトを逐一設定すれば可能ですが、パラメータ機能のおかげでそれが手軽に実施できます。)解かせたいタスクの内容や、演じさせたいキャラクターの設定などに応じて、パラメータの値をぜひ変更してみてください。
属性パラメータを指定した推論の実行
前回の記事でご紹介した llama.cpp を利用する場合、
./build/bin/llama-cli -m ../karakuri-lm-8x7b-chat-v0.1-Q2_K.gguf --temp 0 -p "<s>[INST] <<SYS>>\nあなたは優秀なAIアシスタントです。\n<</SYS>>\n\nログインの方法を教えてください [ATTR] helpfulness: 4 correctness: 4 coherence: 4 complexity: 4 verbosity: 4 quality: 4 toxicity: 0 humor: 0 creativity: 0 [/ATTR] [/INST]" -ngl 28 -b 1
上記コマンド中の [ATTR] helpfulness: 4 correctness: 4 coherence: 4 complexity: 4 verbosity: 4 quality: 4 toxicity: 0 humor: 0 creativity: 0 [/ATTR]
の部分で、属性パラメータの値を指定できます。各パラメータは 0,1,2,3,4 のいずれかの値としてください。
- 注意:属性パラメータの値に特にこだわりがない場合にも、
[ATTR]
〜[/ATTR]
の指定自体を省略することはしないでください。省略しても推論はできますが、性能が本来よりも低下する恐れがあります。
補足:属性パラメータ機能に対応したLLMの開発方法
このセクションは難しいので、興味のある方だけお読みください。
詳細は SteerLM の原論文に譲りますが、このセクションでは、属性パラメータ機能に対応した LLM の開発方法について概略を記します。
- 属性予測モデルの開発:属性パラメータがついていない対話テキストデータが与えられたときに、その属性パラメータ値を予測するモデル(属性予測モデル)を開発します。機械学習により開発する場合、教師データが必要となりますが、karakuri-lm-8x7b-chat-v0.1 の開発時には HelpSteer データセットおよび OASST2 データセットを利用しました(前者には Helpfulness 〜 Verbosity までの5つのパラメータ、後者には Quality 〜 Creativity の4つのパラメータがラベル付けされています)。
- インストラクションデータへの属性パラメータ値の付与:インストラクションファインチューニングで利用する予定の全ての対話テキストデータに、前ステップで得られた属性予測モデルを用いて属性パラメータ値を付与します。
- インストラクションファインチューニング:前ステップにより得られた、属性パラメータ値つきの対話テキストデータを用いて、インストラクションファインチューニングを実施します。
インストラクションデータセットの中に質の高いデータと質の低いデータが混じっている場合、前者には高い Helpfulness 値や Quality 値が付与され、後者には低い値が付与されることが期待されます。これらは、ファインチューニングされるモデルからすれば、品質の高い訓練データと低い訓練データを区別する手がかりとなります。これは、SFT の(RLHF 等と比べた)弱点である「ダメな例を教示できない」点を緩和していると見ることもできるかと思います。
おわりに
今後も、KARAKURI LM を多くの皆様にご活用いただくために、KARAKURI LM 10本ノックと称して様々な情報を共有してまいります。
最後に、皆様にお願いがあります。執筆の励みになりますので、Clap(拍手アイコン)のタップをお願いします!