>_tech-draft
Firebaseのアイコン
Firebase
動画公開日
タイトル

Generating structured output (JSON) using the Gemini API (iOS)

再生時間

6分 6秒

Geminiの構造化出力(JSON Mode)で信頼性の高いデータ連携を実現

ポイント

  • この記事は、Geminiを用いたアプリケーション開発において、信頼性の高いデータ連携を実現したい開発者向けです。
  • Geminiの構造化出力(JSON Mode)により、事前に定義したスキーマに沿ったJSON形式のレスポンスを確実に生成できます。
  • これにより、LLMからのデータ解析ロジックが簡素化され、ハルシネーションのリスクを低減し、堅牢なデータ統合が可能になります。

Geminiの構造化出力(JSON Mode)で信頼性の高いデータ連携を実現

はじめに

大規模言語モデル(LLM)であるGeminiの最も強力な機能の一つに、マルチモーダル分析があります。これは、画像をはじめとする様々なメディアを理解する能力を指します。最近、ユーザーが食事の写真を撮るだけで栄養価を取得できるデモを構築しました。これは非常に印象的な機能ですが、この機能をプロダクションレディにするには、単に巧妙なプロンプトを作成するだけでは不十分です。信頼できるデータが必要となります。

この記事では、FirebaseチームのDeveloper Relations EngineerであるPeterが、Geminiの「構造化出力」(JSON Modeとも呼ばれます)について詳しく解説します。この機能を使うことで、Geminiがアプリケーションの内部データ構造に直接マッピングされるレスポンスを生成するように強制する方法を学ぶことができます。これにより、複雑なパースロジックや脆いエラーハンドリングの記述が不要になります。

構造化出力が必要な理由と従来の課題

私のアプリケーションでは、食事に関するテキストの羅列は望んでいません。検出された食品の名前、総カロリー、そしてタンパク質、炭水化物、脂質といったマクロ栄養素の内訳が、一目で確認できるような画面に表示したいと考えていました。

この要件を満たすために、Swiftで NutritionInfo という構造体を定義しました。この構造体は Codable プロトコルに準拠しており、画面に表示したい全てのプロパティを持っています。しかし、歴史的に、LLMにこのような情報を確実に埋め込ませることは非常に困難でした。

これまでは、「JSONのみを生成してください」といったプロンプトを使用し、それ以外の余計なマークダウン書式設定や、「JSONはこちらです」といったような付加的なテキストが追加されないことを期待するしかありませんでした。しかし、GeminiとFirebase AI Logicにおける構造化出力の登場により、この問題は過去のものとなりました。

Geminiにスキーマを指示する方法

私たちはSwiftの構造体を持っていますが、GeminiはSwiftの型を直接認識しません。そのため、Geminiにガイダンスを提供する必要があります。このガイダンスは「スキーマオブジェクト」を定義することで行います。スキーマオブジェクトは、Geminiが使用すべきキーとデータ型を正確に指示する設計図(ブループリント)として機能します。

例えば、料理の名前が文字列(string)であり、炭水化物、脂質、エネルギーの各属性がすべて整数(integer)であることを指定できます。さらに、個々のプロパティの意味について詳細な情報を提供することも可能です。例えば、マクロ栄養素がグラム(grams)で表現されるように指示することができます。

スキーマとMIMEタイプの指定

この定義したスキーマを、モデルの generationConfig (生成設定)に application/json というMIMEタイプと共に渡します。この設定はモデルに対し、「会話形式のテキストも、マークダウンも与えないでください。このスキーマに完全に合致するJSONのみを返してください」と明確に指示します。もし mimeType を提供し忘れた場合、モデルはレスポンスをプレーンテキストで返してしまうため注意が必要です。

generationConfig が設定されれば、通常通りモデルを構成し、generateContent メソッドを呼び出すことができます。

レスポンスの処理

構造化出力の最大の利点は、出力がスキーマに準拠した有効なJSONであることが保証される点です。そのため、モデルからのレスポンスをSwiftの JSONDecoder を使用してそのままデコードすることができます。これにより、画像を分析し、そのレスポンスでSwift構造体を簡単にデータとして埋めることが可能になります。

デモンストレーション

スタジオに温かい食べ物を持ち込むことはできなかったため、ザクロの写真を使ったデモをお見せします。

アプリで栄養スキャナーを起動し、写真を撮ります。しばらくすると、モデルが分析結果を返します。結果を見てみましょう。モデルは料理を「ザクロ」として正確に検出し、マクロ栄養素とカロリーが表示されました。私の低炭水化物ダイエットの目標を壊すことなく、もう一皿食べられたかもしれませんね。

まとめと応用例

構造化出力を使用することで、私たちは創造的で確率的なAIモデルを、信頼性の高い型付きデータソースへと効果的に変換することができました。これにより、複雑な正規表現やパースロジックの必要性がなくなり、ハルシネーション(AIが事実に基づかない情報を生成すること)のリスクを排除し、コードを大幅にクリーンにすることが可能です。

この例では栄養アプリを使用しましたが、この技術は他のユースケースにも応用できます。例えば、請求書や名刺からのデータ抽出など、Geminiをアプリケーションのデータモデル(Swiftに限らず、Firebase AI Logicがサポートする他の言語でも)とより密接に連携させる必要があるあらゆるシナリオで活用できるでしょう。

サンプルアプリケーションのソースコードはGitHubにアップロードされており、ドキュメントへのリンクと共に概要欄にあります。Firebase AI Logicの詳細については、Firebase AI Logicプレイリストの他の動画をご覧ください。そして、YouTubeのFirebaseチャンネルを購読するのをお忘れなく。

参考動画

https://www.youtube.com/watch?v=pLOrQuReDeQ