😸
(Go)Google Gemini APIを試す
はじめに
Go言語でGoogle Gemini APIを試したのでメモします。
まずはGoogle公式のGo SDK for Google Generative AIリポジトリのREADMEを確認しましょう。APIキーの取得方法から実装例まで詳しく説明されています。
ドキュメントも整備されています。以下のURLでアクセスできます。
記事投稿時点でGemini APIは無料で利用できます。Rate / Limit制限がやや厳しいですが、個人で遊ぶ程度なら十分かと思います。
試す
例として、画像の内容をGemini君に説明してもらいましょう。以下、実装例を示します。
ここで利用するモデルはgemini-1.5-flash
です。利用可能なモデル一覧はドキュメントに記載されています。
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/google/generative-ai-go/genai"
"google.golang.org/api/option"
)
func main() {
if len(os.Args) < 2 {
return
}
ctx := context.Background()
fileName := os.Args[1]
if err := request(ctx, fileName); err != nil {
log.Fatal(err)
}
}
func request(ctx context.Context, fileName string) error {
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("GEMINI_API_KEY")))
if err != nil {
return err
}
defer client.Close()
file, err := client.UploadFileFromPath(ctx, fileName, nil)
if err != nil {
return err
}
defer client.DeleteFile(ctx, file.Name)
model := client.GenerativeModel("gemini-1.5-flash")
resp, err := model.GenerateContent(
ctx,
genai.FileData{URI: file.URI},
genai.Text("この写真の内容を80文字程度で説明してください。"),
)
if err != nil {
return err
}
printResponse(resp)
return nil
}
func printResponse(resp *genai.GenerateContentResponse) {
for _, cand := range resp.Candidates {
if cand.Content == nil {
continue
}
for _, part := range cand.Content.Parts {
fmt.Println(part)
}
}
}
結果
それでは、適当に撮影した写真を渡してみましょう。結果はいかに?
# APIキーを設定
$ export GEMINI_API_KEY='xxxxxxxx'
# Gemini君に尋ねる
$ go run main.go garage.jpg
青空の下、倉庫のような建物が並んでいます。屋根の上には数字が書かれたプレートが見えます。建物はシャッターで閉められており、周囲には木々が生い茂っています。
いい漢字です!写真は自宅の前で撮影したものなので掲載はしませんが、誰が見ても文句のない回答かと思います。
なお、garage.jpg
のサイズは横640 px・縦480 pxです。ファイル容量は約140 KBです。
(補足)回答にかかる時間と内容について
今回はシンプルなプロンプトを指定したため、同じリクエストに対して毎回少し異なるレスポンスが返されます。
参考までに何度か実行した結果を示します。レスポンスは5、6秒ほどで返されますが、10秒ほどまたされることもあります。
$ time go run main.go garage.jpg
青空の下、倉庫のような建物が並んでいます。建物の屋根は波板でできていて、シャッターが閉まっています。建物には番号が振られています。
real 0m5.052s
user 0m0.537s
sys 0m0.349s
$ time go run main.go garage.jpg
ガレージのような建物が並んでいます。屋根の上には番号が振ってあり、1から2まで確認できます。空は青く、雲がいくつか見えます。
real 0m5.033s
user 0m0.540s
sys 0m0.403s
$ time go run main.go garage.jpg
ガレージのような建物の前に並んだシャッターが閉まっている。上は青空で雲が広がっている。屋根の上には電線が通っている。
real 0m5.760s
user 0m0.546s
sys 0m0.373s
$ time go run main.go garage.jpg
青空の下、鉄製のシャッターが閉まっている複数の車庫があります。 車庫の上には瓦屋根の建物がいくつか並んでおり、手前にはレンガでできた塀があります。
real 0m5.408s
user 0m0.535s
sys 0m0.346s
$ time go run main.go garage.jpg
青空に白い雲が広がり、建物が立ち並ぶ街並みが写っている。手前にシャッター付きの倉庫が並んでいる。倉庫は番号が振られていて、屋根は赤茶色とグレーの2色に分かれている。
real 0m7.803s
user 0m0.526s
sys 0m0.422s
おわりに
記事を書いている最中に新しいモデルが発表されたようです。詳細を把握できていませんが、モデル名の末尾が-002
が新しいモデルのようです。今後も性能向上しつつ料金がお安くなりそうで、楽しみです。
Discussion