Salta ai contenuti

Graphiti - Grafi di Conoscenza Temporali per Agenti

Graphiti - Grafi di Conoscenza Temporali per Agenti

Graphiti (di Zep) è un framework open-source per costruire e interrogare grafi di conoscenza temporali per agenti IA. A differenza di un grafo statico, Graphiti traccia come i fatti cambiano nel tempo: ogni arco porta intervalli di validità, quindi il grafo sa non solo cosa è vero ma quando era vero, preservando la provenienza e la storia. Acquisisce i dati in modo incrementale — gli episodi vengono aggiunti senza ricompilare l”intero grafo — rendendolo ben adatto a memoria che deve ragionare su fatti in evoluzione.

Requisiti

  • Un database di grafi: Neo4j o FalkorDB
  • Un provider LLM (OpenAI, Anthropic, ecc.) per l”estrazione di entità/relazioni
  • Python 3.10+

Installazione

MetodoComando
pippip install graphiti-core
Con FalkorDBpip install "graphiti-core[falkordb]"
Imposta le chiaviexport OPENAI_API_KEY=... e variabili d”ambiente del DB di grafi
Verificapython -c "import graphiti_core; print('ok')"

Concetti Principali

TermineSignificato
EpisodioUn”unità di dati acquisiti (messaggio, testo, JSON)
NodoUn”entità estratta dagli episodi
Arco (fatto)Una relazione con validità temporale (valid_at/invalid_at)
Bi-temporaleTraccia sia il tempo dell”evento che il tempo di acquisizione
CommunityCluster di entità correlate

Inizializza e Aggiungi Episodi

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 si è unito ad Acme come CTO nel 2024.",
        source=EpisodeType.text,
        reference_time=datetime.now(),
        source_description="chat",
    )

asyncio.run(main())
ChiamataDescrizione
Graphiti(uri, user, pass)Connettiti al DB di grafi
build_indices_and_constraints()Setup schema una sola volta
add_episode(...)Acquisisce dati; entità/archi estratti automaticamente
add_episode_bulk(...)Acquisizione batch

Ricerca della Memoria

# Ricerca ibrida: semantica + BM25 + grafo, rirranking
results = await graphiti.search("Dove lavora Nick?")
for r in results:
    print(r.fact, r.valid_at)
RicercaComportamento
search(query)Ricerca ibrida (semantica + parola chiave + grafo) di archi
Ricerca di nodiRecupera entità
RirrankingOpzioni RRF / distanza-grafo / cross-encoder
Nodo centraleBias dei risultati attorno a un”entità specifica

Ragionamento Temporale

Il differenziatore: quando un fatto cambia, Graphiti non lo cancella — lo contrassegna come non valido e aggiunge uno nuovo, quindi la storia è preservata.

CapacitàUso
Invalidazione dei fattiI fatti vecchi ottengono invalid_at impostato quando contraddetti
Query point-in-time”Cosa era vero alla data X?”
ProvenienzaTraccia un fatto alla sua episodio di origine
Tipi di entità personalizzatiDefinisci modelli Pydantic per l”estrazione tipizzata

Integrazione

TargetCome
ZepGraphiti è il motore sotto il servizio di memoria di Zep
Framework di agentiUsa come strumento di memoria/recupero
MCPServer Graphiti MCP espone la memoria agli agenti
PersonalizzatoInterroga il grafo direttamente per il contesto

Flussi di Lavoro Comuni

# Memoria dell''agente che sopravvive a fatti che cambiano
await graphiti.add_episode(name="e1", episode_body="Nick usa Postgres.", ...)
# più tardi, il fatto cambia:
await graphiti.add_episode(name="e2", episode_body="Nick è migrato a SQLite.", ...)
# Graphiti invalida il fatto Postgres e registra quello SQLite con il tempo
ctx = await graphiti.search("Quale database usa Nick adesso?")

Graphiti vs Altri Framework di Memoria

AspettoGraphitiCogneeMem0
Punto di forza principaleFatti temporali/bi-temporaliRagionamento grafo-nativo ECLPersonalizzazione
CronologiaPreservato con orari di validitàSnapshot di grafiFocalizzato su recente
BackendNeo4j / FalkorDBMulti-storeVettore/grafo/KV
Migliore perFatti che cambiano nel tempoRagionamento grafo localeMemoria conversazionale

Risorse