このチュートリアルでは、Go 用の Gemini API にアクセスする方法について説明します アプリケーションをビルドします。
このチュートリアルでは、次の方法を学習します。
- API キーを含めたプロジェクトをセットアップする
- テキストのみの入力からテキストを生成する
- テキストと画像の入力からテキストを生成する(マルチモーダル)
- マルチターンの会話を構築する(チャット)
- ストリーミングを使用して操作を高速化する
また、このチュートリアルには、高度なユースケース( embeddingsと トークンのカウントなど)や、 コンテンツ生成の制御を行います。
前提条件
このチュートリアルは、読者が 開始
このチュートリアルを最後まで進めるには、開発環境が次の要件を満たしていることを確認してください。 次の要件を満たす必要があります。
- Go 1.20 以降
プロジェクトを設定する
Gemini API を呼び出す前に、以下を含むプロジェクトを設定する必要があります。 API キーの設定、SDK パッケージのインストール、モデルの初期化です。
API キーを設定する
Gemini API を使用するには API キーが必要です。まだお持ちでない場合は 作成することもできます。
API キーを保護する
API キーをバージョンにチェックインしないことを強くおすすめします。 制御システムです。代わりに、API キーにはシークレット ストアを使用する必要があります。
このチュートリアルのすべてのスニペットは、API キーに 使用します。
SDK パッケージをインストールする
独自のアプリケーションで Gemini API を使用するには、Go SDK をget
する必要があります
をモジュール ディレクトリに配置します。
go get github.com/google/generative-ai-go
生成モデルを初期化する
API 呼び出しを行うには、その前に 説明します。
import "github.com/google/generative-ai-go/genai"
import "google.golang.org/api/option"
ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
log.Fatal(err)
}
defer client.Close()
// The Gemini 1.5 models are versatile and work with most use cases
model := client.GenerativeModel("gemini-1.5-flash")
モデルを指定する際は、次の点に注意してください。
ユースケースに固有のモデルを使用する(例:
gemini-1.5-flash
) マルチモーダル入力用です)。このガイドでは、それぞれの手順について説明します。 実装のリストには、各ユースケースの推奨モデルが記載されています。
一般的なユースケースの実装
プロジェクトが設定されたので、Gemini API を使用して以下を行う方法を学習します。 さまざまなユースケースを実装できます。
高度なユースケースのセクションでは、Gemini API に関する情報を確認できます embeddings
テキストのみの入力からテキストを生成する
プロンプト入力にテキストのみが含まれている場合は、Gemini 1.5 モデルまたは
Gemini 1.0 Pro モデルで generateContent
を使用してテキスト出力を生成します。
ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
log.Fatal(err)
}
defer client.Close()
// The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
model := client.GenerativeModel("gemini-1.5-flash")
resp, err := model.GenerateContent(ctx, genai.Text("Write a story about a magic backpack."))
if err != nil {
log.Fatal(err)
}
テキストと画像の入力からテキストを生成する(マルチモーダル)
Gemini はマルチモーダル入力を処理できるさまざまなモデルを提供 (Gemini 1.5 モデル)を使用し、テキストと画像の両方を入力できるようにしました。必ず 確認 プロンプトの画像の要件をご覧ください。
プロンプト入力にテキストと画像の両方が含まれている場合は、Gemini 1.5 モデルを使用する
generateContent
メソッドを使用して、テキスト出力を生成します。
ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
log.Fatal(err)
}
defer client.Close()
// The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
model := client.GenerativeModel("gemini-1.5-flash")
imgData1, err := os.ReadFile(pathToImage1)
if err != nil {
log.Fatal(err)
}
imgData2, err := os.ReadFile(pathToImage1)
if err != nil {
log.Fatal(err)
}
prompt := []genai.Part{
genai.ImageData("jpeg", imgData1),
genai.ImageData("jpeg", imgData2),
genai.Text("What's different between these two pictures?"),
}
resp, err := model.GenerateContent(ctx, prompt...)
if err != nil {
log.Fatal(err)
}
マルチターンの会話を構築する(チャット)
Gemini を使用すると、複数のターンで自由形式の会話を構築できます。「
SDK は会話の状態を管理することでプロセスを簡素化するため、
GenerateContent
との会話履歴を保存する必要はありません
できます。
マルチターンの会話(チャットなど)を作成するには、Gemini 1.5 モデルまたは
Gemini 1.0 Pro モデルを作成し、startChat()
を呼び出してチャットを初期化します。
次に、sendMessage()
を使用して新しいユーザー メッセージを送信します。これにより、
返信メッセージも確認できます。
コンテンツに関連付けられた role
には、次の 2 つのオプションがあります。
あります。
user
: プロンプトを提供するロール。この値は Kubernetes のSendMessage
回。model
: レスポンスを提供するロール。このロールは、 既存のhistory
でStartChat()
を呼び出す。
ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
log.Fatal(err)
}
defer client.Close()
// The Gemini 1.5 models are versatile and work with multi-turn conversations (like chat)
model := client.GenerativeModel("gemini-1.5-flash")
// Initialize the chat
cs := model.StartChat()
cs.History = []*genai.Content{
&genai.Content{
Parts: []genai.Part{
genai.Text("Hello, I have 2 dogs in my house."),
},
Role: "user",
},
&genai.Content{
Parts: []genai.Part{
genai.Text("Great to meet you. What would you like to know?"),
},
Role: "model",
},
}
resp, err := cs.SendMessage(ctx, genai.Text("How many paws are in my house?"))
if err != nil {
log.Fatal(err)
}
ストリーミングを使用してより高速にやり取りする
デフォルトでは、モデルは生成全体を完了するとレスポンスを返します。 プロセスですメッセージ全体を待つ必要がないため、 代わりにストリーミングを使用して部分的な結果を処理できます
次の例は、Dataflow を使用してストリーミングを実装する方法を示しています。
テキストと画像の入力からテキストを生成する GenerateContentStream
メソッド
表示されます。
ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
log.Fatal(err)
}
defer client.Close()
// The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
model := client.GenerativeModel("gemini-1.5-flash")
imageBytes, err := os.ReadFile(pathToImage)
img := genai.ImageData("jpeg", imageBytes)
prompt := genai.Text("Tell me a story about this animal")
iter := model.GenerateContentStream(ctx, img, prompt)
for {
resp, err := iter.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Fatal(err)
}
// ... print resp
}
テキストのみの入力とチャットのユースケースにも、同様のアプローチを使用できます。
prompt := genai.Text("Tell me a story about a lumberjack and his giant ox")
iter := model.GenerateContentStream(ctx, prompt)
prompt := genai.Text("And how do you feel about that?")
iter := cs.SendMessageStream(ctx, prompt)
高度なユースケースの実装
このチュートリアルの前のセクションで説明した一般的なユースケースは、 Gemini API の使い方に慣れてきたはずです。このセクションでは、 より高度なとみなされる可能性のあるユースケースを学習します。
エンベディングを使用する
エンベディングとは、情報を表現するために使用される手法 浮動小数点数のリストとして配列します。Gemini を使用すると、 テキスト(単語、文、テキストのブロック)をベクトル化して、 エンベディングを簡単に比較できます。たとえば、同じ名前を持つ 2 つのテキストが 類似した主題や感情には類似したエンべディングが必要です コサイン類似度などの数学的比較手法で特定できます
embedding-001
モデルと EmbedContent
メソッド(または
BatchEmbedContent
メソッドなど)を使用してエンベディングを生成します。次の例をご覧ください。
単一の文字列のエンベディングを生成します。
ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
log.Fatal(err)
}
defer client.Close()
// For embeddings, use the embedding-001 model
em := client.EmbeddingModel("embedding-001")
res, err := em.EmbedContent(ctx, genai.Text("The quick brown fox jumps over the lazy dog."))
if err != nil {
panic(err)
}
fmt.Println(res.Embedding.Values)
関数呼び出し
関数呼び出しを使用すると、構造化データの出力を 説明します。その後、これらの出力を使用して他の API を呼び出し、 レスポンス データをモデルに送ります。つまり関数呼び出しは 生成モデルを外部システムに接続して、生成されたコンテンツが に最新の正確な情報が含まれています。 詳しくは、 関数呼び出しのチュートリアル
トークンをカウントする
長いプロンプトを使用する場合は、メッセージを送信する前にトークンをカウントすると、
モデルに提供します次の例は、CountTokens()
の使用方法を示しています。
さまざまなユースケースに対応できます
// For text-only input
text := "Parrots can be green and live a long time."
resp, err := model.CountTokens(ctx, genai.Text(text))
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.TotalTokens)
// For text-and-image input (multimodal)
text := "Parrots can be green and live a long time."
imageBytes, err := os.ReadFile(pathToImage)
if err != nil {
log.Fatal(err)
}
resp, err := model.CountTokens(
ctx,
genai.Text(text),
genai.ImageData("png", imageBytes))
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.TotalTokens)
コンテンツの生成を管理するオプション
コンテンツの生成を制御するには、モデル パラメータを構成し、 安全性設定。
モデル パラメータを構成する
モデルに送信するすべてのプロンプトには、モデルにどのように モデルがレスポンスを生成します。このモデルは、パラメータ値によって異なる結果を生成できます。詳細: モデル パラメータ。この構成は 維持されることです。
// ...
// The Gemini 1.5 models are versatile and work with most use cases
model := client.GenerativeModel("gemini-1.5-flash")
// Configure model parameters by invoking Set* methods on the model.
model.SetTemperature(0.9)
model.SetTopK(1)
// ...
安全性設定を使用する
安全性設定を使用すると、 害を及ぼす可能性があります。デフォルトでは、安全性設定で「中」のコンテンツはブロックされます すべての要素で安全でないコンテンツである確率が高くなります。学習 詳しくは、安全性設定についての説明をご覧ください。
安全性設定を 1 つ設定する方法は次のとおりです。
// ...
// The Gemini 1.5 models are versatile and work with most use cases
model := client.GenerativeModel("gemini-1.5-flash")
model.SafetySettings = []*genai.SafetySetting{
{
Category: genai.HarmCategoryHarassment,
Threshold: genai.HarmBlockOnlyHigh,
},
}
// ...
安全性設定は複数設定できます。
// ...
// The Gemini 1.5 models are versatile and work with most use cases
model := client.GenerativeModel("gemini-1.5-flash")
model.SafetySettings = []*genai.SafetySetting{
{
Category: genai.HarmCategoryHarassment,
Threshold: genai.HarmBlockOnlyHigh,
},
{
Category: genai.HarmCategoryHateSpeech,
Threshold: genai.HarmBlockMediumAndAbove,
},
}
// ...
次のステップ
プロンプト設計は、言語モデルから望ましいレスポンスを引き出すプロンプトを作成するプロセスです。適切に構造化されたプロンプトを記述することは これは、言語モデルからの正確で高品質なレスポンスを確保するための一環です。 プロンプト作成のベスト プラクティスについて確認する。
Gemini には、さまざまな用途のニーズに対応する複数のモデル バリエーションが用意されています。 入力の種類や複雑さ、チャットやその他のツールの実装、 タスク、サイズの制約です。 利用可能な Gemini モデルについて学習する。