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つの判断軸
- 失敗時の影響が金銭やユーザー体験にどれだけ波及するか
- 復旧オペレーションが明文化されているか
- 観測ログから人間が再現できる粒度に整っているか