<目次>
(1) OpenAIのFunction Callingとは?概要とサンプルプログラムをご紹介
(1-0) やりたいこと
(1-1) 概要
(1-2) サンプルプログラム①:関数1つの例
(1-3) サンプルプログラム②:関数複数の例
(1) OpenAIのFunction Callingとは?概要とサンプルプログラムをご紹介
(1-0) やりたいこと
・OpenAIのFunction Callingについて理解し、実際のサンプルを動かしたい
(1-1) 概要
Function Callingとは、OpenAIのモデルが自然言語の入力に基づいて「関数を呼び出す」形式の出力を生成する能力を指します。具体的には、ユーザーの質問や指示に対する応答として、関数の名前とその引数を含む構造化されたJSONを出力します。この機能は、自然言語とプログラムの間のインターフェースを提供し、モデルがAPIを呼び出したり、データを構造化したりすることを可能にします。
(図100)
ただし、モデルが生成した関数呼び出しの形式の出力を解析し、その提案に基づいて実際の関数を呼び出すロジックは、各自で実装する必要があります。モデルは関数の呼び出しを提案するだけで、実際に関数を実行するわけではありません。
(図101)
(1-2) サンプルプログラム①:関数1つの例
動かし方は下記を参照下さい。
⇒(整備中)OpenAIでPDFファイルを要約する方法(サンプルプログラムをご紹介)
(サンプルプログラム)FunctionCalling_Example.py
import env import json import openai from datetime import datetime, timedelta # 環境変数の設定を読み込み openai.api_key = env.get_env_variable('OPEN_AI_KEY') # 出発地と目的地を引数としてフライト情報を取得する関数 def get_flight_info(departure, destination): """ 出発地と目的地の間のフライト情報を取得する関数 """ # デモのためのダミーのフライト情報(本来はDBやAPI経由で取得する) flight_info = { "departure": departure, "destination": destination, "datetime": str(datetime.now() + timedelta(hours=2)), "airline": "JAL", "flight": "JL0006", } # フライト情報をJSON形式で返す return json.dumps(flight_info) def main(): # GPTに渡す関数の説明 function_descriptions = [ { "name": "get_flight_info", "description": "出発地と目的地の2つの情報からフライト情報を取得する", "parameters": { "type": "object", "properties": { "departure": { "type": "string", "description": "出発地の空港。(例) HND", }, "destination": { "type": "string", "description": "目的地の空港。(例) CDG", }, }, "required": ["departure", "destination"], }, } ] # ユーザーからの質問(プロンプト) user_prompt = "次の羽田からニューヨークへのフライトはいつですか?" # GPTに問いかけを行い、返答を取得 completion = openai.ChatCompletion.create( model="gpt-3.5-turbo-0613", messages=[ { "role": "user", "content": user_prompt, }, ], # 関数の情報を渡す functions=function_descriptions, function_call="auto", ) # プロンプトの内容に基づき、自動的に関数の要否を判断して、引数も埋めた状態で返却してくれる output = completion.choices[0].message print("=== LLMの出力:"+str(output)) # 出力から関数の引数を取得 # json.loads関数で文字列をPythonオブジェクトに変換 departure = json.loads(output.function_call.arguments).get("departure") destination = json.loads(output.function_call.arguments).get("destination") params = json.loads(output.function_call.arguments) print("=== 出発地:"+departure) print("=== 目的地:"+destination) print("=== 引数:"+str(params)) # 取得した引数を与えて、関数を呼び出し chosen_function = eval(output.function_call.name) flight = chosen_function(**params) print("=== 実行する関数:"+str(chosen_function)) print("=== 実行結果:"+flight) if __name__ == '__main__': main()
(サンプルプログラム)env.py
def get_env_variable(key): env_variable_dict = { "OPEN_AI_KEY" : "sk-xxxxxx", } ret_val = env_variable_dict.get(key, None) return ret_val
(サンプルプログラム)requirements.txt
openai langchain
(動画211)実行例
(1-3) サンプルプログラム②:関数複数の例
先ほどの例は、呼び出せる関数は1つでしたが、Function Callingは本来、自然言語の要求を解釈し、複数ある関数の中から最適なものをチョイスできる事が価値のため、複数関数の例も紹介します。
(サンプルプログラム)
import env import json import openai from datetime import datetime, timedelta # 環境変数の設定を読み込み openai.api_key = env.get_env_variable('OPEN_AI_KEY') # 出発地と目的地を引数としてフライト情報を取得する関数 def get_flight_info(departure, destination): """ 出発地と目的地の間のフライト情報を取得する関数 """ # デモのためのダミーのフライト情報(本来はDBやAPI経由で取得する) flight_info = { "departure": departure, "destination": destination, "datetime": str(datetime.now() + timedelta(hours=2)), "airline": "JAL", "flight": "JL0006", } # フライト情報をJSON形式で返す return json.dumps(flight_info) def main(): # GPTに渡す関数の説明 function_descriptions = [ { "name": "get_flight_info", "description": "出発地と目的地の2つの情報からフライト情報を取得する", "parameters": { "type": "object", "properties": { "departure": { "type": "string", "description": "出発地の空港。(例) HND", }, "destination": { "type": "string", "description": "目的地の空港。(例) CDG", }, }, "required": ["departure", "destination"], }, }, { "name": "book_flight", "description": "フライト情報を基に、フライトを予約する", "parameters": { "type": "object", "properties": { "departure": { "type": "string", "description": "出発地の空港。(例) HND", }, "destination": { "type": "string", "description": "目的地の空港。(例) CDG", }, "datetime": { "type": "string", "description": "フライトの日時。(例) 2023-01-01 01:01", }, "airline": { "type": "string", "description": "航空会社の名前。(例) Japan Airline", }, }, "required": ["departure", "destination", "datetime", "airline"], }, }, { "name": "inquiry", "description": "お客様のお問い合わせ窓口から、問い合わせを行う。", "parameters": { "type": "object", "properties": { "name": { "type": "string", "description": "顧客名。(例) 山田 太郎", }, "email": { "type": "string", "description": "顧客メールアドレス。(例) taro.yamada@rainbow.com", }, "text": { "type": "string", "description": "お問い合わせの内容", }, }, "required": ["name", "email", "text"], }, }, ] # ----------------------------------------------------- # ステップ1:フライト情報をチェックする # ----------------------------------------------------- user_prompt = "次の羽田からニューヨークへのフライトはいつですか?" # GPTに問いかけを行い、返答を取得 completion = openai.ChatCompletion.create( model="gpt-3.5-turbo-0613", messages=[{"role": "user","content": user_prompt}], # 関数の情報を渡す functions=function_descriptions, function_call="auto", ) # プロンプトの内容に基づき、自動的に正しい関数を判断して、引数も埋めた状態で返却してくれる output = completion.choices[0].message print("=== ステップ1 - LLMの出力:"+str(output)) # 出力から関数の引数を取得 # json.loads関数で文字列をPythonオブジェクトに変換 origin = json.loads(output.function_call.arguments).get("departure") destination = json.loads(output.function_call.arguments).get("destination") # 取得した引数を与えて、関数を呼び出し chosen_function = eval(output.function_call.name) flight = chosen_function(origin, destination) print("=== ステップ1 - 出発地:"+origin) print("=== ステップ1 - 目的地:"+destination) print("=== ステップ1 - フライト情報:"+flight) # 結果から、次のフライト予約に必要な情報を抽出 flight_datetime = json.loads(flight).get("datetime") flight_airline = json.loads(flight).get("airline") print("=== ステップ1 - フライト日時:"+flight_datetime) print("=== ステップ1 - 航空会社:"+flight_airline) # ----------------------------------------------------- # ステップ2:フライト情報を予約する # ----------------------------------------------------- user_prompt2 = f"私は {flight_airline}の {origin} から {destination} への {flight_datetime} のフライトを、予約したいです。" # GPTに問いかけを行い、返答を取得 completion = openai.ChatCompletion.create( model="gpt-3.5-turbo-0613", messages=[{"role": "user","content": user_prompt2}], # 関数の情報を渡す functions=function_descriptions, function_call="auto", ) # プロンプトの内容に基づき、自動的に正しい関数を判断して、引数も埋めた状態で返却してくれる output = completion.choices[0].message print("=== ステップ2 - LLMの出力:"+str(output)) # ----------------------------------------------------- # ステップ3:お問い合わせする # ----------------------------------------------------- user_prompt3 = "AAA BBBです。xxx空港に落とし物が届いていないか確認させてください。落としたのは眼鏡です。" # GPTに問いかけを行い、返答を取得 completion = openai.ChatCompletion.create( model="gpt-3.5-turbo-0613", messages=[{"role": "user","content": user_prompt3}], # 関数の情報を渡す functions=function_descriptions, function_call="auto", ) # プロンプトの内容に基づき、自動的に正しい関数を判断して、引数も埋めた状態で返却してくれる output = completion.choices[0].message print("=== ステップ3 - LLMの出力:"+str(output)) if __name__ == '__main__': main()
(サンプルプログラム)env.py
→サンプル1と同じ
→サンプル1と同じ
(サンプルプログラム)requirements.txt
→サンプル1と同じ
→サンプル1と同じ
(動画311)実行例