콘텐츠로 이동

Graphiti - 에이전트용 시간 지식 그래프 치트시트

Graphiti - 에이전트용 시간 지식 그래프 치트시트

Graphiti (by Zep)는 AI 에이전트를 위해 시간 지식 그래프를 구축하고 쿼리하기 위한 오픈소스 프레임워크입니다. 정적 그래프와 달리, Graphiti는 사실이 시간에 따라 어떻게 변하는지 추적합니다. 각 엣지는 유효성 간격을 수반하므로 그래프는 단순히 무엇이 참인지뿐만 아니라 언제 참이었는지를 알고, 전파를 보존합니다. 데이터를 증분적으로 수집합니다(에피소드는 전체 그래프 재계산 없이 추가됨). 이는 진화하는 사실에 대해 추론해야 하는 메모리에 이상적입니다.

요구사항

  • 그래프 데이터베이스: Neo4j 또는 FalkorDB
  • LLM 제공자 (OpenAI, Anthropic 등) 엔티티/관계 추출용
  • Python 3.10+

설치

방법명령어
pippip install graphiti-core
FalkorDB 포함pip install "graphiti-core[falkordb]"
키 설정export OPENAI_API_KEY=... 및 그래프 DB 환경 변수
검증python -c "import graphiti_core; print('ok')"

핵심 개념

용어의미
Episode수집된 데이터의 단위 (메시지, 텍스트, JSON)
Node에피소드에서 추출된 엔티티
Edge (fact)유효성 시간 (valid_at/invalid_at)을 갖는 관계
Bi-temporal이벤트 시간과 수집 시간 모두 추적
Community관련 엔티티의 클러스터

초기화 및 에피소드 추가

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 joined Acme as CTO in 2024.",
        source=EpisodeType.text,
        reference_time=datetime.now(),
        source_description="chat",
    )

asyncio.run(main())
호출설명
Graphiti(uri, user, pass)그래프 DB에 연결
build_indices_and_constraints()일회성 스키마 설정
add_episode(...)데이터 수집; 엔티티/엣지 자동 추출
add_episode_bulk(...)배치 수집

메모리 검색

# 하이브리드 검색: 시맨틱 + BM25 + 그래프, 재정렬
results = await graphiti.search("Where does Nick work?")
for r in results:
    print(r.fact, r.valid_at)
검색동작
search(query)하이브리드 (시맨틱 + 키워드 + 그래프) 엣지 검색
Node search엔티티 검색
RerankingRRF / 그래프 거리 / 크로스 인코더 옵션
Center node특정 엔티티 주변 결과 편향

시간 추론

차이점: 사실이 변하면, Graphiti는 이전 사실을 삭제하지 않습니다. 이전 엣지를 무효로 표시하고 새 사실을 기록하여 히스토리가 보존됩니다.

기능사용
사실 무효화모순되면 이전 사실이 invalid_at으로 설정
시점 쿼리”날짜 X 기준으로 무엇이 참이었는가?”
전파사실을 소스 에피소드로 추적
커스텀 엔티티 타입유형 추출을 위한 Pydantic 모델 정의

통합

대상방법
ZepGraphiti는 Zep 메모리 서비스 엔진
에이전트 프레임워크메모리/검색 도구로 사용
MCPGraphiti MCP 서버는 에이전트에 메모리 노출
커스텀컨텍스트를 위해 그래프 직접 쿼리

일반적인 워크플로우

# 변화하는 사실을 견디는 에이전트 메모리
await graphiti.add_episode(name="e1", episode_body="Nick uses Postgres.", ...)
# 나중에 사실이 변함:
await graphiti.add_episode(name="e2", episode_body="Nick migrated to SQLite.", ...)
# Graphiti는 Postgres 사실을 무효화하고 시간 정보와 함께 SQLite를 기록
ctx = await graphiti.search("What database does Nick use now?")

Graphiti vs 다른 메모리 프레임워크

측면GraphitiCogneeMem0
핵심 강점시간/양시간 사실그래프 네이티브 ECL개인화
히스토리유효성 시간으로 보존그래프 스냅샷최근 중심
백엔드Neo4j / FalkorDB다중 저장소벡터/그래프/KV
최고의 용도시간에 따라 변하는 사실로컬 그래프 추론대화 메모리

리소스