A chamada de função facilita a geração de saídas de dados estruturados de modelos generativos. É possível 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 a conectar modelos generativos a sistemas externos para que o conteúdo gerado inclua as informações mais atualizadas e precisas.
É possível fornecer descrições de funções aos modelos do Gemini. Essas são funções que você escreve no idioma do seu app, ou seja, elas não são funções do Google Cloud. O modelo pode pedir que você chame uma função e envie de volta o resultado para ajudar o modelo a processar sua consulta.
Se ainda não fez isso, confira a Introdução à chamada de função para saber mais.
Exemplo de API para controle de iluminação
Imagine que você tem um sistema básico de controle de iluminação com uma interface de programação de aplicativos (API) e quer permitir que os usuários controlem as luzes por meio de solicitações de texto simples. Você pode usar o recurso de chamada de função para interpretar solicitações de mudança de iluminação dos usuários e traduzi-las em chamadas de API para definir os valores de iluminação. Esse sistema hipotético de controle de iluminação permite controlar o brilho da luz e a temperatura de cor, definidos como dois parâmetros separados:
Parâmetro | Tipo | Obrigatório | Descrição |
---|---|---|---|
brightness |
number | sim | Nível de luz de 0 a 100. Zero é desligado e 100 é o brilho máximo. |
colorTemperature |
string | sim | Temperatura de cor do dispositivo de iluminação, que pode ser daylight , cool ou warm . |
Para simplificar, esse sistema de iluminação imaginário tem apenas uma luz, para que o usuário não precise especificar um cômodo ou local. Confira um exemplo de solicitação JSON que pode ser enviada à API de controle de iluminação para mudar o nível de luz para 50% usando a temperatura de cor do dia:
{
"brightness": "50",
"colorTemperature": "daylight"
}
Este tutorial mostra como configurar uma chamada de função para a API Gemini para interpretar as solicitações de iluminação dos usuários e mapeá-las para as configurações da API para controlar os valores de brilho e temperatura de cor de uma luz.
Antes de começar: configure o projeto e a chave de API
Antes de chamar a API Gemini, você precisa configurar seu projeto e a 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 seu aplicativo, mas pode chamar serviços ou APIs fora dele. A API Gemini não chama essa função diretamente. Assim, você pode controlar como e quando ela é executada pelo código do aplicativo. 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 ao modelo generativo. Ao declarar uma função para uso pelo modelo, inclua o máximo de detalhes possível nas descrições da função e do parâmetro. 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 abaixo mostra como declarar 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
Quando você quer usar a chamada de função com um modelo, é necessário fornecer as
declarações de função ao inicializar o objeto do modelo. Para declarar funções,
defina 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 de função, você pode solicitar
o modelo com a função definida. Use chamadas de função com
comandos de chat (SendMessage()
), já que as chamadas de função geralmente se beneficiam
do 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)
}