Graphiti - Graphes de connaissances temporels pour agents
Graphiti (par Zep) est un framework open-source pour construire et interroger des graphes de connaissances temporels pour les agents IA. Contrairement à un graphe statique, Graphiti suit comment les faits changent au fil du temps : chaque arête porte des intervalles de validité, donc le graphe sait non seulement ce qui est vrai mais quand c’était vrai, préservant la traçabilité et l’historique. Il ingère les données de manière incrémentale — les épisodes sont ajoutés sans recalculer le graphe entier — ce qui le rend bien adapté à la mémoire qui doit raisonner sur les faits évolutifs.
Exigences
- Une base de données de graphe : Neo4j ou FalkorDB
- Un fournisseur LLM (OpenAI, Anthropic, etc.) pour l’extraction d’entités/relations
- Python 3.10+
Installation
| Méthode | Commande |
|---|
| pip | pip install graphiti-core |
| Avec FalkorDB | pip install "graphiti-core[falkordb]" |
| Définir les clés | export OPENAI_API_KEY=... et les variables d’env de la base de graphe |
| Vérifier | python -c "import graphiti_core; print('ok')" |
Concepts clés
| Terme | Signification |
|---|
| Episode | Une unité de données ingérées (message, texte, JSON) |
| Node | Une entité extraite des épisodes |
| Edge (fact) | Une relation avec le temps de validité (valid_at/invalid_at) |
| Bi-temporal | Suit à la fois l’heure de l’événement et l’heure d’ingestion |
| Community | Grappes d’entités connexes |
Initialiser et ajouter des épisodes
from graphiti_core import Graphiti
from graphiti_core.nodes import EpisodeType
import asyncio
async def main():
graphiti = Graphiti("bolt://localhost:7687", "neo4j", "password")
await graphiti.build_indices_and_constraints()
await graphiti.add_episode(
name="msg1",
episode_body="Nick a rejoint Acme en tant que CTO en 2024.",
source=EpisodeType.text,
reference_time=datetime.now(),
source_description="chat",
)
asyncio.run(main())
| Appel | Description |
|---|
Graphiti(uri, user, pass) | Se connecter à la base de graphe |
build_indices_and_constraints() | Configuration du schéma unique |
add_episode(...) | Ingérer les données ; entités/arêtes extraites automatiquement |
add_episode_bulk(...) | Ingestion en lot |
Rechercher dans la mémoire
# Recherche hybride : sémantique + BM25 + graphe, réclassée
results = await graphiti.search("Où travaille Nick ?")
for r in results:
print(r.fact, r.valid_at)
| Recherche | Comportement |
|---|
search(query) | Recherche hybride (sémantique + mot-clé + graphe) d’arête |
| Node search | Récupérer les entités |
| Reranking | Options RRF / distance de graphe / cross-encoder |
| Center node | Biaiser les résultats autour d’une entité spécifique |
Raisonnement temporel
Le différencié : quand un fait change, Graphiti ne supprime pas l’ancien — il marque l’arête précédente comme invalide et ajoute la nouvelle, donc l’historique est préservé.
| Capacité | Utilisation |
|---|
| Fact invalidation | Les vieux faits obtiennent invalid_at quand ils sont contredits |
| Point-in-time queries | « Que c’était vrai à la date X ? » |
| Provenance | Retracer un fait jusqu’à son épisode source |
| Custom entity types | Définir des modèles Pydantic pour l’extraction typée |
Intégration
| Cible | Comment |
|---|
| Zep | Graphiti est le moteur sous le service de mémoire Zep |
| Agent frameworks | Utiliser comme outil de mémoire/récupération |
| MCP | Le serveur MCP Graphiti expose la mémoire aux agents |
| Custom | Interroger directement le graphe pour le contexte |
Workflows courants
# Mémoire d'agent qui survit aux faits changeants
await graphiti.add_episode(name="e1", episode_body="Nick utilise Postgres.", ...)
# plus tard, le fait change :
await graphiti.add_episode(name="e2", episode_body="Nick a migré vers SQLite.", ...)
# Graphiti invalide le fait Postgres et enregistre le fait SQLite avec l'heure
ctx = await graphiti.search("Quelle base de données Nick utilise-t-il maintenant ?")
Graphiti vs autres frameworks de mémoire
| Aspect | Graphiti | Cognee | Mem0 |
|---|
| Force principale | Faits temporels/bi-temporels | Raisonnement de graphe ECL | Personnalisation |
| Historique | Préservé avec temps de validité | Snapshots de graphe | Récemment centré |
| Backend | Neo4j / FalkorDB | Multi-store | Vecteur/graphe/KV |
| Meilleur pour | Faits qui changent au fil du temps | Raisonnement local de graphe | Mémoire conversationnelle |
Ressources