Tutoriel: Appeler une fonction avec l'API Gemini


Les appels de fonctions vous permettent d'obtenir plus facilement des sorties de données structurées à partir de modèles génératifs. Vous pouvez ensuite utiliser ces sorties pour appeler d'autres API et renvoyer les données de réponse pertinentes au modèle. En d'autres termes, l'appel de fonction vous aide à connecter des modèles génératifs à des systèmes externes afin que le contenu généré inclue les informations les plus récentes et les plus précises.

Vous pouvez fournir aux modèles Gemini des descriptions de fonctions. Il s'agit de fonctions que vous écrivez dans le langage de votre application (il ne s'agit pas de fonctions Google Cloud). Le modèle peut vous demander d'appeler une fonction et de renvoyer le résultat pour l'aider à gérer votre requête.

Si vous ne l'avez pas déjà fait, consultez l'article Présentation des appels de fonctions pour en savoir plus.

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 un appel de fonction

Dans ce tutoriel, le modèle interagira avec une API d'échange de devises fictive qui accepte les paramètres suivants:

Paramètres Type Obligatoire Description
currencyDate chaîne oui Date de récupération du taux de change pour
(qui doit toujours être au format AAAA-MM-JJ ou la valeur latest si aucune période n'est spécifiée)
currencyFrom chaîne oui Devise à convertir
currencyTo chaîne non Devise à convertir

Exemple de requête API

{
  "currencyDate": "2024-04-17",
  "currencyFrom": "USD",
  "currencyTo": "SEK"
}

Exemple de réponse de l'API

{
  "base": "USD",
  "date": "2024-04-17",
  "rates": {"SEK": 0.091}
}

Étape 1: Créez la fonction qui envoie la requête API

Si vous ne l'avez pas déjà fait, commencez par créer la fonction qui envoie une requête API.

À des fins de démonstration dans ce tutoriel, au lieu d'envoyer une requête API réelle, vous renvoyez des valeurs codées en dur au même format que celui renvoyé par une API réelle.

func exchangeRate(currencyDate string,
    currencyFrom string, currencyTo string) map[string]any {
    // This hypothetical API returns a JSON such as:
    // {"base":"USD","date":"2024-04-17","rates":{"SEK": 0.091}}
    return map[string]any{
        "base":  currencyFrom,
        "date":  currencyDate,
        "rates": map[string]any{currencyTo: 0.091}}
}

Étape 2: Créez une déclaration de fonction

Créez la déclaration de fonction que vous transmettrez au modèle génératif (étape suivante de ce tutoriel).

Fournissez autant de détails que possible dans les descriptions des fonctions et des paramètres. Le modèle génératif utilise ces informations pour déterminer la fonction à sélectionner et comment fournir des valeurs pour les paramètres dans l'appel de fonction.

currencyExchangeTool := &genai.Tool{
    FunctionDeclarations: []*genai.FunctionDeclaration{{
        Name:        "exchangeRate",
        Description: "Lookup currency exchange rates by date",
        Parameters: &genai.Schema{
            Type: genai.TypeObject,
            Properties: map[string]*genai.Schema{
                "currencyDate": {
                    Type:        genai.TypeString,
                    Description: "A date that must always be in YYYY-MM-DD format" +
                        " or the value 'latest' if a time period is not specified",
                },
                "currencyFrom": {
                    Type:        genai.TypeString,
                    Description: "Currency to convert from",
                },
                "currencyTo": {
                    Type:        genai.TypeString,
                    Description: "Currency to convert to",
                },
            },
            Required: []string{"currencyDate", "currencyFrom"},
        },
    }},
}

Étape 3: Spécifiez la déclaration de la fonction lors de l'initialisation du modèle

Spécifiez la déclaration de la fonction lors de l'initialisation du modèle génératif en la transmettant au paramètre Tools du modèle:

// ...

currencyExchangeTool := &genai.Tool{
  // ...
}

// Use a model that supports function calling, like a Gemini 1.5 model
model := client.GenerativeModel("gemini-1.5-flash")

// Specify the function declaration.
model.Tools = []*genai.Tool{currencyExchangeTool}

Étape 4: Générez un appel de fonction

Vous pouvez maintenant envoyer une requête au modèle avec la fonction définie.

La méthode recommandée pour utiliser les appels de fonction consiste à passer par l'interface de chat, car les appels de fonction s'intègrent parfaitement à la structure multitours du chat.

// Start new chat session.
session := model.StartChat()

prompt := "How much is 50 US dollars worth in Swedish krona?"

// Send the message to the generative model.
resp, err := session.SendMessage(ctx, genai.Text(prompt))
if err != nil {
    log.Fatalf("Error sending message: %v\n", err)
}

// Check that you got the expected function call back.
part := resp.Candidates[0].Content.Parts[0]
funcall, ok := part.(genai.FunctionCall)
if !ok {
    log.Fatalf("Expected type FunctionCall, got %T", part)
}
if g, e := funcall.Name, currencyExchangeTool.FunctionDeclarations[0].Name; g != e {
    log.Fatalf("Expected FunctionCall.Name %q, got %q", e, g)
}
fmt.Printf("Received function call response:\n%q\n\n", part)

apiResult := map[string]any{
    "base":  "USD",
    "date":  "2024-04-17",
    "rates": map[string]any{"SEK": 0.091}}

// Send the hypothetical API result back to the generative model.
fmt.Printf("Sending API result:\n%q\n\n", apiResult)
resp, err = session.SendMessage(ctx, genai.FunctionResponse{
    Name:     currencyExchangeTool.FunctionDeclarations[0].Name,
    Response: apiResult,
})
if err != nil {
    log.Fatalf("Error sending message: %v\n", err)
}

// Show the model's response, which is expected to be text.
for _, part := range resp.Candidates[0].Content.Parts {
    fmt.Printf("%v\n", part)
}