Gemma 4 がリリースされて以来、Antigravity 上でのエージェント構築を試みる開発者が急増しています。「Gemma 4 を動かすことはできた、でも思ったように動かない」という声をよく聞きます。多くの場合、問題はモデルの能力にあるのではなく、ツール設計とメモリ管理にあります。
ここではGemma 4 を Antigravity でエージェントとして動かすための実装パターンを、具体的なコードと設計判断の理由とともに解説します。
なぜ Gemma 4 × Antigravity の組み合わせが効くのか
Gemma 4 は Google が 2026年4月にリリースしたオープンモデルです。特筆すべき点は、同サイズ帯のモデルと比較してツール呼び出し(Function Calling)の精度が大幅に向上している点です。小規模なモデルでは「ツールを呼ぶべきタイミング」の判断が苦手なことが多いのですが、Gemma 4 はこのタイミング判断がかなり改善されています。
Antigravity は Google のエージェント開発プラットフォームとして、Gemma 4 との統合が前提で設計されています。ツールの登録・実行・結果の受け渡しの仕組みがシームレスで、他のフレームワークと比べてボイラープレートが少なく済みます。
この組み合わせが特に力を発揮するのは、外部APIやツールを多用するタスクです。検索、計算、データベース参照、ファイル操作などを組み合わせた業務フローを、比較的シンプルなコードで実現できます。
環境セットアップ:Antigravity に Gemma 4 を接続する
まず Antigravity の環境を用意します。Google Cloud の Vertex AI を経由するのが現時点での標準的なセットアップです。
pip install google-cloud-aiplatform antigravity-sdkimport vertexai
from antigravity import AgentBuilder, Tool
from vertexai.preview.generative_models import GenerativeModel
# Vertex AI の初期化
vertexai.init(project="your-project-id", location="us-central1")
# Gemma 4 モデルの接続
model = GenerativeModel("gemma-4-pro") # または gemma-4-it
# エージェントビルダーの初期化
agent_builder = AgentBuilder(model=model)ここでモデルのバリアントの選択について一点補足します。gemma-4-pro はより高精度ですが応答が遅く、コストも高めです。gemma-4-it は Instruction Tuned 版で、エージェントタスクへの応答速度と精度のバランスが良く、多くのユースケースではこちらで十分です。
ツール呼び出しの設計:何を使わせ、何を禁じるか
エージェント開発で最もよくある失敗の一つは「ツールを多く与えすぎること」です。Gemma 4 はツール選択の精度が向上しましたが、それでも利用可能なツールが多すぎると混乱が起きます。設計の基本原則は「1エージェント=3〜5ツール以内」です。
ツールの定義方法を示します。
from antigravity import Tool, ToolParameter
# 検索ツールの定義
search_tool = Tool(
name="web_search",
description="最新情報や事実確認が必要な場合にウェブを検索する。一般的な知識には使わない。",
parameters=[
ToolParameter(
name="query",
type="string",
description="検索クエリ。具体的な検索語を使い、自然文は避ける。",
required=True
),
ToolParameter(
name="max_results",
type="integer",
description="取得する結果の最大数(1〜5)",
required=False,
default=3
)
],
function=execute_web_search # 実際の検索を行う関数
)
# 計算ツールの定義
calculator_tool = Tool(
name="calculate",
description="数値計算を行う。掛け算・割り算・複雑な数式の評価など。",
parameters=[
ToolParameter(
name="expression",
type="string",
description="評価する数式。例: '1234 * 5678' または '(100 * 0.08) + 1000'",
required=True
)
],
function=safe_calculate
)
# エージェントにツールを登録
agent = agent_builder.build(
tools=[search_tool, calculator_tool],
system_instruction="""
あなたは業務支援アシスタントです。
ウェブ検索は最新情報が必要なときだけ使ってください。
すでに知っている情報にはツールを使わないでください。
計算は必ず calculator ツールを使ってください。頭の中で計算しないこと。
"""
)description に「いつ使うか」と「いつ使わないか」の両方を書くのが重要です。Gemma 4 はこの記述を参考にツールを選択するため、使うべきでないケースを明示することで誤ったツール呼び出しを大幅に減らせます。
メモリとコンテキスト管理の実装パターン
エージェントが長い会話や複数ステップのタスクを扱う場合、メモリ管理は避けられない課題になります。Antigravity には 3種類のメモリ機構があります。
インメモリ(セッション内): デフォルトで有効。会話の全履歴をコンテキストに保持します。長い会話ではコンテキストが膨れ上がり、精度が落ちたり速度が低下したりします。
サマリーメモリ: 一定のメッセージ数ごとに過去の会話を要約し、圧縮してコンテキストに保持します。長期的なタスクに向いています。
外部メモリ: Vector DB(Vertex AI Vector Search など)に記憶を外出しする方式です。大量の情報を参照しながら動くエージェントに使います。
from antigravity.memory import SummaryMemory, ExternalMemory
# サマリーメモリの設定
memory = SummaryMemory(
max_recent_messages=10, # 最新10件はそのまま保持
summary_interval=20, # 20件ごとに要約を生成
summary_model=model # 要約にも同じモデルを使用
)
# または外部メモリ(大規模ナレッジが必要な場合)
external_memory = ExternalMemory(
vector_store="vertex-ai-vector-search",
index_id="your-index-id",
top_k=5 # 関連する過去情報を上位5件取得
)
agent = agent_builder.build(
tools=[search_tool, calculator_tool],
memory=memory, # または external_memory
system_instruction="..."
)実際の選択基準として、タスクが1セッション内で完結するなら インメモリで十分です。数日・数週間にわたるプロジェクト支援のようなユースケースにはサマリーメモリが適しています。ドキュメントや過去の事例を大量に参照するナレッジベースエージェントには外部メモリが必要です。
エージェントの実行と結果の受け取り
実際にエージェントを動かすコードです。
import asyncio
async def run_agent_task(user_request: str) -> str:
"""エージェントにタスクを依頼し、結果を受け取る"""
response = await agent.run_async(
user_message=user_request,
session_id="session-001" # セッションを継続する場合に指定
)
# ツール呼び出しのログを確認(デバッグ時に有用)
for step in response.steps:
if step.type == "tool_call":
print(f"ツール使用: {step.tool_name}({step.arguments})")
print(f"結果: {step.result[:100]}...")
return response.final_answer
# 実行例
async def main():
result = await run_agent_task(
"2026年4月時点のPythonの最新バージョンを調べて、"
"それを使った仮想環境の作成コマンドを教えてください。"
)
print(result)
asyncio.run(main())本番環境への展開前に確認すること
エージェントを実際の業務に組み込む前に、いくつかの点を確認しておく必要があります。
ツールの安全性: 外部APIを呼び出すツールには、レート制限のチェックとエラーハンドリングを必ず入れてください。エージェントがループ状態に陥ってAPIを大量呼び出しするケースが実際に起きます。
import time
from functools import wraps
def rate_limited(calls_per_second: float):
"""シンプルなレート制限デコレータ"""
min_interval = 1.0 / calls_per_second
last_called = [0.0]
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
elapsed = time.time() - last_called[0]
if elapsed < min_interval:
time.sleep(min_interval - elapsed)
result = func(*args, **kwargs)
last_called[0] = time.time()
return result
return wrapper
return decorator
@rate_limited(calls_per_second=1)
def execute_web_search(query: str, max_results: int = 3) -> str:
# 実際の検索処理
...最大ステップ数の設定: エージェントが無限に動き続けないよう、タスクあたりの最大ステップ数を設定します。Antigravity では max_steps パラメータで制御できます。
人間によるレビューポイント: 高リスクな操作(データの削除・外部への送信など)の前には、人間の確認を挟む設計にしてください。完全な自動化は「確認しなくても大丈夫なタスク」に限定するのが原則です。
Gemma 4 × Antigravity の組み合わせは、個人開発者がエージェントを試すには今がベストなタイミングです。まずは小さな・安全なタスク(情報収集、下書き生成など)から始めて、動作を確認しながら徐々にスコープを広げていくアプローチをお勧めします。