Extra Inteligencia Artificial • Trilha Progressiva em 4 Níveis


🧭 Navegação Pedagógica


🎯 Nível 1: Fundamentos

Problema 07.1 — Parser de Chamada de Função a partir de JSON de LLM

Contexto: Parser de Chamada de Função a partir de JSON de LLM no contexto de Tool Use e Function Calling em LLMs.

Requisitos de Execução:

  1. Escrever extrator que interprete o objeto tool_call gerado por LLM e separe nome da função e argumentos.

Resultado Esperado

Tool Detectada: 'consultar_cotacao'
Argumentos: {'moeda': 'USD', 'base': 'BRL'}

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_1_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Tool Use e Function Calling em LLMs
🔑 Gabarito de Código & Solução Comentada
# function_call_parser.py
import json

def parse_tool_call(payload_json_str):
    dados = json.loads(payload_json_str)
    nome = dados.get("name")
    args = dados.get("arguments", {})
    if not nome: raise ValueError("Chamada de ferramenta sem nome")
    return nome, args

resposta_llm = '{"name": "consultar_cotacao", "arguments": {"moeda": "USD", "base": "BRL"}}'
nome_tool, argumentos = parse_tool_call(resposta_llm)
print(f"Tool Detectada: '{nome_tool}'")
print(f"Argumentos    : {argumentos}")

🔍 Nível 2: Prática

Problema 07.2 — Dispatcher de Ferramentas com Decorador @tool

Contexto: Dispatcher de Ferramentas com Decorador @tool no contexto de Tool Use e Function Calling em LLMs.

Requisitos de Execução:

  1. Criar registro centralizado de ferramentas com decorador Python e validação de existência.

Resultado Esperado

Executando ferramenta 'somar' -> Resultado: 42

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_2_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Tool Use e Function Calling em LLMs
🔑 Gabarito de Código & Solução Comentada
# tool_dispatcher.py
REGISTRO_TOOLS = {}

def tool(nome):
    def decorador(func):
        REGISTRO_TOOLS[nome] = func
        return func
    return decorador

@tool("somar")
def somar_numeros(a, b): return a + b

@tool("multiplicar")
def mult_numeros(a, b): return a * b

def despachar(nome_tool, args):
    if nome_tool not in REGISTRO_TOOLS:
        raise KeyError(f"Ferramenta '{nome_tool}' não registrada")
    return REGISTRO_TOOLS[nome_tool](**args)

print("Resultado Tool:", despachar("somar", {"a": 20, "b": 22}))

⚡ Nível 3: Integração

Problema 07.3 — Orquestrador de Múltiplas Ferramentas em Paralelo

Contexto: Orquestrador de Múltiplas Ferramentas em Paralelo no contexto de Tool Use e Function Calling em LLMs.

Requisitos de Execução:

  1. Executar lista sequencial de tool calls (ex.: consultar saldo + consultar extrato) e agregar respostas em formato de observação para a LLM.

Resultado Esperado

2 ferramentas executadas com sucesso.
Observações agregadas: {'get_saldo': 1500, 'get_status': 'ATIVO'}

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_3_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Tool Use e Function Calling em LLMs
🔑 Gabarito de Código & Solução Comentada
# multi_tool_orchestrator.py
def get_saldo(conta_id): return 1500.0
def get_status(conta_id): return "CONTA_ATIVA"

catalogo = {"get_saldo": get_saldo, "get_status": get_status}

def orquestrar_chamadas(chamadas):
    resultados = {}
    for c in chamadas:
        fn = catalogo.get(c["name"])
        if fn:
            resultados[c["name"]] = fn(**c["args"])
    return resultados

chamadas_mock = [
    {"name": "get_saldo", "args": {"conta_id": 101}},
    {"name": "get_status", "args": {"conta_id": 101}}
]
print("Resultados Agregados:", orquestrar_chamadas(chamadas_mock))

🏆 Nível 4: Desafio Corporativo

Problema 07.4 — Validador Defensivo de Tipos de Argumentos em Tempo de Execução

Contexto: Validador Defensivo de Tipos de Argumentos em Tempo de Execução no contexto de Tool Use e Function Calling em LLMs.

Requisitos de Execução:

  1. Inspecionar as anotações de tipo dos parâmetros da função Python e validar se os tipos passados pela LLM são compatíveis antes de executar.

Resultado Esperado

Validação de Tipos: Parâmetro 'valor' (float) compatível | Parâmetro 'moeda' (str) compatível.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_4_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Tool Use e Function Calling em LLMs
🔑 Gabarito de Código & Solução Comentada
# tool_type_validator.py
import inspect

def transferir_fundos(valor: float, destino: str) -> bool:
    print(f"Transferindo R$ {valor:.2f} para {destino}")
    return True

def validar_e_executar(func, args):
    sig = inspect.signature(func)
    for param_name, param in sig.parameters.items():
        if param_name in args:
            tipo_esperado = param.annotation
            val = args[param_name]
            if tipo_esperado != inspect.Parameter.empty and not isinstance(val, tipo_esperado):
                raise TypeError(f"Argumento '{param_name}' deve ser {tipo_esperado.__name__}, recebido {type(val).__name__}")
    return func(**args)

args_validos = {"valor": 250.50, "destino": "chave_pix_123"}
validar_e_executar(transferir_fundos, args_validos)

⬅️ Voltar ao Índice de Exercícios 📚 Sumário de Tópicos