Apresentação
User Intelligence — studyAI
User State / Session Intelligence — contexto do utilizador que permite aos agentes adaptar conteúdo, dificuldade e feedback.
Problema
Atualmente o Router decide só pela mensagem. Não considera:
- Nível do utilizador
- Histórico de erros
- Tópicos fracos
- Preferências de estilo
User State
user_profile (nova tabela)
| Campo | Tipo | Descrição |
|---|---|---|
| id | UUID | PK |
| user_id | UUID | FK users(id) |
| level | VARCHAR | beginner | intermediate | advanced |
| weak_topics | JSONB | ["RAG", "Agents", ...] — tópicos com scores baixos |
| recent_errors | JSONB | Últimas N perguntas com score < 70 |
| preferred_style | VARCHAR | concise | detailed | technical |
| created_at | TIMESTAMPTZ | |
| updated_at | TIMESTAMPTZ |
Como se popula
- level: User define ou inferido por scores médios
- weak_topics: Agregado de user_progress por document/topic
- recent_errors: Últimas 5–10 submissões com score < 70
- preferred_style: User define em settings
Memória de sessão (conversation_memory)
Para "continua o que estavas a dizer" e contexto entre sessões:
| Campo | Descrição |
|---|---|
| user_id, project_id | Scope da memória |
| summary | Resumo da conversa (últimas N mensagens) |
| embedding | Para retrieval semântico ("o que estávamos a discutir") |
| message_count | Nº de mensagens resumidas |
| last_activity_at | Última atividade |
Atualização: A cada 5–10 mensagens, ou ao fechar sessão, LLM gera summary e atualiza. Embedding do summary para retrieval.
Uso: RAG QA Agent e Content Writer podem carregar conversation_memory para contexto adicional.
Memory Layer (semântica)
Além de dados estruturados (user_profile) e conversation_memory, considerar:
Opção A: JSON + agregação
- Guardar em user_profile.recent_errors, weak_topics
- Sem embeddings adicionais
- Simples, suficiente para MVP
Opção B: Embeddings de comportamento
- "Este user erra sempre em X" → chunk com embedding
- Retrieval quando Planner/Evaluator precisa de contexto
- Mais complexo, para fase avançada
Opção C: user_memory (tabela)
- Factos extraídos: "user tem dificuldade em polipectomia"
- Tipo, conteúdo, source (question_id), created_at
- Pode ser indexado para RAG sobre o user
Adaptação por agente
Content Planner
- Input: + user_profile (level, weak_topics)
- Output: Estrutura adaptada — mais detalhe em weak_topics, menos em dominados
- Ex: Se weak_topics inclui "complicações", garantir secção dedicada
Question Generator
- Input: + user_profile.level, preferred_style
- Output: Perguntas com
difficulty:easy|medium|hard - Distribuição por nível: beginner → mais easy, advanced → mais hard
- Estilo: concise → perguntas curtas; detailed → perguntas abertas
Question Evaluator
- Input: + user_profile (recent_errors, weak_topics)
- Output: Feedback adaptado — mais pormenorizado em weak_topics
- Sugerir material específico para reforçar
Router
- Input: + user_profile (opcional para alguns intents)
- Ex: "O que devo estudar?" → considera weak_topics, next_review_at
Schema de contexto (para agentes)
{
"user_level": "intermediate",
"weak_topics": ["RAG", "Guardrails"],
"recent_errors": [
{ "question_id": "...", "score": 45, "topic": "RAG" }
],
"preferred_style": "technical",
"next_review_count": 5
}
Integração
- Atualização: Após cada evaluate, atualizar user_profile (weak_topics, recent_errors)
- Leitura: Antes de chamar Planner, Generator, Evaluator — carregar user_profile
- Inferência de level: Job periódico ou em evaluate — média de scores → level
Referências
Zona de prática
Sem perguntas. Clica em Editar para adicionar.