Tutorial sobre chamada de função

A chamada de função facilita a geração 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. 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 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. 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 é desativado e 100 é brilho total.
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. Este é um exemplo de solicitação JSON você pode enviar à API de controle de iluminação para mudar o nível de iluminação 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 os valores de brilho e temperatura da cor da luz.

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. 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:

suspend fun setLightValues(
    brightness: Int,
    colorTemp: String
): JSONObject {
    // This mock API returns the requested lighting values
    return JSONObject().apply {
        put("brightness", brightness)
        put("colorTemperature", colorTemp)
    }
}

Criar declarações de função

Crie a declaração de função que você vai transmitir ao 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 abaixo mostra como declarar a função de controle de iluminação:

val lightControlTool = defineFunction(
  name = "setLightValues",
  description = "Set the brightness and color temperature of a room light.",
  Schema.int("brightness", "Light level from 0 to 100. Zero is off and 100" +
    " is full brightness."),
  Schema.str("colorTemperature", "Color temperature of the light fixture" +
    " which can be `daylight`, `cool` or `warm`.")
) { brightness, colorTemp ->
    // Call the function you declared above
    setLightValues(brightness.toInt(), colorTemp)
}

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:

val generativeModel = GenerativeModel(
    modelName = "gemini-1.5-flash",

    // Access your API key as a Build Configuration variable
    apiKey = BuildConfig.apiKey,

    // Specify the function declaration.
    tools = listOf(Tool(listOf(lightControlTool)))
)

Gerar uma chamada de função

Depois de inicializar o modelo com as declarações da função, é possível fazer o comando 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.

val chat = generativeModel.startChat()

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

// Send the message to the generative model
var response = chat.sendMessage(prompt)

// Check if the model responded with a function call
response.functionCall?.let { functionCall ->
  // Try to retrieve the stored lambda from the model's tools and
  // throw an exception if the returned function was not declared
  val matchedFunction = generativeModel.tools?.flatMap { it.functionDeclarations }
      ?.first { it.name == functionCall.name }
      ?: throw InvalidStateException("Function not found: ${functionCall.name}")

  // Call the lambda retrieved above
  val apiResponse: JSONObject = matchedFunction.execute(functionCall)

  // Send the API response back to the generative model
  // so that it generates a text response that can be displayed to the user
  response = chat.sendMessage(
    content(role = "function") {
        part(FunctionResponsePart(functionCall.name, apiResponse))
    }
  )
}

// Whenever the model responds with text, show it in the UI
response.text?.let { modelResponse ->
    println(modelResponse)
}