Pular para conteúdo

Otimização de Prompt

Visão Geral

O sistema de otimização de prompt reduz o consumo de tokens nas conversas ao gerar uma versão compactada do SystemPrompt do agente. A otimização é feita via LLM no momento da criação/atualização do agente e armazenada na coluna OptimizedSystemPrompt.

Benefícios: - Redução de ~30-35% no consumo de tokens por conversa - Preservação da semântica e comportamento do agente - Processamento transparente (usuário não percebe diferença)


Arquitetura

┌─────────────────────────────────────────────────────────────────────────┐
│  Criação/Atualização do Agente                                          │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  CreateAgentHandler / UpdateAgentHandler                                │
│              │                                                          │
│              ▼                                                          │
│  ┌─────────────────────────────────────────┐                            │
│  │   IPromptOptimizationService            │                            │
│  │   .OptimizeAsync(systemPrompt)          │                            │
│  └───────────────────┬─────────────────────┘                            │
│                      │                                                  │
│         ┌────────────┴────────────┐                                     │
│         │                         │                                     │
│         ▼                         ▼                                     │
│  ┌─────────────┐           ┌─────────────┐                              │
│  │  Enabled?   │──false──▶ │ Return null │                              │
│  │  MinLength? │           │ (usa orig.) │                              │
│  └──────┬──────┘           └─────────────┘                              │
│         │ true                                                          │
│         ▼                                                               │
│  ┌─────────────────────────────────────────┐                            │
│  │   LLM Provider (Claude/OpenAI)          │                            │
│  │   - Carrega template de otimização      │                            │
│  │   - Envia prompt para otimização        │                            │
│  │   - Retorna versão otimizada            │                            │
│  └───────────────────┬─────────────────────┘                            │
│                      │                                                  │
│                      ▼                                                  │
│  ┌─────────────────────────────────────────┐                            │
│  │   Agent.OptimizedSystemPrompt = result  │                            │
│  └─────────────────────────────────────────┘                            │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

Uso em Conversas

Durante o processamento de mensagens, o sistema usa o prompt otimizado com fallback para o original:

// ProcessMessageHandler.cs / PlaygroundHandler.cs
var basePrompt = agent.OptimizedSystemPrompt ?? agent.SystemPrompt;
var fullSystemPrompt = basePrompt;

if (knowledgeBlocks.Count > 0)
{
    var knowledgeSection = string.Join("\n\n---\n\n", knowledgeBlocks);
    fullSystemPrompt = $"{basePrompt}\n\n## Base de Conhecimento\n\n{knowledgeSection}";
}

Comportamento de Fallback: - Se OptimizedSystemPrompt é null → usa SystemPrompt original - Se otimização falhar → retorna null, usa original - Se feature desabilitada → retorna null, usa original


Configuração

appsettings.json

{
  "PromptOptimization": {
    "Enabled": true,
    "Provider": "anthropic",
    "Model": "claude-sonnet-4-5-20250929",
    "MaxOutputTokens": 4096,
    "MinPromptLength": 500
  }
}
Parâmetro Tipo Descrição
Enabled bool Habilita/desabilita a otimização
Provider string Provider LLM (anthropic ou openai)
Model string Modelo a usar para otimização
MaxOutputTokens int Limite de tokens na resposta
MinPromptLength int Tamanho mínimo do prompt para otimizar (chars)

docker-compose (Produção)

environment:
  - PromptOptimization__Enabled=true
  - PromptOptimization__Provider=anthropic
  - PromptOptimization__Model=claude-sonnet-4-5-20250929
  - PromptOptimization__MaxOutputTokens=4096
  - PromptOptimization__MinPromptLength=500

Regras de Otimização

O template de otimização (prompt-optimization.md) instrui o LLM a:

  1. Remover redundâncias - Eliminar repetições e informações duplicadas
  2. Compactar linguagem - Usar formas mais concisas sem perder clareza
  3. Reorganizar estrutura - Agrupar informações relacionadas
  4. Preservar semântica - Manter o comportamento e tom esperados
  5. Manter exemplos - Preservar diálogos de exemplo (críticos para comportamento)
  6. Preservar regras críticas - Nunca remover restrições de segurança (NUNCA, NÃO, proibido)

O que NÃO fazer: - Remover exemplos de diálogo - Alterar regras de segurança - Mudar o tom ou personalidade - Adicionar informações novas


Trigger de Otimização

CreateAgentHandler

Sempre otimiza ao criar um agente (se habilitado e prompt >= MinPromptLength).

UpdateAgentHandler

Otimiza quando: 1. SystemPrompt mudou (comparação de string) 2. OptimizedSystemPrompt é null (nunca foi otimizado)

var promptChanged = agent.SystemPrompt != request.SystemPrompt;
var needsOptimization = promptChanged || agent.OptimizedSystemPrompt is null;

if (needsOptimization)
{
    optimizedPrompt = await _promptOptimization.OptimizeAsync(request.SystemPrompt, ct);
}

Arquivos Relacionados

Arquivo Descrição
Infrastructure/Services/PromptOptimization/IPromptOptimizationService.cs Interface do serviço
Infrastructure/Services/PromptOptimization/PromptOptimizationService.cs Implementação
Infrastructure/Services/PromptOptimization/PromptOptimizationOptions.cs Configuração
Infrastructure/Prompts/prompt-optimization.md Template de otimização
Domain/Entities/Agent.cs Entidade com OptimizedSystemPrompt
Api/Features/Agents/Create/CreateAgentHandler.cs Integração no create
Api/Features/Agents/Update/UpdateAgentHandler.cs Integração no update

Métricas e Logs

Logs de Otimização

[INF] Prompt optimized: 4200 -> 2700 chars (35.7% reduction)
[INF] Agent {AgentId} updated: {AgentName}. PromptOptimized: True

Métricas Importantes

  • Redução média: ~30-35% (varia por prompt)
  • Tempo de otimização: 2-5s (síncrono no create/update)
  • Preservação de exemplos: Obrigatória (verificar manualmente)

Tratamento de Erros

Cenário Comportamento
Otimização desabilitada Retorna null, usa original
Prompt muito curto (< MinPromptLength) Retorna null, usa original
LLM falha (timeout, erro API) Loga erro, retorna null, usa original
OptimizedSystemPrompt é null Fallback automático via ??

Princípio: A aplicação nunca falha por causa da otimização. Graceful degradation sempre.


Escolha do Modelo

Baseado em análise comparativa:

Modelo Redução Preserva Exemplos Recomendado
claude-sonnet-4-5 35.4% Sim Sim
claude-haiku-4-5 26.5% Sim Sim (custo menor)
gpt-4.1 21.5% Sim Não (menor redução)
gpt-4.1-mini 26.2% Sim Não
gpt-5.2 36.8% Não Não (remove exemplos)

Recomendação: Use claude-sonnet-4-5-20250929 para melhor equilíbrio entre redução e preservação.