はじめに
Function Calling は、LLM をテキスト ジェネレーターからエージェントに変える スーパーパワー です。 LLM は、テキストで応答するだけでなく、構造化された JSON を出力して、定義した関数/ツールを呼び出すことができます。この記事では、3 つの主要プロバイダーすべての関数呼び出しメカニズムについて詳しく説明します。
1. 関数呼び出しはどのように機能しますか?
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ User │────►│ LLM │────►│ Your │────►│ LLM │────► Final
│ Prompt │ │ (Choose │ │ Code │ │ (Process │ Response
│ │ │ tools) │ │ (Execute)│ │ result) │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
Output: Output:
tool_calls[] tool results
重要な洞察
LLM は 実際には関数を呼び出しません。 「関数 X を引数 Y で呼び出したい」という JSON を出力するだけです。 コードは実際に関数を呼び出し、結果を LLM に返します。
2. OpenAI 関数の呼び出し
2.1 ツールの定義
tools = [
{
"type": "function",
"function": {
"name": "search_products",
"description": "Tìm kiếm sản phẩm trong database",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Từ khóa tìm kiếm"},
"category": {"type": "string", "enum": ["electronics", "clothing", "books"]},
"max_price": {"type": "number", "description": "Giá tối đa (VND)"},
"sort_by": {"type": "string", "enum": ["price_asc", "price_desc", "rating"]}
},
"required": ["query"]
}
}
}
]
2.2 並列関数呼び出し
同時に多くの情報が必要な場合、LLM は 複数のツールを並行して 呼び出すことができます。
# User: "So sánh thời tiết Hà Nội, Đà Nẵng và Sài Gòn"
# LLM sẽ output 3 tool_calls cùng lúc!
for tool_call in message.tool_calls:
# tool_call 1: get_weather("Hanoi")
# tool_call 2: get_weather("Da Nang")
# tool_call 3: get_weather("Ho Chi Minh City")
...
3. 人間の道具の使用
Claude は、異なる構文を使用しますが、同じ概念を使用します。
response = anthropic_client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
tools=[{
"name": "search_products",
"description": "Tìm kiếm sản phẩm",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string"},
"category": {"type": "string"}
},
"required": ["query"]
}
}],
messages=[{"role": "user", "content": "Tìm laptop dưới 20 triệu"}]
)
4. ビルドツールのレジストリパターン
class ToolRegistry:
def __init__(self):
self.tools = {}
self.schemas = []
def register(self, name, description, parameters):
def decorator(func):
self.tools[name] = func
self.schemas.append({
"type": "function",
"function": {
"name": name,
"description": description,
"parameters": parameters
}
})
return func
return decorator
def execute(self, name, args):
return self.tools[name](**args)
registry = ToolRegistry()
@registry.register("get_weather", "Lấy thời tiết", {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]
})
def get_weather(city):
return f"Thời tiết {city}: 32°C, nắng"
概要
- 関数呼び出し = LLM 出力 JSON → コードが実行 → 結果が LLM に返される
- オープンAI:
toolsパラメータ +tool_calls応答。応答 - 人間性:
toolsパラメータ +tool_useコンテンツブロック - 並行通話により、エージェントの処理が高速化されます
- ツール レジストリ パターンはツールを適切に管理するのに役立ちます
演習
- 5 つのツールを実装します: 電卓、天気、web_search、file_read、send_email
- 並列関数呼び出しを使用してエージェントを構築する
- 適切なツールの説明を書く — 明確な説明と曖昧な説明を比較する 4.tool_choice="required" と "auto" を実装し、違いを観察します。