ANTIGRAVITY LABEN
記事一覧/Agents & Manager
Agents & Manager/2026-04-11中級

Gemma 4でAIエージェント開発を加速する方法

Google Gemma 4の関数呼び出し・構造化出力・マルチモーダル機能を活用したAIエージェント開発の実践ガイド。モデルサイズの選び方から、実装コードまで詳しく解説します。

Gemma 421AIエージェント36関数呼び出しGoogle3オープンモデル2エージェント開発2

2026年4月にGoogleがリリースしたGemma 4は、オープンモデルのエージェント開発において新しい基準を打ち立てましました。関数呼び出し・構造化JSON出力・システム命令のネイティブサポートという三拍子揃った機能セットは、実用的なエージェントを構築するための土台として非常に優れています。

Gemma 4がエージェント開発に適している理由

エージェントを構築する際に必要な能力は、大きく三つあります。ツールの呼び出し(外部APIやデータベースとのインタラクション)、結果の構造化(後続システムが処理できる形式での出力)、そして文脈の保持(長い会話や複雑なタスクを通じた一貫性)です。

Gemma 4はこれら三つをネイティブにサポートしており、Apache 2.0ライセンスのため自由に商用利用できます。クローズドモデルへの依存をなくしつつ、本格的なエージェントを構築できる点が大きな魅力です。

モデルサイズとエージェント設計の関係

エージェント開発では、タスクの複雑さとインフラコストのバランスに応じてモデルサイズを選ぶ必要があります。

シンプルなルーティングエージェント(入力の分類、簡単な情報取得)にはE2Bが適しています。リソース消費が少なくレスポンスが速いため、エッジデバイス上でのリアルタイム処理に向いています。

マルチステップの業務自動化エージェント(複数ツールを連携させるワークフロー)には26B MoEが良いバランスを提供します。精度とコストのトレードオフが最適で、プロダクション環境での大量処理に適しています。

複雑な推論が必要なエージェント(コード生成・分析・意思決定)には31B Denseを推奨します。精度が最優先の場面では、コストよりも品質を取る判断が正しいでしょう。

エージェントの基本構造:ReActパターン

Gemma 4を使ったエージェントの典型的な実装パターンはReAct(Reasoning + Acting)です。モデルが「考える→行動する→観察する」というサイクルを繰り返して目標を達成します。

import vertexai
from vertexai.preview.generative_models import (
    GenerativeModel, FunctionDeclaration, Tool, Part
)
 
vertexai.init(project="YOUR_PROJECT_ID", location="us-central1")
 
# ツールの定義
web_search = FunctionDeclaration(
    name="web_search",
    description="インターネットで情報を検索する",
    parameters={
        "type": "object",
        "properties": {
            "query": {
                "type": "string",
                "description": "検索クエリ"
            }
        },
        "required": ["query"]
    }
)
 
get_stock_price = FunctionDeclaration(
    name="get_stock_price",
    description="指定した銘柄の現在の株価を取得する",
    parameters={
        "type": "object",
        "properties": {
            "ticker": {
                "type": "string",
                "description": "株式ティッカーシンボル(例:GOOG, AAPL)"
            }
        },
        "required": ["ticker"]
    }
)
 
calculate = FunctionDeclaration(
    name="calculate",
    description="数式を計算する",
    parameters={
        "type": "object",
        "properties": {
            "expression": {
                "type": "string",
                "description": "計算する数式(例:'100 * 1.05')"
            }
        },
        "required": ["expression"]
    }
)
 
tools = [Tool(function_declarations=[web_search, get_stock_price, calculate])]
 
model = GenerativeModel(
    "google/gemma-4-31b-it",
    tools=tools,
    system_instruction="""あなたは投資調査アシスタントです。
    ユーザーの質問に答えるために、利用可能なツールを積極的に活用してください。
    複数のツールを組み合わせて、包括的な回答を作成してください。"""
)
 
# エージェントの実行ループ
def run_agent(user_message: str, max_iterations: int = 5):
    chat = model.start_chat()
    response = chat.send_message(user_message)
    
    iteration = 0
    while iteration < max_iterations:
        # 関数呼び出しが必要かチェック
        parts = response.candidates[0].content.parts
        function_calls = [p for p in parts if hasattr(p, 'function_call') and p.function_call.name]
        
        if not function_calls:
            # 最終回答
            return response.text
        
        # ツールを実行して結果を返す
        function_responses = []
        for part in function_calls:
            fc = part.function_call
            result = execute_tool(fc.name, dict(fc.args))
            function_responses.append(
                Part.from_function_response(
                    name=fc.name,
                    response={"result": result}
                )
            )
        
        # 結果をモデルに渡して次の判断を得る
        response = chat.send_message(function_responses)
        iteration += 1
    
    return response.text
 
def execute_tool(name: str, args: dict) -> dict:
    """ツールの実際の実行(本番では各APIを呼び出す)"""
    if name == "get_stock_price":
        # 実際にはYFinance等のAPIを呼び出す
        return {"ticker": args["ticker"], "price": 185.42, "currency": "USD"}
    elif name == "calculate":
        # 安全な計算実行
        import ast
        result = eval(args["expression"], {"__builtins__": {}})
        return {"result": result}
    elif name == "web_search":
        return {"results": [f"検索結果: {args['query']}に関する情報...(実際はAPIで取得)"]}
    return {}
 
# 実行例
result = run_agent("Appleの現在の株価を調べて、100株購入した場合の総額(円換算)を計算してください。1ドル=150円で計算してください。")
print(result)

マルチモーダルエージェント:画像を「見て」行動する

Gemma 4のマルチモーダル能力を活かすと、画像の内容を理解した上でアクションを取るエージェントを構築できます。

from vertexai.preview.generative_models import GenerativeModel, Part, Tool, FunctionDeclaration
import base64
 
# 画像の内容を分析して、適切なアクションを自律的に選択するエージェント
create_work_order = FunctionDeclaration(
    name="create_work_order",
    description="製造ラインの異常を検出した際に作業指示書を作成する",
    parameters={
        "type": "object",
        "properties": {
            "severity": {
                "type": "string",
                "enum": ["low", "medium", "high", "critical"],
                "description": "異常の深刻度"
            },
            "issue_type": {"type": "string", "description": "異常の種類"},
            "location": {"type": "string", "description": "発生箇所"},
            "recommended_action": {"type": "string", "description": "推奨対応"}
        },
        "required": ["severity", "issue_type", "location", "recommended_action"]
    }
)
 
alert_supervisor = FunctionDeclaration(
    name="alert_supervisor",
    description="supervisorへ緊急アラートを送信する",
    parameters={
        "type": "object",
        "properties": {
            "message": {"type": "string"},
            "urgency": {"type": "string", "enum": ["normal", "urgent", "emergency"]}
        },
        "required": ["message", "urgency"]
    }
)
 
model = GenerativeModel(
    "google/gemma-4-e4b",  # エッジデバイスでリアルタイム処理
    tools=[Tool(function_declarations=[create_work_order, alert_supervisor])],
    system_instruction="あなたは製造ラインの品質検査AIです。画像を分析して異常を検出し、適切なアクションを取ってください。"
)
 
def inspect_product(image_path: str):
    with open(image_path, "rb") as f:
        image_data = f.read()
    
    chat = model.start_chat()
    response = chat.send_message([
        Part.from_data(mime_type="image/jpeg", data=image_data),
        "この製品画像を検査して、異常があれば適切なツールを使ってアクションを取ってください。"
    ])
    
    # ツール呼び出しを処理(上記のrun_agent関数と同様のループ)
    return response
 
# inspect_product("product_sample.jpg") # 実際の画像パスを指定

並列ツール呼び出しによる高速化

複数のツールを並列実行することで、エージェントの処理速度を大幅に向上できます。

import asyncio
 
async def run_parallel_agent(query: str):
    """
    複数のツールを並列実行する非同期エージェントパターン
    例:複数の情報源から同時にデータを収集する
    """
    # 非同期でツールを並列実行
    tasks = [
        fetch_market_data("GOOG"),
        fetch_market_data("AAPL"),
        fetch_news("AI市場 2026"),
    ]
    
    results = await asyncio.gather(*tasks)
    
    # 収集したデータをまとめてGemma 4に渡す
    model = GenerativeModel("google/gemma-4-31b-it")
    summary_response = model.generate_content(
        f"""以下のデータを分析して投資判断レポートを作成してください:
        
        市場データ: {results[0]}, {results[1]}
        ニュース: {results[2]}"""
    )
    return summary_response.text
 
async def fetch_market_data(ticker: str):
    await asyncio.sleep(0.1)  # API呼び出しのシミュレーション
    return {"ticker": ticker, "price": 185.0, "change": "+2.3%"}
 
async def fetch_news(query: str):
    await asyncio.sleep(0.1)
    return [f"{query}に関する最新ニュース1", f"{query}に関する最新ニュース2"]

全体を振り返って

Gemma 4はオープンモデルでありながら、エンタープライズグレードのエージェント開発に必要な機能を全て備えています。関数呼び出し・構造化出力・マルチモーダル入力の組み合わせは、これまでクローズドモデルにしか実現できなかったユースケースを開発者に開放してくれます。

まずは小さなツールセットから始めて、実際の業務フローで動作を確認しながら機能を拡張していくアプローチが、安定したエージェント開発への近道だと感じています。ぜひGemma 4でエージェント開発に挑戦してみてください。

個人開発12年の現場で実感したこと

線引きするときの3つの判断軸

  • 失敗時の影響が金銭やユーザー体験にどれだけ波及するか
  • 復旧オペレーションが明文化されているか
  • 観測ログから人間が再現できる粒度に整っているか
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

Agents & Manager2026-04-09
Antigravity × Gemma 4:プロダクション・エージェントをローカルLLMで構築する
Gemma 4をAntigravityで動かしてプロダクションレベルのAIエージェントを構築する完全ガイド。モデル選択・Ollama設定・AgentKit統合・マルチエージェント化まで体系的に解説。
AIツール2026-04-11
Claude MythosとGemma 4:2026年最先端AIモデルを徹底比較
2026年春に登場したClaude MythosとGemma 4を多角的に比較。ライセンス・ユースケース・アクセス方法・コストの違いを整理して、どちらを選ぶべきか判断できるガイドです。
Agents & Manager2026-06-30
Android CLI が3倍速・トークン7割減になったとき、増やすべきは並列数ではなく1件あたりの検証だった
Android CLI のエージェントが3倍速・トークン約7割減になった、というニュースを見て最初に考えたのは「では何本同時に走らせようか」でした。けれど速くなって本当に変わるのは生産量ではなく、詰まる場所です。レビューと検証ゲートに移ったボトルネックを Little's Law で見積もり、WIP キャップで並列数を抑え、浮いた予算を1件あたりの検証に回す設計を、動く Python 実装と実測値でまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →