Premiers pas avec l'API Gemini dans les applications Go

Ce tutoriel explique comment accéder à l'API Gemini pour votre application Go à l'aide du SDK Google AI pour Go.

Dans ce tutoriel, vous allez apprendre à effectuer les opérations suivantes:

Ce tutoriel contient également des sections sur des cas d'utilisation avancés (tels que les représentations vectorielles continues et les jetons de comptage), ainsi que sur les options de contrôle de la génération de contenu.

Prérequis

Dans ce tutoriel, nous partons du principe que vous savez comment créer des applications avec Go.

Pour suivre ce tutoriel, assurez-vous que votre environnement de développement répond aux exigences suivantes:

  • Go 1.20+

Configurer votre projet

Avant d'appeler l'API Gemini, vous devez configurer votre projet, ce qui comprend la configuration de votre clé API, l'installation du package SDK et l'initialisation du modèle.

Configurer votre clé API

Pour utiliser l'API Gemini, vous avez besoin d'une clé API. Si vous n'en avez pas, créez-en une dans Google AI Studio.

Obtenir une clé API

Sécuriser votre clé API

Il est vivement recommandé de ne pas vérifier une clé API dans votre système de contrôle des versions. Utilisez plutôt un magasin de secrets pour votre clé API.

Tous les extraits de ce tutoriel supposent que vous accédez à votre clé API en tant que variable d'environnement.

Installer le package SDK

Pour utiliser l'API Gemini dans votre propre application, vous devez get le package SDK Go dans le répertoire de votre module:

go get github.com/google/generative-ai-go

Initialiser le modèle génératif

Avant de pouvoir effectuer des appels d'API, vous devez importer et initialiser le modèle génératif.

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

model := client.GenerativeModel("MODEL_NAME")

Lorsque vous spécifiez un modèle, tenez compte des points suivants:

  • Utilisez un modèle spécifique à votre cas d'utilisation (par exemple, gemini-pro-vision est destiné à l'entrée multimodale). Dans ce guide, les instructions pour chaque implémentation listent le modèle recommandé pour chaque cas d'utilisation.

Implémenter des cas d'utilisation courants

Maintenant que votre projet est configuré, vous pouvez découvrir comment utiliser l'API Gemini pour mettre en œuvre différents cas d'utilisation:

Dans la section sur les cas d'utilisation avancés, vous trouverez des informations sur l'API Gemini et les représentations vectorielles continues.

Générer du texte à partir d'une entrée de texte uniquement

Lorsque l'entrée de la requête n'inclut que du texte, utilisez le modèle gemini-pro avec la méthode GenerateContent pour générer une sortie textuelle:

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 text-only input, use the gemini-pro model
model := client.GenerativeModel("gemini-pro")
resp, err := model.GenerateContent(ctx, genai.Text("Write a story about a magic backpack."))
if err != nil {
  log.Fatal(err)
}

Générer du texte à partir d'une entrée de texte et d'image (multimodale)

Gemini fournit un modèle multimodal (gemini-pro-vision), qui vous permet de saisir à la fois du texte et des images. Veillez à consulter les exigences concernant les images pour les invites.

Lorsque l'entrée de la requête comprend à la fois du texte et des images, utilisez le modèle gemini-pro-vision avec la méthode GenerateContent pour générer une sortie textuelle:

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 text-and-image input (multimodal), use the gemini-pro-vision model
model := client.GenerativeModel("gemini-pro-vision")

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

Créer des conversations multitours (chat)

Gemini vous permet de créer des conversations de forme libre sur plusieurs tours. Le SDK simplifie le processus en gérant l'état de la conversation. Ainsi, contrairement à GenerateContent, vous n'avez pas besoin de stocker l'historique de la conversation vous-même.

Pour créer une conversation multitour (telle qu'un chat), utilisez le modèle gemini-pro, puis initialisez le chat en appelant StartChat(). Utilisez ensuite SendMessage() pour envoyer un nouveau message utilisateur, qui ajoutera également le message et la réponse à l'historique des discussions.

Deux options sont possibles pour role associé au contenu d'une conversation:

  • user: rôle qui fournit les invites. Cette valeur est la valeur par défaut pour les appels SendMessage.

  • model: rôle qui fournit les réponses. Ce rôle peut être utilisé lorsque vous appelez StartChat() avec le history existant.

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 text-only input, use the gemini-pro model
model := client.GenerativeModel("gemini-pro")
// 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)
}

Utiliser le streaming pour des interactions plus rapides

Par défaut, le modèle renvoie une réponse une fois l'ensemble du processus de génération terminé. Vous pouvez obtenir des interactions plus rapides en évitant d'attendre l'intégralité du résultat, et en utilisant plutôt le traitement par flux pour gérer des résultats partiels.

L'exemple suivant montre comment implémenter la diffusion en flux continu avec la méthode GenerateContentStream pour générer du texte à partir d'une invite de saisie de texte et d'image.

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 text-and-image input (multimodal), use the gemini-pro-vision model
model := client.GenerativeModel("gemini-pro-vision")

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
}

Vous pouvez utiliser une approche similaire pour les cas d'utilisation de la saisie de texte et du chat.

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)

Implémenter des cas d'utilisation avancés

Les cas d'utilisation courants décrits dans la section précédente de ce tutoriel vous aideront à vous familiariser avec l'API Gemini. Cette section décrit certains cas d'utilisation qui peuvent être considérés comme plus avancés.

Utiliser des représentations vectorielles continues

La technique de représentation vectorielle continue permet de représenter des informations sous la forme d'une liste de nombres à virgule flottante dans un tableau. Avec Gemini, vous pouvez représenter du texte (mots, phrases et blocs de texte) sous une forme vectorisée, ce qui facilite la comparaison et le contraste des représentations vectorielles continues. Par exemple, deux textes qui partagent un sujet ou un sentiment similaire doivent avoir des représentations vectorielles continues similaires, qui peuvent être identifiées à l'aide de techniques de comparaison mathématiques telles que la similarité cosinus.

Utilisez le modèle embedding-001 avec la méthode EmbedContent (ou la méthode BatchEmbedContent) pour générer des représentations vectorielles continues. L'exemple suivant génère une représentation vectorielle continue pour une seule chaîne:

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

Compter les jetons

Lorsque vous utilisez des invites longues, il peut être utile de compter les jetons avant d'envoyer du contenu au modèle. Les exemples suivants montrent comment utiliser CountTokens() pour différents cas d'utilisation:

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

Options pour contrôler la génération de contenu

Vous pouvez contrôler la génération de contenu en configurant des paramètres de modèle et en utilisant des paramètres de sécurité.

Configurer les paramètres du modèle

Chaque invite que vous envoyez au modèle inclut des valeurs de paramètres qui contrôlent la manière dont le modèle génère une réponse. Le modèle peut générer différents résultats pour différentes valeurs de paramètre. Apprenez-en plus sur les paramètres de modèle. Cette configuration est conservée pendant toute la durée de vie de votre instance de modèle.

// ...

model := client.GenerativeModel("MODEL_NAME")

// Configure model parameters by invoking Set* methods on the model.
model.SetTemperature(0.9)
model.SetTopK(1)

// ...

Utiliser les paramètres de sécurité

Vous pouvez utiliser les paramètres de sécurité pour ajuster la probabilité de recevoir des réponses pouvant être considérées comme nuisibles. Par défaut, les paramètres de sécurité bloquent le contenu ayant une probabilité moyenne et/ou élevée d'être un contenu dangereux dans toutes les dimensions. En savoir plus sur les paramètres de sécurité

Voici comment définir un paramètre de sécurité:

// ...

model := client.GenerativeModel("MODEL_NAME")

model.SafetySettings = []*genai.SafetySetting{
  {
    Category:  genai.HarmCategoryHarassment,
    Threshold: genai.HarmBlockOnlyHigh,
  },
}

// ...

Vous pouvez également définir plusieurs paramètres de sécurité:

// ...

model := client.GenerativeModel("MODEL_NAME")

model.SafetySettings = []*genai.SafetySetting{
  {
    Category:  genai.HarmCategoryHarassment,
    Threshold: genai.HarmBlockOnlyHigh,
  },
  {
    Category:  genai.HarmCategoryHateSpeech,
    Threshold: genai.HarmBlockMediumAndAbove,
  },
}

// ...

Étapes suivantes

  • La conception d'invites est le processus de création d'invites qui permettent d'obtenir la réponse souhaitée en utilisant des modèles de langage. Pour rédiger des réponses précises et de haute qualité à partir d'un modèle de langage, il est essentiel de rédiger des invites bien structurées. Découvrez les bonnes pratiques concernant la rédaction de requêtes.

  • Gemini propose plusieurs variantes de modèle pour répondre aux besoins de différents cas d'utilisation, tels que les types et la complexité des entrées, les implémentations pour le chat ou d'autres tâches linguistiques de dialogue, ainsi que les contraintes de taille. Découvrez les modèles Gemini disponibles.

  • Gemini propose des options pour demander des augmentations de la limite de débit. La limite de débit pour les modèles Geni Pro est de 60 requêtes par minute (tr/min).