En pocas palabras
Framework abierto de grafos temporales que conserva relaciones y cambios de hechos para agentes.
Qué problema resuelve
Memoria que mezcla hechos antiguos y actuales o pierde su procedencia.
Cuándo utilizarlo
Agentes con información cambiante. Ejemplo: distinguir el responsable actual de una cuenta del anterior.
De la idea a la práctica
Funcionamiento, ejemplos y decisiones para pasar al siguiente nivel.
En el Radar compartido: Trial (valoración de la edición aportada).
Cómo funciona
Incorpora episodios y deriva entidades y relaciones con ventanas temporales. Combina búsqueda semántica, textual y recorridos del grafo para recuperar contexto.
Ejemplo de uso
Registrar que una cuenta cambió de asesor en septiembre. Una consulta actual recupera al nuevo responsable; una auditoría histórica puede recuperar la relación vigente en agosto.
Modelo bitemporal
Cada relación (arista) guarda dos líneas de tiempo:
| Línea temporal | Campos | Responde a |
|---|---|---|
| Validez | valid_at, invalid_at |
¿Cuándo fue cierto este hecho en el mundo? |
| Transacción | created_at, expired_at |
¿Cuándo lo supo el sistema y cuándo lo dejó de considerar vigente? |
Cuando llega información contradictoria («desde septiembre el asesor es Ana»), Graphiti no borra la relación anterior: la invalida con fecha, de modo que se puede reconstruir el estado en cualquier momento.
Ejemplo de uso
from datetime import datetime, timezone
from graphiti_core import Graphiti
from graphiti_core.nodes import EpisodeType
graphiti = Graphiti("bolt://localhost:7687", "neo4j", "password")
await graphiti.build_indices_and_constraints()
await graphiti.add_episode(
name="reasignacion-cuenta-42",
episode_body="La cuenta 42 pasa a ser atendida por la asesora Ana Ruiz desde el 1 de septiembre.",
source=EpisodeType.text,
source_description="CRM, nota del supervisor",
reference_time=datetime(2026, 9, 1, tzinfo=timezone.utc),
group_id="cliente-42",
)
resultados = await graphiti.search("¿Quién atiende la cuenta 42?", group_ids=["cliente-42"])
for arista in resultados:
print(arista.fact, arista.valid_at, arista.invalid_at)
Los episodios pueden ser texto, mensajes de chat o JSON estructurado. Un LLM extrae entidades y relaciones; el grafo se guarda en Neo4j, FalkorDB, Kuzu o Amazon Neptune.
Búsqueda híbrida
La recuperación combina similitud semántica (embeddings), búsqueda por palabras clave (BM25) y recorrido del grafo desde un nodo central, con reordenación de resultados. Esto reduce la dependencia de llamadas al LLM en el momento de consulta, lo que mejora la latencia.
Tipos de entidad propios
Se pueden definir entidades con modelos de Pydantic (por ejemplo Cliente, Credito, Asesor con sus atributos) para que la extracción produzca un esquema coherente en lugar de entidades genéricas.
Cuándo usarlo frente a otras memorias
| Necesidad | Opción |
|---|---|
| Buscar fragmentos de documentos estáticos | RAG con vector store |
| Responder preguntas globales sobre un corpus | GraphRAG |
| Memoria de agente que cambia con el tiempo | Graphiti |
Incluye un servidor MCP para usarlo como memoria desde asistentes y agentes de código.
Criterios de implementación
Validar contradicciones y errores de extracción. Elegir un backend compatible, fijar versiones y aplicar aislamiento por usuario o organización; no asumir latencias universales.
Continúa en las fuentes
Documentación oficial para verificar detalles y explorar más.