logo
Desarrollo
Buscar
Sistema de memoria tridimensional

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)
                      
                      (entidad source) --[relationship]--> (entidad target)

                    
Este bloque de código en una ventana flotante

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
                      
                      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

                    
Este bloque de código en una ventana flotante

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 djb2 se 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-hop
  • shortestPath() — camino más corto entre dos entidades
  • extractEntitiesFromText() — 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 - ...
                      
                      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
- ...

                    
Este bloque de código en una ventana flotante

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