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

AI that Actually DOES stuff! (Function calling tutorial)

再生時間

11分

Firebase AI Logic SDKとFunction CallingでAIアプリを強化!iOSでの実装ガイド

ポイント

  • この記事は、Firebase AI Logic SDKとFunction Callingを用いてiOSアプリにAI連携機能を強化したい開発者向けの実装ガイドです。
  • 生成AIモデルが直接実行できないデバイス上のローカル機能(タイマーなど)を、AIに実行させる方法を解説します。
  • 関数の実装から登録、モデルからの呼び出し要求の処理、結果の返却まで、具体的な5ステップを実装例と共に学べます。

皆様、こんにちは。Firebaseチームでデベロッパーリレーションズエンジニアを務めているピーターです。本日はFunction Calling(関数呼び出し)について詳しく掘り下げていきます。Function Callingが何であるかを説明した後、Firebase AI Logic SDKを使用して、iOS上でAI搭載アプリにFunction Callingをどのように組み込むかを見ていきましょう。私と私のチームは、「Friendly Meals」というAIを活用した食事計画アプリを開発しています。このアプリでは、ユーザーがアプリと会話形式でやり取りし、入力に基づいてレシピの推薦を求めることができます。会話型のUIを使用することは、ユーザーにより多くの制御を与える素晴らしい方法です。たとえば、ユーザーはアプリに「より短い時間でできるレシピ」を求めることができます。時間のない私たち全員にとって、これは非常に役立ちます。アプリが魅力的なレシピを提案した後、ユーザーは実際にそのレシピを試したくなるかもしれません。チャットインターフェースの会話型という性質のおかげで、アプリはユーザーがレシピを準備する手順をガイドすることができます。これは非常に素晴らしい機能です。しかし、多くのレシピでは料理をする人が時間を計る必要があります。そこで私たちは、「もしAIがユーザーのために時間を追跡できたらクールではないか?」と考えました。それは素晴らしいアイデアに聞こえますが、一つ小さな問題がありました。ご存知の通り、生成モデルは多くの種類の問題を解決するのに優れていますが、いくつかの制限があります。例えば、トレーニング後に「凍結」されるため、データが古くなることがあります。また、私たちのケースにおける本当の問題は、生成モデルがデータをクエリしたり変更したりできないことです。つまり、ユーザーのために時間を追跡するには、モデルがユーザーのデバイス上でローカルAPIを呼び出してタイマーを開始できる必要があります。幸いなことに、この問題には解決策があります。それがFunction Callingです。

Function Callingとは何か?

Function Callingは「ツール利用(Tool Use)」と呼ばれることもあります。これは、モデルが最終的な応答を生成するために、APIやローカル関数などの外部ツールを使用できるようにする機能だからです。Function Callingの仕組みは次のとおりです。モデルにリクエストを送信する際、モデルが最終的な応答を生成するために使用できる関数などのツールセットも提供できます。モデルがこれらのツールを使用できるようにするには、モデルとアプリが互いに情報をやり取りする必要があります。そのため、Function Callingの実装にはチャットAPIを使用することが推奨されています。

Firebase AI Logic SDKでFunction Callingを実装する5つのステップ

食事計画アプリにタイマー機能を実装する方法を見ていきましょう。Firebase AI LogicでFunction Callingを実装するには、次の手順に従う必要があります。

  1. 関数の実装: まず、関数を実装する必要があります。私たちのケースでは、これはローカルタイマーを開始する関数です。
  2. 関数宣言の作成: 次に、モデルがその関数が何ができるかを理解するのに役立つ関数宣言を作成する必要があります。
  3. モデルへの関数登録: 第三に、その関数が存在することをモデルに伝えます。
  4. モデルからの関数呼び出し要求: 第四に、モデルがユーザーのリクエストに答えるためにその関数を使用する必要があると判断した場合、アプリにその関数を呼び出すように要求します。
  5. 関数の結果をモデルに返す: そして第五に、関数の結果をモデルに返し、モデルが応答を生成できるようにします。

タイマー機能の実装例

1. startTimer関数の実装

まず、タイマーを開始する関数を作成しましょう。これは、ユーザーがボタンをタップしたときなど、アプリの他の部分から呼び出す可能性のある任意の関数で構いません。startTimer関数は1つのパラメーターを受け取ります。これにより、タイマーを起動する分数 (minutes) を渡すことができます。この関数は、時間をカウントダウンするタイマーをスケジュールします。このクロージャーは各時間間隔で呼び出されるため、タイマーが終了したかどうかを確認し、サウンドを再生することができます。例えば、残りの時間をプロパティに保持しておくことで、モデルがタイマーがどれくらいの時間実行されているかを知るのを助ける別の関数を使って後で読み取ることができます。

2. 関数宣言の作成とモデルへの登録

startTimer関数をモデルに認識させるには、モデルに登録する必要があります。しかしその前に、関数宣言を使用してモデルにその関数を記述する必要があります。関数宣言は、関数の名前、その機能の説明、および関数が期待するパラメーターのリストで構成されます。モデルが提供された関数を使用できるかどうか、どのように使用できるかを理解するのに役立つ、良い名前を使用し、意味のある説明を提供することが重要です。toolsパラメーターを使用して、startTimer関数をツールとして登録できるようになります。モデルを設定する際に、1つまたは複数のツールを登録できます。

Function Callingのベストプラクティス

最良の結果を得るために、Function Callingのベストプラクティスに従うようにしてください。

  • 説明は極めて明確かつ具体的であること: モデルはあなたの説明に基づいて正しい関数を選択し、適切な引数を提供します。
  • 説明的な関数名を使用する: スペース、ピリオド、ダッシュは使用しないでください。
  • パラメーターには特定の型を使用する: これによりエラーを減らすことができます。
  • 関連性の高いツールのみを選択する: モデルは任意の数のツールを使用できますが、あまりにも多くのツールを提供すると、間違ったツールや最適ではないツールを選択するリスクが高まります。アクティブなツールセットを最大10〜20に保つことをお勧めします。
  • プロンプトにコンテキストを提供する: 例えば、「あなたは時間を管理する、親切なキッチンシェフです」といった指示を与えることで、モデルの動作を誘導できます。
  • 温度(temperature)を低く設定する: 関数呼び出しをより決定論的で信頼性の高いものにするために、温度を低く設定します。温度0がうまく機能します。
  • 重要な注意点: 注文をするなど、関数呼び出しに重大な結果が伴う場合は、実行する前にユーザーにその呼び出しを確認するよう求めるべきです。より多くのベストプラクティスについては、公式ドキュメントのFunction Callingのベストプラクティスをご確認ください。

3. モデルからの関数呼び出しリクエストの処理

モデルが、提供された関数を呼び出すことがユーザーへのより良い応答を提供すると判断した場合、あなたのアプリはその関数を呼び出し、結果をモデルに返す必要があります。私たちのケースでは、ユーザーが「3分タイマーを開始してください」と言うかもしれません。モデルからのツール呼び出しリクエストを処理するには、応答オブジェクトのfunctionCallsプロパティを確認します。これには、モデルがユーザーに最良の応答を提供するために行いたい関数呼び出しのリストが含まれています。まず、呼び出しの名前が登録した関数の名前と一致するかどうかを確認します。次に、呼び出しから引数を抽出し、ローカルのデータ型に変換します。これで関数を呼び出す準備ができました。関数呼び出しが戻り値を返したら、結果の値をモデルに渡します。これを行うには、関数呼び出しと同じ名前を持つFunctionResponsePartを作成します。私たちのケースでは、タイマーの開始は戻り値を生成しないため、空の辞書を返します。すべての関数呼び出しに対してこのプロセスを繰り返し、すべての関数応答をFunctionResponsePartの配列に収集します。最後に、chat.sendMessageを呼び出し、functionRoleを使用して関数応答を渡します。これは、あなたのアプリがモデルとユーザー間の会話における第三のパートナーであると考えることができます。モデルの応答を待ち、それに応じて表示します。試してみましょう。アプリにポーチドエッグの準備方法を尋ねます。卵黄の半熟具合に応じて、3分または4分のタイマーを設定する必要があります。私は半熟のポーチドエッグが好きなので、3分タイマーをリクエストします。すると、タイマーが3分間動作していることが確認できます。

残りの時間を確認する機能の追加

ユーザーがAIに残り時間を尋ねられるように、残りの時間を返す別の関数を追加しましょう。以前と同じように、まず関数自体を実装します。これは残り時間を秒単位で返します。次に、名前と説明を提供する関数宣言を定義します。この関数はパラメーターを受け付けないため、空の辞書を提供します。モデルの初期化中にこの関数を登録することを忘れないでください。また、関数呼び出し自体を処理する必要があります。モデルがgetRemainingTime関数の呼び出しを要求した場合、結果をJSONオブジェクトとして返す必要があります。タイマーが実行中の場合は、残り時間を秒単位でdouble型として返します。タイマーが実行中でない場合は、そのことをモデルに示すステータスメッセージを返します。最後に、この関数呼び出し応答をfunctionResponsesオブジェクトに追加します。アプリを再度実行すると、「タイマーは動いていますか?」と尋ねることができ、応答は当然「いいえ」となるはずです。タイマーを開始した後、もう一度尋ねると、アプリは残り時間を秒単位で教えてくれます。

まとめ

本記事では、Firebase AI Logic SDKとFunction Callingを活用することで、AIモデルが外部ツールやローカル機能と連携し、より高度でインタラクティブなAIアプリケーションを構築できることをご紹介しました。生成モデルの限界を補完し、リアルタイムな情報取得やデバイス操作を可能にするFunction Callingは、ユーザーエクスペリエンスを大きく向上させる強力な機能です。iOSアプリへの実装は、明確なステップとベストプラクティスに従うことで、効率的に進めることができます。ぜひ皆さんのAIアプリにもFunction Callingを組み込んでみてください。

参考動画

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