💨

AI Agent Hackathon with Google Cloudに参加するための事前調査:4日目

2025/01/06に公開

前回から現在まで

前回は生成AIに人格を持たせるためのパラメーター調査をしていました。

そこからこの記事を書くまでに年末年始を挟んでいますが、そこでの学習内容を踏まえたアウトプットをしていました。

今回の記事は現在開発運用している自作のツールをopenaiからgeminiに置き換える作業をするためにgemini APIの学習を進めていこうかと思います。

gemini APIのAPIキーの取得

こちらの記事を確認しながら進めていきます。
https://ai.google.dev/gemini-api/docs/quickstart?hl=ja&lang=go

なお、筆者が使う開発言語はGoなので、ドキュメント中にある開発言語の選択で Go を選択しています。

このページに Google AI StudioでGemini APIキーを取得する ボタンがあるのでクリック。

するとGoogle AI Studioの画面が表示されるので APIキーを作成 ボタンをクリック。

すると現時点で存在するgoogle cloudのプロジェクトが一覧に並びますので、いずれかを選択・・・・

と、いきたいところなのですが、このプロジェクト一覧はgoogleアカウントでデフォルトに設定されているアカウントのプロジェクト一覧が表示されていています。

筆者の場合はデフォルトになっているアカウントではなく、ハッカソン用に用意したアカウントのプロジェクトを選択したいのですが、アカウント切り替えはこの画面上にありませんのでAPIキーをハッカソン用アカウントのプロジェクトに作成することができません・・・

なので、この画面上での操作ではなく別アカウントにログインした上でgoogle cloud上でAPIキーを発行する手順を行いました。

  1. 対象のgoogle cloudにログイン
  2. プロダクトから APIとサービス を選択
  3. メニューから認証情報 を選択し、画面上部の 認証情報を作成 をクリック、APIキーを選択するとキーが作成される
  4. 作成したキーのリンクをクリックして、名前・アプリケーションの制限の設定を適宜変更
  5. APIの制限Generative Language APIを選択、これは先ほどのGoogle AI Studioで作成するものと同じ。

APIキーの内容はこちら。

この手順でAPIキーは用意できますので、キーをコピーして実装に進みます。

gemini APIを利用した実装

こちらの記事を確認しながら進めていきます。
https://ai.google.dev/api?hl=ja

記載内容のクセが強すぎる・・・

おそらくなのですが、このドキュメント自体はGoでの開発に結構慣れている人が前提で書かれていると思います。

サンプルとして挙げられているコードはリポジトリごとマルっと落としてこないと動作しないとかがその理由です。

ですので、自分で実装する場合は動作させるために必要なエッセンスだけを抽出して独自に実装したほうがいい感じです。

もちろん動作確認をする場合はリポジトリごとマルっと落としてきたほうが全然早いですので、その辺りはここの都合に合わせて読み進められたし、みたいな感じだと思います。

筆者の実装例

生成したテキストを含めて様々な返却値を確認するので以下のようなコードにしています。

APIキーは環境変数から読みこんで、利用するモデルは現在お試しで低価格で利用できる(らしい) gemini-2.0-flash-exp を利用しています。

func Generate() {
	ctx := context.Background()
	key := os.Getenv("GEMINI_API_KEY")

	client, err := genai.NewClient(ctx, option.WithAPIKey(key))
	if err != nil {
		log.Fatal(err)
	}
	defer client.Close()

	model := client.GenerativeModel("gemini-2.0-flash-exp")
	resp, err := model.GenerateContent(ctx, genai.Text(`[プロンプト]`))
	if err != nil {
		log.Fatal(err)
	}

	for _, cand := range resp.Candidates {
		if cand.Content != nil {
			for _, part := range cand.Content.Parts {
				fmt.Println(part)
			}
		}
	}
}

返却された値を確認して用途に応じて実装やプロンプトを変えていけば理想通りのものに仕上がると思います。

openaiとgeminiの違い

一番戸惑ったのは同じプロンプトを利用したのに、openaiとgeminiで出力が全く違う内容になることです。

ですので、modelの選択自体もそうなのですが、AI関連のプロダクトごとに適切なプロンプトを用意する手間があるのだと思いました。

まだ深く触ってないので初見での感想ですが、gemini APIの場合は体感ですが欲しい出力の前後に「***ですね」「以上になります」のような応答内容が差し込まれるので、これを除去することが必要なのかもしれないです。

そのため、プロンプトの入力コストがgeminiの方が高くなるのではないかと思います。

総合してコストが安く理想的なAIプロダクトとそのモデルを選択することが必要となると感じました。

終わりに

コードを使った実装はこなれてきてはいるのですが学習についてはまだ未知の世界なので以後はデータを使って学習させることを試していければいいなと思いました。

GitHubで編集を提案

Discussion