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

Implementing chat with Firebase AI Logic on iOS

再生時間

13分 15秒

Firebase AI Logicで実現!会話型AIチャットのコンテキスト管理と実装ガイド

ポイント

  • 本記事は、Firebase AI Logicを活用し、ステートレスなLLMの課題を解決して会話のコンテキストを維持するAIチャットの実装方法を解説します。
  • ChatクラスのsendMessage APIが会話履歴の自動管理を担い、システムインストラクションによる個性設定やマルチモーダル入力も容易に実現します。
  • 開発者は、少ないコードでユーザーフレンドリーな会話型AI機能をアプリに統合し、パーソナライズされた体験を構築するための実践的な方法を学べます。

こんにちは、Peterです。FirebaseチームのDeveloper Relations Engineerを務めています。本記事では、Firebase AI Logicを活用して、AIを搭載した会話型チャット機能をアプリに実装する方法をご紹介します。

導入:会話型AIでユーザー体験を革新する

私のチームでは、ユーザーの好みに基づいてレシピを提案する食事計画アプリ「Friendly Meals」の開発に取り組んでいます。現在のアプリでは、ユーザーが入力した食材やその他の要件に基づいてレシピを生成できます。例えば、今日の私のキッチンで見つけた食材リストから生成されたレシピがこちらです。

現在のFriendly Mealsアプリは十分に機能していますが、会話型AI機能を導入することで、ユーザー体験をさらに向上できると認識しました。

想像してみてください。単に食事の提案を受け取るだけでなく、まるで友人やプロのシェフと話すように、パーソナルな食事プランナーと直接チャットできるのです。これは単なる利便性にとどまりません。動的なパーソナライゼーションを可能にします。もはや提案を受け取るだけでなく、リアルタイムで提案を積極的に形作っていくことができるようになります。

例えば、食事プランナーがポモドーロのレシピを提案しても、もしナスを食べたい気分でなければ、「代わりにズッキーニを使えますか?」と尋ねることができます。AIはあなたのリクエストを理解し、その好みに合わせてレシピを調整します。このようなターンバイターンの会話の流れは、有機的で反復的なプロセスを可能にし、アプリの応答に対してあなたが反応し、それに対してアプリが反応することで、真にパーソナライズされた結果が生まれます。

会話型AIチャットの核心:LLMのステートレス性とその課題

この会話型食事プランナーを実装する前に、極めて重要な技術的詳細を理解しておく必要があります。これは、こうしたシステムがどのように機能するかという基礎となる部分です。

大規模言語モデル(LLM)は本質的にステートレスです。これは何を意味するのでしょうか?彼らはあなたが伝えたことを一切覚えていないということです。たとえ10秒前のメッセージであっても、ましてや5分前のメッセージなど記憶していません。

もしAIが1分前にポモドーロについて話していたことを覚えていなければ、「代わりにズッキーニを使えますか?」と言っても、全くコンテキストがありません。おそらく、ポモドーロとは全く関係のないズッキーニについての回答を返すでしょう。これはかなりフラストレーションのたまる会話になるはずです。

「でも、待って。それなら他のAIチャットボットはどうやって動いているの?」と思われるかもしれません。私は彼らと会話できますし、彼らは私の言ったことを完璧に覚えています。その秘密はこれです。モデルが以前に何が議論されたかを知るために、開発者であるあなたが、すべてのリクエストと一緒に会話の全履歴を送信する必要があるのです。

そうです。これは、あなたが言ったこと、モデルが返したすべての応答、そしてそれに対するあなたの発言など、すべてを意味します。これらすべてを、すべてのリクエストと一緒にモデルに送信する必要があります。これは、AIにこれまでのチャットの完全なトランスクリプト(文字起こし)を渡すようなものです。

「これは大変な作業に聞こえる!」と思われるかもしれませんが、ご安心ください。Firebase AI Logicがその解決策を提供します。Firebase AI Logicは、チャットの会話を自動的に追跡してくれるため、手動でこの作業を行う必要はありません。

Firebase AI Logicが提供する解決策:ChatクラスとsendMessage API

Firebase AI Logicは、モデルと対話するための主要なAPIを2つ提供しています。generateContentsendMessageです。

generateContent:ステートレスな対話

generateContentメソッドはGenerativeModelクラスの一部であり、モデルとステートレスな方法で通信することを可能にします。私は以前の動画で、Friendly Mealsアプリの最初の画面を実装する際にこのメソッドを使用した方法を詳しく説明しています。しかし、前述の通り、これは会話のコンテキストを保持しません。コミュニケーションパートナーが注意を払っていないように見えるとき、本当にイライラしませんか?

sendMessage:コンテキストを維持する会話

ここでsendMessageが登場します。これはChatクラスのメンバーです。ChatクラスはFirebase AI Logic SDKの一部であり、インメモリバッファを使用して会話履歴を自動的に管理します。ユーザーのメッセージとモデルの応答の両方を保存することで、ユーザーは以前のモデルの出力や会話で以前に言ったことに言及できるようになります。

Chat APIの利用準備

Chat APIを使用するには、まず使用したいモデルのインスタンスを取得します。ここでは、日常的なタスクで高速なパフォーマンスを発揮する素晴らしいモデルであるGemini 2.5 Flashを使用します。デフォルトでは、Firebase AI LogicはGemini Developer APIを介してモデルと通信します。また、追加機能をサポートするVertex AI Gemini APIを使用することも可能です。これら2つのAPIプロバイダーの違いについては、ドキュメントをご確認ください。

システムインストラクションによるパーソナリティ設定

チャット機能は、アプリに個性を加える素晴らしい方法でもあります。あなたのブランドペルソナが「親切」であるとします。しかし、もしかしたらユーザーは「生意気な有名シェフ」のような個性を評価してくれるかもしれません。システムインストラクションを使用すると、わずか数行のコードでチャットのパーソナリティを変更できます。モデルに個性を与えることは必須ではありませんが、システムインストラクションを提供することはモデルにガイダンスを与えるのに役立ちます。

新しいチャットの開始とメッセージ送信

モデルのセットアップが完了したら、新しいチャットを開始できます。各チャットインスタンスは、独自の会話履歴をメモリ内に保持します。既存のチャット履歴を提供することも可能です。これは、会話を継続したり、データベースなどの永続的な場所に保存された過去の会話でチャットを事前入力したりする場合に役立ちます。

すべての準備が整ったので、ユーザーのメッセージをモデルに送信できるようになります。チャットインスタンスが会話履歴を管理するため、ユーザーは以前に何が言われたかを振り返ることができます。

Friendly MealsアプリケーションにChat APIを統合した方法を以下に示します。これは、UIがSwiftUIを使用して画面にレンダリングするローカルメッセージリストを維持するView Modelの一部です。ここで注目すべきは、messagesプロパティがUIに表示したいすべてのチャットメッセージのリストを保持していることです。これはチャットオブジェクトのメッセージ履歴とはわずかに異なるデータモデルを持っており、アプリのユーザーインターフェースでメッセージをどのように表示するかをより細かく制御できます。

ユーザーが新しいメッセージを送信すると、まずそれをチャットUIに追加し、次にモデルに送信します。その後、モデルからの応答を待ちます。これは非同期操作であるため、Swiftのawaitキーワードを使用します。これにより、現在の関数が一時停止され、メインスレッドが他の作業を行うために解放され、アプリがフリーズしないようにします。モデルからの応答を受け取ると、それをチャットUIに追加します。

また、予期せぬ事態が発生することもあるため、エラーハンドリングも組み込んでいます。何か予期せぬことが起こった場合でも、ユーザーが状況を知らずに待たされることがないよう、エラーメッセージを表示するようにしています。

このように、Firebase AI Logic SDKを使用すれば、数行のコードでAIを搭載した会話型ユーザーインタラクションをアプリに作成できます。

会話におけるマルチモーダル入力の活用

次に、ユーザーが会話に視覚情報を取り入れる方法について見ていきましょう。例えば、冷蔵庫の中の写真を撮り、モデルがその食材だけを使っておいしいレシピを提案するといったことが可能です。

generateContent APIとsendMessage APIの両方がマルチモーダル入力をサポートしています。これは、コンテンツを生成したり、モデルとチャットしたりする際に、画像やその他のファイルをシームレスに送信できることを意味します。画像を送信するには、sendMessage APIの最初のパラメータとして画像を渡すだけです。

テキストメッセージと同様に、チャットAPIは、チャットオブジェクトがアクティブである限り、これらの画像への参照を履歴に自動的に保持します。Firebase AI Logicは、PNG、JPEG、WEBP画像をサポートしています。

マルチモーダル入力の注意点

注意点として、ファイルをインラインデータとして送信する場合、転送中にBase64エンコードされるため、リクエストサイズが増加します。リクエストが大きくなりすぎると、HTTP 413エラーが発生する可能性があります。この場合、送信前に画像をリサイズするか、ユーザーに小さい画像を提供するよう依頼する必要があります。

モデルからの応答がUIに表示されるまでに少し待つ必要があることに気づいたかもしれません。これは、sendMessage APIがモデルから完全な応答を受け取るまで待機するためです。

まとめ

本記事では、Firebase AI Logic SDKを活用して、アプリにAI駆動の会話型チャット機能を実装する方法を解説しました。特に、大規模言語モデルのステートレス性という課題に対し、Firebase AI LogicのChatクラスとsendMessage APIが会話履歴を自動的に管理し、開発者の負担を軽減する仕組みを詳しくご紹介しました。

また、システムインストラクションによるAIのパーソナリティ設定や、画像などのマルチモーダル入力を活用して、より豊かでパーソナライズされたユーザー体験を提供できることも示しました。これにより、ユーザーは単なる情報提供ではなく、まるで人間と対話しているかのような、動的でインタラクティブなコミュニケーションをアプリ内で楽しめるようになります。

Firebase AI Logicを導入することで、開発者はコンテキスト管理といった複雑な部分に煩わされることなく、ユーザーにとって本当に価値のある会話型AI体験の構築に集中できるでしょう。

参考動画

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