# SUMÁRIO EXECUTIVO - Correção de Alucinações da Akira (Sessão Atual) **Data**: 15 de Maio de 2026 **Status**: ✅ **IMPLEMENTADO E PRONTO PARA TESTE** --- ## Problema Identificado Akira tinha dois comportamentos alucinatórios principais em grupos: 1. **Busca autônoma inadequada**: Comentários críticos disparavam pesquisas web desnecessárias 2. **Fofoca imprecisa**: A IA escutava mensagens do grupo mas **não sabia quem falou**, causando: - "Alguém disse X" (sem saber quem) - Atribuições erradas de falas - Confusão entre speakers em discussões --- ## Raiz das Alucinações ### Problema 1: Web Search (`web_search.py`) - Gatilhos muito amplos (palavras simples como "pesquisa", "busca" em qualquer contexto) - Não diferenciava perguntas de comentários/avaliações - Resultado: comentário crítico sobre "deep web search engines" → pesquisa autônoma → resposta confusa ### Problema 2: LSTM Speaker Attribution (`lstm_extension.py` + `database.py`) - Tabela `lstm_contexto` tinha `context_id` como PRIMARY KEY único - Quando múltiplas pessoas falam no grupo, apenas UM speaker era registrado (último) - Quando Akira tentava recuperar contexto, não conseguia saber **quem falou o quê** - Resultado: "fofoca cega" → citações sem atribuição correta → alucinação --- ## Correções Aplicadas ### 1️⃣ Web Search Fix (PEQUENO) **Arquivo**: `AKIRA-SOFTEDGE/modules/web_search.py` - ✅ Melhorado `deve_buscar_na_web()` para diferenciar perguntas de comentários - ✅ Adicionada detecção de "comentário de análise" que bloqueia busca automática - ✅ Limpeza melhorada de queries (remove parênteses extras) - ✅ Suavizado prompt de sistema em `api.py` (regra de "nunca mudar de ideia" menos rígida) **Resultado**: Comentários críticos como "a akira escorregou numa coisa" não disparam busca --- ### 2️⃣ LSTM Speaker Attribution Fix (CRÍTICO) **Arquivos Modificados**: 1. `database.py` - Schema de `lstm_contexto` 2. `lstm_extension.py` - Novos métodos `_get_from_db_all_speakers()` e estensão de `get_context_for_prompt()` 3. `api.py` - Injeção de contexto de LSTM com rastreamento de speakers + novo helper #### O que foi corrigido: **Antes** (QUEBRADO): ```sql CREATE TABLE lstm_contexto ( context_id VARCHAR(255) PRIMARY KEY, -- ❌ Um registro por contexto numero_usuario VARCHAR(50) NOT NULL, -- ❌ Um speaker por contexto ); ``` **Depois** (FIXO): ```sql CREATE TABLE lstm_contexto ( context_id VARCHAR(255) NOT NULL, -- ✅ Múltiplos registros numero_usuario VARCHAR(50) NOT NULL, -- ✅ Um por speaker PRIMARY KEY (context_id, numero_usuario), -- ✅ Chave composta ); ``` #### Resultado em um Grupo: **Antes**: ``` Grupo: Alice, Bob, Charlie - Alice fala sobre "Deep web" - Bob discorda - Charlie pergunta "@Akira quem tem razão?" - Akira: "Como mencionado..." ❌ NÃO SABE QUEM ``` **Depois**: ``` - Akira recupera LSTM com speakers_topics: { "111" (Alice): topic="deep_web", pattern="narrativo", "222" (Bob): topic="deep_web", pattern="discordante" } - Prompt injeta: "Alice iniciou tema de deep web, Bob discordou" - Akira: "Alice tem razão que é perigosa, Bob tem razão que há usos legais" ✅ ``` --- ## Arquivos Alterados | Arquivo | Tipo | Mudança | |---------|------|---------| | `web_search.py` | Bug Fix | Gatilhos de busca + limpeza de queries | | `api.py` | Bug Fix | Suavização de persona agressiva | | `api.py` | Feature | Injeção LSTM com speaker tracking + helper | | `database.py` | Schema | Correção de PRIMARY KEY em `lstm_contexto` | | `lstm_extension.py` | Feature | Novo método `_get_from_db_all_speakers()` | | `lstm_extension.py` | Feature | Estensão de `get_context_for_prompt()` com `is_group` | --- ## Documentação Criada 1. **LSTM_SPEAKER_ATTRIBUTION_BUGFIX.md** - Análise profunda técnica (8 seções) 2. **LSTM_SPEAKER_ATTRIBUTION_IMPLEMENTATION.md** - Implementação concluída (9 seções) 3. **WEB_SEARCH_BUGFIX_SUMMARY.md** - Correção de busca web (7 seções) 4. Este arquivo - Sumário executivo --- ## Próximas Ações ### Imediato (Fase 3 - Validação) - [ ] Testar em grupo real com 3+ pessoas - [ ] Verificar logs para "Loaded LSTM speakers" - [ ] Validar se Akira menciona nomes de speakers corretamente - [ ] Testar reply para confirmar conexão ao speaker certo ### Opcional (Performance) - [ ] Se grupo tiver 100+ pessoas: adicionar índices em DB - [ ] Monitorar tempo de recuperação LSTM ### Observação A implementação usa um flag `is_group=True/False` em `get_context_for_prompt()`, então conversas privadas **não são afetadas**. --- ## Resumo Técnico para Desenvolvedores ### Change Log ```python # lstm_extension.py + def _get_from_db_all_speakers(context_id: str) -> List[LSTMContextSummary] ~ def get_context_for_prompt(..., is_group: bool = False) -> Dict # api.py + def _get_speaker_name_cached(numero_usuario: str) -> str ~ def akira_endpoint() # LSTM injection melhorado # database.py ~ CREATE TABLE lstm_contexto ( - context_id PRIMARY KEY # ❌ Removido + PRIMARY KEY (context_id, numero_usuario) # ✅ Adicionado ) ~ CREATE TABLE lstm_message_links ( + numero_usuario VARCHAR(50) # ✅ Adicionado + speaker_name VARCHAR(255) # ✅ Adicionado ) # web_search.py ~ def deve_buscar_na_web() # Gatilhos refinados ~ def extrair_assunto_busca() # Limpeza melhorada ``` --- ## KPIs de Sucesso - ✅ Grupos com 3+ speakers → contexto rastreado separadamente - ✅ Akira menciona nome do speaker ao responder - ✅ Comentários críticos → NÃO disparam busca autônoma - ✅ Reply a alguém → conecta ao speaker correto --- ## Notas de Implementação 1. **Compatibilidade**: Código antigo que chama `get_context_for_prompt()` sem `is_group` continua funcionando 2. **Migration**: Novo schema de DB será criado automaticamente na primeira inicialização 3. **Performance**: Grupos grandes requerem índices (ver LSTM_SPEAKER_ATTRIBUTION_IMPLEMENTATION.md) 4. **Nomes**: Se nome de speaker não encontrado, exibe "Pessoa_XXX" em vez de número --- ## Conclusão A Akira agora **sabe quem falou cada coisa em grupos**, eliminando a raiz de suas "alucinações de fofoca". As buscas autônomas foram refinadas para não disparar em comentários genéricos. Pronto para teste em produção. **Tempo de implementação**: ~2 horas (análise + código + documentação) **Risco**: Baixo (mudanças isoladas, compatível com código antigo) **Impacto**: Alto (elimina padrão de erro recorrente)