【Flutter】Gemini APIを触ってみた

2024/05/17に公開

はじめに

GoogleI /O 2024にてFlutterの様々な新規機能が紹介されました。
その中で、FlutterでGeminiを利用する方法が紹介されており、早速試してみました!

つくったもの

質問に対して答えてもらうという、かなりシンプルな形で試しました!

APIを利用するには

チュートリアルには下記のような注意書きがあります。直接APIを呼び出すのは、プロトタイピングに留めておく必要があるようです。

コード

テキストのみの入力からテキストを生成するを参考に実装しました。
また、Markdown形式で記述されていたため、Markdown表示用パッケージを使用しました。

https://pub.dev/packages/flutter_markdown

今回作成したコードはこちらになります。
よければご覧ください🙇

コード

ストリーミングで、部分的な結果を処理することもできるみたいです。(今度試してみよう)

// ...

final response = model.generateContentStream([
  Content.multi([prompt, ...imageParts])
]);
await for (final chunk in response) {
  print(chunk.text);
}

// ...

コンテンツ生成のレスポンスの形を制御するためのパラメータは以下のように設定します。
モデルと設定できるパラメータの詳細はこちらの公式ドキュメントを参照してください。

final generationConfig = GenerationConfig(
  stopSequences: ["red"],
  maxOutputTokens: 200,
  temperature: 0.9,
  topP: 0.1,
  topK: 16,
);
final model = GenerativeModel(
  model: 'MODEL_NAME',
  apiKey: apiKey,
  generationConfig: generationConfig,
);

パラメータの検証

簡単にですが、パラメータによって生成される内容にどのような違いが生じるか確認してみました。
僕は、パラメータについては詳しくないので、「真面目な文章」「フランクな文章」 を作るための設定をGeminiに聞いて設定しました。

真面目な文章

プロンプト

「MLBで活躍した日本人選手についてまとめてください。」

パラメータ

maxOutputTokens: 500
temperature: 0.5
topP: 0.2
topK: 15

生成内容

      **投手**
      
      * **野茂英雄** (ドジャース、ヤンキースなど): 1995年にMLBデビューし、トルネード投法で旋風を巻き起こした。1995年に新人王、サイ・ヤング賞を受賞。
      * **松坂大輔** (レッドソックス、メッツなど): 2007年にワールドシリーズ制覇に貢献。2008年にオールスターゲームMVPを受賞。
      * **ダルビッシュ有** (レンジャーズ、カブスなど): 2012年にサイ・ヤング賞2位。2017年にワールドシリーズ制覇。
      * **田中将大** (ヤンキース): 2014年に24勝を挙げ、ア・リーグ最多勝。2017年にワールドシリーズ制覇。
      * **大谷翔平** (エンゼルス): 2021年に投手と打者の両方でオールスターゲームに出場。2021年にア・リーグMVPを受賞。
      
      **野手**
      
      * **イチロー** (マリナーズ、ヤンキースなど): 2001年にア・リーグMVP、首位打者、盗塁王の三冠王を獲得。2016年に3,000安打を達成。
      * **松井秀喜** (ヤンキース): 2009年にワールドシリーズMVPを受賞。2010年に35本塁打、106打点を記録。
      * **青木宣親** (ブルワーズ、アストロズなど): 2013年にア・リーグ首位打者。2017年にワールドシリーズ制覇。
      * **筒香嘉智** (レイズ、パイレーツ): 2019年にナ・リーグ新人王。2020年に40本塁打を記録。
      * **鈴木誠也** (カブス): 2022年にナ・リーグ新人王。2022年に46本塁打を記録。
      
      **その他**
      
      * **上原浩治** (レンジャーズ、レッドソックスなど): 2013年にワールドシリーズ制覇。2013年にア・リーグ最優秀救援投手。
      * **川崎宗則** (マリナーズ、ブルージェイズなど): 守備の名手として知られ、「ムネリン」の愛称で親しまれた。
      * **田澤純一** (レッドソックス、マーリンズなど): 2013年にワールドシリーズ制覇。2013年にア・リーグ最優秀救援投手。

フランクな文章

プロンプト

「MLBで活躍した日本人選手についてまとめてください。」

パラメータ

maxOutputTokens: 500
temperature: 0.9
topP: 0.5
topK: 40

生成内容

      **野手**
      
      * **イチロー・スズキ** (シアトル・マリナーズ、ニューヨーク・ヤンキーズ、マイアミ・マーリンズ): 通算3,089安打、10個のゴールドグラブ賞、2001年ア・リーグMVP
      * **松井秀喜** (ニューヨーク・ヤンキーズ、ロサンゼルス・エンゼルス、タンパベイ・レイズ): 通算1,753安打、2009年ワールドシリーズMVP
      * **青木宣親** (ミルウォーキー・ブルワーズ、ヒューストン・アストロズ、トロント・ブルージェイズ): 通算1,302安打、2012年ア・リーグ盗塁王
      * **大谷翔平** (ロサンゼルス・エンゼルス): 通算1,015安打、1,120奪三振、2021年ア・リーグMVP
      * **筒香嘉智** (タンパベイ・レイズ、サンディエゴ・パドレス): 通算63本塁打、2019年ナ・リーグ新人王
      
      **投手**
      
      * **野茂英雄** (ロサンゼルス・ドジャース、ミルウォーキー・ブルワーズ、ニューヨーク・メッツ): 通算123勝、2,362奪三振、1995年ナ・リーグ新人王
      * **黒田博樹** (ロサンゼルス・ドジャース、ニューヨーク・ヤンキーズ): 通算187勝、2,172奪三振、2012年ア・リーグサイ・ヤング賞2位
      * **ダルビッシュ有** (テキサス・レンジャーズ、シカゴ・カブス、サンディエゴ・パドレス): 通算185勝、2,393奪三振、2020年ナ・リーグサイ・ヤング賞3位
      * **田中将大** (ニューヨーク・ヤンキーズ): 通算125勝、1,678奪三振、2013年ワールドシリーズMVP
      * **前田健太** (ロサンゼルス・ドジャース、ミネソタ・ツインズ): 通算96勝、1,135奪三振、2020年ナ・リーグサイ・ヤング賞4位
      
      **その他**
      
      * **上原浩治** (ボルチモア・オリオールズ、テキサス・レンジャーズ、ボストン・レッドソックス): 通算104セーブ、2013年ワールドシリーズチャンピオン
      * **川崎宗則** (シアトル・マリナーズ、オークランド・アスレチックス、シカゴ・カブス): 通算800安打、2008年ア・リーグゴールドグラブ賞
      * **菊池雄星** (シアトル・マリナーズ、トロント・ブルージェイズ): 通算79勝、926奪三振
      * **山本由伸** (ロサンゼルス・エンゼルス): 通算46勝、610奪三振、2023年ア・リーグオールスター

二つを見比べてみると、前者では選手の具体的な業績や特定の年の出来事に焦点を当てているように見えます。
例えば、「松坂大輔は2007年にワールドシリーズ制覇に貢献」「2001年にア・リーグMVP、首位打者、盗塁王の三冠王を獲得。2016年に3,000安打を達成。」といった具合です。
一方、後者では、選手の通算成績やキャリア全体に焦点を当てています。例えば、「野茂英雄は通算123勝、2,362奪三振」「通算800安打、2008年ア・リーグゴールドグラブ賞」といったように、具体的な成績を見ることができますね。

このように、情報をどのような形で見せるかの条件によって、パラメータは注意して設定する必要がありそうな気がしました。
サービスで利用する際には、ユーザーが求める形にチューニングする必要がありそうですね。

感想

ドキュメントを読みながらスムーズに試すことができたのと、Flutterに限らず他のフレームワークでも手軽に利用できる印象を持ちました。
また、モデルとかパラメータの理解は必要だと思いました...(サッパリワカッテイナイ)

下記の記事もよかったら覗いてみてくださいー
https://zenn.dev/410/articles/b9edc21cf80f15

Discussion