OpenAI APIのFunction Callingを使って遊戯王APIからカード情報を取得する
OpenAI APIにはFunction Callingという機能があって会話内容に応じて関数を使ってくれるらしい。
公式サンプルの天気予報APIでは気乗りしないので遊戯王APIを使って実験する。
1. システムフロー
Function Callingを使用したシステムは以下の図のように動作する。
青色の項目がOpenAI APIを使用している部分。
Function Callingは
- 使用する関数
- 使用する引数
を用意してくれるが関数を実行するわけではない。
関数を実行するところは別途作成する必要がある。
「Function Calling」ではなく「Function Selecting」とか名前を変えた方が良いと思う。
また、せっかくChatAPIを使うなら結果を会話形式で返して欲しい。
その場合は関数の実行結果をOpenAI APIに渡せば良い。
したがって、一度の処理の中で
- 関数の選択
- 会話の生成
の2回、OpenAI APIを呼び出すことになる。
2. 実験
コードは最後にまとめて書く。
2.1. 関数が1つだけのパターン
「カード名」を渡すと遊戯王APIから情報を引き出す関数get_card_info_by_name
を作った。
ChatAPIを呼び出す際に引数functions
に上記関数の説明を渡すと会話の内容に応じて関数を使うべきか判断してくれる。
- 実験1
1 | [SYSTEM MESSAGE]テキストを入力してください: DARK MAGICIANの攻撃力を教えて! |
「DARK MAGICIAN」は「ブラックマジシャン」の英語名。
遊戯王APIは英語名しか対応していないため数少ないつづりを知ってるやつを入力。
正しく動いていることが分かる。
上記例では、1度目のOpenAI API実行時に下記変数に関数と変数を返してくれる。
1 | response_message["function_call"]["name"] # 関数:ここでは「get_card_info_by_name」 |
続いて、
選択された関数を実行して「DARK MAGICIAN」の情報を取得。
「DARK MAGICIAN」の情報を2度目のOpenAI API実行時に渡す。
と手順を踏んだ結果、「DARK MAGICIANの攻撃力は2500です。」という回答が返ってくる。
- 実験2
1 | [SYSTEM MESSAGE]テキストを入力してください: Jinzoのステータスを表にまとめて! |
ChatAPIらしく出力を整形してもらうこともできる。
これくらいメジャーだと普通のChatGPTでもできそうだがマイナーカードの英語名が分からない。
- 実験3
1 | [SYSTEM MESSAGE]テキストを入力してください: 明日の天気を教えて! |
ふさわしい関数が何も選択されなかった場合の分岐も可能。
今回はprintして終了したが会話をつなげることも当然できる。
2.2. 関数が2つあるパターン
下記2つの関数を用意。
- 「カード名」を渡すと遊戯王APIから情報を引き出す関数
get_card_info_by_name
- 「カードID」を渡すと遊戯王APIから情報を引き出す関数
get_card_info_by_id
会話に応じてふさわしい関数を選んでくれるはず。
- 実験1
1 | [SYSTEM MESSAGE]テキストを入力してください: DARK MAGICIANのidを教えて! |
カード名から情報を取得した。get_card_info_by_name
が呼ばれたことが分かる。
- 実験2
1 | [SYSTEM MESSAGE]テキストを入力してください: 77585513番のカード情報を表にまとめて! |
あえて「ID」という言葉を使わずに「77585513番」といじわるなことを言ったが意図を読み取ってくれた。
素晴らしい。
3. まとめ
- 思った以上に優秀
ChatGPTでありがちなハルシネーション(自信満々に嘘つく現象)に対して、関数部分を自作で用意することで正確さを保証できる点が素晴らしい。
会話から意図を読み取る力が優れていて、関数を選択するのも凄いが、引数を用意してくれるのがさらにすごい。
これを従来の自然言語処理で実装しようと思ったらかなり大変。
最初は「GPT-4」を使っていたが「GPT-3.5」でも問題なく動く。
- 英語名だけだとつまらないので日本語で検索できるようにしたい
遊戯王カードの日本語名とカードIDの対応表があれば実装できる。
上記は以前の実験の副産物として所有しているので実装できる。
↓実装した結果
4. コード
実験に使用したコードを記す。
python3.11
インストールしたライブラリはopenai
のみ。
4.1. 関数が1つだけのパターン
1 | import openai |
4.2. 関数が2つあるパターン
関数を増やしただけ。
同様に3つ、4つと増やせる。
1 | import openai |