以前の記事「OpenAI Chat Completions APIのツール呼び出しを使ってPL/SQLファンクションを呼び出す」で作成したAPEXアプリケーションを使って、Ollama + command-r-plus:104b-q2_Kでファンクション呼び出しを試してみます。
Ollama自体はファンクション呼び出しをサポートしていないはずなのですが、プロンプトを調整すればそれっぽいことができそう、とのことで試してみました。以下の記事を参考にしています。
Function calling using Ollama modelshttps://www.deskriders.dev/posts/1702742595-function-calling-ollama-models/
結論から先に言うと、プロンプトの記述だけでは厳しいかな、と感じました。以下、行った作業を記述します。
```json { "tool_calls": [ { "type": "function", "function": { "id": "get_current_weather_0", "name": "get_current_weather", "arguments": { "location": "Tokyo" } } } ] }```
パッケージUTL_OPENAI_CHAT_APIには、OpenAI以外のエンドポイントから上記ようなJSONが返されたときは、ファンクション呼び出しと解釈してPL/SQLファンクションを呼び出すようにコーディングしています。
Messageに日本語で回答してください。と入力し、Send Messageをクリックします。
以下の回答が返されました。
東京の現在の天気は晴れです。(高層雲なし)気温は 13°C で、南からの風が吹いています。
結論から先に言うと、プロンプトの記述だけでは厳しいかな、と感じました。以下、行った作業を記述します。
APEXアプリケーション側の設定として、置換文字列のG_API_ENDPOINTはhttp://host.docker.internal:11434/v1/chat/completions、G_MODEL_NAMEにはcommand-r-plus:104b-q2_Kを設定しています。
ollamaをローカルで実行し、APEXアプリケーションにアクセスします。Promptとして以下を与え、Set Promptをクリックします。ツール定義の部分はOpenAIのtoolの定義をそのまま埋め込んでいます。また出力の形式指定もOpenAIの仕様で返すように要求しています。
MessageとしてWhat is the current weather in Tokyo?を入力し、Send Messageをクリックします。
プロンプトが想定どおり解釈されると、roleがassistantのメッセージとして以下のようなJSONのレスポンスが返されます。
```json { "tool_calls": [ { "type": "function", "function": { "id": "get_current_weather_0", "name": "get_current_weather", "arguments": { "location": "Tokyo" } } } ] }```
パッケージUTL_OPENAI_CHAT_APIには、OpenAI以外のエンドポイントから上記ようなJSONが返されたときは、ファンクション呼び出しと解釈してPL/SQLファンクションを呼び出すようにコーディングしています。
そのため、ファンクションget_current_weatherが引数{ "location": "Tokyo"}で呼び出されます。ファンクション呼び出しのレスポンスは(OpenAI以外ではroleがtoolのメッセージに対応していないため)、roleをassistantにしてチャット履歴に追記します。
{ "weather" : "Clear(No cloud at any level)" }
Promptを空にしてSet Promptをクリックします。 ロールがsystemのメッセージが無くなります。
東京の現在の天気は晴れです。(高層雲なし)気温は 13°C で、南からの風が吹いています。
東京の天気について聞いているということは理解されていて、天気が晴れで雲がないところまでは合っていますが、気温や南からの風という情報は適当です。
systemプロンプトの記述によりOpenAIのtool_callsのJSONが返されるのは少々驚きましたが、これから先には進めないように感じました。
今回の記事は以上です。何かの参考になれば幸いです。
完