OpenAI API の Function calling で GPT が天気を回答できるようにしてみる

Pocket

はじめに

2023年6月13日に登場した、OpenAI API の Function calling 機能を試してみました。

本記事では、Function calling の概要と、Python のサンプルプログラム(天気の回答)を紹介します。

Function calling とは?

Function calling は、GPT に関数の定義を渡すと、呼ぶべき関数とその引数を JSON 形式で出力してくれる機能です。この機能を使うことで、GPT だけではできなかった外部 API 呼び出し等ができるようになります。

例えば、GPT は現在の天気を回答することはできませんが、Function calling を利用することで、天気を取得する外部 API を呼び出し、その結果を GPT に自然な文章で回答させることができます。

Function calling の処理の流れ 

次の図で Function calling の処理の流れを見ていきましょう。ここでは、外部 API で天気を取得する例で説明します。

プログラム(OpenAI API を呼び出すプログラム)は、「ユーザー入力」「プログラムで実行可能な関数一覧」を GPT に伝えます。図では、ユーザー入力は「東京の天気を教えて」となっています。プログラム側で実行可能な関数は get_current_weather という関数の定義になっています。この関数は、外部 API で天気を取得するものとしてプログラム側に実装されているとします。

② GPT は、実行すべき関数とその引数を JSON 形式で返します。ユーザー入力が「東京の天気を教えて」だったため、GPT は get_current_weather を city_name = “Tokyo” で呼び出すべし、と推論したようです。もし、ユーザー入力にマッチする関数が無い場合は、JSON ではなく普通に自然言語で回答が返ってきます。

③ プログラムは、② で返ってきた情報をもとに関数を実行します。今回は get_current_weather(“Tokyo”) を実行します。

④ プログラムは、関数の実行結果を GPT に伝えます。実行結果は、図のように JSON 形式で GPT に伝えます。

⑤ GPT は、④ の情報をもとに回答を返します。「東京の現在の天気は、晴れです。気温は25℃です」と自然な文章で回答してくれました。

Function calling のポイント

Function calling の処理の流れを見て、なんか複雑だなと思われたかもしれませんが、重要なポイントは次の2つだけです。

ポイント1: 関数を実行するのはプログラム側。GPT はどの関数を実行すべきか教えてくれるだけ。

Function calling という字面から、GPT が関数を実行してくれるのかなと勘違いしてしまいそうですが、関数を実行するのはプログラム側です。GPT はユーザー入力に合う関数を教えてくれるだけ、ということに注意しましょう。

ポイント2: GPT は、実行すべき関数の情報を JSON 形式で出力する。

GPT からの回答が JSON という決まった形式で出力されることに意義があります。Function calling が登場する前は、GPT からの回答を必ず JSON に固定することは難しく、プロンプトでがんばって指示してもたまに JSON にならないことがありました。Function calling を利用すると GPT から JSON を得られるので、プログラムでその JSON をパースして何かしら処理するということが格段にやりやすくなりました。

Function calling のサンプルプログラム

Function calling の概要がわかったところで、サンプルプログラムを見ていきましょう。今回は GPT に天気を回答してもらうプログラムを Python で書きました。といってもほとんど OpenAI の公式サンプルと同じで、天気を取得する関数で外部 API(OpenWeather)を 叩くようにしたのと、会話を何回も続けられるようにしただけです。

実際に手元で動かしてみたい方は、Python3 の環境(Google Colaboratory がお手軽です)を用意して、下記パッケージを pip でインストールしてください。

また、OpenWeatherOpenAI の API キーを取得して、下記コードの7、8行目を書き換えてください。

※ OpenWeather API は無料で利用できます。

※ OpenAI API を初めて利用する場合、最初の3か月間は 5 ドル分無料で利用できます。

工夫したところは、天気を取得する関数(get_current_weather)の引数 city_name の説明(55行目)です。

OpenWeather API で天気を取得するときに、英語表記の都市名を指定する必要があり、引数の説明にわざわざ「英語表記の~」と書いています。

こうすることで、ユーザーが「東京の天気を教えて」のように都市名を漢字で入力しても、GPT が city_name: Tokyo と英語表記に直して引数を教えてくれます。(2023年7月執筆時点)

実行すると、入力が求められます。「東京の天気を教えて」と入力したときの結果は次のとおりです。

「東京の現在の天気は薄い雲で、気温は摂氏37度です」と回答が返ってきました。ちゃんと天気を取得する関数が実行されて、その結果が自然な文章で回答されました。

ちなみに都市名を入力せず「天気を教えて」と聞いた場合は、天気を取得する関数は実行されず、「どの都市の天気を知りたいですか?」と返してくれました。

続けて「大阪」と入力すると、天気を取得する関数が実行されて、「大阪の天気は曇りがちで、気温は35度です」と回答されました。ちゃんと文脈も考慮して、実行すべき関数が判定されていることがわかります。

Function calling 利用時の注意点

Function calling を利用すると、サンプルプログラムでやったように外部システムとの連携が可能になります。今回のように天気を取得するようなリードオンリーな処理なら問題ないですが、状態を更新するような処理をする場合は注意が必要です。

例えば、メールを送ったり、通販で購入したりするような処理です。このような処理をする関数を Function calling に指定する場合は、関数を実行する前にユーザーに確認を求めた方が良いでしょう。

おわりに

Function calling いかがでしたか。今回試してみて、GPT ができないことを独自の関数で補えてすごい便利だと思いました。

弊社では OpenAI API を利用して、Google Spaces から使える社内版 ChatGPT を開発し、社内に展開しております。 Function calling を利用すれば、社内版 ChatGPT で Web 検索や添付ファイルについて質問できる機能など実装できそうだと思いました。

以上です。本記事が、OpenAI API を利用している方の役に立てば幸いです。

tdi はクラウドでの開発に力を入れています。ご興味がありましたら、下記のページもご覧ください。

お問い合わせ先

執筆者プロフィール

Yamaguchi Tatsuya
Yamaguchi Tatsuyatdi デジタルイノベーション技術部
AWS上で使えるツールの開発やフロントエンドの調査、生成系AIの調査等を行っています。最近は AWS の CDK やサーバーレスに興味があります。
Pocket