日本語のテキストデータをクラウドに送らずにAI処理したい——そう考えたとき、真っ先に選択肢に上がるのが Gemma 4 です。Google がオープンソースで公開しているこのモデルは、日本語の理解精度が前世代から大きく向上しており、個人情報を含む日本語コンテンツの処理にも適しています。
ここではAntigravity を使って Python 環境を整え、日本語テキストの要約と感情分析を実装する流れを実際のコードと合わせて紹介します。「Gemma 4 を使ってみたいけど、何を作ればいいか分からない」という方にとって、最初の手がかりになれば嬉しいです。
Gemma 4 が日本語処理に向いている理由
Gemma 4 は多言語コーパスで学習されており、日本語・英語・中国語・韓国語など主要言語を同一モデルで扱えます。前世代の Gemma 3 と比べると、日本語の文章構造(主語省略・助詞の多様性)への対応が改善されており、要約・翻訳・感情分析といったタスクで実用的な精度が出るようになりました。
もうひとつの強みはサイズの選択肢です。Gemma 4 には複数のパラメータ数のバリアントがあり、ローカルマシンのスペックに合わせてモデルを選べます。API経由で使う場合はモデル選択が不要なので、まずは API から試してみることをおすすめします。
Antigravity で Python 開発環境を整える
Antigravity の新規プロジェクトを開いたら、まずターミナルで必要なパッケージをインストールします。
# Google GenAI SDK をインストール
pip install google-genai
# 環境変数ファイルを作成(APIキーは直接コードに書かない)
touch .env.env ファイルに API キーを書き込みます(コードに直接書くと Git 管理時に漏洩リスクがあります)。
GEMINI_API_KEY=YOUR_GEMINI_API_KEY
Antigravity の場合、.env ファイルはプロジェクトルートに置くだけで IDE が自動認識します。環境変数の読み込みには python-dotenv を使うか、OS 環境変数に直接設定する方法を使います。
import os
from dotenv import load_dotenv
from google import genai
load_dotenv()
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])日本語テキスト要約の実装
最初に作るのは要約機能です。ニュース記事・レポート・メールなど、長い日本語テキストを指定した文章数に収める関数を作ります。
def summarize_japanese(text: str, max_sentences: int = 3) -> str:
"""
日本語テキストを指定した文章数以内で要約する。
Args:
text: 要約したい日本語テキスト
max_sentences: 要約の最大文章数(デフォルト3)
Returns:
要約されたテキスト
"""
if not text.strip():
raise ValueError("テキストが空です")
prompt = f"""以下の日本語テキストを{max_sentences}文以内で要約してください。
重要な情報を優先し、元のテキストにない情報は追加しないでください。
要約のみを出力し、前置きや説明は不要です。
テキスト:
{text}"""
response = client.models.generate_content(
model="gemma-4-27b-it", # Gemma 4 27B(instruction-tuned)
contents=prompt,
config={"temperature": 0.3} # 低めの温度で安定した出力を得る
)
return response.text.strip()
# 動作確認
sample_text = """
東京都は19日、2026年度の予算案を発表した。総額は15兆3千億円で、
前年度比で約3%増となる。重点項目として、子育て支援の充実と
デジタルインフラの整備が挙げられた。子育て支援では、
保育所の定員を2万人分増やす計画が盛り込まれた。
デジタルインフラでは、5G基地局の拡充と行政手続きの
オンライン化を推進する方針が示された。
"""
result = summarize_japanese(sample_text, max_sentences=2)
print(result)
# 期待する出力例:
# 東京都は2026年度予算案(15兆3千億円、前年度比3%増)を発表した。
# 子育て支援(保育所定員2万人増)とデジタルインフラ整備が重点項目となっている。プロンプトで「前置きや説明は不要」と指定しているのがポイントです。これを省くと「承知しました。以下が要約です:」のような余計な前置きが付くことがあります。
感情分析機能を追加する
次に、日本語テキストの感情(ポジティブ・ネガティブ・ニュートラル)を分析する機能を実装します。レビュー分析や SNS モニタリングなどに使える機能です。
from dataclasses import dataclass
import json
@dataclass
class SentimentResult:
label: str # "positive" / "negative" / "neutral"
score: float # 0.0 〜 1.0(確信度)
reason: str # 判定の根拠(日本語)
def analyze_sentiment(text: str) -> SentimentResult:
"""
日本語テキストの感情を分析する。
Returns:
SentimentResult: ラベル・スコア・根拠を含む結果
Raises:
ValueError: モデルの出力が JSON 形式でない場合
"""
prompt = f"""以下の日本語テキストの感情を分析し、JSON形式で返してください。
返すべきJSON:
{{
"label": "positive" または "negative" または "neutral",
"score": 0.0から1.0の確信度(小数点2桁),
"reason": "判定の根拠(1文で)"
}}
JSON以外のテキストは一切含めないでください。
テキスト:
{text}"""
response = client.models.generate_content(
model="gemma-4-27b-it",
contents=prompt,
config={"temperature": 0.1} # 感情分析は低温度で決定論的に
)
# JSON パース
raw = response.text.strip()
# コードブロックが含まれる場合はクリーニング
if raw.startswith("```"):
raw = raw.split("```")[1]
if raw.startswith("json"):
raw = raw[4:]
try:
data = json.loads(raw)
return SentimentResult(
label=data["label"],
score=float(data["score"]),
reason=data["reason"]
)
except (json.JSONDecodeError, KeyError) as e:
raise ValueError(f"モデルの出力を解析できませんでした: {raw}") from e
# 動作確認
reviews = [
"このカフェ、雰囲気も良くてコーヒーも美味しかったです。また来たいです!",
"注文してから40分待たされた上に、料理が冷めていた。二度と行かない。",
"普通の定食屋さんです。価格相応かと思います。",
]
for review in reviews:
result = analyze_sentiment(review)
print(f"[{result.label.upper()}] score={result.score:.2f} | {result.reason}")
print(f" テキスト: {review[:30]}...\n")実際に試してみると、日本語特有の表現(婉曲表現・文末の語感)をかなりうまく捉えてくれます。「普通」「まあまあ」「悪くはない」といった微妙なニュアンスも、スコアに反映されます。
よくある実装のつまずきポイント
モデル名の指定ミス: gemma-4-27b-it のように -it(instruction-tuned)サフィックスが必要です。ベースモデル(gemma-4-27b)では指示追従の精度が大きく落ちます。利用可能なモデル名は client.models.list() で確認できます。
JSON 出力の不安定さ: 感情分析のように構造化された出力を期待する場合、モデルがたまに JSON 以外のテキストを混入させることがあります。上記のコードのようにコードブロックのクリーニング処理を入れておくと安定します。Google GenAI SDK の response_schema 機能を使って型を強制する方法もあります。
長文テキストのコンテキスト超過: Gemma 4 のコンテキストウィンドウは大きいですが、非常に長い文書(10万字超)はチャンクに分割して処理する必要があります。詳しくはAntigravity Python SDK でFunction Callingを実装する:AIに外部ツールを使わせる実践ガイドで、API呼び出しのベストプラクティスも紹介しています。
実用的なアプリに仕上げるために
2つの関数ができたら、FastAPI でAPIエンドポイントとして公開することもできます。社内ツールとして使う場合は、Antigravity のビルトイン Web サーバー機能でそのままデプロイできます。
また、Gemma 4 をローカルで動かす——開発環境に自前AIを組み込む実践手順では、API を使わずに完全ローカルで Gemma 4 を実行する方法も解説しています。個人情報を扱うデータでは、ローカル実行も選択肢に入れてみてください。
今日の次のステップとして、まず手元にある短い日本語テキスト(メール・メモ・レビューなど)で summarize_japanese() を動かしてみてください。Antigravity の Inline Chat でコードの改善提案を求めながら作業すると、想像以上にスムーズに進められます。