関数ツールを使用する
関数ツールを使用すると、モデルで開発者定義関数を呼び出して、応答中にデータを取得したりアクションをトリガーしたりできます。
関数ツールとは
関数ツール (関数呼び出し) を使用すると、モデルは、アプリケーションで公開する名前付きツールを呼び出すタイミングを決定できます。 このモデルでは、ビジネス ロジックは直接実行されません。 代わりに、構造化された関数呼び出しを返し、コードで関数を実行した後、関数の出力をモデルに渡します。
このパターンは、モデル推論を API、データベース、ビジネス ワークフロー、ユーティリティ関数などの実際のシステムに接続するのに最適です。
主な機能は次のとおりです。
- 構造化ツール呼び出し - モデルは明示的な関数呼び出し要求を出力します
- 開発者が制御する実行 - アプリケーションが関数の実行方法と場所を決定する
- 信頼性の高い統合パターン - API、内部サービス、またはヘルパー ユーティリティを安全に呼び出す
- マルチターン オーケストレーション - ツールの出力を返し、モデルが推論を続行できるようにする
- 根拠のある応答 - 回答には、ライブのシステム生成データを含めることができます
一般的なユース ケース
| ユースケース(事例) | 例 |
|---|---|
| システム統合 | アカウントまたは注文の詳細に対して内部 API を呼び出す |
| タスクの自動化 | チケットの作成や通知などのワークフローをトリガーする |
| データ検索 | 回答する前にビジネス ルールまたは参照テーブルにクエリを実行する |
簡単な例
get_time関数を公開し、必要に応じモデルがそれを呼び出す例を次に示します。
import time
from openai import OpenAI
# Function to get the current time
def get_time():
return f"The time is {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}"
# Main function
def main():
client = OpenAI(
base_url={openai_endpoint},
api_key={auth_key_or_token}
)
function_tools = [
{
"type": "function",
"name": "get_time",
"description": "Get the current time"
}
]
# Initialize messages with a system prompt
messages = [
{"role": "developer", "content": "You are an AI assistant that provides information."},
]
# Loop until the user types 'quit'
while True:
prompt = input("\nEnter a prompt (or type 'quit' to exit)\n")
if prompt.lower() == "quit":
break
# Append the user prompt to the messages
messages.append({"role": "user", "content": prompt})
# Get initial response
response = client.responses.create(
model=model_deployment,
input=messages,
tools=function_tools
)
# Append model output to the messages
messages += response.output
# Was there a function call?
for item in response.output:
if item.type == "function_call" and item.name == "get_time":
current_time = get_time()
messages.append({
"type": "function_call_output",
"call_id": item.call_id,
"output": current_time
})
# Get a follow up response using the tool output
response = client.responses.create(
model=model_deployment,
instructions="Answer only with the tool output.",
input=messages,
tools=function_tools
)
print(response.output_text)
# Run the main function when the script starts
if __name__ == '__main__':
main()
このフローでは、モデルが get_timeを呼び出すタイミングを決定し、コードによって関数が実行され、モデルから最終的な回答が返されます。 ユーザーは任意のプロンプトを入力できるため、モデルは、関数を呼び出す必要があるタイミングを決定する必要があります。 その場合、プロンプトへの応答には関数呼び出しが含まれます。この呼び出しは、モデルが処理するために関数からの出力を含む新しいプロンプトを送信する前に、アプリケーション コードが実装する必要があります。
出力は次のようになります。
Enter a prompt (or type 'quit' to exit)
Hello
Hello! How can I help you today?
Enter a prompt (or type 'quit' to exit)
What time is it?
The time is 2026-03-19 17:17:41.
Enter a prompt (or type 'quit' to exit)
最初のユーザー プロンプト ("Hello") では関数ツールを使用する必要がなかったため、モデルは正常に応答しました。 2 番目のプロンプト ("What time is it?") によってモデルがトリガーされ、 get_time 関数が選択され、応答で示されました。 その後、アプリケーション コードは関数を実行し、結果をモデルに返し、関数からの結果を含む 2 番目の応答を送信しました。
ヒント
この例では、パラメーターのない 1 つの関数を使用します。 パラメーターの有無にかかわらず、複数の関数を使用するようにツールを構成できます。 関数の詳細の指定の詳細については、 OpenAI 開発者ガイドを参照してください。
関数ツールのしくみ
関数ツールを使用する一般的なプロセスは次のとおりです。
- ツールを定義 する - ツール配列に 1 つ以上の関数定義を指定します。
- モデルはプロンプトを評価します 。関数呼び出しが必要かどうかを判断します。
- モデルは関数呼び出しを出力 します。応答には、関数名と呼び出しのメタデータが含まれます。
- アプリがロジックを実行する - コード内で一致する関数を実行します。
-
関数の出力を返す - 結果を含む
function_call_output項目を送信します。 - モデルは答えを完成 させる - それは最終的な応答にツールの結果を組み込みます。
ベスト プラクティス
- ツールのフォーカスを維持 する - 小さな単一用途の関数を簡単に制御およびテストできます
- 関数の入力を検証 する - 運用システムでツールの引数を盲目的に信頼しない
- エラーを安全に処理 する - モデルが推論できる明確なエラー出力を返します
- ログ ツールの使用状況 - デバッグとガバナンスの呼び出し、待機時間、および失敗率を追跡する
- 機密性の高い操作を制限 する - 影響の大きいアクションに明示的な承認が必要
知っておくべき制限事項
- モデルは関数呼び出しを要求しますが、アプリケーションで関数呼び出しを実行する必要があります
- ツールの引数が正しくないか予期しない場合があり、検証する必要がある
- ツールの待機時間により、エンド ツー エンドの応答時間が増加する可能性があります
- 関数呼び出しにより信頼性は向上しますが、最終的な出力には重要な決定のレビューが必要です
この関数ツールは、モデルをテキスト ジェネレーターからオーケストレーターに変換し、制御された監査可能な方法で実際のシステムと対話できるようにします。