😸

(Go)Google Gemini APIを試す

2024/09/25に公開

はじめに

Go言語でGoogle Gemini APIを試したのでメモします。

まずはGoogle公式のGo SDK for Google Generative AIリポジトリのREADMEを確認しましょう。APIキーの取得方法から実装例まで詳しく説明されています。

https://github.com/google/generative-ai-go

ドキュメントも整備されています。以下のURLでアクセスできます。

https://ai.google.dev/gemini-api/docs?hl=ja

記事投稿時点で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