Skip to content
sho10case
Go back

【開発記 第2回】Android × Firebase × Gemini API で作る!AIアレルギー判定アプリの技術選定とシステム構成

一人でAIアプリをリリースするために。開発スピードと安全性を両立させた技術スタック

graph TD
    subgraph "Client (Android App)"
        A[Jetpack Compose UI] --> B[CameraX / OCR]
        B --> C[Cloud Functions Call]
    end

    subgraph "Server (Google Cloud Platform)"
        C --> D[Cloud Functions / Go]
        D --> E[APP_INTERNAL_SECRET Check]
        E --> F[Gemini API / AI Analysis]
        D --> G[(Cloud Firestore)]
    end

    subgraph "External AI"
        F --> H[Generative AI: Gemini 2.5 Flash]
    end

    G -.->|Cache Result| D
    H -.->|Analysis Data| D
    D -->|Safe / Caution / Danger| A

1. セキュリティ:APIキーをアプリに持たせない

    secret := os.Getenv("APP_INTERNAL_SECRET")
    if r.Header.Get("X-App-Internal-Secret") != secret {
        http.Error(w, "Unauthorized", http.StatusUnauthorized)
        return
    }

2. 高速化:Firestoreによるキャッシュ戦略

3. 最新技術:Gemini 2.5 Flashの採用

「Glu-Suppo」を開発するにあたり、重視したのは**「スピード感」「ユーザーの安心感」**の両立です。その結果、以下の技術スタックに辿り着きました。

技術選定の理由:なぜこのスタックなのか?

1. Kotlin & Jetpack Compose:宣言的UIが生む直感的な操作性

現代のAndroid開発において、Jetpack Composeを選択しない手はありません。

2. Firebase:個人開発の強力なバックボーン

インフラの管理に時間をかけたくなかったため、Firebase(Google Cloud)をフル活用しました。

3. Go言語:高速なサーバレス関数

サーバーレス環境でのコールドスタート(起動速度)を最小限に抑え、店頭でのレスポンスを1秒でも速くするため、バックエンドには私の得意な Go言語 を採用しました。


バックエンドの心臓部:Cloud Functions と Gemini API の連携

Glu-Suppoの「知能」は、どのように動いているのか。その連携フローを詳しく解説します。

セキュアな連携フロー

アプリから直接Gemini APIを叩くのではなく、以下のステップで連携を行っています。

  1. リクエストの検証: AndroidアプリからCloud Functionsへリクエストを送る際、独自ヘッダーに「秘密の合言葉(APP_INTERNAL_SECRET)」を含めます。サーバー側でこれを検証することで、不正な呼び出しをシャットアウトします。
  2. プロンプトエンジニアリング: Cloud Functions(Node.js)内で、原材料テキストをGeminiに渡す前に「判定ルール」を定義したプロンプトを付与します。「専門家として、科学的根拠に基づいて3段階で評価せよ」といった指示をサーバー側で制御することで、判定の精度と安定性を保っています。
  3. ストリーミング解析: Gemini 2.5 Flashの高速な推論結果をサーバー側で受け取り、JSON形式に整形してアプリへ返却します。

なぜGemini 2.5 Flashなのか?

このアプリにとって、スーパーの店頭での「待ち時間」は最大の敵です。 Gemini 2.5 Pro ほどの多機能さは必要なく、**「テキスト解析に特化した爆速のレスポンス」「圧倒的な低コスト」**を誇るFlashモデルこそが、Glu-Suppoに最適な選択でした。

まとめ

「技術は、安心を支えるための裏方であるべき。」

今回ご紹介した「Android × Firebase × Gemini API」という構成は、個人開発としては少し贅沢に感じるかもしれません。しかし、ユーザーがスーパーの店頭でこのアプリを開いたとき、一瞬の迷いもなく「これは安全だ」と確信できる体験を作るためには、この強固で高速なインフラが必要不可欠でした。

複雑なセキュリティ対策も、Firestoreによるキャッシュ戦略も、すべては「買い物をもっと自由に、もっと楽しく」という目的のために存在しています。

さて、システムという「器」は整いました。しかし、このアプリの本当の心臓部は、その器の中で動く**「AIが、いかにして原材料名を正しく読み解き、安全性を判断しているか」**というロジックにあります。

次回、第3回では、私が最も試行錯誤を繰り返した**「AIプロンプト編」**をお届けします。 「蛋白加水分解物」や「醸造調味料」といった曖昧な表記に対して、Geminiにどのような指示(プロンプト)を与え、判定精度を極限まで高めていったのか。

その「AIへの教育」の裏側を詳しく解説します。どうぞお楽しみに!

次回の記事:【開発記 第3回】AIを「専門家」にする魔法。アレルギー判定精度を極限まで高めたプロンプトエンジニアリング


Share this post on:

Previous Post
【開発記 第1回】生成AIでグルテンフリーを身近にする。アレルギー判定アプリ「Glu-Suppo」ができるまで
Next Post
【開発記 第3回】AIを「専門家」にする魔法。アレルギー判定精度を極限まで高めたプロンプトエンジニアリング