본문으로 건너뛰기
Kreath Archive
TechProjectsBooksAbout
TechProjectsBooksAbout

내비게이션

  • Tech
  • Projects
  • Books
  • About
  • Tags

카테고리

  • AI / ML
  • 웹 개발
  • 프로그래밍
  • 개발 도구

연결

  • GitHub
  • Email
  • RSS
© 2026 Kreath Archive. All rights reserved.Built with Next.js + MDX
홈TechProjectsBooksAbout
//
  1. 홈
  2. 테크
  3. 5장: 지식 그래프 기반 메모리 — Zep 아키텍처
2026년 3월 6일·AI / ML·

5장: 지식 그래프 기반 메모리 — Zep 아키텍처

Zep의 시간 인식 동적 지식 그래프를 중심으로, 엔티티 추출, 관계 생성, 시간적 추론 등 구조화된 메모리의 설계와 장점을 다룹니다.

16분444자8개 섹션
aillmai-agent
공유
agent-memory5 / 10
12345678910
이전4장: 에피소딕 메모리 — 경험에서 학습하기다음6장: 메모리 압축과 통합

학습 목표

  • 지식 그래프 기반 메모리의 구조와 벡터 메모리와의 차이를 이해한다
  • Zep의 3계층 아키텍처(에피소드/시맨틱 엔티티/커뮤니티)를 파악한다
  • 엔티티 추출과 관계 생성의 동작 원리를 이해한다
  • 시간적 추론의 개념과 구현 방식을 설명할 수 있다

벡터 메모리의 한계

3장에서 다룬 벡터 기반 장기 메모리는 강력하지만, 몇 가지 구조적 한계가 있습니다.

관계 표현의 어려움: "김철수는 A 프로젝트의 리더이고, A 프로젝트는 B 팀 소속이며, B 팀은 AI 사업부에 속한다"와 같은 다단계 관계를 벡터만으로 표현하기 어렵습니다.

시간에 따른 변화 추적: "지난달에는 Python을 사용했지만, 이번 달에 TypeScript로 전환했다"와 같은 시간적 변화를 벡터 유사도만으로는 구분할 수 없습니다.

추론의 한계: "A가 B를 알고, B가 C를 알면, A와 C는 간접적으로 연결되어 있다"와 같은 추이적 관계를 벡터 검색으로 발견하기 어렵습니다.

이러한 한계를 극복하기 위해 지식 그래프(Knowledge Graph) 기반 메모리가 등장했습니다.


Zep의 3계층 아키텍처

Zep은 2026년 현재 지식 그래프 기반 메모리의 대표적인 프레임워크입니다. Zep의 핵심은 시간 인식 동적 지식 그래프이며, 이는 3개의 하위 그래프로 구성됩니다.

계층 1: 에피소드 서브그래프 — Episodic Subgraph

대화의 원본 데이터를 시간순으로 저장하는 계층입니다. 4장에서 다룬 에피소딕 메모리의 저장소 역할을 합니다.

episodic-subgraph.ts
typescript
interface EpisodicNode {
  id: string;
  type: "episode";
  content: string;        // 원본 대화 내용
  timestamp: number;
  sessionId: string;
  userId: string;
  metadata: Record<string, unknown>;
}
 
// 에피소드 노드들은 시간순으로 연결
// Episode_1 -> Episode_2 -> Episode_3 -> ...

계층 2: 시맨틱 엔티티 서브그래프 — Semantic Entity Subgraph

에피소드에서 추출된 엔티티(사람, 프로젝트, 기술, 개념)와 그 관계를 구조화한 계층입니다. 이 계층이 지식 그래프의 핵심입니다.

semantic-entity-subgraph.ts
typescript
interface EntityNode {
  id: string;
  type: "entity";
  name: string;            // "김철수", "TypeScript", "A 프로젝트"
  entityType: string;      // "person", "technology", "project"
  attributes: Record<string, string>;
  createdAt: number;
  updatedAt: number;
}
 
interface Relationship {
  id: string;
  source: string;          // 소스 엔티티 ID
  target: string;          // 타깃 엔티티 ID
  type: string;            // "uses", "leads", "belongs_to"
  properties: Record<string, string>;
  validFrom: number;       // 관계 시작 시점
  validUntil?: number;     // 관계 종료 시점 (없으면 현재 유효)
  confidence: number;      // 관계의 확신도
}

계층 3: 커뮤니티 서브그래프 — Community Subgraph

관련된 엔티티와 관계를 군집으로 묶어 상위 수준의 요약을 제공하는 계층입니다. 커뮤니티 탐지(Community Detection) 알고리즘을 통해 자동으로 형성됩니다.

커뮤니티 수준의 요약은 "A 프로젝트는 김철수가 리더인 AI 프로젝트팀에서 TypeScript와 Next.js로 개발 중이며, 박민수가 관리하는 AWS 인프라에 배포된다"와 같은 형태로 생성됩니다.

Info

커뮤니티 서브그래프는 Microsoft의 GraphRAG에서 영감을 받은 구조입니다. 개별 엔티티를 넘어 그룹 수준의 맥락을 파악할 수 있어, "이 프로젝트와 관련된 전체 맥락을 알려줘"와 같은 광범위한 질문에 효과적입니다.


Graphiti: Zep의 지식 그래프 엔진

Graphiti는 Zep이 개발한 오픈소스 시간 인식 지식 그래프 엔진입니다. 대화에서 실시간으로 엔티티와 관계를 추출하고, 시간에 따른 변화를 추적합니다.

엔티티 추출 과정

graphiti-entity-extraction.py
python
from graphiti_core import Graphiti
from graphiti_core.nodes import EpisodeType
 
# Graphiti 인스턴스 초기화
graphiti = Graphiti(
    neo4j_uri="bolt://localhost:7687",
    neo4j_user="neo4j",
    neo4j_password="password",
)
 
# 에피소드 추가 - 엔티티와 관계가 자동 추출됨
await graphiti.add_episode(
    name="기술 스택 논의",
    episode_body="""
    김철수: 이번 프로젝트는 TypeScript로 진행하겠습니다.
    이영희: 좋습니다. Next.js와 함께 사용할까요?
    김철수: 네, Next.js App Router를 사용하고 배포는 AWS Amplify로 하겠습니다.
    """,
    source=EpisodeType.message,
    reference_time=datetime.now(),
)
 
# 자동 추출되는 엔티티와 관계:
# 엔티티: 김철수(person), 이영희(person), TypeScript(technology),
#          Next.js(framework), AWS Amplify(service)
# 관계: 김철수 -[decides]-> TypeScript
#        프로젝트 -[uses]-> Next.js App Router
#        프로젝트 -[deploys_to]-> AWS Amplify

시간적 추론

Graphiti의 핵심 차별점은 시간 인식(Temporal Awareness)입니다. 모든 엔티티와 관계에 유효 기간이 있으며, 시간에 따른 변화를 추적합니다.

temporal-reasoning.py
python
# 시간에 따른 변화 추적
await graphiti.add_episode(
    name="기술 스택 변경",
    episode_body="""
    김철수: Python FastAPI에서 TypeScript로 백엔드도 전환하기로 했습니다.
    """,
    reference_time=datetime(2026, 3, 20),
)
 
# 그래프 상태:
# 김철수 -[uses]-> Python FastAPI  (validUntil: 2026-03-20)
# 김철수 -[uses]-> TypeScript       (validFrom: 2026-03-20)
 
# 시점별 검색
current_stack = await graphiti.search(
    "김철수의 현재 기술 스택",
    reference_time=datetime(2026, 3, 25),
)
# -> TypeScript
 
past_stack = await graphiti.search(
    "김철수의 기술 스택",
    reference_time=datetime(2026, 3, 15),
)
# -> Python FastAPI
Tip

시간적 추론은 "과거에는 어땠는지"와 "현재는 어떤지"를 구분해야 하는 에이전트에게 매우 유용합니다. 사용자의 선호도, 프로젝트 상태, 팀 구성 등이 시간에 따라 변하는 정보를 정확하게 반영할 수 있습니다.


구조화된 메모리의 장점

다단계 추론

벡터 검색으로는 어려운 다단계 추론이 가능합니다.

multi-hop-reasoning.txt
text
질문: "김철수가 속한 사업부의 인프라 담당자는 누구인가?"
 
그래프 탐색 경로:
김철수 -> (소속) -> B 팀 -> (부서) -> AI 사업부
AI 사업부 -> (인프라 담당) -> 박민수
 
답변: 박민수

이러한 질문에 벡터 검색으로 답하려면 "김철수가 속한 사업부의 인프라 담당자"에 대한 직접적인 메모리가 존재해야 합니다. 하지만 지식 그래프에서는 관계를 순회하여 간접적으로 답을 도출할 수 있습니다.

모순 감지

새로운 정보가 기존 그래프와 충돌하는지 자동으로 감지할 수 있습니다.

contradiction-detection.ts
typescript
interface ConflictResult {
  hasConflict: boolean;
  existingFact: string;
  newFact: string;
  resolution: "update" | "coexist" | "reject";
}
 
async function detectContradiction(
  newRelationship: Relationship,
  graph: KnowledgeGraph
): Promise<ConflictResult | null> {
  // 동일 소스-타깃 간 상충되는 관계 검색
  const existing = await graph.findRelationships({
    source: newRelationship.source,
    target: newRelationship.target,
    active: true,
  });
 
  for (const rel of existing) {
    if (isContradictory(rel.type, newRelationship.type)) {
      return {
        hasConflict: true,
        existingFact: `${rel.source} -[${rel.type}]-> ${rel.target}`,
        newFact: `${newRelationship.source} -[${newRelationship.type}]-> ${newRelationship.target}`,
        resolution: "update", // 기존 관계를 종료하고 새 관계로 갱신
      };
    }
  }
 
  return null;
}

설명 가능성

왜 특정 메모리를 참조했는지 그래프 경로를 통해 설명할 수 있습니다. 이는 에이전트의 응답에 대한 신뢰도를 높이는 데 기여합니다.

explainable-retrieval.txt
text
에이전트: "Next.js를 추천합니다."
 
추론 경로:
1. 사용자 -> (선호) -> TypeScript
2. TypeScript -> (주요 프레임워크) -> Next.js
3. 현재 프로젝트 -> (요구사항) -> SSR 지원
4. Next.js -> (제공) -> SSR 지원
 
근거: 사용자의 TypeScript 선호도와 프로젝트의 SSR 요구사항을
모두 충족하는 프레임워크입니다.

벡터 검색과 그래프 검색의 결합

실제 프로덕션에서는 벡터 검색과 그래프 검색을 결합하여 사용합니다. Zep도 내부적으로 이 하이브리드 방식을 채택하고 있습니다.

hybrid-search.ts
typescript
async function hybridMemorySearch(
  query: string,
  userId: string,
  vectorDB: VectorDB,
  graphDB: GraphDB,
  embedder: EmbeddingModel
): Promise<MemoryResult[]> {
  // 병렬로 두 검색 수행
  const [vectorResults, graphResults] = await Promise.all([
    // 벡터 유사도 검색
    vectorDB.query({
      vector: await embedder.embed(query),
      filter: { userId },
      topK: 5,
    }),
    // 그래프 탐색
    graphDB.search({
      query,
      userId,
      maxDepth: 3,     // 최대 3홉까지 탐색
      maxResults: 5,
    }),
  ]);
 
  // 결과 병합: 중복 제거 및 가중 점수 계산
  return mergeAndRank(vectorResults, graphResults, {
    vectorWeight: 0.6,
    graphWeight: 0.4,
  });
}
Info

벡터 검색은 의미적 유사성에 강하고, 그래프 검색은 구조적 관계와 다단계 추론에 강합니다. 두 방식을 결합하면 단일 방식보다 더 정확하고 풍부한 메모리 검색이 가능합니다.


정리

이번 장에서 다룬 지식 그래프 기반 메모리의 핵심 내용을 정리합니다.

  • 지식 그래프는 벡터 메모리의 한계(관계 표현, 시간 추적, 다단계 추론)를 극복합니다
  • Zep의 3계층 구조는 에피소드(원본), 시맨틱 엔티티(구조), 커뮤니티(요약)로 정보를 조직합니다
  • Graphiti는 대화에서 실시간으로 엔티티와 관계를 추출하고 시간적 변화를 추적합니다
  • 시간적 추론으로 "과거에는 A였지만 현재는 B"와 같은 변화를 정확히 반영합니다
  • 하이브리드 검색은 벡터 유사도와 그래프 탐색을 결합하여 검색 품질을 높입니다

다음 장 미리보기

6장에서는 메모리 압축과 통합을 다룹니다. 누적되는 메모리를 효율적으로 압축하면서도 정보 손실을 최소화하는 전략, 3-6배 텍스트 압축과 5-40배 도구 호출 압축의 실제 기법을 살펴봅니다.

이 글이 도움이 되셨나요?

관련 주제 더 보기

#ai#llm#ai-agent

관련 글

AI / ML

6장: 메모리 압축과 통합

에이전트 메모리의 압축 기법, 3-6배 텍스트 압축과 5-40배 도구 호출 압축, 계층적 통합과 정보 손실 최소화 전략을 다룹니다.

2026년 3월 8일·16분
AI / ML

4장: 에피소딕 메모리 — 경험에서 학습하기

에이전트가 과거 상호작용을 에피소드로 기록하고, 경험 기반 의사결정과 패턴 학습에 활용하는 에피소딕 메모리 시스템을 다룹니다.

2026년 3월 4일·17분
AI / ML

7장: 메모리 프레임워크 비교와 선택

Mem0, Zep, Letta, LangChain/LangGraph의 메모리 시스템을 상세 비교하고, 프로젝트 요구사항에 맞는 프레임워크 선택 의사결정 트리를 제시합니다.

2026년 3월 10일·16분
이전 글4장: 에피소딕 메모리 — 경험에서 학습하기
다음 글6장: 메모리 압축과 통합

댓글

목차

약 16분 남음
  • 학습 목표
  • 벡터 메모리의 한계
  • Zep의 3계층 아키텍처
    • 계층 1: 에피소드 서브그래프 — Episodic Subgraph
    • 계층 2: 시맨틱 엔티티 서브그래프 — Semantic Entity Subgraph
    • 계층 3: 커뮤니티 서브그래프 — Community Subgraph
  • Graphiti: Zep의 지식 그래프 엔진
    • 엔티티 추출 과정
    • 시간적 추론
  • 구조화된 메모리의 장점
    • 다단계 추론
    • 모순 감지
    • 설명 가능성
  • 벡터 검색과 그래프 검색의 결합
  • 정리
  • 다음 장 미리보기