こんにちは、中山です
進歩の早い生成 AI 界隈ですが、今春も OpenAI 社から、GPT-4o などの発表があったり、Google I/O 2024 では、Gemini のいろいろな進化が紹介されていました
私たちソフトウェアエンジニアとしましては、これらの最新の生成AIに「使われる」のではなく、「使いこなす」側でありつづけないといけません!
このような意気込みのもと、今回は、 Google の Gemini にトライしてみまして、 前回 の Microsoft Copilot とも比較しながら、その特徴を掴んでみたいと思います
準備
Android Studio をインストールする
Google から、Gemini を Android アプリとして利用するサンプルコードが提供されていましたので、今回はこれを使ってみたいと思います
まずは公式から Android Studio 最新版 をインストールします
サンプルコードを取得する
Gemini の Android アプリのサンプルコードは、 こちら から取得します
サンプルコードを Android Studio で開く
取得したサンプルコードの中の、 generativeai-android-sample フォルダを指定して Android Studio で開きます
Android Studio ではこんな感じで表示されます
Google Gemini の API キーを取得する
次に、Gemini の機能を利用するための、API キーを取得します
ブラウザから、Google アカウントにサインインした状態で、 https://makersuite.google.com/app/apikey にアクセスします
表示されたページで Get API Key をクリックします
Create API Key をクリックします
Create API key in new project をクリックします
以下のように API キーが生成されますので、この値をコピーします
API キーをサンプルコードの local.properties に設定する
コピーした API キーの値を、サンプルコードのプロジェクト内にある local.properties ファイルに、
以下のように追記します
## This file must *NOT* be checked into Version Control Systems, # as it contains information specific to your local configuration. # # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. #Mon May 27 10:30:45 JST 2024 sdk.dir=/Users/****/Library/Android/sdk apiKey=********
サンプルアプリを実行する
アプリの起動
Android Studio から Android スマートフォン実機、またはシミュレータを指定してアプリを実行します
正常に起動すると以下のような画面が表示されます
まずは一番下の chat を使ってみます
ソースコードの生成を依頼する
前回 、 Microsoft Copilot に依頼したのと同じように、Python のコードサンプルの生成をお願いしてみようと思います
前回、Microsoft Copilot で「 Python で、日時を文字列に変換するコードを教えて 」と依頼してみますと、以下のような回答が返ってきていました
from datetime import datetime # 現在の日時を取得 now = datetime.now() # 月 日, 年 の形式の文字列に変換 date_string = now.strftime("%B %d, %Y") print(date_string) # 出力: March 29, 2023 (または現在の日付) # 形式: YYYY-MM-DD iso_date_string = now.strftime("%Y-%m-%d") print(iso_date_string) # 出力: 2023-03-29 (または現在の日付)
同じ質問を、Android サンプルアプリから Gemini に問いかけてみますと、
このとおり、 ほぼ同じような回答 が返ってきました
なお、このあたりの生成 AI とのやりとりを、具体的にどのように実装しているかを見てみますと、 サンプルアプリのプロジェクト内にある ChatViewModel クラスで、
・・・ private val chat = generativeModel.startChat( history = listOf( content(role = "user") { text("Hello, I have 2 dogs in my house.") }, content(role = "model") { text("Great to meet you. What would you like to know?") } ) ) ・・・
こんな感じで startChat メソッドを呼び出して生成AIとのチャットを開始して、
・・・
try {
val response = chat.sendMessage(userMessage)
・・・
こんなふうに、sendMessage メソッドで追加の質問を送って、という感じで、いずれも Google が用意しているメソッドを呼び出すだけで、生成AIとのやりとりを実現できていました
なおかつ、以下のようなコードで、対話の履歴を記録していっているようでしたので、
・・・ _uiState.value.addMessage( ChatMessage( text = userMessage, participant = Participant.USER, isPending = true ) ) ・・・ _uiState.value.addMessage( ChatMessage( text = modelResponse, participant = Participant.MODEL, isPending = false ) ) ・・・
以下のように、対話の履歴を前提とするような質問をしても、的確な回答を返してくれました
一方で、生成 AI の機能自体の呼び出し部分自体はシンプルなのですが、このサンプルの場合は Kotlin + Jetpack Compose + Coroutine を使った実装になっていましたので、手を加えていく場合は、このあたりの知識は必要になってくると思われます
エラーを解決してもらう
前回 、 エラーの解決も Microsoft Copilot にお願いしていました
「"Error response from daemon: Ports are not available: " というエラーを解決して」という質問を Microsoft Copilot に投げると、
Dockerでコンテナを起動する際に、「Error response from daemon: Ports are not available」というエラーが発生することがあります。このエラーは、指定されたポートが他のプロセスで既に使用されているために発生します。以下の対処法を試してみてください。 ポートを確認する: 最初に、使用中のポートを確認します。ターミナルで次のコマンドを実行して、ポート番号を使用しているプロセスのリストを表示します。 sudo lsof -i:<ポート番号> 例えば、ポート番号80のプロセスを調べるには、次のように入力します。 sudo lsof -i:80 このコマンドは、ポート番号80を使用しているプロセスのリストを表示します。 ・・・
のような回答を返してくれていました
同じ質問を Gemini に問いかけてみますと、
これもほぼ同じような回答を返してくれました
このあたりの性能については、Google でも Microsoft でも、十分実用に耐えうるレベルにまで達している、ということかもしれません
画面キャプチャを渡して読み取ってもらう
しかし、少し差が出ましたのが、この画面キャプチャの読み取りの部分でした
前回 、 Microsoft Copilot に以下のような Amazon ウェブサイトのログイン画面キャプチャの画像を渡して、
「 画像を添付するので、分析して画面項目の一覧を作成してください。その際にjson形式で答えてください 」
のように依頼しますと、
{ "elements": [ { "type": "logo", "description": "Amazon logo" }, { "type": "text", "description": "アカウントサービス" }, { "type": "form", "fields": [ { "type": "input box", "label": "Eメールまたは携帯電話番号" }, { "type": "input box", "label": "Amazonパスワード" } ], "buttons": [ { "text": "ログイン", "color":"orange" }, { "text": "パスワードを表示する", "type": "checkbox" } ], "links": [ { "text": "パスワードを忘れた場合はこちら" }, { "text": "新しいお客様ですか?アカウントを作成する" } ] } ] }
このように回答を返してくれたのですが、日本語テキスト部分が誤っていたり、と、やや正確でないところがありました
同じ操作を Gemini の Android サンプルアプリでも試してみますと、
まずサンプルアプリのトップ画面から 2番目の multimodal を選択して、
同じように画面キャプチャを指定して、
同じく「 画像を添付するので、分析して画面項目の一覧を作成してください。その際にjson形式で答えてください 」という質問を投げてみますと、
このような結果が返ってきました
完全に正解、というわけではないのですが、Microsoft Copilot の回答と比べると、日本語テキストについてもより正確な読み取りができているように見えます
以下、いくつか例を挙げてみましたが、やはりこのケースでは Gemini の精度が上のようです
画面キャプチャのテキスト | Microsoft Copilot の認識結果 | Google Gemini の認識結果 |
---|---|---|
携帯電話番号またはメールアドレス | Eメールまたは携帯電話番号 | メールアドレスまたは携帯電話番号 |
もう一度パスワードを入力してください | パスワードを忘れた場合はこちら | もう一度パスワードを入力してください |
生成 AI の機能を呼び出しているコードは、PhotoReasoningViewModel クラスの以下のあたり、 generateContentStream メソッドを呼び出すだけ、という比較的シンプルな実装になっています
・・・ try { val inputContent = content { for (bitmap in selectedImages) { image(bitmap) } text(prompt) } var outputContent = "" generativeModel.generateContentStream(inputContent) .collect { response -> outputContent += response.text _uiState.value = PhotoReasoningUiState.Success(outputContent) } } catch (e: Exception) { _uiState.value = PhotoReasoningUiState.Error(e.localizedMessage ?: "") } } }
まとめ
生成 AI 界隈、今回試した Google Gemini も実用的な精度があり、まったく無視できない存在でした
今回のように公式がサンプルアプリを用意していたり、と、生成 AI の技術を活用する敷居は低くなってきていると思いますので、よいものはどんどん使っていきたいと考えています