なぜ Gemini 2.5 Flash を選ぶのか
Googleが提供するGemini APIにはいくつかのモデルが存在しますが、モバイルアプリ開発で今もっとも注目を集めているのが Gemini 2.5 Flash です。従来のGemini 2.5 Proが高品質な長文生成・複雑な推論に優れている一方、Flash は「速度・コスト・精度のバランス」において際立った存在感を示しています。
Rork Maxで作るアプリはユーザーとのリアルタイムなやり取りが多く、AIの応答速度がUXを左右します。Flashを採用することで、ユーザーが「返答を待っている」と感じるストレスを大幅に軽減できます。
主な特徴を整理すると次のようになります。
- 応答速度: Gemini 2.5 Proの平均5〜10秒に対し、Flash は1〜3秒程度で初回トークンが返る
- コスト: 入力100万トークンあたり約0.075ドル(Proの約1/5〜1/7)
- Thinking モード: 複雑な推論が必要な場面では「Thinking」を有効化して精度を確保できる
- マルチモーダル対応: テキスト・画像・音声・動画の入力に対応
AI機能をアプリに組み込む際は「どのモデルを使うか」が開発コストとユーザー体験に直結します。Rork MaxプロジェクトにGemini 2.5 Flashを統合する具体的な手順を順を追って整理していきます。
事前準備:Google AI API キーの取得
実装を始める前に、Google AI StudioでAPIキーを取得しておく必要があります。
- Google AI Studio にアクセスし、Googleアカウントでログイン
- 左上の「Get API Key」ボタンをクリック
- 「Create API Key」を選択し、使用するGCPプロジェクトを指定
- 生成されたAPIキーを安全な場所にコピー
⚠️ セキュリティ上の注意: APIキーはソースコードに直接記述しないでください。Rork Maxプロジェクトでは、Supabaseの環境変数またはCloudflare WorkersのSecretとして管理するのが安全です。
Gemini 2.5 Flash の SDK セットアップ
Rork Maxのプロジェクトは内部的にExpo(React Native)で動作しています。Google AI JavaScript SDKを追加することで、Gemini APIを呼び出せるようになります。
# Rork MaxプロジェクトのルートディレクトリでSDKをインストール
npm install @google/generative-aiインストール後、API呼び出しの共通ファイルを作成します。
// lib/gemini.ts — Gemini 2.5 Flash クライアントの初期化
import { GoogleGenerativeAI } from "@google/generative-ai";
// 環境変数からAPIキーを読み込む(ハードコード厳禁)
const API_KEY = process.env.EXPO_PUBLIC_GEMINI_API_KEY || "";
const genAI = new GoogleGenerativeAI(API_KEY);
/**
* Gemini 2.5 Flash モデルを取得するヘルパー関数
* thinkingBudget を指定すると Thinking モードが有効になる
*/
export function getFlashModel(thinkingBudget?: number) {
return genAI.getGenerativeModel({
model: "gemini-2.5-flash-preview-04-17",
generationConfig: thinkingBudget
? {
thinkingConfig: {
thinkingBudget, // 0 = 無効, 1024〜8192 = Thinking有効(トークン予算)
},
}
: undefined,
});
}
// 期待する出力: GoogleGenerativeAIのモデルインスタンス基本的なテキスト生成の実装
最もシンプルなユースケースから始めましょう。ユーザーの入力に対してAIが返答するテキスト生成です。
// screens/AIChatScreen.tsx の一部
import { getFlashModel } from "../lib/gemini";
import { useState } from "react";
import { View, TextInput, Button, Text, ScrollView } from "react-native";
export default function AIChatScreen() {
const [input, setInput] = useState("");
const [response, setResponse] = useState("");
const [loading, setLoading] = useState(false);
async function handleSend() {
if (!input.trim()) return;
setLoading(true);
setResponse("");
try {
// Thinking不使用(高速レスポンス優先)
const model = getFlashModel();
const result = await model.generateContent(input);
const text = result.response.text();
setResponse(text);
} catch (error) {
console.error("Gemini API error:", error);
setResponse("エラーが発生しました。しばらく経ってから再試行してください。");
} finally {
setLoading(false);
}
}
return (
<View style={{ flex: 1, padding: 16 }}>
<ScrollView style={{ flex: 1 }}>
<Text style={{ fontSize: 16 }}>{response}</Text>
</ScrollView>
<TextInput
value={input}
onChangeText={setInput}
placeholder="質問を入力..."
style={{ borderWidth: 1, borderRadius: 8, padding: 12, marginBottom: 8 }}
/>
<Button
title={loading ? "生成中..." : "送信"}
onPress={handleSend}
disabled={loading}
/>
</View>
);
}
// 期待する出力: テキスト入力→AIレスポンス表示が動作するシンプルなチャット画面ストリーミング応答でUXを向上させる
長い文章の生成では、完了を待つより**ストリーミング(逐次表示)**のほうがユーザー体験が格段に向上します。Gemini 2.5 FlashはSSE(Server-Sent Events)形式でのストリーミングに対応しています。
// ストリーミングを使った実装例
async function generateWithStreaming(prompt: string, onChunk: (text: string) => void) {
const model = getFlashModel();
// generateContentStream を使うとトークンを逐次受け取れる
const stream = await model.generateContentStream(prompt);
for await (const chunk of stream.stream) {
const chunkText = chunk.text();
if (chunkText) {
onChunk(chunkText); // 受け取ったテキストをコールバックで渡す
}
}
}
// 使い方
await generateWithStreaming("React Nativeのパフォーマンス最適化のコツを教えて", (chunk) => {
setResponse((prev) => prev + chunk); // 逐次 state を更新
});
// 期待する出力: テキストが1文字ずつではなく段落単位で流れるように表示されるこの実装にするだけで、ユーザーが「AIが考えている」のをリアルタイムで見られるようになり、離脱率が下がります。
Thinking モードで複雑な問題を解く
「数学の計算」「多段推論が必要なQ&A」「コードのデバッグ提案」など、精度が求められる場面ではThinkingモードを有効にします。
// Thinkingモードを有効にした実装例
async function generateWithThinking(prompt: string): Promise<string> {
// thinkingBudget: 使用するThinkingトークンの上限
// 1024 = 軽めの推論, 8192 = 深い推論(応答時間増加・コスト増)
const model = getFlashModel(2048);
const result = await model.generateContent({
contents: [{ role: "user", parts: [{ text: prompt }] }],
});
return result.response.text();
}
// 使い方(コードレビュー・バグ解析などに適している)
const analysis = await generateWithThinking(
"このReact Nativeコンポーネントのパフォーマンス問題を分析して改善案を提案してください:\n\n" +
"..." // ユーザーのコードを挿入
);
// 期待する出力: 単純な回答より詳細で構造化された分析結果が返るマルチモーダル機能:画像をAIで解析する
Gemini 2.5 Flashは画像入力にも対応しています。例えば、カメラで撮影した食品の栄養情報を解析するアプリや、レシートをスキャンして自動仕訳するアプリに活用できます。
// 画像解析の実装例
import * as ImagePicker from "expo-image-picker";
import * as FileSystem from "expo-file-system";
async function analyzeImage(imageUri: string, prompt: string): Promise<string> {
const model = getFlashModel();
// 画像をBase64に変換
const base64 = await FileSystem.readAsStringAsync(imageUri, {
encoding: FileSystem.EncodingType.Base64,
});
const result = await model.generateContent([
{
inlineData: {
mimeType: "image/jpeg",
data: base64,
},
},
{ text: prompt },
]);
return result.response.text();
}
// 使い方
const result = await analyzeImage(
photoUri,
"この画像の食品の推定カロリーと主要栄養素を教えてください"
);
// 期待する出力: 「このメニューには約500kcal含まれており、タンパク質30g...」のような回答コスト最適化のベストプラクティス
Gemini 2.5 Flashは安価ですが、トークン消費を最小化することでさらにコストを抑えられます。
システムプロンプトの最適化:繰り返し使うシステムプロンプトは短く簡潔に書く。毎回100トークン節約できれば、1万リクエストで100万トークン削減できます。
Thinking の使い分け:シンプルな質問応答にはThinking不要(thinkingBudget: 0)、複雑な推論には有効化する条件分岐を入れます。
キャッシュの活用:同じプロンプトへの繰り返しリクエストはクライアント側でキャッシュします。AsyncStorageやMMKVに短期キャッシュを保持するだけで、重複APIコールを60〜80%削減できるケースもあります。
プロンプトエンジニアリングの詳細については Rork AIプロンプトエンジニアリング完全マスターガイド でも丁寧に解説していますので、あわせてご参照ください。
全体を振り返って
Gemini 2.5 FlashはRork Maxアプリへの組み込みに非常に適したモデルです。その理由を改めて整理します。
- 高速:ほとんどのモバイルユースケースで1〜3秒以内に初回レスポンスが返る
- 安価:Proモデルと比べてトークン単価が大幅に低く、コストコントロールがしやすい
- Thinkingで精度補完:必要な場面だけThinkingを有効にする柔軟な設計ができる
- マルチモーダル:テキスト・画像・音声の入力に対応し、アプリの機能幅が広がる
まず lib/gemini.ts を作成して基本的なテキスト生成を動かし、その後ストリーミング→マルチモーダルと段階的に機能を拡張していくアプローチをお勧めします。
Gemini APIのさらに深い活用方法については、Rork × Gemini 2.5 Pro 完全実装ガイド でProモデルを使った長文コンテキスト処理を解説しています。AI機能を活かしたアプリ開発に取り組む方の参考になれば幸いです。