AKIRA-SOFTEDGE / GUIA_INTEGRACAO_LSTM.md
akra35567's picture
Upload 55 files
13091b9 verified
|
Raw
History Blame Contribute Delete
19.1 kB

🧠 GUIA DE INTEGRAÇÃO - LSTM MEMORY SYSTEM

Versão: 1.0
Data: 10/04/2026
Para: Desenvolvedores integrando LSTM Memory


📋 O QUE É O LSTM MEMORY SYSTEM?

Sistema de memória que funciona 100% transparente para criar "resumos mentais" de conversas:

  • Mentais - Usuário não vê os resumos
  • Contextualizados - Entende tópicos, perguntas pendentes, padrões
  • Isolados - Cada usuário/grupo tem seu próprio contexto
  • Automáticos - Recuperados quando modelo precisa
  • Persistentes - Armazenados em DB para sessões futuras

🎯 EXEMPLO PRÁTICO

Conversa Real com Belmira:

Belmira: "Fale tudo sobre anemia falciforme"
Akira: "Anemia falciforme é doença genética da hemoglobina..."

Belmira: "Eu não falei inglês"
Akira: "Respondi em português. Você pediu tudo explicado."

Belmira: "Poxa"
Akira: "O quê?"

Belmira: "cura? tratamento?"
Akira: ??? ANTES: "De quê?" ← CONTEXTO PERDIDO
         DEPOIS: Entende que é sobre anemia!  ← ✅ CERTO

O Que Acontece Mentalmente (Oculto):

[LSTM MENTAL PROCESSING - NÃO VISÍVEL]

Msg 1: "Fale tudo sobre anemia falciforme"
├─ Topic: "anemia falciforme"
├─ Subtopics: ["definição", "genética", "hemoglobina"]
└─ Pattern: "perguntador"

Msg 2: "Eu não falei inglês"
└─ [Contexto continua: anemia falciforme]

Msg 3: "Poxa"
└─ [Contexto continua: anemia falciforme]

Msg 4: "cura? tratamento?"
├─ Detecta pergunta sobre "cura/tratamento"
├─ LSTM busca no histórico: tópico é "anemia falciforme"
├─ Conecta: "cura" → deve ser sobre "anemia falciforme"
└─ Modelo usa contexto automaticamente ✅

🔧 ARQUITETURA

Fluxo de Dados:

User Message
    ↓
short_term_memory (100 msgs)
    ↓ (simultaneous)
    ├─→ Reply Handler (resposta direto)
    │   ├─→ Context Builder
    │   └─→ API Call (Mistral/Gemini/etc)
    │
    └─→ LSTM Memory (async)
        ├─ Processa em background
        ├─ Extrai tema, subtópicos
        ├─ Detecta perguntas pendentes
        ├─ Armazena em DB
        └─ (Modelo usa quando precisa)

Tabelas no DB:

lstm_contexto
├─ context_id (PK)
├─ numero_usuario
├─ topic_principal (tema atual)
├─ subtopicas (list)
├─ conversation_path (histórico de temas)
├─ last_key_message (última msg importante)
├─ emotional_state
├─ interaction_pattern (perguntador, narrativo, etc)
├─ unanswered_questions (perguntas pendentes)
├─ assumed_knowledge (o que ele sabe)
├─ contradictions (inconsistências)
└─ metadata

lstm_message_links
├─ context_id (FK)
├─ message_id
├─ parent_message_id
├─ topic_changed
├─ created_at
└─ relevance_score

🚀 INTEGRAÇÃO PASSO A PASSO

1️⃣ Em reply_context_handler.py

Disparar LSTM processing quando mensagem chega:

from modules.lstm_memory_system import get_lstm_memory_system
from modules.context_isolation import ContextIsolation

class ReplyContextHandler:
    def __init__(self, db, llm_client):
        self.lstm = get_lstm_memory_system(db, ContextIsolation(db))
        self.llm_client = llm_client
    
    def handle_user_message(self, numero_usuario: str, message: str, grupo_id: Optional[str] = None):
        """Processa mensagem de usuário."""
        
        # 1. Gerar context_id
        context_id = self._generate_context_id(numero_usuario, grupo_id)
        
        # 2. Processar short-term memory (síncrono)
        short_memory = self.short_term_memory.add_message(
            context_id=context_id,
            role='user',
            content=message,
            timestamp=time.time()
        )
        
        # 3. ✅ DISPARAR LSTM PROCESSING (ASSÍNCRONO)
        if self.lstm:
            parent_msg = short_memory[-2] if len(short_memory) > 1 else None
            parent_id = parent_msg.get('id') if parent_msg else None
            
            self.lstm.process_message_async(
                context_id=context_id,
                numero_usuario=numero_usuario,
                message=message,
                role='user',
                parent_message_id=parent_id,
                llm_client=self.llm_client  # Para análise com LLM
            )
        
        # 4. Construir contexto para resposta
        context = self._build_context(numero_usuario, context_id, short_memory)
        
        # 5. Gerar resposta (model não espera LSTM)
        response = self.generate_response(context, message)
        
        # 6. Adicionar resposta à memória
        self.short_term_memory.add_message(
            context_id=context_id,
            role='assistant',
            content=response,
            timestamp=time.time()
        )
        
        # 7. ✅ PROCESSAR RESPOSTA TAMBÉM EM LSTM
        if self.lstm:
            self.lstm.process_message_async(
                context_id=context_id,
                numero_usuario=numero_usuario,
                message=response,
                role='assistant',
                parent_message_id=short_memory[-1].get('id')
            )
        
        return response
    
    def _build_context(self, numero_usuario, context_id, short_memory):
        """Constrói contexto com LSTM + short_term."""
        
        context = {
            'numero_usuario': numero_usuario,
            'short_term_messages': short_memory,  # Últimas 100
        }
        
        # ✅ ADICIONAR LSTM CONTEXT (AUTOMÁTICO)
        if self.lstm:
            lstm_context = self.lstm.get_lstm_context_for_model(
                context_id=context_id,
                numero_usuario=numero_usuario
            )
            context['lstm_context'] = lstm_context
        
        return context

2️⃣ Em context_builder.py

Usar LSTM context na construção do prompt:

from modules.lstm_memory_system import get_lstm_memory_system

class ContextBuilder:
    def __init__(self, db):
        self.lstm = get_lstm_memory_system(db)
    
    def build_full_context(self, user_id, short_memory, lstm_context=None):
        """Constrói contexto completo para o modelo."""
        
        # Se não temos LSTM context, recuperar agora
        if lstm_context is None and self.lstm:
            context_id = self._get_context_id(user_id)
            lstm_context = self.lstm.get_lstm_context_for_model(
                context_id=context_id,
                numero_usuario=user_id
            )
        
        # ═══════════════════════════════════════════════════════
        # CONTEXTO DUAL: Direto + LSTM (Ambos Transparentes)
        # ═══════════════════════════════════════════════════════
        
        context_data = {
            # 1. Contexto Direto (últimas mensagens)
            "direct_context": {
                "recent_messages": short_memory[-5:],  # Últimas 5
                "conversation_type": "direct_interaction"
            },
            
            # 2. Contexto LSTM (memória mental)
            "lstm_context": lstm_context or {},
        }
        
        # ✅ INSTRUÇÃO PARA MODELO USAR AMBOS
        context_data["instruction"] = """
        Use dois tipos de contexto simultaneamente:
        1. DIRETO: Mensagens das últimas trocas (direct_context)
        2. MENTAL: Contexto histórico (lstm_context)
        
        Exemplo:
        - Pergunta direto: "cura? tratamento?"
        - Contexto mental: {topic_principal: "anemia falciforme"}
        - Modelo conecta automaticamente
        """
        
        return context_data
    
    def build_system_prompt_with_lstm(self, lstm_context=None):
        """Constrói system prompt enriquecido com LSTM."""
        
        base_prompt = """Você é Akira, assistente angolana inteligente..."""
        
        if lstm_context and lstm_context.get('topic_principal'):
            # ✅ Injetar contexto mental no prompt
            mental_summary = lstm_context.get('mental_summary_text', '')
            
            lstm_injection = f"""
## 🧠 CONTEXTO INTERNO (MEMÓRIA MENTAL - NÃO MOSTRE ISTO AO USUÁRIO)
Contexto da conversa atual (processado internamente):
{mental_summary}

Perguntas pendentes a responder: {json.dumps(lstm_context.get('unanswered_questions', [])[:3])}
Padrão de interação deste usuário: {lstm_context.get('interaction_pattern', 'unknown')}

**INSTRUÇÃO:** Use este contexto para conectar tópicos e entender a conversa naturalmente.
Tópico principal atual: {lstm_context.get('topic_principal')}
Não mencione que está usando "contexto mental" ou "LSTM" - responda naturalmente.
            """
            
            return base_prompt + "\n" + lstm_injection
        
        return base_prompt

3️⃣ Em api.py

Usar contexto LSTM ao chamar APIs:

from modules.lstm_memory_system import get_lstm_memory_system

class UnifiedLLMClient:
    def __init__(self, db):
        self.lstm = get_lstm_memory_system(db)
    
    def generate(self, user_prompt, context_history):
        """Gera resposta usando LSTM context."""
        
        # ✅ Recuperar LSTM context se disponível
        lstm_context = None
        if self.lstm and hasattr(self, 'current_context_id'):
            lstm_context = self.lstm.get_lstm_context_for_model(
                context_id=self.current_context_id,
                numero_usuario=self.current_user_id
            )
        
        # ✅ Injetar no system prompt
        from modules.context_builder import ContextBuilder
        cb = ContextBuilder(self.db)
        system_prompt = cb.build_system_prompt_with_lstm(lstm_context)
        
        # Chamar qualquer provedor (Mistral, Gemini, etc)
        messages = [
            {"role": "system", "content": system_prompt},
            *context_history,
            {"role": "user", "content": user_prompt}
        ]
        
        response = self._call_llm(messages)
        return response

4️⃣ Em persona_tracker.py

Usar LSTM context para atualizar persona:

class PersonaTracker:
    def __init__(self, db, llm_client):
        self.db = db
        self.llm_client = llm_client
        from modules.lstm_memory_system import get_lstm_memory_system
        self.lstm = get_lstm_memory_system(db)
    
    def track_background(self, numero_usuario: str, historico_recente):
        """Rastreia persona usando LSTM context."""
        
        if numero_usuario in self.processing_users:
            return
        
        # ✅ Recuperar LSTM context
        context_id = self._get_context_id(numero_usuario)
        lstm_context = None
        if self.lstm:
            lstm_context = self.lstm.get_lstm_context_for_model(
                context_id=context_id,
                numero_usuario=numero_usuario
            )
        
        self.processing_users.add(numero_usuario)
        
        thread = threading.Thread(
            target=self._analyze_with_lstm,
            args=(numero_usuario, historico_recente, lstm_context),
            daemon=True
        )
        thread.start()
    
    def _analyze_with_lstm(self, numero_usuario, historico, lstm_context):
        """Analisa persona usando contexto LSTM."""
        
        # ✅ Usar LSTM context para melhor análise
        if lstm_context:
            contexto_info = f"""
            Contexto da conversa: {lstm_context.get('topic_principal')}
            Padrão de interação: {lstm_context.get('interaction_pattern')}
            Conhecimento demonstrado: {lstm_context.get('assumed_knowledge')}
            """
        else:
            contexto_info = ""
        
        prompt = f"""
        Analise a persona deste usuário. Use também o contexto da conversa:
        {contexto_info}
        
        Mensagens:
        {historico}
        
        Retorne JSON com personalidade atualizada.
        """
        
        # ... rest of analysis

📊 FLUXO COMPLETO DE EXEMPLO

Cenário: Belmira faz 3 perguntas sobre anemia

┌─────────────────────────────────────────────────────────────┐
│ Msg 1: "Fale tudo sobre anemia falciforme"                 │
└─────────────────────────────────────────────────────────────┘
         ↓
    [Processing]
    ├─ Short-Term Memory: Add to [context_id_belmira]
    ├─ [ASYNC] LSTM:
    │   ├─ Extrai tema: "anemia falciforme"
    │   ├─ Subtópicos: ["definição", "genética"]
    │   ├─ Pattern: "perguntador"
    │   └─ Salva em DB (lstm_contexto)
    └─ Build Context:
        ├─ short_memory: [msg1]
        ├─ lstm_context: {topic: "anemia falciforme", ...}
        └─ System Prompt + LSTM Injection
         ↓
    Akira Responde: "Anemia falciforme é..."
         ↓
    [ASYNC] LSTM processa resposta:
    ├─ Detecta que resposta está no tópico
    └─ Atualiza last_key_message


┌─────────────────────────────────────────────────────────────┐
│ Msg 2: "Eu não falei inglês"                               │
└─────────────────────────────────────────────────────────────┘
         ↓
    [Processing]
    ├─ Short-Term Memory: Add to [context_id_belmira]
    ├─ [ASYNC] LSTM:
    │   ├─ Analisa mensagem: "não é pergunta direto"
    │   ├─ Contexto continua: "anemia falciforme"
    │   └─ Detecta: possível confusão ou desacordo
    └─ Build Context:
        ├─ short_memory: [msg1, resposta_akira, msg2]
        ├─ lstm_context: {topic: CONTINUA "anemia falciforme"}
        └─ Akira sabe contexto
         ↓
    Akira Responde: "Respondi em português..."


┌─────────────────────────────────────────────────────────────┐
│ Msg 3: "cura? tratamento?"                                 │
└─────────────────────────────────────────────────────────────┘
         ↓
    [Processing]
    ├─ Short-Term Memory: Add [msg3]
    ├─ [ASYNC] LSTM:
    │   ├─ Detecta pergunta: "cura? tratamento?"
    │   ├─ Busca LSTM: "De quê?" ← NOT IN LSTM!
    │   ├─ Procura no histórico mental
    │   ├─ Encontra: topic_principal = "anemia falciforme"
    │   └─ Conecta automaticamente! ✅
    └─ Build Context:
        ├─ short_memory: [últimas 5]
        ├─ lstm_context: {
        │     topic: "anemia falciforme",
        │     unanswered_questions: [
        │       "cura de anemia falciforme?",
        │       "tratamento de anemia?"
        │     ]
        │   }
        └─ Model vê contexto:
           "pergunta sobre anemia falciforme!"
         ↓
    ✅ Akira Responde Corretamente:
    "Para anemia falciforme, tratamentos incluem..."
    (Sabe que é sobre a doença, não pergunta "de quê?")

🔐 ISOLAMENTO E SEGURANÇA

Garantir Isolamento Total:

# ✅ CORRETO: Context isolado por usuário/grupo
context_id = f"{numero_usuario}:{grupo_id}:{tipo}"
lstm_context = self.lstm.get_lstm_context_for_model(context_id)

# ✅ CADA USUÁRIO VEHE APENAS SEU LSTM:
- Belmira vê apenas {context_id: "belmira:None:pv"}
- Isaac vê apenas {context_id: "isaac:None:pv"}
- Grupo X vê apenas {context_id: "user:grupo_x:group"}

# ❌ NUNCA MISTURAR CONTEXTOS
lstm_belmira = get_lstm_for("belmira")  # ✅
lstm_isaac = get_lstm_for("isaac")      # ✅
# Se um usuário vê contexto do outro = VAZAMENTO ❌

Validação de Isolamento:

def validate_context_isolation(numero_usuario, context_id):
    """Valida que contexto pertence ao usuário."""
    
    # Extrair usuario do context_id
    user_in_context = context_id.split(':')[0]
    
    # Verificar
    assert user_in_context == numero_usuario, "Context isolation violated!"
    
    return True

📈 MONITORAMENTO

Logs de LSTM:

✅ LSTM Memory System inicializado
✅ Tabelas LSTM inicializadas
✅ LSTM summary salvo: context_id_belmira
✅ LSTM context for model retrieved: anemia falciforme topic
⚠️ Erro ao processar LSTM: [erro]
❌ Context isolation violated!

Debugging:

# Ver resumo mental de um usuário
lstm = get_lstm_memory_system()
summary = lstm.get_lstm_context_for_model("belmira", "belmira")
print(json.dumps(summary, indent=2))

# Ver histórico com contexto
history = lstm.get_conversation_history_with_context("belmira:None:pv")
print(history['mental_summary'])

✅ CHECKLIST DE IMPLEMENTAÇÃO

  • lstm_memory_system.py criado ✅
  • Tabelas LSTM criadas em database.py
  • reply_context_handler.py chama process_message_async()
  • context_builder.py injeta LSTM context no prompt
  • api.py usa system prompt com LSTM injection
  • persona_tracker.py usa LSTM context
  • Isolamento testado (usuários não veem contextos um do outro)
  • Testes de LSTM extraction funcionam
  • Logs funcionando corretamente
  • Documentação atualizada

🎯 RESULTADO ESPERADO

Antes (Sem LSTM):

Belmira: "cura? tratamento?"
Akira: "De quê?" ❌ Perdeu contexto

Depois (Com LSTM):

Belmira: "cura? tratamento?"
Akira: "Para anemia falciforme, os tratamentos incluem..." ✅ Mantém contexto mentalmente!

O Usuário NÃO vê:

  • Resumos mentais
  • Tabelas LSTM
  • Processamento async
  • Extrações de tópico

O Usuário SÓ vê:

  • Respostas inteligentes com contexto correto ✅

Status: 🚀 Pronto para integração
Complexidade: ⭐⭐⭐⭐ (Média)
Impacto: 🎯 ENORME - Contextalização perfeita