TL;DR: Function Calling permite que modelos de IA interajam com código personalizado e serviços externos, possibilitando acesso a dados em tempo real e execução de ações específicas através de um processo em que o modelo decide quando chamar funções definidas pelo usuário, executa-as com argumentos apropriados e incorpora os resultados em suas respostas.
Takeaways:
- O Function Calling resolve dois desafios principais: acesso a dados atualizados (RAG) e execução de ações como envio de emails ou agendamentos.
- A implementação segue quatro etapas: definir funções disponíveis, chamar o modelo com essas definições, processar a resposta executando a função e enviar os resultados de volta ao modelo.
- É recomendado manter descrições claras e detalhadas, aplicar princípios de engenharia de software e limitar o número de funções para aumentar a precisão.
- Configurações adicionais como tool_choice, chamadas paralelas, modo estrito e streaming oferecem maior controle sobre como o modelo utiliza as funções.
- As definições de função contam como tokens de entrada e devem ser otimizadas para evitar atingir limites de contexto.
Function Calling: Como Integrar Modelos de IA com Seu Código e Serviços Externos
Você já se perguntou como fazer com que modelos de IA interajam diretamente com suas aplicações e serviços? Como obter dados em tempo real ou executar ações específicas sem precisar reescrever toda a lógica da sua aplicação? O Function Calling é a resposta para essas questões, permitindo que você conecte o poder dos modelos de linguagem com seu código personalizado de forma elegante e eficiente.
Neste artigo, vamos explorar como implementar Function Calling para permitir que modelos de IA como GPT-4 interajam com seu código, expandindo drasticamente as possibilidades de suas aplicações de IA.
O Que é Function Calling e Por Que Você Deveria Se Importar
Function Calling é uma capacidade que permite que modelos de IA da OpenAI interajam com seu código personalizado ou serviços externos. Em vez de apenas gerar texto, o modelo pode decidir quando chamar funções específicas, determinar quais argumentos usar e incorporar os resultados em suas respostas.
Esta funcionalidade resolve dois desafios fundamentais:
- Acesso a dados atualizados (RAG): Permite que o modelo busque informações em tempo real, como previsões meteorológicas, cotações de ações ou dados de usuários.
- Execução de ações: Possibilita que o modelo execute operações como enviar e-mails, agendar compromissos ou atualizar registros em um banco de dados.
O processo funciona assim:
- Você define funções que o modelo pode chamar
- O modelo decide quando e como chamar essas funções
- Você executa o código da função com os argumentos fornecidos
- O resultado é enviado de volta ao modelo, que o incorpora em sua resposta final
Como Definir Funções para Seu Modelo de IA
As funções são definidas usando um esquema JSON que informa ao modelo o que a função faz e quais argumentos de entrada ela espera. Cada função deve incluir:
- name: O nome da função (ex:
get_weather
) - description: Descrição detalhada sobre quando e como usar a função
- parameters: Esquema JSON definindo os argumentos de entrada da função
Veja um exemplo de definição de função:
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Obter a temperatura atual para uma localização específica.",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Cidade e país, ex: São Paulo, Brasil"
},
"units": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "Unidade de temperatura"
}
},
"required": ["location"],
"additionalProperties": False
},
"strict": True
}
}]
Esta definição cria uma função get_weather
que espera um parâmetro obrigatório location
e um parâmetro opcional units
. A descrição detalhada ajuda o modelo a entender quando e como usar esta função.
Para simplificar a criação dessas definições, as SDKs da OpenAI oferecem helpers para converter objetos pydantic
(Python) ou zod
(JavaScript) em esquemas de função, embora nem todos os recursos sejam suportados.
Passo a Passo para Implementar Function Calling
A implementação do Function Calling segue quatro etapas principais:
1. Definir as funções disponíveis
Primeiro, você precisa definir as funções que o modelo poderá chamar, como no exemplo anterior.
2. Chamar o modelo com as definições de função
Em seguida, envie sua solicitação ao modelo incluindo as definições de função:
from openai import OpenAI
client = OpenAI()
completion = client.chat.completions.create(
model="gpt-4.1",
messages=[{"role": "user", "content": "Como está o clima em Paris hoje?"}],
tools=tools
)
3. Processar a resposta e executar a função
O modelo retornará o nome da função a ser chamada e os argumentos necessários:
tool_calls = completion.choices[0].message.tool_calls
if tool_calls:
# Extrair a chamada da função
function_call = tool_calls[0].function
function_name = function_call.name
function_args = json.loads(function_call.arguments)
# Executar a função
if function_name == "get_weather":
result = get_weather(function_args["location"], function_args.get("units", "celsius"))
4. Enviar os resultados de volta ao modelo
Por fim, envie os resultados da função de volta ao modelo para que ele possa incorporá-los em sua resposta final:
messages = [
{"role": "user", "content": "Como está o clima em Paris hoje?"},
completion.choices[0].message,
{
"role": "tool",
"tool_call_id": tool_calls[0].id,
"name": function_name,
"content": result
}
]
final_response = client.chat.completions.create(
model="gpt-4.1",
messages=messages
)
print(final_response.choices[0].message.content)
# Saída: "A temperatura atual em Paris é de 14°C."
Melhores Práticas para Definir Funções Eficientes
Para garantir que o modelo use suas funções corretamente, siga estas práticas recomendadas:
1. Clareza e Detalhamento
Escreva nomes de funções, descrições de parâmetros e instruções claras e detalhadas. Quanto mais informações você fornecer, melhor o modelo entenderá quando e como usar a função.
2. Aplique Princípios de Engenharia de Software
- Use enums para restringir valores a um conjunto predefinido
- Estruture objetos para evitar estados inválidos
- Mantenha as funções simples e com responsabilidade única
3. Descarregue a Complexidade para o Código
Em vez de fazer o modelo lidar com lógica complexa, simplifique as funções e implemente a complexidade no seu código. Por exemplo, em vez de pedir ao modelo para formatar coordenadas geográficas, crie uma função que aceite nomes de cidades e faça a conversão internamente.
4. Limite o Número de Funções
Mantenha o número de funções pequeno (idealmente menos de 20) para aumentar a precisão. Muitas funções podem confundir o modelo sobre qual deve ser usada.
5. Use o Playground para Iteração
O Playground da OpenAI é uma ferramenta excelente para testar e refinar suas definições de função antes de implementá-las em produção.
Gerenciando o Uso de Tokens e Limites
As definições de função são inseridas na mensagem do sistema e contam contra o limite de contexto do modelo. Elas também são cobradas como tokens de entrada. Para otimizar o uso de tokens:
- Limite o número de funções disponíveis em cada solicitação
- Mantenha as descrições concisas, mas informativas
- Considere o fine-tuning para casos com muitas funções, o que pode reduzir o número de tokens necessários
Se você atingir os limites de token, considere reduzir o número de funções ou o tamanho das descrições.
Gerenciando Chamadas de Função Múltiplas
O modelo pode chamar múltiplas funções em uma única resposta. Cada chamada de função inclui:
- id: Identificador único para a chamada
- name: Nome da função a ser chamada
- arguments: Argumentos codificados em JSON
Para processar múltiplas chamadas de função, itere sobre a lista tool_calls
e execute cada função adequadamente:
for tool_call in tool_calls:
function_call = tool_call.function
function_name = function_call.name
function_args = json.loads(function_call.arguments)
# Executar a função apropriada
result = call_function(function_name, function_args)
# Adicionar o resultado às mensagens
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"name": function_name,
"content": result
})
O resultado de cada função deve ser formatado como uma string, mas o formato específico (JSON, texto simples, etc.) fica a seu critério. O modelo interpretará essa string conforme necessário.
Configurações Adicionais para Maior Controle
Além das definições básicas, você pode usar configurações adicionais para controlar como o modelo utiliza as funções:
1. Tool Choice
O parâmetro tool_choice
permite controlar se o modelo usa funções automaticamente, requer funções ou força uma função específica:
# Automático (padrão)
tool_choice="auto"
# Força o uso de uma função específica
tool_choice={"type": "function", "function": {"name": "get_weather"}}
# Não usar nenhuma função
tool_choice="none"
2. Chamadas Paralelas
Por padrão, o modelo pode chamar múltiplas funções em paralelo. Você pode desativar isso com:
parallel_tool_calls=False
3. Modo Estrito
O modo estrito garante que as chamadas de função sigam rigorosamente o esquema definido:
"strict": True
Quando habilitado, o modo estrito requer que:
additionalProperties
seja definido comofalse
- Todos os campos em
properties
sejam marcados comorequired
4. Streaming
O streaming permite exibir o progresso das chamadas de função em tempo real:
stream = client.chat.completions.create(
model="gpt-4.1",
messages=[{"role": "user", "content": "Como está o clima em Paris hoje?"}],
tools=tools,
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.tool_calls:
# Processar chunk da chamada de função
print(chunk.choices[0].delta.tool_calls)
Conclusão: Expandindo os Horizontes da IA com Function Calling
O Function Calling representa um avanço significativo na forma como interagimos com modelos de IA, permitindo a criação de aplicações mais poderosas e úteis. Ao conectar a capacidade generativa dos modelos de linguagem com a execução de código real, você pode:
- Criar assistentes virtuais que acessam dados em tempo real
- Automatizar fluxos de trabalho complexos
- Integrar modelos de IA com sistemas existentes
- Desenvolver ferramentas que combinam raciocínio de IA com ações concretas
À medida que a tecnologia evolui, espera-se que o Function Calling se torne ainda mais sofisticado, suportando interações mais complexas e personalizadas, e abrindo novas possibilidades para aplicações de IA em diversos domínios.
Comece a experimentar o Function Calling hoje e descubra como ele pode transformar suas aplicações de IA de simples geradores de texto em poderosos agentes capazes de interagir com o mundo real.
Fonte: OpenAI. “Function Calling: Habilitando modelos a interagir com seu código e serviços externos”. Disponível em: https://platform.openai.com/docs/guides/function-calling.