Function Calling・Tool Use完全ガイド|外部API連携・DB操作・計算実行の実装
Function Calling・Tool Use完全ガイド|外部API連携・DB操作・計算実行の実装こんにちは、橋本裕也です。近年のLLM(大規模言語モデル)の発展に伴い、Function Call
Function Calling・Tool Use完全ガイド|外部API連携・DB操作・計算実行の実装
こんにちは、西岡章です。ここ数年のLLM(大規模言語モデル)の進化を見ていると、Function Calling と Tool Use という機能が急速に実務的な重要性を増してきていることに気づきます。この機能を使いこなすことで、AIアシスタントを既存のシステムと繋ぎ、実際に動作するアプリケーションをつくることができるようになるんです。
この記事では、Function Callingの基本的な考え方から実装の手順、そして具体的な活用例までを、コード例を交えながら説明していきます。
Function Calling・Tool Useとは
Function Calling というのは、簡潔に言えば、LLMが自分で判断して外部の関数やAPIを呼び出す機能です。従来のチャットボットはテキスト質問に対してテキストで返すだけでしたが、この機能があるおかげで、もっと複雑で実用的なことが実現できます。
例えば、ユーザーが「明日の天気を教えて」と聞いたとき、LLMが天気予報APIを自動的に呼び出して結果を取得するというイメージです。他にも、データベースから顧客情報を引っ張ってきたり、複雑な計算をしたり、リアルタイムの株価情報を取得したりと、単なるテキスト生成を超えた対応が可能になります。
基本的な実装フロー
実際にFunction Callingを組み込む流れを考えると、五つのステップが必要です。まずLLMに対して「こういうツールが使えますよ」と定義を伝えます。次にユーザーの質問とそのツール定義をLLMに送ります。LLMが「この質問に答えるにはこの関数が必要だ」と判断したら、その指示を受け取ります。そしてこちら側でその関数を実際に実行して、結果をLLMに返します。最後にLLMがその結果を使ってユーザーへの最終的な応答を生成するという流れになります。
OpenAIのFunction Callingを使った実装例
OpenAIのAPIを使った実装がもっとも分かりやすいので、具体例で説明していきましょう。
ツール定義
まずはLLMに提供するツールをJSON形式で定義します。これによってLLMがどんなツールが使えるか、どんなパラメータが必要かを理解します。
tools = [
{
"type": "function",
"function": {
"name": "get_user_info",
"description": "ユーザーIDから顧客情報を取得します",
"parameters": {
"type": "object",
"properties": {
"user_id": {
"type": "string",
"description": "取得したいユーザーのID"
}
},
"required": ["user_id"]
}
}
},
{
"type": "function",
"function": {
"name": "calculate_total_price",
"description": "商品の数量と単価から合計金額を計算します",
"parameters": {
"type": "object",
"properties": {
"quantity": {
"type": "integer",
"description": "商品の数量"
},
"unit_price": {
"type": "number",
"description": "商品の単価"
}
},
"required": ["quantity", "unit_price"]
}
}
}
]
APIリクエストと関数呼び出し処理
実際にOpenAI APIにリクエストを送って、帰ってきた指示を処理するメイン部分のコードです。ここが Function Calling の心臓部なんですが、LLMからの指示を受け取り、実関数を実行し、結果をLLMに返すという一連のループを回します。
import openai
import json
client = openai.OpenAI(api_key="sk-your-api-key")
# 実装する関数群
def get_user_info(user_id):
"""ダミーのユーザー情報取得"""
users = {
"user001": {"name": "田中太郎", "email": "tanaka@example.com", "plan": "premium"},
"user002": {"name": "鈴木花子", "email": "suzuki@example.com", "plan": "standard"}
}
return users.get(user_id, {"error": "ユーザーが見つかりません"})
def calculate_total_price(quantity, unit_price):
"""合計金額を計算"""
return {"total": quantity * unit_price, "quantity": quantity, "unit_price": unit_price}