5. Novos Padrões de Design para IA¶
A engenharia de software para sistemas com IA generativa exige um novo vocabulário de padrões. Valliappa Lakshmanan e Hannes Hapke, em sua obra "Generative AI Design Patterns" (O'Reilly, 2024), catalogaram 32 padrões organizados em sete categorias 1. Este capítulo apresenta estes padrões e frameworks complementares que estruturam o design de aplicações com LLMs.
5.1 Framework de 32 Padrões¶
A experiência prática em construção de aplicações LLM reforça a importância destes padrões como ferramentas essenciais para superar desafios recorrentes 2.
1. Controle de Estilo de Conteúdo¶
Estes padrões governam como o output do modelo é formatado e estilizado:
Logits Masking: Técnica para restringir o vocabulário do modelo em tempo de inferência, forçando outputs em formatos específicos (ex: apenas código JSON válido).
# Exemplo conceitual de logits masking
from transformers import LogitsProcessor
class JSONLogitsProcessor(LogitsProcessor):
def __call__(self, input_ids, scores):
# Mascarar tokens que violariam sintaxe JSON
if not self.is_json_valid_so_far(input_ids):
scores = self.mask_invalid_tokens(scores)
return scores
Style Transfer: Aplicação de estilos específicos a conteúdo gerado — desde tom de voz até formatos técnicos específicos.
Prompt Templates: Estruturas reutilizáveis de prompts com placeholders para variáveis, garantindo consistência nas interações.
class PromptTemplate:
TEMPLATE = """
Você é um {role} especializado em {domain}.
Contexto: {context}
Tarefa: {task}
Restrições:
{constraints}
Formato de saída: {output_format}
"""
def render(self, **kwargs) -> str:
return self.TEMPLATE.format(**kwargs)
2. Adição de Conhecimento¶
Estes padrões endereçam a limitação fundamental de LLMs: conhecimento estático e alucinações.
RAG (Retrieval-Augmented Generation): Arquitetura que combina retrieval de documentos relevantes com geração contextualizada:
┌─────────────────────────────────────────────┐
│ RAG Pipeline │
├─────────────────────────────────────────────┤
│ │
│ Query ──▶ Embedding ──▶ Vector Store │
│ │ │
│ ▼ │
│ Context ◀── Retrieval (Top-K docs) │
│ │ │
│ ▼ │
│ Augmented Prompt ──▶ LLM ──▶ Response │
│ │
└─────────────────────────────────────────────┘
Semantic Indexing: Indexação de documentos baseada em embeddings semânticos, permitindo busca por significado além de keywords.
Deep Search: Técnicas avançadas de retrieval incluindo reranking, query expansion e fusion retrieval.
3. Extensão de Capacidades do Modelo¶
Padrões para superar limitações intrínsecas dos LLMs:
Chain of Thought (CoT): Técnica de prompting que solicita ao modelo explicar seu raciocínio passo a passo, melhorando performance em tarefas complexas de raciocínio.
## Exemplo de Chain of Thought
Pergunta: Uma loja tem 15 maçãs. Deram 7 para um cliente,
compraram 10 novas e venderam 3. Quantas maçãs restam?
Prompt otimizado:
"Resolva este problema passo a passo, mostrando seu
raciocínio:
1. Quantas maçãs havia inicialmente?
2. Quantas foram dadas/diminuídas?
3. Quantas foram adicionadas?
4. Qual o total final?"
Adapter Tuning: Fine-tuning eficiente que ajusta apenas camadas adapter do modelo, mantendo pesos base congelados.
Evol-Instruct: Método para evoluir instruções de treinamento, aumentando complexidade e diversidade dos dados.
4. Melhoria de Confiabilidade¶
Padrões para garantir qualidade e consistência:
LLM-as-Judge: Uso de um LLM para avaliar outputs de outro LLM ou do mesmo modelo em iterações diferentes.
class LLMJudge:
def __init__(self, judge_model: LLMProvider):
self.judge = judge_model
def evaluate(self, response: str, criteria: List[str]) -> Evaluation:
prompt = f"""
Avalie a seguinte resposta segundo os critérios:
{criteria}
Resposta: {response}
Forneça:
1. Nota (1-10) para cada critério
2. Justificativa
3. Sugestões de melhoria
"""
return self.judge.generate(prompt)
Reflection: Padrão onde o modelo avalia e melhora suas próprias saídas através de auto-verificação.
Prompt Optimization: Técnicas automáticas para otimização de prompts, incluindo A/B testing e otimização bayesiana.
5. Habilitação de Agentes¶
Padrões para sistemas autônomos:
Tool Calling: Permite que LLMs invoquem funções externas através de chamadas estruturadas:
# Definição de ferramentas disponíveis para o modelo
tools = [
{
"name": "get_weather",
"description": "Obtém previsão do tempo para uma localização",
"parameters": {
"location": {"type": "string", "required": True},
"days": {"type": "integer", "default": 1}
}
},
{
"name": "search_database",
"description": "Busca informações no banco de dados",
"parameters": {
"query": {"type": "string", "required": True}
}
}
]
# O modelo pode decidir chamar: {"tool": "get_weather", "parameters": {"location": "São Paulo"}}
Multi-agent Collaboration: Padrões para coordenação de múltiplos agentes especializados.
6. Endereçamento de Constraints¶
Padrões para otimização de recursos:
Small Language Model (SLM): Uso de modelos menores e mais eficientes para tarefas simples, reduzindo custo e latência.
Prompt Caching: Cache de embeddings e respostas frequentes para minimizar chamadas redundantes.
Inference Optimization: Técnicas como quantization, pruning e batching para melhorar throughput.
7. Salvaguardas¶
Padrões para segurança e alinhamento:
Guardrails: Sistema de proteção em múltiplas camadas:
- Input validation: Verificação de prompts maliciosos
- Output filtering: Filtro de conteúdo inadequado
- Topic constraints: Restrição a domínios permitidos
class GuardrailSystem:
def __init__(self):
self.input_validator = InputValidator()
self.output_filter = OutputFilter()
self.topic_guard = TopicGuard(allowed_topics=["tecnologia", "negócios"])
def process(self, input_text: str, llm: LLMProvider) -> SafeResponse:
# Validação de entrada
if not self.input_validator.is_safe(input_text):
return SafeResponse(blocked=True, reason="Input inseguro")
# Geração
raw_output = llm.generate(input_text)
# Validação de saída
if not self.output_filter.is_safe(raw_output):
return SafeResponse(blocked=True, reason="Output inseguro")
if not self.topic_guard.is_on_topic(raw_output):
return SafeResponse(blocked=True, reason="Fora do tópico")
return SafeResponse(blocked=False, content=raw_output)
Self-Check: Mecanismo onde o modelo verifica suas próprias respostas antes de entregá-las.
5.2 LLM Triangle Principles¶
Framework de três princípios fundamentais para arquitetar aplicações LLM confiáveis 3:
1. Standard Operating Procedure (SOP)¶
Documentação clara de procedimentos que o sistema deve seguir. SOPs fornecem estrutura e previsibilidade:
## SOP: Processamento de Solicitação de Suporte
1. Receber solicitação do usuário
2. Classificar categoria (técnico, financeiro, geral)
3. Verificar base de conhecimento para soluções existentes
4. Se solução encontrada: fornecer resposta padronizada
5. Se não encontrada: escalar para agente humano
6. Registrar interação para análise futura
2. Prompt Chaining¶
Decomposição de tarefas complexas em etapas sequenciais, cada uma com prompt específico:
Input do Usuário
│
▼
┌─────────────┐
│ Step 1 │ ◀── Extrair intenção
│ Intent │
└──────┬──────┘
│
▼
┌─────────────┐
│ Step 2 │ ◀── Buscar contexto relevante
│ Retrieve │
└──────┬──────┘
│
▼
┌─────────────┐
│ Step 3 │ ◀── Gerar resposta fundamentada
│ Generate │
└──────┬──────┘
│
▼
┌─────────────┐
│ Step 4 │ ◀── Validar e formatar
│ Validate │
└──────┬──────┘
│
▼
Resposta Final
3. RAG como Fundação¶
Grounding em dados verificáveis para reduzir alucinações e aumentar confiabilidade.
5.3 Seis Princípios de Design para Generative AI¶
Pesquisa do IBM Research apresentada na CHI 2024 estabeleceu seis princípios fundamentais para design de aplicações Generative AI 4:
1. Clareza de Propósito e Limitações¶
Usuários devem compreender claramente o que o sistema faz e suas limitações:
- Comunicar o escopo de capacidades do sistema
- Indicar quando o sistema está incerto
- Ser transparente sobre o uso de IA
2. Controle e Personalização¶
Usuários devem ter controle sobre interações:
- Permitir ajuste de parâmetros (temperatura, estilo)
- Oferecer opções de correção
- Suportar personalização de preferências
3. Feedback e Transparência¶
O sistema deve comunicar seu processamento:
- Indicadores de progresso em operações longas
- Explicação de como respostas foram geradas
- Citação de fontes quando aplicável (RAG)
4. Gerenciamento de Erros Gracefully¶
Falhas devem ser tratadas elegantemente:
- Mensagens de erro claras e construtivas
- Sugestões de ação alternativa
- Fallbacks para operação manual
5. Privacidade e Segurança¶
Proteção de dados e uso responsável:
- Consentimento explícito para uso de dados
- Anonimização de informações sensíveis
- Conformidade com regulamentações (GDPR, LGPD)
6. Inclusão e Acessibilidade¶
Design para diversidade de usuários:
- Suporte a múltiplos idiomas
- Adaptação a diferentes níveis de literacia técnica
- Compatibilidade com tecnologias assistivas
5.4 Síntese: Um Novo Vocabulário de Design¶
Estes padrões e princípios compõem um novo vocabulário técnico para engenheiros de software:
| Domínio | Padrões Tradicionais | Padrões de IA |
|---|---|---|
| Controle | Validadores | Guardrails, Logits Masking |
| Conhecimento | Cache, Banco de Dados | RAG, Semantic Indexing |
| Qualidade | Testes Unitários | LLM-as-Judge, Reflection |
| Eficiência | Connection Pooling | Prompt Caching, SLM |
| Autonomia | Workflow Engines | Tool Calling, Multi-Agent |
A adoção destes padrões requer não apenas conhecimento técnico, mas também julgamento sobre quando cada padrão é apropriado — uma decisão de design fundamental na era da IA.
Referências¶
-
Lakshmanan, Valliappa & Hapke, Hannes. "Generative AI Design Patterns." O'Reilly, 2024. ↩
-
Medium. "What I Learned from Building LLM Applications." 2024. ↩
-
Medium. "The LLM Triangle Principles to Architect Reliable AI Apps." 2025. ↩
-
IBM Research. "Design Principles for Generative AI Applications." CHI 2024. ↩