Function Callingの概要

Function Calling(関数呼び出し)は、大規模言語モデルがユーザーの意図を認識し、事前定義された関数を呼び出せるようにする技術です。モデル自体は関数を実行せず、構造化された関数呼び出しリクエストを生成し、開発者のコードが実際に実行し、結果をモデルに返します。

基本原理

Function Callingのワークフロー:

  1. 利用可能な関数とそのパラメータスキーマを定義する
  2. 関数定義とユーザーメッセージをモデルに送信する
  3. モデルが関数を呼び出すかどうかを判断し、呼び出しパラメータを生成する
  4. 開発者が関数を実行し、結果を取得する
  5. 関数の結果をモデルに返し、モデルが最終的な返信を生成する

実践:天気予報エージェント

import json
import requests
from openai import OpenAI

client = OpenAI()

# 関数を定義
def get_weather(city: str, date: str = "today"):
    """天気を照会"""
    api_key = "your-api-key"
    url = f"https://api.weather.com/v1/forecast"
    response = requests.get(url, params={
        "city": city, "date": date, "key": api_key
    })
    return response.json()

# 関数スキーマを定義
functions = [{
    "name": "get_weather",
    "description": "指定された都市と日付の天気情報を照会します",
    "parameters": {
        "type": "object",
        "properties": {
            "city": {
                "type": "string",
                "description": "都市名、例:'北京'、'上海'"
            },
            "date": {
                "type": "string",
                "description": "日付、形式YYYY-MM-DD、デフォルトは今日"
            }
        },
        "required": ["city"]
    }
}]

# 会話フロー
messages = [{"role": "user", "content": "明日の北京の天気は?"}]

response = client.chat.completions.create(
    model="deepseek-chat",
    messages=messages,
    functions=functions,
    function_call="auto"
)

msg = response.choices[0].message

if msg.function_call:
    # モデルが関数呼び出しを決定
    func_name = msg.function_call.name
    func_args = json.loads(msg.function_call.arguments)

    # 実際の関数を実行
    available_functions = {"get_weather": get_weather}
    func_result = available_functions[func_name](**func_args)

    # 結果をモデルに返す
    messages.append(msg)
    messages.append({
        "role": "function",
        "name": func_name,
        "content": json.dumps(func_result)
    })

    final_response = client.chat.completions.create(
        model="deepseek-chat",
        messages=messages
    )
    print(final_response.choices[0].message.content)

複数関数の協調呼び出し

実際のアプリケーションでは、エージェントは複数の関数を呼び出す必要があることがよくあります。複数の関数スキーマを定義し、モデルにどの関数を呼び出すかを自律的に選択させることができます。例えば、カスタマーサービスエージェントは「注文照会」、「物流照会」、「返金ポリシー照会」などの関数を同時に呼び出す必要があるかもしれません。

ベストプラクティス

  • 関数の説明を詳細に:明確な説明はモデルがいつ呼び出すかを正確に判断するのに役立ちます
  • パラメータ検証:関数内でパラメータを検証し、モデルが異常値を渡すのを防ぎます
  • エラー処理:関数実行が失敗した場合、明確なエラー情報を返します
  • 結果の簡潔さ:モデルに返す結果は簡潔にし、必要な情報のみを含めます
  • タイムアウト制御:関数呼び出しにタイムアウトを設定し、長時間のブロッキングを防ぎます

セキュリティ注意事項

Function CallingによりAIがコードを実行する能力を得るため、セキュリティに注意する必要があります:機密操作(データベースのDELETE、支払い転送など)を直接関数として公開しないでください。危険な操作にはユーザーの確認が必要です。関数パラメータを厳密に検証し、すべての関数呼び出しログを監査用に記録してください。