こんにちは、HolySheep AIのテクニカルライターの田中です。今回は、API 경험为零の 完全初心者でも理解できる、超がつく基本的なところから、ストリーミング応答と関数呼び出し(Function Calling)の組み合わせについて解説します。

関数呼び出しとは、AIに「天気予報を取得して」「予約を確認して」といった具体的なアクションを実行させる技術です。HolySheep AIでは、この機能を今すぐ登録して始めることで、GPT-4.1と同等の高性能モデルでありながら、1トークンあたりのコストは$8のところ、¥1=$1のレートで考えると大幅に節約できます。

関数呼び出しとは?なぜ使うの?

まず、従来のAI応答と関数呼び出しの違いを理解しましょう。

従来の方法:AIが текстだけで回答

従来のAI応答:
質問:「東京の今日の天気を教えて」
AI:「東京は晴れで、気温は25度です」

問題点:実際の天気を取得していない。
架空の回答かもしれない。

関数呼び出し:AIが必要なデータをリアルタイム取得

関数呼び出しを使った場合:
質問:「東京の今日の天気を教えて」
AI → 「weather_toolを呼び出してください」とリクエスト
     ↓
ツールが実際の天気APIを実行
     ↓
「東京は晴れで、気温は25度です」と正確な回答

HolySheep AIのレイテンシは50ミリ秒未満を実現しており、リアルタイムなツール実行が可能です。

実践編:Pythonでストリーミング関数呼び出しを実装

STEP 1:必要なライブラリのインストール

# コマンドラインで実行
pip install openai>=1.0.0

STEP 2:天気を取得する関数ツールを定義

from openai import OpenAI
import json

HolySheep AIクライアントを初期化

client = OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" )

関数(ツール)の定義

tools = [ { "type": "function", "function": { "name": "get_weather", "description": "指定した都市の天気を取得する", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "天気を知りたい都市名(例:東京、ニューヨーク)" } }, "required": ["city"] } } } ]

ツールの実装関数

def execute_tool(function_name, arguments): """実際にツールを実行する関数""" if function_name == "get_weather": city = arguments.get("city", "") # 実際のAPI呼び出しの代わりに、モックデータを返す weather_data = { "東京": {"weather": "晴れ", "temperature": 25, "humidity": 60}, "ニューヨーク": {"weather": "曇り", "temperature": 18, "humidity": 75}, "ロンドン": {"weather": "雨", "temperature": 12, "humidity": 85} } return weather_data.get(city, {"error": "都市が見つかりません"}) return {"error": "不明な関数"}

ストリーミングで関数呼び出しを処理

def stream_with_function_calling(user_message): response = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": "あなたは helpful assistant です。"} , {"role": "user", "content": user_message} ], tools=tools, stream=True ) full_response = "" tool_calls_buffer = [] for chunk in response: delta = chunk.choices[0].delta # ツール呼び出しがある場合 if delta.tool_calls: for tool_call in delta.tool_calls: tool_calls_buffer.append({ "id": tool_call.id, "name": tool_call.function.name, "arguments": tool_call.function.arguments }) print(f"[ツール呼び出しを検出] {tool_calls_buffer}") # 通常のテキスト応答 if delta.content: print(delta.content, end="", flush=True) full_response += delta.content return full_response, tool_calls_buffer

メイン処理

print("=== AIとの会話 ===\n") response, tools_used = stream_with_function_calling( "東京の今日の天気はどうですか?" ) print("\n\n=== ツール実行結果 ===") for tool in tools_used: result = execute_tool(tool["name"], json.loads(tool["arguments"])) print(f"実行結果: {result}")

ストリーミング応答の仕組みを視覚的に理解

スクリーンショットのヒント:下の図は、ストリーミング応答がどのように届くかを示しています。-traditional-batch.png-のように、一度に全文が届くのではなく、-streaming-chunks.png-のように、少しずつ届きます。

【従来のバッチ応答(一括で届く)】
{
  "content": "東京は today's 天气は..."
}
     ↓
全文が同時に届く(2-3秒待つ)

【ストリーミング応答(少しずつ届く)】
chunk 1: "東"
chunk 2: "京は"
chunk 3: " today's"
chunk 4: " 天気は..."
     ↓
即座に文字が届き始める(最初の文字は0.5秒)

複数の関数を連携させる実践例

ここからは、私が実際に使った複数の関数呼び出しの連携例を紹介します。

# より実践的な例:旅行助手を作成
advanced_tools = [
    {
        "type": "function",
        "function": {
            "name": "search_flights",
            "description": "フライトを検索する",
            "parameters": {
                "type": "object",
                "properties": {
                    "from_city": {"type": "string"},
                    "to_city": {"type": "string"},
                    "date": {"type": "string"}
                },
                "required": ["from_city", "to_city", "date"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "book_hotel",
            "description": "ホテルを予約する",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string"},
                    "check_in": {"type": "string"},
                    "check_out": {"type": "string"}
                },
                "required": ["city", "check_in", "check_out"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "calculate_budget",
            "description": "旅行の予算を計算する",
            "parameters": {
                "type": "object",
                "properties": {
                    "flight_cost": {"type": "number"},
                    "hotel_cost": {"type": "number"},
                    "daily_budget": {"type": "number"},
                    "days": {"type": "integer"}
                },
                "required": ["flight_cost", "hotel_cost", "daily_budget", "days"]
            }
        }
    }
]

def execute_advanced_tools(function_name, arguments):
    """複数のツールを実行"""
    if function_name == "search_flights":
        return {
            "flights": [
                {"airline": "ANA", "price": 45000, "departure": "10:00"},
                {"airline": "JAL", "price": 48000, "departure": "14:00"}
            ]
        }
    elif function_name == "book_hotel":
        return {"booking_id": "HT-12345", "confirmation": "確定"}
    elif function_name == "calculate_budget":
        total = (arguments["flight_cost"] + 
                arguments["hotel_cost"] + 
                (arguments["daily_budget"] * arguments["days"]))
        return {"total_budget": total, "breakdown": arguments}
    return {"error": "Unknown function"}

複雑なクエリを処理

user_query = "来月15日に東京からニューヨークへのフライトと、" user_query += "同じ日から3泊のホテルを探して、1日2万円の生活を入れると" user_query += "全部でいくらになるか計算してください" print(f"ユーザー: {user_query}") response = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "user", "content": user_query} ], tools=advanced_tools, stream=True )

ツール呼び出しを収集

tool_calls = [] for chunk in response: if chunk.choices[0].delta.tool_calls: for tc in chunk.choices[0].delta.tool_calls: print(f"🔧 ツール呼び出し: {tc.function.name}") tool_calls.append(tc)

HolySheheep AIを使うメリット

私が実際にHolySheep AIを数ヶ月間使用して感じている、利便性とコスト面でのメリットは内容です。

よくあるエラーと対処法

エラー1:APIキーが無効です(401 Unauthorized)

# ❌ 間違い:キーの前後に空白がある
client = OpenAI(
    api_key=" YOUR_HOLYSHEEP_API_KEY ",  # 空白NG
    base_url="https://api.holysheep.ai/v1"
)

✅ 正しい:空白 없이正確に

client = OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" )

解決方法:APIキーの先頭と末尾に余分な空白がないか確認してください。APIキーはHolySheep AIダッシュボードの「API Keys」セクションから取得できます。

エラー2:ツール呼び出しが実行されない

# ❌ 間違い:toolsパラメータがない
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "天気を教えて"}]
    # toolsパラメータが欠けている
)

✅ 正しい:toolsパラメータを必ず含める

response = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": "天気を教えて"}], tools=tools # これがないと関数呼び出しは発生しない )

解決方法:関数呼び出しを使用するには、toolsパラメータを必ず指定してください。toolsパラメータを省略すると、AIは関数呼び出しを一切都useしません。

エラー3:argumentsがJSONとして解析できない

# ❌ 間違い:argumentsが文字列でない
tool_call = {
    "id": "call_123",
    "name": "get_weather",
    "arguments": {"city": "東京"}  # 辞書型はNG
}

✅ 正しい:argumentsはJSON文字列

import json tool_call = { "id": "call_123", "name": "get_weather", "arguments": json.dumps({"city": "東京"}) # 文字列に変換 }

または、deltaから取得したargumentsをそのまま使用

for tool_call in delta.tool_calls: args = json.loads(tool_call.function.arguments) # 文字列から辞書に変換 result = execute_tool(tool_call.function.name, args)

解決方法:tool_call.function.argumentsは常に文字列(JSON形式)です。execute_tool関数に渡す前に、json.loads()で辞書に変換してください。

エラー4:base_urlのエンドポイントが違う

# ❌ 間違い:他のAIサービスのエンドポイントを使ってしまう
client = OpenAI(
    api_key="YOUR_HOLYSHEEP_API_KEY",
    base_url="https://api.openai.com/v1"  # これはOpenAIфициальный
)

❌ これも間違い:バージョンが違う

client = OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v2" # v2ではない )

✅ 正しい:HolySheep AIのv1エンドポイントを正確に指定

client = OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" )

解決方法:常にbase_urlはhttps://api.holysheep.ai/v1を使用してください。他のサービスをコピー&ペーストして地址を変更し忘れることのないようにしましょう。

次のステップ

以上で、ストリーミング応答と関数呼び出しの基本的な使い方は理解できたでしょうか。私がおすすめするのは、以下のような流れで学習を進めることです。

  1. まずは今回紹介したいちばんシンプルな例を実行してみる
  2. 次に、自分の好きなツール(天気、ニュースなど)を定義して試す
  3. 最後に、複数の関数を連携させた複雑なアプリを作成に挑戦

HolySheep AIなら、レート面での圧倒的なメリット(DeepSeek V3.2は$0.42/MTok、GPT-4.1は$8/MTok)があるため、失敗を恐れずに何度も試すことができます。登録者は全員無料クレジットを獲得できますので、ぜひHolySheep AI に登録して實際に手を動かしてみてください!

ご質問やフィードバックがあれば、お気軽にコメントください。未来のブログ記事では、より高度な応用テクニックについても解説予定です。


関連リンク