チュートリアル: Gemini API のスタートガイド


このチュートリアルでは、Google AI Go SDK を使用して Go アプリケーション用の Gemini API にアクセスする方法について説明します。

このチュートリアルでは、次の方法を学習します。

さらに、このチュートリアルには、高度なユースケース(エンベディングトークンのカウントなど)と、コンテンツ生成の制御のオプションに関するセクションも含まれています。

前提条件

このチュートリアルは、Go でのアプリケーションの構築に精通していることを前提としています。

このチュートリアルを最後まで進めるには、開発環境が次の要件を満たしていることを確認してください。

  • Go 1.20 以降

プロジェクトを設定する

Gemini API を呼び出す前に、API キーの設定、SDK パッケージのインストール、モデルの初期化など、プロジェクトを設定する必要があります。

API キーを設定する

Gemini API を使用するには API キーが必要です。キーがない場合は、Google AI Studio で作成します。

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 とエンベディングに関する情報を確認できます。

テキストのみの入力からテキストを生成する

プロンプト入力にテキストのみが含まれている場合は、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 モデル)が用意されており、テキストと画像の両方を入力できます。プロンプトの画像の要件を必ず確認してください。

プロンプト入力にテキストと画像の両方が含まれている場合は、generateContent メソッドで Gemini 1.5 モデルを使用して、テキスト出力を生成します。

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: プロンプトを提供するロール。この値は SendMessage 呼び出しのデフォルトです。

  • model: レスポンスを提供するロール。このロールは、既存の historyStartChat() を呼び出す場合に使用できます。

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)
}

ストリーミングを使用してより高速にやり取りする

デフォルトでは、モデルは生成プロセス全体を完了するとレスポンスを返します。結果全体を待たずに、ストリーミングを使用して部分的な結果を処理することで、インタラクションを高速化できます。

次の例は、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 モデルについて学習する。