Skip to main content
Glama

LCBro

by lcbro
LLM_LOGGING_GUIDE.md12.5 kB
# Logging Detalhado de LLM para Depuração e Estatísticas ## Visão Geral Foi implementado um sistema abrangente de logging de todas as operações LLM com informações detalhadas sobre prompts, respostas, performance e economia de custos. ## Principais Funcionalidades ### 🔍 **Logging Detalhado de Solicitações** - Todos os prompts enviados ao LLM - Prompts do sistema e instruções do usuário - Parâmetros do modelo (temperatura, máx tokens) - Metadados da operação (tipo, ID, timestamps) ### 📊 **Logging de Respostas e Métricas** - Respostas completas dos modelos LLM - Estatísticas de uso de tokens - Tempo de execução da operação - Tratamento de erros com informações detalhadas ### 💰 **Análise de Economia de Custos** - Cálculo de custo por modelos - Economia do pré-processamento - Comparação de tokens antes/depois - Estatísticas por tipos de operação ### 📈 **Métricas de Performance** - Rastreamento automático de estatísticas - Análise por modelos (número de operações, tokens médios, tempo) - Eficiência do pré-processamento (redução de dados, economia) - Resumos periódicos de performance ## Configuração ### config/default.yaml ```yaml logging: level: info # Logging detalhado de LLM llm: enabled: true # habilitar/desabilitar logging LLM logPrompts: true # logar todos os prompts logResponses: true # logar todas as respostas logTokens: true # logar estatísticas de tokens logPerformance: true # logar métricas de performance logPreprocessing: true # logar análise de pré-processamento # Configurações de logging de dados maxPromptLength: 2000 # máx caracteres para prompts maxResponseLength: 1000 # máx caracteres para respostas maxInputDataLength: 5000 # máx caracteres para dados de entrada # Rastreamento de performance trackMetrics: true # rastrear métricas metricsInterval: 100 # logar métricas a cada N operações ``` ## Tipos de Operações Logadas ### 1. **Análise de Conteúdo (analysis)** ```json { "level": "info", "msg": "Solicitação LLM [ANÁLISE]", "timestamp": "2025-01-13T10:30:15.123Z", "operationId": "op_1705135815123_1", "operationType": "analysis", "model": "ollama:qwen2.5:7b", "systemPrompt": "Você é um analisador de conteúdo especialista...", "userPrompt": "TAREFA PRINCIPAL: Extrair informações do produto...", "maxTokens": 300, "temperature": 0.1, "inputDataLength": 15420, "inputDataType": "html", "instruction": "Extrair informações do produto como JSON" } ``` ### 2. **Pré-processamento (preprocessing)** ```json { "level": "info", "msg": "Solicitação LLM [PRÉ-PROCESSAMENTO]", "operationType": "preprocessing", "model": "ollama:qwen2.5:7b", "systemPrompt": "Você é um pré-processador de dados...", "userPrompt": "Solicitação de pré-processamento: Remover ruído HTML...", "preprocessRequest": "Remove HTML noise: scripts, styles, navigation, ads, footers. Focus on product/item information, remove marketing fluff. Keep only content relevant to the main task." } ``` ### 3. **Processamento Principal (main)** ```json { "level": "info", "msg": "Solicitação LLM [PRINCIPAL]", "operationType": "main", "model": "gpt-4o-mini", "systemPrompt": "Você é um assistente útil...", "userPrompt": "Tarefa: Extrair informações do produto como JSON...", "instruction": "Extrair informações do produto como JSON", "preprocessRequest": "Remove HTML noise: scripts, styles, navigation, ads, footers..." } ``` ## Respostas e Métricas ### Respostas Bem-sucedidas ```json { "level": "info", "msg": "Resposta LLM [PRÉ-PROCESSAMENTO]", "timestamp": "2025-01-13T10:30:18.456Z", "operationId": "op_1705135815123_2", "operationType": "preprocessing", "model": "ollama:qwen2.5:7b", "content": "Conteúdo HTML limpo sem navegação e anúncios...", "tokensUsed": { "prompt": 1250, "completion": 320, "total": 1570 }, "duration": 2847, "success": true } ``` ### Análise de Pré-processamento ```json { "level": "info", "msg": "Análise e Resultados do Pré-processamento", "timestamp": "2025-01-13T10:30:18.500Z", "inputData": "<html><head><script>...</script></head><body>...", "instruction": "Extrair informações do produto como JSON", "analysisResponse": "Este HTML contém informações do produto com navegação e anúncios que devem ser removidos...", "generatedPreprocessRequest": "Remove HTML noise: scripts, styles, navigation, ads, footers. Focus on product/item information...", "originalLength": 15420, "processedLength": 3200, "reductionPercentage": "79.25", "analysisDuration": 1500, "preprocessingDuration": 2847, "totalDuration": 4347 } ``` ### Análise de Economia de Custos ```json { "level": "info", "msg": "Análise de Custo do Pré-processamento", "operationId": "op_1705135815123_2", "originalInput": "<html><head><script>...</script></head>...", "processedInput": "Produto: iPhone 15 Pro\nPreço: $999\nDescrição: Último modelo iPhone...", "preprocessRequest": "Remove HTML noise: scripts, styles, navigation, ads, footers...", "originalTokens": 3855, "processedTokens": 800, "tokenReduction": 3055, "tokenReductionPercentage": "79.25", "estimatedCostSaved": "0.0457" } ``` ## Métricas de Performance ### Resumos Periódicos ```json { "level": "info", "msg": "Resumo de Métricas de Performance LLM", "timestamp": "2025-01-13T10:35:00.000Z", "metrics": { "totalOperations": 100, "totalTokensUsed": 125000, "totalCost": 0.1875, "averageResponseTime": 2850, "preprocessingStats": { "count": 45, "avgReduction": 72.3, "avgTime": 2100 }, "modelStats": { "gpt-4o-mini": { "count": 55, "avgTokens": 1200, "avgTime": 3200, "totalCost": 0.1250 }, "ollama:qwen2.5:7b": { "count": 45, "avgTokens": 800, "avgTime": 1800, "totalCost": 0.0000 } } } } ``` ### Resumo Final ```json { "level": "info", "msg": "Resumo Final de Performance LLM", "finalMetrics": { "totalOperations": 500, "totalTokensUsed": 650000, "estimatedTotalCost": 0.9750, "averageResponseTime": 2750, "preprocessingEffectiveness": { "operations": 200, "avgReduction": "75.2%", "avgTime": 1950 }, "modelUsage": [ { "model": "gpt-4o-mini", "operations": 300, "avgTokens": 1100, "avgTime": 3100, "totalCost": "0.7500" }, { "model": "ollama:qwen2.5:7b", "operations": 200, "avgTokens": 750, "avgTime": 1700, "totalCost": "0.0000" } ] } } ``` ## Tratamento de Erros ### Erros de Solicitação LLM ```json { "level": "error", "msg": "Erro LLM [ANÁLISE]", "timestamp": "2025-01-13T10:30:15.123Z", "operationId": "op_1705135815123_1", "operationType": "analysis", "model": "ollama:qwen2.5:7b", "content": "", "duration": 5000, "success": false, "error": "Timeout de conexão com servidor Ollama" } ``` ## Análise de Logs ### Usando grep para Análise ```bash # Todas as operações de pré-processamento grep '"operationType": "preprocessing"' logs/app.log # Todos os erros grep '"success": false' logs/app.log # Métricas de performance grep 'Performance Metrics Summary' logs/app.log # Análise de economia de custos grep 'Preprocessing Cost Analysis' logs/app.log # Estatísticas para modelo específico grep '"model": "gpt-4o-mini"' logs/app.log ``` ### Análise com jq ```bash # Extrair todas as operações de pré-processamento cat logs/app.log | jq 'select(.operationType == "preprocessing")' # Estatísticas de tokens cat logs/app.log | jq 'select(.tokensUsed) | .tokensUsed.total' | awk '{sum+=$1} END {print "Total tokens:", sum}' # Duração média das operações cat logs/app.log | jq 'select(.duration) | .duration' | awk '{sum+=$1; count++} END {print "Duração média:", sum/count, "ms"}' # Análise de economia do pré-processamento cat logs/app.log | jq 'select(.msg == "Preprocessing Cost Analysis") | .estimatedCostSaved' | awk '{sum+=$1} END {print "Custo total economizado: $", sum}' ``` ## Monitoramento em Tempo Real ### Visualizando Logs em Tempo Real ```bash # Seguir todas as operações LLM tail -f logs/app.log | grep -E "(LLM Request|LLM Response|Performance Metrics)" # Seguir apenas erros tail -f logs/app.log | grep '"success": false' # Seguir métricas de performance tail -f logs/app.log | grep 'Performance Metrics Summary' ``` ### Criando Dashboard com jq ```bash # Dashboard simples no terminal while true; do clear echo "=== Dashboard de Performance LLM ===" echo "Total de operações: $(grep 'LLM Request' logs/app.log | wc -l)" echo "Total de erros: $(grep '"success": false' logs/app.log | wc -l)" echo "Operações de pré-processamento: $(grep '"operationType": "preprocessing"' logs/app.log | wc -l)" echo "Tempo médio de resposta: $(grep 'LLM Response' logs/app.log | jq -r '.duration' | awk '{sum+=$1; count++} END {if(count>0) print sum/count "ms"; else print "N/A"}')" sleep 5 done ``` ## Configuração de Nível de Logging ### Para Depuração (Máximo Detalhe) ```yaml logging: level: debug llm: enabled: true logPrompts: true logResponses: true logTokens: true logPerformance: true logPreprocessing: true maxPromptLength: 5000 # mais dados para depuração maxResponseLength: 2000 maxInputDataLength: 10000 trackMetrics: true metricsInterval: 10 # logar métricas com mais frequência ``` ### Para Produção (Logging Otimizado) ```yaml logging: level: info llm: enabled: true logPrompts: false # desabilitar prompts para economizar espaço logResponses: false # desabilitar respostas logTokens: true # manter tokens para monitoramento logPerformance: true # manter métricas logPreprocessing: false # desabilitar detalhes de pré-processamento trackMetrics: true metricsInterval: 1000 # logar métricas com menos frequência ``` ### Para Análise de Performance ```yaml logging: level: info llm: enabled: true logPrompts: false logResponses: false logTokens: true logPerformance: true logPreprocessing: true # habilitar para análise de eficiência maxPromptLength: 500 # dados mínimos maxResponseLength: 200 maxInputDataLength: 1000 trackMetrics: true metricsInterval: 50 # métricas frequentes ``` ## Automação de Análise ### Script de Relatório Diário ```bash #!/bin/bash # daily_llm_report.sh LOG_FILE="logs/app-$(date +%Y-%m-%d).log" REPORT_FILE="reports/llm-$(date +%Y-%m-%d).txt" echo "=== Relatório de Performance LLM para $(date +%Y-%m-%d) ===" > $REPORT_FILE # Estatísticas gerais echo "Total de operações: $(grep 'LLM Request' $LOG_FILE | wc -l)" >> $REPORT_FILE echo "Total de erros: $(grep '"success": false' $LOG_FILE | wc -l)" >> $REPORT_FILE echo "Operações de pré-processamento: $(grep '"operationType": "preprocessing"' $LOG_FILE | wc -l)" >> $REPORT_FILE # Análise de tokens TOTAL_TOKENS=$(grep 'LLM Response' $LOG_FILE | jq -r 'select(.tokensUsed) | .tokensUsed.total' | awk '{sum+=$1} END {print sum}') echo "Total de tokens usados: $TOTAL_TOKENS" >> $REPORT_FILE # Análise de economia COST_SAVED=$(grep 'Preprocessing Cost Analysis' $LOG_FILE | jq -r '.estimatedCostSaved' | awk '{sum+=$1} END {print sum}') echo "Custo estimado economizado: \$${COST_SAVED}" >> $REPORT_FILE # Duração média AVG_DURATION=$(grep 'LLM Response' $LOG_FILE | jq -r '.duration' | awk '{sum+=$1; count++} END {if(count>0) print sum/count; else print "N/A"}') echo "Tempo médio de resposta: ${AVG_DURATION}ms" >> $REPORT_FILE echo "Relatório salvo em $REPORT_FILE" ``` ## Conclusão O sistema de logging detalhado de LLM fornece: - ✅ **Transparência completa** de todas as operações LLM - ✅ **Depuração detalhada** de prompts e respostas - ✅ **Análise de performance** e otimização - ✅ **Monitoramento de economia** do pré-processamento - ✅ **Configuração flexível** para diferentes necessidades - ✅ **Automação de análise** com ferramentas padrão **Modelo:** Claude Sonnet 4

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lcbro/lcbro-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server