Chuyển đến nội dung chính

レッスン 4: 関数呼び出し — エージェントに「手と足」を与える

関数呼び出し・ツール OpenAI、Anthropic、Geminiの仕組みを利用します。ツール スキーマ (JSON) を定義し、tool_calls を処理し、並列関数呼び出しを行います。計算エージェントと気象エージェントを構築します。

🧠 AI と ML — レッスン 3 レッスン 4: 関数呼び出し — エージェントに「任せる」 足」

AI エージェントの構築: ゼロから本番環境まで

パート 2: 関数呼び出しとツールの使用

xdev.asia

はじめに

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 コンテンツブロック
  • 並行通話により、エージェントの処理が高速化されます
  • ツール レジストリ パターンはツールを適切に管理するのに役立ちます

演習

  1. 5 つのツールを実装します: 電卓、天気、web_search、file_read、send_email
  2. 並列関数呼び出しを使用してエージェントを構築する
  3. 適切なツールの説明を書く — 明確な説明と曖昧な説明を比較する 4.tool_choice="required" と "auto" を実装し、違いを観察します。