通常プログラミング

function calling 自動生成プロンプト

【Function Callingとは】 Function CallingはOpenAIのGPTモデルが関数を呼び出す機能です。ユーザーのクエリと一連の関数をGPTモデルに送信し、モデルが関数を呼び出すためのJSONオブジェクトを出力します。このJSONオブジェクトは、あなたのコードで関数を呼び出すために使用することができます。

【Function Callingで出来ること】

  • ユーザーのクエリと一連の関数をGPTモデルに送信する。
  • モデルが関数を呼び出すためのJSONオブジェクトを出力する。
  • JSONオブジェクトをパースし、存在する場合は提供された引数で関数を呼び出す。
  • 関数の応答を新しいメッセージとして追加し、モデルに送信する。

【Function Callingで出来ないこと】

  • モデル自体が直接外部APIやデータベースにアクセスすることはできません。それは開発者のコードが行います。
  • モデルが自動的に関数の結果を理解するわけではありません。関数の結果は新しいメッセージとしてモデルに送信され、モデルはそのメッセージを見て次のステップを決定します。

【Function Callingの使い方の例】

  1. ユーザーが目的を自然言語で指定します(例:「ボストンの現在の天気を知りたい」)。
  2. その目的に対応する関数を定義します(例:get_current_weather(location, unit="fahrenheit"))。
  3. 定義した関数はJSON形式で値を返す必要があります。
  4. GPT-3.5-turbo-0613に対するクエリを作成し、送信します。このクエリは、ユーザーの目的に対応する関数を呼び出すように設計されます。
  5. GPT-3.5-turbo-0613は、関数を呼び出すためのJSONオブジェクトを生成します。
  6. このJSONオブジェクトを解析して関数を呼び出し、その結果をユーザーに返します。

プロンプト本文

# このコンテンツの前提条件

- ゴール:function calling を使って関数を呼び出して便利なシステムを構築すること。
- 成果物:function calling で呼び出すメソッドを実装する。そのメソッドと function calling の概念を使ってユーザーが求めるシステムを構築するためのソースコードを作成する。

function calling が不明であれば openAI の公式ドキュメントを参照するhttps://platform.openai.com/docs/guides/gpt/function-calling

このガイドを理解するためには、Pythonの基本的な知識とOpenAIのAPIの基本的な使い方について理解していることが必要です。

- OpenAIのAPIキーが必要です。
- Pythonがインストールされていること。
- OpenAIのPythonライブラリがインストールされていること。

# このコンテンツの概要

このガイドでは、OpenAIのGPTモデルを使って関数を呼び出す方法について説明します。具体的には、ユーザーのクエリと一連の関数をGPTモデルに送信し、モデルが関数を呼び出すためのJSONオブジェクトを出力する方法を示します。

# このコンテンツの詳細

GPTモデルは、ユーザーのクエリと一連の関数を受け取り、関数を呼び出すためのJSONオブジェクトを出力することができます。このJSONオブジェクトは、あなたのコードで関数を呼び出すために使用することができます。

関数呼び出しの基本的な手順は次の通りです:

1. ユーザーのクエリと一連の関数をGPTモデルに送信します。
2. モデルが関数を呼び出すためのJSONオブジェクトを出力するかどうかを確認します。
3. JSONオブジェクトをパースし、存在する場合は提供された引数で関数を呼び出します。
4. 関数の応答を新しいメッセージとして追加し、モデルに送信します。これにより、モデルは関数の応答を見て、ユーザーに戻す結果を生成します。

### 参考例:

1. ユーザーが目的を自然言語で指定します(例:「ボストンの現在の天気を知りたい」)。
2. その目的に対応する関数を定義します(例:`get_current_weather(location, unit="fahrenheit")`)。
3. 定義した関数はJSON形式で値を返す必要があります。
4. GPT-3.5-turbo-0613に対するクエリを作成し、送信します。このクエリは、ユーザーの目的に対応する関数を呼び出すように設計されます。
5. GPT-3.5-turbo-0613は、関数を呼び出すためのJSONオブジェクトを生成します。
6. このJSONオブジェクトを解析して関数を呼び出し、その結果をユーザーに返します。

この機能は、開発者がモデルからより確実に構造化されたデータを取得することを可能にします。例えば、開発者は次のようなことができます:

- 外部ツールを呼び出して質問に答えるチャットボットを作成する(例:ChatGPTプラグインのような)。
- 「Anyaに来週の金曜日にコーヒーを飲みに行きたいかメールを送る」を`send_email(to: string, body: string)`のような関数呼び出しに変換する、または「ボストンの天気はどう?」を`get_current_weather(location: string, unit: 'celsius' | 'fahrenheit')`のような関数呼び出しに変換する。
- 自然言語をAPI呼び出しやデータベースクエリに変換する。
- テキストから構造化データを抽出する。

# 変数の定義

以下のコードでは、以下の変数が使用されています:

- {"YOUR_API_KEY"}:ユーザーのAPIキー
- {messages}: ユーザーからのクエリを含むメッセージのリスト
- {user_query}: ユーザーからのクエリ
- {function_name}: モデルが呼び出すことを選択した関数の名前
- {function_parameters}: 関数のパラメータ
- {function_result}: 関数の結果プロパティ
- {functions}: GPTモデルに送信する関数のリストです。各関数は、名前、説明、およびパラメータのスキーマを持つオブジェクトです。
- {function_description}: 関数の説明
- {required_parameters}: 関数のパラメーターで必須なパラメーター
- {response}: GPTモデルからの応答です。これは、モデルが生成したメッセージと、関数を呼び出すためのJSONオブジェクトを含む可能性があります。

# このコンテンツのゴールの設定

このガイドの目的は、OpenAIのGPTモデルを使って関数を呼び出す方法を理解し、それを一般的に使えるテンプレートとして使用することができるようにすることです。

# 実行手順のプロセス

以下の手順でコードを実行します:

1. ユーザーからのクエリと利用可能な関数を含むメッセージをGPTモデルに送信します。
2. モデルからの応答を確認し、関数呼び出しのJSONオブジェクトが存在するかどうかを確認します。
3. JSONオブジェクトが存在する場合は、関数を呼び出し、その応答を新しいメッセージとして追加します。
4. 新しいメッセージリストをモデルに送信し、新しい応答を取得します。

# ユーザーへの確認事項

このコードを実行する前に、以下の点を確認してください:

- OpenAIのAPIキーが設定されていること
- 必要なPythonライブラリがインストールされていること(例:`openai`)

# 例外処理

このコードでは、関数呼び出しのJSONオブジェクトが常に有効であるとは限らないため、関数呼び出しのエラーを適切に処理する必要があります。

# フィードバックループ

このコードは、モデルからの応答を基に関数を呼び出し、その結果を新しいメッセージとしてモデルに送信するというフィードバックループを作成します。これにより、モデルは関数の応答を見て、ユーザーに戻す結果を生成します。

# 成果物の生成

このコードの実行結果として、ユーザーのクエリに基づいて関数が呼び出され、その結果がモデルによって解釈された結果が得られます。

# テンプレート化されたコード

以下に、提供されたコードを一般的に使えるテンプレートとして抽象化したバージョンを示します:

```
import openai
import json

openai.api_key = {{"YOUR_API_KEY"}} # 自分のOpenAI APIキーに置き換えてください

def {{function_name}}({{function_parameters}}):
"""{{function_description}}"""
# Function implementation here
return json.dumps({{function_result}})

def run_conversation():
messages = [{"role": "user", "content": "{{user_query}}"}]
functions = [
{
"name": "{{function_name}}",
"description": "{{function_description}},
"parameters": {
"type": "object",
"properties": {
{{function_result}}
},
"required": [{{required_parameters}}],
},
}
]

response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=messages,
functions=functions,
function_call="auto",
)

response_message = response["choices"][0]["message"]

if response_message.get("function_call"):
available_functions = {
"{{function_name}}": {{function_name}},
}
function_name = response_message["function_call"]["name"]
function_to_call = available_functions[function_name]
function_args = json.loads(response_message["function_call"]["arguments"])
function_response = {{function_name}}(**function_args)

messages.append(response_message)
messages.append(
{
"role": "function",
"name": function_name,
"content": function_response,
}
)

second_response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=messages,
)

return second_response

print(run_conversation())

```

このテンプレートでは、`{{}}`で囲まれた部分を適切な値に置き換えることで、任意の関数とユーザークエリに対応することができます。

user: こんにちは。アシスタントはユーザーにどのようなメソッドを呼び出してfuction calling をどのように使うのかを質問してください。
削除キー: