Tutorial sobre chamada de função

A chamada de função facilita o recebimento de saídas de dados estruturados de modelos generativos. Você pode usar essas saídas para chamar outras APIs e retornar os dados de resposta relevantes ao modelo. Em outras palavras, a chamada de função ajuda você conecta modelos generativos a sistemas externos para que o conteúdo gerado inclui as informações mais atualizadas e precisas.

É possível fornecer descrições de funções aos modelos do Gemini. São que você escreve na linguagem do app (ou seja, não são Google Cloud Functions). O modelo pode pedir que você chame uma função e retorne o resultado para ajudar o modelo a lidar com sua consulta.

Confira a Introdução à chamada de função para aprender mais.

Exemplo de API para controle de iluminação

Imagine que você tem um sistema básico de controle de iluminação com um aplicativo de programação interface de usuário (API) e quer permitir que os usuários controlem as luzes por meio de interfaces solicitações de texto. Use o recurso de chamada de função para interpretar a iluminação alterar solicitações de usuários e convertê-las em chamadas de API para definir a iluminação valores. Esse sistema hipotético de controle de iluminação permite controlar brilho da luz e sua temperatura da cor, definidas como dois elementos parâmetros:

Parâmetro Tipo Obrigatório Descrição
brightness number sim Nível de iluminação de 0 a 100. Zero é desativado e 100 é brilho total.
colorTemperature string sim A temperatura da cor da luminária, que pode ser daylight, cool ou warm.

Para simplificar, esse sistema de iluminação imaginário tem apenas uma luz, então o usuário não precisa especificar uma sala ou um local. Este é um exemplo de solicitação JSON você pode enviar à API de controle de iluminação para mudar o nível de luz para 50% usando a temperatura da cor da luz do dia:

{
  "brightness": "50",
  "colorTemperature": "daylight"
}

Neste tutorial, mostramos como configurar uma chamada de função para a API Gemini para interpretar solicitações de iluminação dos usuários e mapeá-las para as configurações da API para controlar uma o brilho da luz e os valores de temperatura da cor.

Antes de começar: configurar o projeto e a chave de API

Antes de chamar a API Gemini, você precisa definir seu projeto e configurar sua chave de API.

Definir uma função de API

Crie uma função que faça uma solicitação de API. Essa função precisa ser definida no código do aplicativo, mas podem chamar serviços ou APIs seu aplicativo. A API Gemini não chama essa função diretamente, então você pode controlar como e quando essa função é executada por meio do seu aplicativo o código-fonte é alterado. Para fins de demonstração, este tutorial define uma função de API simulada que retorna apenas os valores de iluminação solicitados:

func setLightValues(brightness int, colorTemp string) map[string]any {
    // This mock API returns the requested lighting values
    return map[string]any{
        "brightness":       brightness,
        "colorTemperature": colorTemp}
}

Criar uma declaração de função

Crie a declaração de função que você vai transmitir para o modelo generativo. Quando declarar uma função a ser usada pelo modelo, inclua o máximo de detalhes possível nas descrições de funções e parâmetros. O modelo generativo usa essas informações para determinar qual função selecionar e como fornecer valores para os parâmetros na chamada de função. O código a seguir mostra como declare a função de controle de iluminação:

lightControlTool := &genai.Tool{
    FunctionDeclarations: []*genai.FunctionDeclaration{{
        Name:        "controlLight",
        Description: "Set the brightness and color temperature of a room light.",
        Parameters: &genai.Schema{
            Type: genai.TypeObject,
            Properties: map[string]*genai.Schema{
                "brightness": {
                    Type:        genai.TypeString,
                    Description: "Light level from 0 to 100. Zero is off and"+
                        " 100 is full brightness.",
                },
                "colorTemperature": {
                    Type:        genai.TypeString,
                    Description: "Color temperature of the light fixture which" +
                        " can be `daylight`, `cool` or `warm`.",
                },
            },
            Required: []string{"brightness", "colorTemperature"},
        },
    }},
}

Declarar funções durante a inicialização do modelo

Para usar a chamada de função com um modelo, você precisa fornecer seu declarações de função quando você inicializa o objeto de modelo. Você declara funções definindo o parâmetro Tools do modelo:

// ...

lightControlTool := &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{lightControlTool}

Gerar uma chamada de função

Depois de inicializar o modelo com as declarações da função, é possível solicitar o modelo com a função definida. Use a chamada de função com comandos de chat (SendMessage()), já que a chamada de função geralmente se beneficia da ter o contexto de comandos e respostas anteriores.

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

prompt := "Dim the lights so the room feels cozy and warm."

// 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, lightControlTool.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{
    "brightness":  "30",
    "colorTemperature":  "warm" }

// 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:     lightControlTool.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)
}