2024年1月9日火曜日

Google GeminiのCount TokensとEmbed Contentを呼び出す

Google Geminiを呼び出すアプリケーションにトークン数のカウントとベクトル埋め込み(embeddings)の生成を行うページを追加しました。

以下のように動作します。


文章またはファイルのデータを送信して、トークン数またはベクトル埋め込みをレスポンスとして受け取ります。

ボタンCOUNT_TOKENSのクリックで、ページ・アイテムP7_TEXTの文章をリクエストに含め、Google GeminiのcountTokens APIを呼び出して返されたトークン数が、P7_TOTAL_TOKENSに設定されます。

ボタンEMBED_CONTENTのクリックで、ページ・アイテムP7_TEXTの文章をリクエストに含め、Google GeminiのembedContent APIを呼び出して返されたベクトル埋め込みP7_VALUESに、返されたベクトル埋め込みの次元数がP7_DIMENSIONSに設定されます。

ボタンCOUNT_TOKENS_INLINE_DATAのクリックで、ページ・アイテムP7_FILEの画像ファイルをリクエストに含め、Google GeminiのcountTokens APIを呼び出して返されたトークン数が、P7_TOTAL_TOKENS_Vに設定されます。

Google Geminiのベクトル埋め込みを生成するためのモデルmodels/embedding-001の入力はテキストのみです。画像からベクトル埋め込みを生成できるモデルは、以下のGeminiモデルの一覧には見当たりませんでした。


(この記事の執筆時点では、ページのタイトルが双子座モデルとなっています。)


ボタンCOUNT_TOKENSのクリックで呼び出されるプロセスとして、Count Tokensを作成しています。パッケージUTL_GOOGLE_GEMINI_APIのファンクションCOUNT_TOKENSを呼び出しています。

ファンクションの結果にページ・アイテムP7_TOTAL_TOKENS、パラメータp_textP7_TEXTを割り当てています。


ボタンEMBED_CONTENTのクリックで呼び出されるプロセスとして、Embed Contentを作成しています。パッケージUTL_GOOGLE_GEMINI_APIのファンクションEMBED_CONTENTを呼び出しています。

ファンクションの結果にページ・アイテムP7_DIMENSIONS、パラメータp_textP7_TEXTp_valuesP7_VALUESを割り当てています。


ボタンCOUNT_TOKENS_INLINE_DATAのクリックで呼び出されるプロセスとして、Count Tokens Inline Dataを作成しています。タイプとしてコードを実行を選択し、ソースPL/SQLコードとして、以下を記述しています。



ページの作りは以上になります。

トークン数のカウントやベクトル埋め込みの生成を試してみます。

以下の文章のトークン数をカウントしてみます。夏目漱石の吾輩は猫であるの出だしです。
吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。

文字数は126文字です。トークン数は70でした。


Gemini Proの入力トークンの上限は30720なので、それを超えないように確認するために使用できます。


ベクトル埋め込みの生成については、よく資料を確認しておく必要がありました。長い文章からベクトル埋め込みを生成しようとすると、エラーが発生します。

エラー・メッセージを確認すると、embedContentの呼び出しでは、リクエストのペイロードのサイズが10000バイトに制限されているとのことです。


モデルの説明を読むと「最大 2,048 トークンのテキスト用のエンベディングの作成用に最適化されています。」とのことです。それぞれのベクトル埋め込みの生成では、日本語だと文章の長さを3千文字前後(大体10000バイトになるはず)に抑える必要がありそうです。

画像については、トークン数をカウントすることができました。以下の画像でトークン数は258でした。



動画のトークン数をカウントしてみたら、以下のエラーが発生しました。エラー・メッセージを読むと「MIME type must be image/png, image/jpeg, image/webp, image/heic, or image/heif.」なので、列記されているMIMEタイプに動画は含まれていません。


きちんと確認していませんが、inlineDataやfileDataはmimetypeが画像または動画に限定されているため(こちらのリファレンスのmimeTypeに指定できる値が記載されています)、ベクトル埋め込みの生成にファイルを指定することはできませんでした。

これらの機能を追加したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/google-gemini3.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。