Sistema de memoria tridimensional
Descripción general
El sistema de memoria del espacio de trabajo adopta una arquitectura tridimensional que almacena y gestiona el conocimiento en tres dimensiones: cuenta, empresa y sesión. La memoria está profundamente integrada con la conversación: cada conversación consulta las memorias relevantes para inyectarlas en el contexto, y al final de cada ronda de interacción se extraen automáticamente nuevas memorias.
Base tecnológica: mem0 REST API + grafo de conocimiento Neo4j.
Arquitectura tridimensional
| Dimensión | Ámbito | Forma de escritura | Permiso de gestión | Inyección en la conversación |
|---|---|---|---|---|
| Nivel de cuenta | userId (entre organizaciones) | Añadido manual + extracción automática de la conversación | Gestionada por el propio usuario | "Perfil del usuario" inyectado en el system prompt |
| Nivel de empresa | orgId (aislamiento por organización) | Mantenida manualmente por el administrador | Solo el administrador del espacio de trabajo | "Perfil de la empresa" inyectado en el system prompt |
| Nivel de sesión | runId (sesión única) | Extracción automática en cada ronda | Gestión automática | Consulta semántica dentro de la sesión |
Memoria de nivel de cuenta
- Compartida entre organizaciones: vinculada al userId, disponible en todas las organizaciones del usuario
- Forma de escritura:
- Manual: añadida mediante comandos en la interfaz de gestión de memoria o en la conversación
- Automática: detecta automáticamente durante la conversación la información que vale la pena recordar
- Interfaz de gestión: Configuración de la APP → Memoria
- Documentación detallada: Gestión de memoria
Memoria de nivel de empresa
- Aislamiento por organización: vinculada al orgId, visible solo para los miembros de la organización actual
- Permiso de gestión: solo el administrador del espacio de trabajo puede mantenerla
- Interfaz de gestión: Gestión del espacio → Configuración avanzada → Memoria de empresa
- Documentación detallada: Configuración avanzada — Memoria de empresa
Memoria de nivel de sesión
- Sesión única: vinculada al runId, válida solo dentro de la sesión actual
- Extracción en cada ronda: al final de cada ronda de conversación se analiza y extrae la memoria automáticamente
- Sin necesidad de gestión: el sistema lo procesa automáticamente
Mecanismo de extracción de memoria
Comandos explícitos (confianza 0,99)
El usuario pide directamente al Agent que recuerde u olvide información:
| Operación | Palabras clave desencadenantes |
|---|---|
| Añadir memoria | "记住", "记下", "保存记忆", "保存到记忆", "remember", "store in memory" |
| Eliminar memoria | "删除记忆", "忘掉", "忘记", "forget this", "remove from memory" |
Detección implícita (confianza 0,5-0,93)
El sistema detecta automáticamente hechos persistentes en la conversación mediante patrones de expresiones regulares:
| Tipo de señal | Ejemplo | Confianza |
|---|---|---|
| Perfil personal | "我叫张三", "我是前端开发", "my name is" | 0,93 |
| Pertenencia personal | "我有一只猫", "我养了", "I own" | 0,90 |
| Preferencia personal | "我喜欢用 TypeScript", "I prefer" | 0,88 |
| Estilo del asistente | "以后请用中文回复", "always use", "preferencia de formato de respuesta" | 0,86 |
Umbrales de confianza
| Modo | Umbral | Descripción |
|---|---|---|
| strict | 0,85 | Modo conservador, solo extrae memorias de alta confianza |
| standard (predeterminado) | 0,65 | Modo equilibrado |
| relaxed | 0,50 | Modo agresivo, se recuerda más contenido |
Reglas de exclusión automática
El siguiente contenido no se extrae como memoria:
- Preguntas puras (terminadas en signo de interrogación, iniciadas con palabra interrogativa)
- Charla informal / cortesías
- Contenido dentro de bloques de código
- Información de vigencia limitada / vinculada al tiempo (fechas, noticias, estados temporales)
- Temas no persistentes (informes de bugs, mensajes de error)
Grafo de conocimiento
Almacenamiento en el backend (Neo4j)
Las relaciones de memoria se almacenan en forma de tripletas en la base de datos de grafos Neo4j:
(entidad source) --[relationship]--> (entidad target)
Consulta de vecindario N-hop (de 1 a 4 saltos):
MATCH path = (n {name: $entity})-[*1..depth]-(m)
WHERE ALL(node IN nodes(path) WHERE node.user_id = $user_id)
UNWIND relationships(path) AS rel
RETURN source, relationship, target
La consulta Cypher garantiza que nunca se cruce el límite entre usuarios.
Visualización en el frontend
Se usa react-force-graph-2d para renderizar un grafo dirigido por fuerzas:
| Tipo de nodo | Color | Descripción |
|---|---|---|
| Hub | Morado #6d28d9 |
Nodo central de usuario/organización |
| Fact | Azul #2563eb |
Entrada de memoria |
| Entity | Ámbar #f59e0b (predeterminado) |
Entidad extraída; el color concreto lo asigna un hash djb2 mapeado a una paleta de 10 colores |
Optimización del renderizado del grafo (actualización 2026-04) NEW
La nueva versión del grafo introduce dos umbrales de densidad para evitar que un exceso de nodos provoque solapamiento de etiquetas:
| Constante de umbral | Valor | Significado |
|---|---|---|
PILL_READABILITY_MIN_SCALE |
1.5 | Con un zoom inferior a 1.5x no se renderizan las etiquetas de texto |
PILL_MIN_SCREEN_AREA_PER_NODE |
3000 | Con menos de 3000 píxeles de área de pantalla por nodo no se renderizan las etiquetas |
Las etiquetas solo se muestran cuando ambas condiciones se cumplen simultáneamente. Si no se alcanzan, solo se renderizan puntos.
Estabilización del color por Entity Type:
- Mediante un hash
djb2se calcula el tipo de entidad → índice de color - Las entidades del mismo tipo mantienen el mismo color en distintas vistas y en distintos momentos
- La paleta de 10 colores admite un uso cíclico ilimitado de tipos
Corrección de bug: al mapear las relaciones del grafo, los campos sourceTypes / targetTypes se descartaban antes, lo que hacía que todos los nodos revirtieran al gris fallback. Este bug ya está corregido (véase sidecar/src/mem0Service.ts).
Desglose multinivel
Al hacer clic en un nodo se pueden expandir sus entidades asociadas, profundizando capa por capa en la red de conocimiento. El motor del grafo admite:
neighborhood()— consulta de vecindario N-hopshortestPath()— camino más corto entre dos entidadesextractEntitiesFromText()— extracción de nombres de entidades a partir de texto
Sinergia entre la memoria y la conversación
Momentos de consulta de memoria
| Momento | Acción |
|---|---|
| Nueva conversación | Consulta la memoria del perfil de cuenta + la memoria del perfil de empresa y las concatena al system prompt |
| El usuario envía un mensaje | La herramienta memory_query recupera semánticamente las memorias relevantes |
| Expansión del grafo | searchWithGraphExpansion — recuperación semántica + expansión del grafo de 1-hop, devuelve las entidades y aristas relevantes |
Ubicación de la inyección de memoria
En el system prompt se inyectan dos perfiles de memoria:
Eres el asistente de IA de GPTBots...
## Perfil del usuario
- El usuario es ingeniero de desarrollo frontend
- Prefiere usar TypeScript
- ...
## Perfil de la empresa
- La empresa usa la pila tecnológica React
- Nombre en clave del proyecto: Project Alpha
- ...
Herramientas de memoria
El Agent puede consultar y gestionar la memoria de forma proactiva mediante las siguientes herramientas:
| Herramienta | Operación | Descripción |
|---|---|---|
| memory_query | list / search / graph_traverse | Listar, búsqueda semántica, recorrido del grafo |
| memory_manage | add / update / delete | Añadir, modificar, eliminar memoria |
| conversation_search | search | Buscar en el historial de conversaciones |
| recent_chats | list | Listar las conversaciones recientes |
Aislamiento del Gateway entre cuentas NEW
Cuando un nodo se invoca entre cuentas con ámbito enterprise:
- Memoria de nivel de cuenta (vinculada a userId): ❌ no accesible
- Memoria de nivel de empresa (vinculada a orgId): ✅ accesible
- Memoria de nivel de sesión (dentro de esta sesión): ✅ accesible
Mediante el indicador isRemoteSession se fuerza el filtrado en la fase de consulta de mem0Service: una invocación entre cuentas no puede leer la memoria personal del propietario del nodo de destino.
Objetivo de diseño: proteger la privacidad personal sin afectar el uso compartido colaborativo del conocimiento a nivel de organización. Véase Arquitectura multinodo.
Capacidades de mem0
El backend de memoria, basado en mem0, ofrece las siguientes capacidades automatizadas:
| Capacidad | Descripción |
|---|---|
| Actualización automática | La información nueva sobrescribe la antigua (por ejemplo, "me gusta Python" → "me gusta TypeScript") |
| Fusión automática | Las memorias similares se fusionan en una entrada más completa |
| Olvido automático | La información contradictoria limpia automáticamente las versiones antiguas |
Protección por tiempo de espera
| Operación | Tiempo de espera |
|---|---|
| Consulta/gestión de memoria | 25 segundos |
| Operaciones de memoria de nivel de sesión | 5 segundos (tiempo de espera rápido, no bloquea la conversación) |
| Obtención de relaciones del grafo | 3 segundos (degradación elegante tras el tiempo de espera) |
Qué significa para el usuario
El sistema de memoria permite que el Agent "te conozca". Sin memoria, en cada conversación el Agent es como un desconocido que te ve por primera vez; con memoria, el Agent conoce tus preferencias, el contexto de tus proyectos y tus hábitos de trabajo.
Cómo se reflejan las tres dimensiones en la práctica:
- Memoria de cuenta: "dijiste que te gusta TypeScript" → el Agent prioriza TypeScript en las conversaciones de todas las organizaciones
- Memoria de empresa: el administrador añadió "la empresa usa la base de datos PostgreSQL" → cuando cualquier miembro de la organización habla de bases de datos con el Agent, este recomienda por defecto la solución PostgreSQL
- Memoria de sesión: en esta conversación dijiste "el proyecto actual se llama Project Alpha" → el Agent lo recuerda en esta conversación, pero no necesariamente en una nueva
Puedes gestionar la memoria así:
- Para preferencias personales: di en la conversación "recuerda que prefiero el tema dark", o añádelo manualmente en Configuración de la APP → Memoria
- Para conocimiento de empresa: contacta con el administrador para añadirlo en Gestión del espacio → Configuración avanzada → Memoria de empresa
- Si detectas un error en la memoria: di en la conversación "olvida la preferencia anterior sobre Python", o elimínala directamente en la gestión de memoria
- Para ver la memoria existente: Configuración de la APP → Memoria, donde puedes explorar la lista y el grafo
Documentos relacionados
- Gestión de memoria — Interfaz de gestión de memoria en la APP
- Configuración avanzada — Memoria de empresa — Gestión de memoria de nivel de empresa
- Gestión de herramientas — Herramientas relacionadas con la memoria (memory_query, memory_manage)
- Arquitectura multinodo — Mecanismo de aislamiento del Gateway entre cuentas
