私は現在、ECサイトのAIカスタマーサービスを構築しているエンジニアですが
Function Callingとは
Function Callingは、大規模言語モデル(LLM)が用户の要求を分析し、事前に定義した関数を自动的に呼び出す機能です。これにより、LLMは単なるテキスト生成ツールから、実際のビジネスロジックを実行できるAIエージェントへと进化します。例えば、「今日の天気は?」という质问に対して、天気APIを 호출하여实时データを返すことができます。
実践的ユースケース:ECサイトのAIカスタマーサービス
私が開発中のECサイトでは每日数百件の顧客問い合わせがあり、従来のチャットボットでは対応に限界がありました。Function Callingを導入することで、以下の自动化を実現しています:
- 在庫確認:商品コードからリアルタイム在庫数を取得
- 注文追跡:注文番号から配送状況を查询
- 商品推荐:购买履历からパーソナライズされた商品を提案
实现手順
ステップ1:関数の定義
まず、呼び出したい関数のスキーマを定義します。以下は在庫確認と注文追跡の2つの関数の例です:
import openai
import json
HolySheep AIのエンドポイント設定
client = openai.OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1"
)
利用可能な関数の定義
functions = [
{
"type": "function",
"function": {
"name": "get_inventory",
"description": "指定された商品コードの在庫数を取得する",
"parameters": {
"type": "object",
"properties": {
"product_code": {
"type": "string",
"description": "商品コード(例:SKU-12345)"
}
},
"required": ["product_code"]
}
}
},
{
"type": "function",
"function": {
"name": "track_order",
"description": "注文番号から配送状況を追跡する",
"parameters": {
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "注文番号(例:ORD-20240101-001)"
}
},
"required": ["order_id"]
}
}
}
]
def get_inventory(product_code: str) -> dict:
"""在庫確認APIを呼び出す"""
# 実際の在庫APIのURLに置き換え
api_url = f"https://your-ec-api.com/inventory/{product_code}"
response = requests.get(api_url)
return response.json()
def track_order(order_id: str) -> dict:
"""配送追跡APIを呼び出す"""
# 実際の配送APIのURLに置き換え
api_url = f"https://your-shipping-api.com/track/{order_id}"
response = requests.get(api_url)
return response.json()
ステップ2:Function Callingの実装
次に 用户との对话に応答し、適切な関数を呼び出すロジックを実装します:
import openai
def process_user_message(user_message: str):
"""用户メッセージ 처리 및 함수 호출"""
# Step 1: モデルにFunction Callingさせ函数を決定
response = client.chat.completions.create(
model="gpt-4.1", # HolySheep AIのモデル名
messages=[
{"role": "system", "content": "あなたはECサイトのAIカスタマーサクセスです。"},
{"role": "user", "content": user_message}
],
tools=functions,
tool_choice="auto"
)
assistant_message = response.choices[0].message
# Step 2: 関数が呼び出された場合の処理
if assistant_message.tool_calls:
tool_call = assistant_message.tool_calls[0]
function_name = tool_call.function.name
arguments = json.loads(tool_call.function.arguments)
# 関数の実行
if function_name == "get_inventory":
result = get_inventory(**arguments)
result_message = f"商品{arguments['product_code']}の在庫は{result['quantity']}個です。"
elif function_name == "track_order":
result = track_order(**arguments)
result_message = f"ご注文{arguments['order_id']}は「{result['status']}」です。"
# Step 3: 関数結果をモデルに渡し、最終回答を生成
final_response = client.chat.completions.create(
model="gpt-4.1",
messages=[
{"role": "system", "content": "あなたはECサイトのAIカスタマーサクセスです。"},
{"role": "user", "content": user_message},
assistant_message,
{
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(result)
}
]
)
return final_response.choices[0].message.content
return assistant_message.content
使用例
print(process_user_message("SKU-12345の在庫はありますか?"))
print(process_user_message("ORD-20240101-001の配送状況を知りたい"))
企業RAGシステムへの応用
私は以前、企業向けのRAG(Retrieval-Augmented Generation)システムを構築しましたが
# RAG + Function Callingの実装例
def semantic_search(query: str, top_k: int = 5):
"""ベクトルデータベースから関連ドキュメントを検索"""
# 実際のベクトルDB接続に置き換え
from qdrant_client import QdrantClient
client = QdrantClient(url="http://localhost:6333")
results = client.search(
collection_name="company_docs",
query_vector=get_embedding(query),
limit=top_k
)
return [{"content": r.payload["content"], "source": r.payload["source"]} for r in results]
def query_rag_system(user_query: str):
"""RAG検索とLLM回答を統合"""
# Step 1: 関連ドキュメントを検索
search_results = semantic_search(user_query)
context = "\n".join([r["content"] for r in search_results])
# Step 2: コンテキストを含めて回答生成
response = client.chat.completions.create(
model="gpt-4.1",
messages=[
{"role": "system", "content": f"以下は関連ドキュメントです:\n{context}"},
{"role": "user", "content": user_query}
]
)
return {
"answer": response.choices[0].message.content,
"sources": [r["source"] for r in search_results]
}
HolySheep AIの料金的优点
HolySheep AIを選ぶ理由は明白です。レートは¥1=$1で、公式の¥7.3=$1と比較して85%のコスト削減を実現しています。また、WeChat PayやAlipayに対応しているため、国内開発者でも簡単に结算可能です。APIレイテンシは<50msと非常に高速で、Function Callingのようなリアルタイム处理にも最適です。
2026年現在の出力価格は以下の通りです(/MTok):
- GPT-4.1: $8.00
- Claude Sonnet 4.5: $15.00
- Gemini 2.5 Flash: $2.50
- DeepSeek V3.2: $0.42
Function Calling主要用于结构化数据提取和业务逻辑调用场景>、DeepSeek V3.2のような低成本モデルは日常的な問い合わせ处理に最適で、複雑な推論が必要な场合にはGPT-4.1を選択する柔軟な构成が可能です。
よくあるエラーと対処法
エラー1:Function not found(関数が認識されない)
定義した関数がモデルに認識されない场合、以下の点を確認してください:
# ❌ 错误な例:parametersの型が不正
{
"name": "get_data",
"parameters": {
"properties": { # typeフィールドが不足
"id": {"type": "string"}
}
}
}
✅ 正しい例:完全なスキーマ定義
{
"name": "get_data",
"description": "データを取得する関数",
"parameters": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "取得するデータのID"
}
},
"required": ["id"]
}
}
エラー2:tool_callがNoneを返す
モデルが関数を呼び出さずに直接回答を生成してしまった场合、systemプロンプトを明確にします:
# ❌ 直接回答しようとするプロンプト
{"role": "system", "content": "ユーザーからの質問에만 답하세요."}
✅ 関数使用を强制するプロンプト
{"role": "system", "content": "あなたは外部ツールを使用して情報を取得できます。利用可能なツールがない場合は、「申し訳ありませんが、この情報は確認できません」と答えてください。"}
エラー3:API接続エラー(接続超时・403 Forbidden)
外部APIを呼び出す際に接続エラーが発生する場合があります:
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
def safe_api_call(url: str, max_retries: int = 3):
"""再試行ロジック付きのAPI呼び出し"""
session = requests.Session()
retries = Retry(
total=max_retries,
backoff_factor=1,
status_forcelist=[500, 502, 503, 504]
)
session.mount('http://', HTTPAdapter(max_retries=retries))
try:
response = session.get(url, timeout=10)
response.raise_for_status()
return response.json()
except requests.exceptions.Timeout:
return {"error": "接続がタイムアウトしました"}
except requests.exceptions.HTTPError as e:
if e.response.status_code == 403:
return {"error": "APIキーが無効です。権限を確認してください"}
return {"error": f"HTTPエラー: {e}"}
except requests.exceptions.RequestException as e:
return {"error": f"リクエスト失敗: {str(e)}"}
エラー4:JSON解析エラー(Function argumentsのフォーマット)
モデルが返す引数の形式が不正な场合、解析前にバリデーションを行います:
import json
from typing import Any, Dict
def parse_function_arguments(function_name: str, arguments_str: str) -> Dict[str, Any]:
"""函数引数の安全な解析"""
try:
# BOM除去と空白正規化
cleaned = arguments_str.strip().lstrip('\ufeff')
return json.loads(cleaned)
except json.JSONDecodeError as e:
raise ValueError(
f"関数{function_name}の引数解析に失敗: {e}\n"
f"生データ: {arguments_str}"
)
使用例
try:
args = parse_function_arguments("get_inventory", tool_call.function.arguments)
result = get_inventory(**args)
except ValueError as e:
print(f"エラー: {e}")
# フォールバック処理
まとめ
Function Callingは、LLMを実際のビジネスロジックに接続する架け橋となる技術です。私は个人開発で电商平台的AI客服を構築しましたが