Aller au contenu

Graphiti - Graphes de connaissances temporels pour agents

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éthodeCommande
pippip install graphiti-core
Avec FalkorDBpip install "graphiti-core[falkordb]"
Définir les clésexport OPENAI_API_KEY=... et les variables d’env de la base de graphe
Vérifierpython -c "import graphiti_core; print('ok')"

Concepts clés

TermeSignification
EpisodeUne unité de données ingérées (message, texte, JSON)
NodeUne entité extraite des épisodes
Edge (fact)Une relation avec le temps de validité (valid_at/invalid_at)
Bi-temporalSuit à la fois l’heure de l’événement et l’heure d’ingestion
CommunityGrappes 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())
AppelDescription
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)
RechercheComportement
search(query)Recherche hybride (sémantique + mot-clé + graphe) d’arête
Node searchRécupérer les entités
RerankingOptions RRF / distance de graphe / cross-encoder
Center nodeBiaiser 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 invalidationLes vieux faits obtiennent invalid_at quand ils sont contredits
Point-in-time queries« Que c’était vrai à la date X ? »
ProvenanceRetracer un fait jusqu’à son épisode source
Custom entity typesDéfinir des modèles Pydantic pour l’extraction typée

Intégration

CibleComment
ZepGraphiti est le moteur sous le service de mémoire Zep
Agent frameworksUtiliser comme outil de mémoire/récupération
MCPLe serveur MCP Graphiti expose la mémoire aux agents
CustomInterroger 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

AspectGraphitiCogneeMem0
Force principaleFaits temporels/bi-temporelsRaisonnement de graphe ECLPersonnalisation
HistoriquePréservé avec temps de validitéSnapshots de grapheRécemment centré
BackendNeo4j / FalkorDBMulti-storeVecteur/graphe/KV
Meilleur pourFaits qui changent au fil du tempsRaisonnement local de grapheMémoire conversationnelle

Ressources