我がPCでも動作できる軽量なLLMを使って遊んでいると、質問ごとにタスク選定の機能が欲しくなります。簡単なタスク分解が軽量モデルでできると(体感)応答速度の向上も期待できるかもしれません。もちろん、それなりのLLMモデルとLangchainを使うと簡単に実装できちゃいます。しかし、ローカルLLMのような回答精度が低いLLMの場合、JSONで出力させてもJSONのフォーマットに従ってない場合が多々あります。また、JSON形式以外の情報も丁寧に出力することも多いです。LLMの不正なJSON出力を後から整形するのは、素人には結構メンドイです。(他によい方法があったら、教えてください)
ここでローカルLLMとは、ColabのT4環境でも動くような小型のLLMくらいのイメージです。多くのローカルLLMモデルのすべてに対しての議論ではありません。プロンプト頑張ってもJSON出力が不安定なモデルを便利に使いたいという目的です。
The IBM Granite 2Bをollamaで使います。どこまでできるでしょうか。
これまでいろんなモデルで遊んでいて、軽量LLMモデルでも比較的箇条書きのような出力は指示に従ってくれます。選定したgranite3-denseは2Bでもマルチリンガルで素直な印象のあるLLMでした。Qwen2.5あたりでもいいかもしれません。
作戦は簡単です。
内容はともあれ、フォーマット整形自体で苦労することは、あまりありません。回答の質はLLM次第です。
プロンプトの一部を抜き出すと・・・。
以下の手順に従って、適切なToolを選択してください。
1. まず、<Inputs>タグ内の質問内容を確認します。
2. 質問の内容を詳細に解析します。
3. 質問の内容に基づいて、Toolを<tools>タグから選択します。
4. 最後に選択したToolを出力形式にそって出力します。
```
$TOOL: {tool_name}
$DESCRIPTION: {tool_description}
```<tools>
使用可能なToolは以下の通りです:
- weather : 指定した地域の天気を習得します。
- translate : 英訳します。
</tools>
出来るだけLLMに分かりやすいことと、キーワードとして抜き出しやすいように「$TOOL」のように工夫しています。
生のレスポンス:
<TOOL: weather>
<DESCRIPTION: This tool provides the current weather information for a specified location.
</DESCRIPTION><TOOL: translate>
<DESCRIPTION: This tool translates text from one language to another.
</DESCRIPTION><ANSWER>
$TOOL: weather
$DESCRIPTION: 今日の東京の天気を習得します。
</ANSWER>
いろんな余計な情報も答えちゃっています。むしろ頑張っていると思います。ちゃんと、「$TOOL: weather」を含んでくれているので、その部分だけ抜き出して整形します。
これを整形すると・・・。
[
{
"TOOL": "weather",
"DESCRIPTION": "今日の東京の天気を習得します。\n</ANSWER>"
}
]
DESCRIPTION部は不要かもしれませんけれども、ある程度の関連情報を同時にさせて、動作の状況の確認と生成LLMにとっては正解の出力に寄与するかもといった淡い期待からです。TOOLがリストにないものであれば、チェックして再生成させるくらいでも十分だろうと思います。
複数回試すと日本語プロンプトだと「$TOOL: weather」を含まない文章を生成することもありました。このモデルでは英語のプロンプトの方が出力が安定していました。英語圏のモデルの場合は大抵そうかもしれません。難しいタスク選択には限界があるかもしれませんが、2Bでマルチリンガルでもここまでできます。8Bだとより出力は安定します。
今回お試ししたColabです。抜き出し部は実験のため複数のキーワードを抽出するようにしています。
他の動機としては、入門書を参考にごりごり実行するとモデル利用料も結構ばかにならず、お財布にやさしくありません。皆さん、やっぱり、お仕事で使うのでしょうか。
丁寧でいい本でしたので、紹介します。