Ferramentas para LLMs
O que “Ferramentas para LLMs” Significa
Ferramentas para LLMs (LLM tooling) é o conjunto de sistemas e bibliotecas usados para construir, executar e operar aplicações impulsionadas por modelos de linguagem de grande porte (large language models, LLMs). Em comparação com aplicações “clássicas” de aprendizado de máquina (machine learning, ML), aplicações de LLM tendem a ser:
- Pesadas em composição (composition-heavy): instruções (prompts) + recuperação (retrieval) + ferramentas + saída estruturada (structured output) + pós-processamento (post-processing)
- Sensíveis a latência e custo (latency- and cost-sensitive): cada token (token) custa dinheiro e tempo
- Sensíveis a segurança e confiabilidade (safety- and reliability-sensitive): a saída é probabilística e pode ser insegura ou errada
- Centradas em dados de novas maneiras: recuperação sobre corpus privados (private corpora), gestão de instruções/versões (prompt/version management), avaliação por cenários (evaluation-by-scenarios)
Este artigo se concentra em três pilares:
- Bancos de dados vetoriais (vector databases) (busca semântica e recuperação)
- Frameworks de orquestração (orchestration frameworks) (cadeias (chains), agentes (agents), fluxos de trabalho (workflows))
- Infraestrutura de aplicações de LLMs (LLM application infrastructure) (serving, observabilidade (observability), avaliação, governança (governance))
Ao longo do caminho, vamos nos conectar a tópicos relacionados do ecossistema, como Harnesses de Avaliação, Ferramentas de Experimentos, Dados, Hubs e Registros de Modelos, Modelos Abertos e Licenças e Frameworks.
Por que as Ferramentas Importam: de “Instrução” a “Produto”
Uma demonstração mínima de LLM pode ser apenas “enviar instrução → receber resposta”. Sistemas em produção geralmente adicionam:
- Recuperação sobre documentos internos (Geração Aumentada por Recuperação (Retrieval-Augmented Generation, RAG))
- Chamada de ferramentas (tool calling) (bancos de dados, web, sistemas de tickets, execução de código)
- Estado (memória de conversa, estado do fluxo de trabalho, contexto do usuário)
- Barreiras de segurança (guardrails) (verificações de política, redação de PII, tratamento de recusas)
- Avaliação e monitoramento (qualidade, deriva, alucinações, custo)
- Implantação (deployment) (roteamento, escalonamento, cache, fallbacks)
O ecossistema de “ferramentas para LLMs” existe para tornar essas adições confiáveis e fáceis de manter.
Fundamentos Conceituais
LLMs como Programas Probabilísticos (Probabilistic Programs)
Modelos de linguagem de grande porte (tipicamente baseados na Arquitetura Transformer) geram tokens modelando (p(\text{token} \mid \text{context})). Isso tem duas implicações práticas:
- Não determinismo (non-determinism): mesmo com a mesma instrução, as saídas podem variar.
- Lacuna de especificação (specification gap): você não consegue “testar unitariamente” linguagem natural do jeito que testa código puro.
As ferramentas lidam com isso ao viabilizar saídas estruturadas, ancoragem por recuperação, rastreamento (tracing) e harnesses de avaliação.
Embeddings e Similaridade Semântica
Muitas aplicações de LLM dependem de representações vetoriais (embeddings): vetores que representam o significado de um texto. Com representações vetoriais, você pode encontrar trechos de texto “similares” a uma consulta usando métricas de distância como a similaridade do cosseno (cosine similarity).
Representações vetoriais habilitam:
- Busca semântica (“encontrar documentos sobre política de PTO mesmo que a formulação da consulta seja diferente”)
- Geração Aumentada por Recuperação
- Agrupamento, deduplicação, recomendação
Bancos de dados vetoriais tornam representações vetoriais utilizáveis em escala.
Bancos de Dados Vetoriais
Um banco de dados vetorial armazena vetores (representações vetoriais) e oferece busca do vizinho mais próximo (nearest neighbor search) rápida — muitas vezes com filtragem por metadados e ranqueamento híbrido (hybrid ranking).
Quais Problemas Bancos de Dados Vetoriais Resolvem
Se você tem 1 milhão de segmentos de texto (text chunks) e quer os 10 mais similares a uma representação vetorial de consulta, a força bruta é lenta. Bancos de dados vetoriais usam índices especializados para tornar isso rápido o suficiente para aplicações interativas.
Fluxo típico de RAG:
- Dividir documentos em segmentos
- Calcular representações vetoriais para cada segmento
- Armazenar vetores + texto + metadados em um banco de dados vetorial
- No momento da consulta:
- gerar a representação vetorial da consulta
- recuperar os top-k segmentos similares
- passar os segmentos para o modelo de linguagem de grande porte como contexto
Este é um padrão central em Geração Aumentada por Recuperação.
Conceitos-Chave
Métricas de distância
Medidas comuns de similaridade:
- Similaridade do cosseno (cosine similarity): compara o ângulo entre vetores (comum para representações vetoriais normalizadas)
- Produto escalar (dot product): muitas vezes equivalente ao cosseno se os vetores estiverem normalizados
- Distância euclidiana (Euclidean distance): distância geométrica
Escolha o que o seu modelo de representações vetoriais recomendar.
Vizinho Mais Próximo Aproximado (Approximate Nearest Neighbor, ANN)
A maioria dos sistemas reais usa busca de vizinho mais próximo aproximado, trocando uma quantidade mínima de precisão por grandes ganhos de velocidade. Famílias comuns de índices:
- HNSW (Hierarchical Navigable Small World graphs): ótimo trade-off de latência/recall, amplamente usado
- IVF (Inverted File Index): particiona o espaço vetorial; pode ser combinado com compressão
- PQ (Product Quantization): comprime vetores para reduzir memória
Essas escolhas importam para latência, memória e revocação (recall).
Filtragem por metadados
A recuperação prática frequentemente precisa de restrições:
- tenant_id = “acme-corp”
- doc_type = “policy”
- created_at dentro dos últimos 90 dias
- permissões de ACL/usuário
Um bom banco de dados vetorial suporta filtragem rápida sem destruir a qualidade da recuperação.
Busca híbrida e reclassificação
A similaridade semântica por si só pode perder correspondências exatas. Muitos sistemas combinam:
- BM25 / busca por palavras-chave (keyword search) (correspondência lexical)
- Busca vetorial (vector search) (correspondência semântica)
- Reclassificação (reranking) (codificador cruzado (cross-encoder) ou baseada em LLM) para a ordenação final
Isso é comum em busca corporativa e em RAG de alta precisão.
Opções Comuns de Armazenamento Vetorial
Na prática, “banco de dados vetorial” pode significar:
- BDs vetoriais dedicados: Pinecone, Weaviate, Milvus, Qdrant
- Mecanismos de busca com vetores: Elasticsearch/OpenSearch, Vespa
- Extensões de BD relacional: PostgreSQL + pgvector (popular para pilhas mais simples)
A seleção depende de escala, restrições operacionais, necessidades de recursos (filtragem, multilocação (multitenancy)) e a infraestrutura padrão da sua organização.
Exemplo Prático: Índice + Consulta RAG Minimalistas (Python)
Abaixo está um exemplo simplificado usando uma interface genérica de armazenamento vetorial (vector store interface). Em sistemas reais, você conectaria um SDK do provedor (provider SDK) e um modelo de representações vetoriais.
from typing import List, Dict
import numpy as np
def cosine_sim(a: np.ndarray, b: np.ndarray) -> float:
a = a / (np.linalg.norm(a) + 1e-12)
b = b / (np.linalg.norm(b) + 1e-12)
return float(a @ b)
class TinyVectorStore:
def __init__(self):
self.items = [] # each: (id, vector, text, metadata)
def upsert(self, _id: str, vector: np.ndarray, text: str, metadata: Dict):
self.items.append((_id, vector, text, metadata))
def query(self, qvec: np.ndarray, k: int = 5, where: Dict = None):
where = where or {}
filtered = []
for _id, vec, text, md in self.items:
if all(md.get(key) == val for key, val in where.items()):
filtered.append((_id, vec, text, md))
scored = [(_id, cosine_sim(qvec, vec), text, md) for _id, vec, text, md in filtered]
scored.sort(key=lambda x: x[1], reverse=True)
return scored[:k]
# Example usage (pretend embed() gives real embedding vectors)
def embed(text: str) -> np.ndarray:
rng = np.random.default_rng(abs(hash(text)) % (2**32))
return rng.normal(size=(384,)).astype(np.float32)
store = TinyVectorStore()
store.upsert("doc1", embed("Company PTO policy and holidays"), "PTO policy ...", {"tenant": "acme", "type": "policy"})
store.upsert("doc2", embed("Expense reimbursement guidelines"), "Expenses ...", {"tenant": "acme", "type": "policy"})
store.upsert("doc3", embed("How to deploy the service"), "Deployment ...", {"tenant": "acme", "type": "engineering"})
q = "How many vacation days do we get?"
results = store.query(embed(q), k=2, where={"tenant": "acme", "type": "policy"})
for _id, score, text, md in results:
print(_id, score, md)
Implementações reais adicionam persistência, índices de vizinho mais próximo aproximado, controle de concorrência e verificações de controle de acesso.
Preocupações Operacionais para Recuperação Vetorial
- Estratégia de segmentação (chunking strategy): segmentos pequenos demais perdem contexto; segmentos grandes demais reduzem revocação e desperdiçam tokens.
- Escolha do modelo de representações vetoriais: modelos específicos de domínio podem superar os de propósito geral.
- Atualizações e exclusões: lidar com atualização de documentos e versionamento de representações vetoriais.
- Multilocação e listas de controle de acesso (Access Control Lists, ACLs): aplicar permissões no momento da recuperação, não apenas na interface.
- Monitoramento de deriva (drift monitoring): mudanças no conteúdo e nas consultas podem degradar a qualidade da recuperação ao longo do tempo.
Bancos de dados vetoriais são tão bons quanto o pipeline que os alimenta — frequentemente construído com ferramentas de dados abordadas em Dados.
Frameworks de Orquestração
Orquestração (orchestration) é como você constrói comportamentos de LLM em múltiplas etapas: recuperação, chamadas de ferramentas, ramificações, tentativas (retries), parsing estruturado e gestão de estado.
Dois Estilos Amplos: Cadeias e Agentes
Cadeias (workflows)
Uma cadeia é um pipeline majoritariamente determinístico:
- Normalizar a entrada do usuário
- Recuperar contexto
- Chamar o modelo de linguagem de grande porte com um template de instrução (prompt template)
- Fazer parsing de saída estruturada (por exemplo, JSON)
- Validar e executar lógica de negócio
Cadeias são mais fáceis de testar e monitorar.
Agentes (loops orientados por política)
Um agente decide o que fazer em seguida com base no estado atual:
- “Devo buscar? Qual ferramenta devo chamar? Devo pedir uma pergunta de esclarecimento?”
- Executa em loop até atingir um objetivo ou bater um limite.
Agentes podem ser poderosos, mas são mais difíceis de controlar e avaliar.
O que Frameworks de Orquestração Oferecem
Recursos comuns:
- Templates de instruções (prompt templating) e formatação de mensagens
- Wrappers de chamada de ferramentas/funções
- Componentes de recuperação (conectores para bancos de dados vetoriais)
- Abstrações de memória/estado (histórico de chat, estado de sessão)
- Parsing de saída estruturada (esquema JSON (JSON schema), validadores (validators))
- Políticas de repetição e fallback (retry/fallback policies) (por exemplo, trocar de modelo em falha)
- Execução assíncrona (async execution) e streaming de tokens (streaming tokens)
- Hooks de rastreamento para observabilidade
Exemplos no ecossistema incluem LangChain, LlamaIndex, Haystack, Semantic Kernel e motores de workflow que integram chamadas a modelos de linguagem de grande porte.
Exemplo Prático: Um Padrão Simples de “Cadeia RAG”
Abaixo está um esboço intencionalmente agnóstico a frameworks. Ele destaca interfaces que você vai querer independentemente da biblioteca escolhida.
from dataclasses import dataclass
from typing import List, Dict
@dataclass
class RetrievedChunk:
text: str
source: str
def retrieve(query: str) -> List[RetrievedChunk]:
# query vector DB + rerank
return [
RetrievedChunk(text="PTO policy: Full-time employees get 20 days/year ...", source="handbook.pdf#p12"),
RetrievedChunk(text="Carry-over rules: up to 5 days ...", source="handbook.pdf#p13"),
]
def build_prompt(question: str, chunks: List[RetrievedChunk]) -> str:
context = "\n\n".join([f"[{c.source}]\n{c.text}" for c in chunks])
return f"""You are an HR assistant. Answer using only the provided sources.
If the answer is not in sources, say you don't know.
Question: {question}
Sources:
{context}
"""
def call_llm(prompt: str) -> str:
# call an LLM API or local model server
return "Full-time employees receive 20 PTO days per year, with up to 5 days carry-over. [handbook.pdf#p12][handbook.pdf#p13]"
def answer_question(question: str) -> str:
chunks = retrieve(question)
prompt = build_prompt(question, chunks)
return call_llm(prompt)
print(answer_question("How many PTO days do I get and can I carry them over?"))
Em um framework de produção, cada etapa seria um componente com tentativas, métricas e rastreamentos.
Chamada de Ferramentas e Saídas Estruturadas
Plataformas modernas de LLMs suportam “chamada de função (function calling)” / “chamada de ferramentas (tool calling)”, em que o modelo emite uma requisição estruturada como:
{ "tool": "lookup_invoice", "arguments": { "invoice_id": "INV-10291" } }
Frameworks de orquestração gerenciam:
- registro de ferramentas e esquemas
- validação de argumentos
- execução e tratamento de erros
- devolução de resultados ao modelo
- limitação de acesso às ferramentas (segurança)
Saídas estruturadas reduzem parsing frágil e tornam modelos de linguagem de grande porte mais confiáveis dentro de sistemas de software.
Testando Orquestrações
Orquestração de LLM é engenharia de software: você quer testes unitários, testes de integração e testes por cenário.
Boas práticas incluem:
- Casos de teste de referência (golden test cases) para instruções representativas
- Mocking de ferramentas (mocking tools) para isolar falhas
- Controles de determinismo (determinism controls) (temperatura (temperature), sementes fixas (fixed seeds) quando suportado)
- Suites de avaliação integradas com Harnesses de Avaliação
Infraestrutura de Aplicações de LLMs
“Infraestrutura de LLM” cobre tudo o que é necessário para executar recursos de LLM com confiabilidade em produção.
Servir Modelos: API vs Auto-hospedagem
Dois caminhos comuns de implantação:
APIs gerenciadas de modelos (managed model APIs) (por exemplo, provedores de LLM hospedados, plataformas de modelos na nuvem)
- Prós: começo rápido, alta confiabilidade, atualizações contínuas do modelo
- Contras: preocupações de governança de dados, custo recorrente, dependência de fornecedor
Inferência auto-hospedada (self-hosted inference) (modelos com pesos abertos (open-weight models) nas suas GPUs)
- Prós: controle de dados, potencialmente menor custo marginal em escala, customização
- Contras: operação de GPUs, complexidade de escalonamento, trabalho de otimização de modelos
Essa escolha interage com Modelos Abertos e Licenças e Hubs e Registros de Modelos.
Componentes comuns de serving incluem:
- Servidores de modelos (model servers) (por exemplo, vLLM, TGI, TensorRT-LLM)
- Balanceadores de carga (load balancers) e autoescalonamento (autoscaling)
- Loteamento/enfileiramento (batching/queueing) para vazão (throughput)
- Suporte a streaming para UX de chat
Gateways, Roteamento e Fallbacks
Pilhas de produção frequentemente introduzem um gateway de LLM (LLM gateway):
- Padroniza chamadas de API entre provedores/modelos
- Aplica autenticação (auth), limites de taxa (rate limits) e cotas (quotas)
- Acompanha custo e uso de tokens
- Implementa regras de roteamento:
- “Usar modelo mais barato para sumarização”
- “Usar modelo mais forte para jurídico ou geração de código”
- “Usar fallback se houver timeout ou recusa por segurança”
O roteamento pode ser dinâmico (com base em latência/custo) ou semântico (com base em classificação de tarefas (task classification)).
Cache: O Token Mais Barato É Aquele Que Você Não Gera
Cache (caching) pode reduzir drasticamente custo/latência:
- Cache de instrução+resposta (prompt+response cache) (correspondência exata (exact match))
- Cache semântico (semantic cache) (reutiliza respostas para consultas similares usando representações vetoriais)
- Cache de recuperação (retrieval cache) (cache dos top-k segmentos recuperados)
- Cache de resultados de ferramentas (tool result cache) (por exemplo, consultas caras ao banco de dados)
Tenha cuidado com:
- privacidade (não vazar respostas em cache entre locatários)
- obsolescência (invalidar quando os dados subjacentes mudarem)
Observabilidade: Rastros, Métricas e Logs
A observabilidade de LLMs é mais ampla do que logs típicos de web. Sinais úteis incluem:
- instrução e resposta (frequentemente redigidas ou com hash)
- contagem de tokens, decomposição de latência (recuperação vs geração)
- rastros de chamadas de ferramentas (argumentos, erros)
- sinais de qualidade de recuperação (quais documentos foram usados)
- taxas de recusa, flags de segurança
- sinais de feedback do usuário (“joinha para cima/baixo”)
Muitas equipes instrumentam com rastreamento no estilo OpenTelemetry mais ferramentas especializadas de monitoramento de LLM.
Barreiras de Segurança e Controles de Segurança
Barreiras de segurança podem ser aplicadas em múltiplas etapas:
- Filtragem de entrada (input filtering): detectar injeção de prompt (prompt injection), PII, violações de política
- Restrições de recuperação: aplicação de ACL, filtragem de documentos sensíveis
- Validação de saída:
- validação de esquema JSON para saídas estruturadas
- checagens de alucinação (por exemplo, exigir citações)
- classificadores de política (policy classifiers) para conteúdo proibido
- Isolamento em sandbox de ferramentas (tool sandboxing): restringir acesso a sistema de arquivos/rede para ferramentas de código
Nenhuma barreira de segurança é perfeita; defesas em camadas são o padrão.
Avaliação no Loop
Como o comportamento de LLM muda com instruções, recuperação e versões do modelo, a avaliação precisa ser contínua:
- Avaliação offline (offline evaluation): testes de regressão em conjuntos de dados curados
- Monitoramento online (online monitoring): detecção de deriva, feedback de usuários, triagem de falhas
- Testes A/B (A/B tests): comparar instruções, recuperadores, reclassificadores e modelos
As ferramentas frequentemente se conectam a Ferramentas de Experimentos para rastrear versões de instruções, conjuntos de dados e métricas, e a Harnesses de Avaliação para benchmarking repetível.
Pipelines de Dados para RAG
RAG requer pipelines de ingestão (ingestion pipelines):
- conectores (Google Drive, Confluence, SharePoint, S3, bancos de dados)
- parsing (parsing) (PDF/HTML), reconhecimento óptico de caracteres (OCR) quando necessário
- segmentação e enriquecimento de metadados (metadata enrichment)
- geração de representações vetoriais e indexação (indexing)
- agendamento de atualizações (refresh scheduling) e exclusões
Isso se sobrepõe à engenharia de dados clássica coberta em Dados e à distribuição de conjuntos de dados em Conjuntos de Dados e Hospedagem.
Juntando Tudo: Uma Arquitetura de Referência
Uma aplicação típica de LLM (por exemplo, “assistente interno de conhecimento”) se parece com isto:
- Cliente/UI (aplicativo web, bot do Slack)
- Backend de API
- Orquestrador (cadeia/agente) que:
- chama o recuperador (banco de dados vetorial + filtros + reclassificador)
- chama o modelo de linguagem de grande porte (via gateway)
- chama ferramentas (ticketing, CRM, bancos de dados)
- Banco de dados vetorial contendo representações vetoriais + metadados
- Armazenamento de documentos (documentos originais)
- Observabilidade (rastreamento, logs, métricas)
- Pipeline de avaliação (regressão offline + monitoramento online)
Essa separação mantém as responsabilidades administráveis: a qualidade de recuperação pode ser melhorada sem mudar a hospedagem do modelo, e trocas de modelo podem ocorrer sem reescrever a ingestão.
Como Escolher Ferramentas (Orientação Prática)
Checklist de seleção de banco de dados vetorial
- Qualidade de recuperação: método de vizinho mais próximo aproximado, busca híbrida, integrações de reclassificação
- Filtragem: velocidade e expressividade (consultas por intervalo, filtros booleanos)
- Padrões de multilocação e ACL
- Modelo operacional: gerenciado vs auto-hospedado
- Metas de latência/vazão e tempos de construção do índice
- Modelo de custos (armazenamento, consultas, réplicas)
Checklist de seleção de framework de orquestração
- Adequação ao seu estilo: workflows determinísticos vs loops agentivos
- Ergonomia de chamada de ferramentas e saída estruturada
- Facilidade de depuração: rastros, inspeção de etapas intermediárias
- Conectores do ecossistema (armazenamentos vetoriais, carregadores de documentos, serviços de nuvem)
- Testabilidade: mocking fácil e execuções reprodutíveis
- Risco de manutenção: estabilidade de API, suporte da comunidade
Checklist de seleção de infraestrutura
- Governança de dados: onde instruções e documentos são processados/armazenados
- Necessidades de confiabilidade: fallbacks, SLAs, limitação de taxa
- Segurança: gestão de segredos, sandboxing, logs de auditoria
- Controles de custo: cache, roteamento, batching
- Maturidade de avaliação: suíte de regressão + monitoramento
Modos de Falha Comuns (e Respostas das Ferramentas)
- Alucinações (hallucinations): mitigue com RAG, citações, engenharia de instruções (prompting) mais rígida, validadores de saída e conjuntos de avaliação direcionados.
- Injeção de prompt: isole texto não confiável, use filtragem de entrada, restrinja acesso a ferramentas e aplique verificações de política.
- Recuperação ruim: melhore segmentação, adicione busca híbrida, reclassificadores, metadados e avalie recuperação separadamente da geração.
- Picos de latência: adicione cache, batching, modelos menores para tarefas simples e timeouts com fallbacks graduais.
- Regressões silenciosas: integre avaliação contínua e versionamento de instruções/modelos (veja Ferramentas de Experimentos).
Resumo
Ferramentas para LLMs são a camada prática que transforma um modelo generativo poderoso em um sistema confiável:
- Bancos de dados vetoriais tornam a recuperação semântica rápida e escalável, habilitando RAG e aplicações ancoradas em conhecimento.
- Frameworks de orquestração gerenciam comportamento em múltiplas etapas (recuperação, chamadas de ferramentas, ramificações, tentativas) e tornam aplicações de LLM mais fáceis de manter.
- Infraestrutura de aplicações de LLMs fornece os “essenciais de produção”: serving, roteamento, cache, observabilidade, avaliação e controles de segurança.
À medida que as capacidades de LLM evoluem, essas ferramentas definem cada vez mais o desempenho no mundo real: não apenas qual modelo você usa, mas quão bem você recupera dados, restringe comportamento, mede qualidade e opera o sistema ao longo do tempo.