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:
```sql
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:
```python
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:
```python
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:
```python
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:
```python
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:
```python
# ✅ 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:
```python
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:
```python
# 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