こんにちは!
データサイエンティストのウマたん(@statistics1012)です!
この記事ではChatGPTの話題のFunction callingについてどんなことができるか実装例とともに見ていきたいと思います!
Function callingを使うとChatGPTのAPIを利用してプログラムを構築する際の幅がめちゃくちゃ広がるのでぜひおさえておきましょう!
ちなみにFunction Callingを使ったエージェントの詳しい作り方は以下のUdemyの講座で僕自身が詳しく解説していますのでもっと深く知りたい方はチェックしてみてください!
【初心者向け】生成系AI時代のPython×自動化!Function Callingを使って煩雑な作業を自動化しよう!
【時間】 | 3.5時間 |
---|---|
【レベル】 | 初級 |
OpenAIのFunction Callingを使って自分でカスタマイズしたタスクをこなしてくれるエージェントを作りたいならこれ!今なら購入時に「VGRBCQDF」という講師クーポンコードを入れると94%OFFになりますのでぜひご受講ください!
目次
Function callingとは?
Function callingはOpenAIが2023年6月13日に公開したChatGPT(正確にはChatGPTというかGPTモデル)のAPI新機能であり、処理の幅が広がるため界隈で非常に話題になっている機能です。
ざっくり言うと、あらかじめ特定の関数をこちらで定義して渡しておけば、人間の指示に対してGPTモデル側がよしなに必要な関数をピックアップして処理を行い結果を返してくれるというもの。
たとえば、色んな人のスケジュールが格納されているデータベースがありそこから特定の人の特定の日付のスケジュールを取得する関数を作成したとしましょう。
その関数をGPTのAPIに渡してFunction callingの設定をしてあげると・・・
自然言語で”田中さんの6/30のスケジュールを教えてー!”と入力すると、その結果を元に関数を呼び出すかどうか判断して必要であれば関数を呼んでその情報をもとに出力を返してくれる優れものなのです!
複数の関数を定義することが可能なので、GmailのAPIを利用してメールを送る関数などを定義しておくと”田中さんの6/30のスケジュールをxxxxx.gmail.comにおくってー”などと伝えるだけで、複数の関数を呼び出して実行してくれます。
めちゃくちゃすごいです。
このような処理を自然言語の指示で出来てしまうのは画期的ですし、ChatGPTのAPIを利用する幅が大きく広がりました!
Function callingの実装例
それでは実際にどうやってFunction callingを実装するのか見ていきましょう!
今回は、先ほどお伝えした「誰かの特定日付のスケジュールを取得する」ような処理を簡単なデモで実装していきます。
この時、処理構築の流れとしては以下です。
・独自functionの定義
・GPTのAPIを呼ぶ処理
・独自functionを使うかどうか判断する処理
まず処理構築に入る前に例によって以下のように各種必要なライブラリやAPIキーの設定をしておきましょう!
import openai
import json
openai.api_key = "<自分のOpenAIのAPIキーを入れる>"
独自functionの定義
まずは独自functionを定義していきましょう!以下のように記述していきます!
def get_schedule(date, person):
"""
スケジュール取得用の関数を定義
- ここではdateとpersonがパラメータとして渡りそれに対するscheduleが返ってくる仕様
- 本来であればパラメータを元に適切なスケジュールが返ってくるようになるべきだが簡単のために今回は固定値を返す
"""
schedule_info = {
"date": date,
"person": person,
"schedule": "10時:A社とMTG、12時:友人Bとランチ"
}
return json.dumps(schedule_info)
get_scheduleはまさにスケジュールを取得する関数であり、dateとpersonを引数としてscheduleを取得します。
今回は簡単のためscheduleは固定値を入れています。
GPTのAPIを呼ぶ処理
続いてGPTのAPIを呼ぶ処理を作っていきます。
def run_conversation(prompt):
# GPTのAPIへのリクエストを定義
messages = [{"role": "user", "content": prompt}]
functions = [
{
"name": "get_schedule",
"description": "特定の日付のスケジュールを取得して返す",
"parameters": {
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "日付"
},
"person": {
"type": "string",
"description": "人の名前"
},
},
"required": ["date","person"]
}
}
]
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=messages,
functions=functions,
function_call="auto",
)
response_message = response["choices"][0]["message"]
functionsには独自関数名や関数の説明や関数に必要なパラメータなどをセットしていきます。
function_call=”auto”とすることで独自関数を使うか使わないかをGPTモデルが自動で選定してくれるようになります。
引数promptにはユーザーが入力する自然言語が入るようになってます。
独自functionを呼ぶ選択をしたかどうか判断し処理
続いて独自定義したfunctionを呼ぶかどうかを判断し次の処理に移ります。
先ほどのコードの続きであり、run_conversation関数の中に書いていきます。
# 独自定義したfunctionを呼ぶのかどうか判断し処理
if response_message.get("function_call"):
available_functions = {
"get_schedule": get_schedule,
}
function_name = response_message["function_call"]["name"]
fuction_to_call = available_functions[function_name]
function_args = json.loads(response_message["function_call"]["arguments"])
function_response = fuction_to_call(
date=function_args.get("date"),
person=function_args.get("person")
)
# 独自関数のレスポンスを渡す
messages.append(response_message)
messages.append(
{
"role": "function",
"name": function_name,
"content": function_response,
}
)
# 独自関数のレスポンスをもとに改めてAPIにリクエスト
second_response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=messages,
) # get a new response from GPT where it can see the function response
return second_response
else:
return response_message
ここでは、functionを呼ぶ選択をした場合は、よしなにユーザーが入力したpromptから名前や日付を取得してそれを元に関数を呼び出し結果を返してくれます。
検証
それでは検証していきましょう!
最終的なコードは以下のようになります!
def get_schedule(date, person):
"""
スケジュール取得用の関数を定義
- ここではdateとpersonがパラメータとして渡りそれに対するscheduleが返ってくる仕様
- 本来であればパラメータを元に適切なスケジュールが返ってくるようになるべきだが簡単のために今回は固定値を返す
"""
schedule_info = {
"date": date,
"person": person,
"schedule": "10時:A社とMTG、12時:友人Bとランチ"
}
return json.dumps(schedule_info)
def run_conversation(prompt):
# GPTのAPIへのリクエストを定義
messages = [{"role": "user", "content": prompt}]
functions = [
{
"name": "get_schedule",
"description": "特定の日付のスケジュールを取得して返す",
"parameters": {
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "日付"
},
"person": {
"type": "string",
"description": "人の名前"
},
},
"required": ["date","person"]
}
}
]
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=messages,
functions=functions,
function_call="auto",
)
response_message = response["choices"][0]["message"]
# 独自定義したfunctionを呼ぶかどうかの処理
if response_message.get("function_call"):
available_functions = {
"get_schedule": get_schedule,
}
function_name = response_message["function_call"]["name"]
fuction_to_call = available_functions[function_name]
function_args = json.loads(response_message["function_call"]["arguments"])
function_response = fuction_to_call(
date=function_args.get("date"),
person=function_args.get("person")
)
# 独自関数のレスポンスを渡す
messages.append(response_message)
messages.append(
{
"role": "function",
"name": function_name,
"content": function_response,
}
)
# 独自関数のレスポンスをもとに改めてAPIにリクエスト
second_response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=messages,
) # get a new response from GPT where it can see the function response
return second_response
else:
return response_message
では定義したrun_conversationを呼び出して実際にどんな回答が返ってくるのか検証してみましょう!
print(run_conversation("田中さんの6/30のスケジュールを教えて")["choices"][0]["message"]["content"])
結果は以下のようになりました!!
ちゃんといい感じに回答を返してくれていることが分かります。
今回は固定値を返すというシンプルな方法で実装を試みましたが、これでもFunction callingの実装イメージが掴めたかと思います。
ぜひ色んな関数を定義してFunction callingを駆使して面白いプログラムを作ってみてください!
以下がOpenAIのFunction callingのドキュメントであり実装方法などが詳しく記載されているので是非参考にしてみてください。
ちなみにFunction callingと似たことができるライブラリとしてLangChainが存在しました。
Function callingとLangChainの違いはどんなところにあるのでしょうか?
個人的にはFunction callingの方が処理構築が分かりやすいのと出力が正確かつOpenAIが提供している公式機能であることから出来るだけFunction callingを利用した方がいいかなと思っています。
LangChainについては以下の記事で詳しく解説していますので是非チェックしてみてください!
Function calling まとめ
ここまでで、ChatGPTのAPIをフル活用するのに重要なFunction callingについてまとめてきました!
冒頭でもお伝えしましたが、Function Callingを使ったエージェントの詳しい作り方は以下のUdemyの講座で僕自身が詳しく解説していますのでもっと深く知りたい方はチェックしてみてください!
【初心者向け】生成系AI時代のPython×自動化!Function Callingを使って煩雑な作業を自動化しよう!
【時間】 | 3.5時間 |
---|---|
【レベル】 | 初級 |
OpenAIのFunction Callingを使って自分でカスタマイズしたタスクをこなしてくれるエージェントを作りたいならこれ!今なら購入時に「VGRBCQDF」という講師クーポンコードを入れると94%OFFになりますのでぜひご受講ください!
また、最近話題の生成系AIやLLMの実装方法についてより詳しくは当メディアが運営するスタアカの以下のコースを是非チェックしてみてください!
GPTモデルをはじめとした大規模言語モデルの理論やPythonでの扱い方などを幅広く学んでいきます!
スタアカは業界最安級のAIデータサイエンススクールです。
【価格】 | ライトプラン:1280円/月 プレミアムプラン:149,800円 |
---|---|
【オススメ度】 | |
【サポート体制】 | |
【受講形式】 | オンライン形式 |
【学習範囲】 | データサイエンスを網羅的に学ぶ 実践的なビジネスフレームワークを学ぶ SQLとPythonを組みあわせて実データを使った様々なワークを行う マーケティングの実行プラン策定 マーケティングとデータ分析の掛け合わせで集客マネタイズ |
・BigQuery上でSQL、Google Colab上でPythonを使い野球の投球分析
・世界最大手小売企業のウォルマートの実データを用いた需要予測
・ビジネス・マーケティングの基礎を学んで実際の企業を題材にしたマーケティングプランの策定
・Webサイト構築してデータ基盤構築してWebマーケ×データ分析実践して稼ぐ
AIデータサイエンスを学んで市場価値の高い人材になりましょう!
データサイエンスやAIの勉強方法は以下の記事でまとめています。
PythonでのAPI開発にFastAPIを使った方法を以下の記事で解説しています。