AIエージェント開発において、Function Calling(関数呼び出し)は決して避けて通れない技術要素です。Google GeminiのFunction Callingを活用すれば、外部API連携、データベースクエリ、ファイル操作などをAIモデルに正確に指示させられます。
私はこれまで50以上のAIエージェントを構築してきましたが、Function Callingの実装で最も苦しめられたのがAPIコストの問題でした。OpenAIのGPT-4oではFunction Callingのコストが信じられないほど高く、本番運用を断念したプロジェクトも存在します。
そんな中、HolySheep AIの存在を知り、劇的に状況が変わりました。Gemini 2.5 Flash价格为$2.50/MTokと、他の主要モデルの5〜20%という破格のコストでFunction Callingを実現できます。私のプロジェクトでは 月間Token消費量が200MTok超えますが、コストは従来の1/10以下に削減できています。
Function Callingとは?基本概念を理解する
Function Callingは、LLM(大規模言語モデル)に「外部関数を呼び出す能力」を持たせる技術です。従来のプロンプトエンジニアリングでは、AIはテキストのみを生成できました。しかしFunction Callingにより、AIは以下の流れで動作します:
- ユーザーの質問を分析し、呼び出すべき関数を特定
- 関数の引数(パラメータ)を構造化されたJSONで生成
- 開発者が実際の関数を実行し、結果をAIに返送
- AIが関数結果を基に最終回答を生成
この仕組みにより、リアルタイム天気予報取得、商品在庫確認、ユーザー管理システム連携など、現実世界のデータを活用したAIアプリケーションが構築可能になります。
HolySheep AI APIでのFunction Calling実装
HolySheep AIはGoogle Gemini 2.5 Flashをネイティブサポートしており、OpenAI互換のAPIエンドポイントを通じてFunction Callingを利用できます。私が初めて実装した時に直面したエラーを元に、顺を追って説明します。
ステップ1: 工具(Tools)の定義
Function Callingの核心は、toolsパラメータに呼び出し可能な関数の定義を含めることです。以下は气象情報取得 агентの例です:
import requests
import json
HolySheep AI API設定
BASE_URL = "https://api.holysheep.ai/v1"
API_KEY = "YOUR_HOLYSHEEP_API_KEY"
def get_weather(location: str, unit: str = "celsius") -> dict:
"""
指定した場所の天気情報を取得する関数
Args:
location: 都市名(例: "東京", "大阪")
unit: 温度単位("celsius" または "fahrenheit")
Returns:
dict: 天気情報
"""
# 実際の実装では天気APIを呼び出す
mock_weather_data = {
"東京": {"temp": 22, "condition": "晴れ", "humidity": 65},
"大阪": {"temp": 25, "condition": "曇り", "humidity": 70},
"ニューヨーク": {"temp": 18, "condition": "晴れ", "humidity": 55},
}
return mock_weather_data.get(location, {"error": "データが見つかりません"})
def call_gemini_with_function_calling():
"""Gemini 2.5 FlashでFunction Callingを実行"""
messages = [
{"role": "user", "content": "大阪の今日の天気を摂氏で教えてください"}
]
# 工具定義(Tools)
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "指定した都市の今日の天気を取得します。旅行計画や服装の決定に便利です。",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "都市名(例: 東京、大阪、ニューヨーク)"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度の単位",
"default": "celsius"
}
},
"required": ["location"]
}
}
}
]
payload = {
"model": "gemini-2.5-flash",
"messages": messages,
"tools": tools,
"tool_choice": "auto" # 自動的に関数を選択
}
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
response = requests.post(
f"{BASE_URL}/chat/completions",
headers=headers,
json=payload,
timeout=30
)
if response.status_code == 200:
result = response.json()
print(json.dumps(result, indent=2, ensure_ascii=False))
return result
else:
print(f"エラー: {response.status_code}")
print(response.text)
return None
実行
result = call_gemini_with_function_calling()
このコードを実行すると、Geminiは以下のようにweather.getの呼び出し意图を含む応答を返します:
{
"id": "chatcmpl-xxx",
"object": "chat.completion",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"tool_calls": [{
"id": "call_xxx",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"location\": \"大阪\", \"unit\": \"celsius\"}"
}
}]
}
}]
}
ステップ2: 関数実行と結果の返送
AIが関数を呼び出すと判断したら、開発者は実際にその関数を実行し、結果をAIに返送する必要があります。完全な对话フローを以下に示します:
import requests
import json
from typing import List, Dict, Any, Optional
BASE_URL = "https://api.holysheep.ai/v1"
API_KEY = "YOUR_HOLYSHEEP_API_KEY"
def get_weather(location: str, unit: str = "celsius") -> dict:
"""天気取得の実装"""
weather_db = {
"東京": {"temp_c": 24, "temp_f": 75.2, "condition": "晴れ", "humidity": 60},
"大阪": {"temp_c": 27, "temp_f": 80.6, "condition": "晴れ", "humidity": 65},
"ニューヨーク": {"temp_c": 18, "temp_f": 64.4, "condition": "曇り", "humidity": 55},
}
data = weather_db.get(location)
if data:
return {"status": "success", "data": data}
return {"status": "error", "message": f"{location}の天気データが見つかりません"}
def get_stock(symbol: str) -> dict:
"""株式情報取得の実装"""
stocks = {
"AAPL": {"price": 178.50, "currency": "USD", "change": "+2.3%"},
"GOOGL": {"price": 141.80, "currency": "USD", "change": "-0.5%"},
"7203.T": {"price": 2850, "