RAG를 넘어: 지식 그래프를 활용한 ‘Deep Memory’ AI 동반자 구축
I’m happy to translate the article for you, but I’ll need the full text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source line and all formatting exactly as you requested.
Source: …
왜 표준 RAG가 충분하지 않았는가
오늘날 대부분의 AI‑메모리 시스템은 벡터 RAG에 의존합니다:
- 텍스트를 청크로 나눕니다.
- 각 청크를 벡터로 변환합니다.
- 나중에 가장 유사한 청크를 검색합니다.
이는 PDF에서 특정 정책을 찾는 데는 훌륭하지만, 인간 관계와 역사를 모델링하는 데는 한계가 있습니다.
벡터는 유사성을 포착할 뿐, 구조는 포착하지 못합니다.
예를 들어 아내가 “오늘 너무 압도당하고 있어”라고 말하면, 벡터 검색은 “압도(overwhelm)”라는 단어가 들어 있는 3개월 전 일기의 항목을 찾아낼 수 있습니다.
반면 지식 그래프는 스토리를 다음과 같이 표현할 수 있습니다:
"Project A" → CAUSED → "Stress" → RESULTED_IN → "Overwhelm"
저는 AI가 인과관계를 이해하기를 원했을 뿐, 단순히 키워드가 겹치는 것을 원한 것이 아닙니다.
아키텍처 결정: 전체‑컨텍스트 주입
저는 구글의 Gemini 모델을 사용하고 있으며, 이 모델은 거대한 컨텍스트 윈도우를 제공합니다. 소수의 작은 청크를 검색하는 대신, 전체 컴파일된 프로필을 프롬프트에 주입할 수 있습니다.
프로세스
- 원시 채팅 로그를 구조화된 그래프로 변환합니다.
- 그래프를 간결한 “사용자 매뉴얼”(엔터티와 관계에 대한 일반 텍스트 설명)로 평탄화합니다.
- 각 상호작용 전에 해당 매뉴얼을 모델에 전달합니다.
인덱싱을 위해 Graphiti(오픈‑소스 그래프‑인덱싱 프레임워크)를 사용했으며, 컴파일된 출력은 약 35 k 토큰에서 약 14 k 토큰으로 축소되었습니다—원본 마스터 프롬프트보다 훨씬 적은 양입니다.
Synapse 소개: 아키텍처
프로젝트는 두 개의 논리적 레이어로 나뉩니다:
| 레이어 | 기술 스택 | 역할 |
|---|---|---|
| Body (프론트엔드) | React 19 + Convex | 실시간 UI 및 채팅 처리 |
| Brain (백엔드) | Python + FastAPI | 대규모 데이터 처리 및 그래프 관리 |
| Memory Engine | Graphiti + Neo4j | 지식 그래프 저장 및 검색 |
| Models | Gemini 3 Flash (graph building) Gemini 2.5 Flash (chat) | 비용 효율적이며 고처리량 추론 |
고수준 뷰

Source: …
How It Works: The “Deep Memory” Pipeline
시스템은 세 가지 뚜렷한 단계로 작동합니다.
Phase A – Conversation (The Chat)
- 사용자는 Gemini 2.5 Flash와 대화합니다 — 빠르고 유연한 응답을 제공합니다.
- 첫 번째 사용자 메시지가 오기 전에 시스템 프롬프트는 전체 Knowledge Graph의 텍스트 요약으로 수화(hydrated) 됩니다.
- 모델은 즉시 사용자가 누구인지, 어떤 점을 걱정하는지, 그리고 그들의 친구가 누구인지 알게 됩니다.
Phase B – Ingestion (The “Sleep” Cycle)
대화가 종료될 때(비활성 상태가 3 시간 지속되거나 수동 “Consolidate” 클릭) 전사본이 Python Cortex로 전송되어 Gemini 3 Flash가 이를 처리합니다.
왜 Gemini 3인가?
복잡한 인간 대화에서 엔터티를 추출하는 것은 어렵습니다. Gemini 3은 미묘한 발언을 이해하고 그래프를 올바르게 업데이트할 수 있습니다.
예시:
“I stopped taking medication X and started Y.”
Gemini 3은 다음과 같은 논리적 업데이트를 생성합니다:
- 노드 Medication X를 찾습니다.
- 관계
STOPPED를 추가합니다. - 노드 Medication Y를 생성합니다.
- 관계
STARTED를 추가합니다.

Phase C – Hydration (The Awakening)
사용자가 돌아오면 다음 세션이 새로 컴파일된 그래프 요약으로 시작됩니다. 시스템은 원시 트리플을 그대로 내보내는 것이 아니라, 노드와 엣지를 모델이 즉시 읽을 수 있는 자연어 서술로 변환합니다.
def _format_compilation(definitions: list[str], relationships: list[str]) -> str:
"""
Turn a list of node definitions and relationship statements into a
readable, sectioned prompt for the LLM.
"""
sections = []
if definitions:
sections.append(
"#### 1. CONCEPTUAL ENTITIES\n" +
"\n".join(f"- {d}" for d in definitions)
)
if relationships:
sections.append(
"#### 2. RELATIONSHIPS\n" +
"\n".join(f"- {r}" for r in relationships)
)
# Add any additional formatting or ordering logic here.
return "\n\n".join(sections)
컴파일된 프롬프트(≈ 14 k 토큰)는 채팅 앞에 삽입되어 모델에게 사용자의 삶에 대한 깊고 구조화된 메모리를 제공합니다.
핵심 내용
- 지식 그래프는 벡터가 놓치는 구조와 인과관계를 포착합니다.
- 대규모 컨텍스트 모델(Gemini)을 사용하면 여러 개의 검색된 청크 대신 전체 “사용자 매뉴얼”을 주입할 수 있습니다.
- Chat → Sleep → Hydration이라는 3단계 파이프라인은 인간이 기억을 통합하는 방식을 반영합니다.
Synapse AI Chat은 35 k‑토큰 매뉴얼을 14 k‑토큰 그래프 기반 “연속 뇌”로 변환했으며, 개인화되고 컨텍스트를 인식하며 실행 비용도 저렴합니다.
코드에 관심이 있거나 직접 사용해 보고 싶다면 이슈를 열거나 아래에 댓글을 남겨 주세요!
Source: …
“킬러 기능”: 메모리 탐색기
AI 메모리는 보통 **“블랙 박스”**입니다. 사용자는 볼 수 없는 것을 신뢰하지 않죠.
아내가 자신의 뇌를 직접 감사할 수 있길 원해서 **react‑force‑graph**를 이용해 시각화 도구를 만들었습니다. 그녀는 Work, Health, Family와 같은 삶의 영역을 나타내는 버블들을 볼 수 있습니다.
만약 그녀가 잘못된 연결을 발견하면(예: AI가 그녀가 실제로 싫어하는 음식을 좋아한다고 판단한 경우) 입력을 수정하고 “나는 이제 버섯을 정말 싫어해.” 와 같은 새로운 정보를 넣어 그래프를 다시 처리할 수 있습니다.
시스템은 그 새로운 입력을 처리하고 그래프를 업데이트하며, 새로운 노드/관계를 만들거나 기존의 것을 무효화합니다. 이 human‑in‑the‑loop 접근 방식은 막대한 신뢰를 구축합니다.
Source: …
Engineering Challenges
이 작업은 단순히 프롬프트 엔지니어링만으로 해결되지 않았습니다. 실제 시스템적인 어려움이 있었습니다.
1. Handling Latency (The Job Queue)
그래프 수집은 느립니다 – Graphiti와 Gemini가 긴 대화를 처리하고 Neo4j를 업데이트하는 데 60 – 200 초가 걸립니다. UI가 3분 동안 멈춰 있는 것은 허용할 수 없었습니다.
Solution: Convex를 작업 큐로 사용합니다. 세션이 끝나면 UI는 즉시 반환됩니다. Convex가 백그라운드에서 작업을 처리하면서 UI 상태를 “Processing…” 로 바꾸고, 작업이 완료되면 “Memory Updated” 로 전환합니다.
2. Handling Flakiness (The Retry Logic)
Gemini API는 강력하지만, 특히 그래프 처리 작업이 무거울 때 503 Service Unavailable 오류가 가끔 발생합니다.
Solution: 지수 백오프를 적용한 이벤트‑드리븐 재시도 시스템을 구현합니다.
// retry delays (ms)
export const RETRY_DELAYS_MS = [
0, // Attempt 1: Immediate
2 * 60_000, // Attempt 2: +2 min (let the API cool down)
10 * 60_000, // Attempt 3: +10 min
30 * 60_000, // Attempt 4: +30 min
];
export const processJob = internalAction({
args: { jobId: v.id("cortex_jobs") },
handler: async (ctx, args) => {
const job = await ctx.runQuery(internal.cortexJobs.get, { id: args.jobId });
try {
// 1️⃣ Heavy lifting (Call Gemini 3 Flash)
// This is where 503 errors usually happen
await ingestGraphData(ctx, job.payload);
// 2️⃣ Mark complete if successful
await ctx.runMutation(internal.cortexJobs.complete, { jobId: args.jobId });
} catch (error) {
const nextAttempt = job.attempts + 1;
if (nextAttempt >= job.maxAttempts) {
// Stop after too many tries
await ctx.runMutation(internal.cortexJobs.fail, {
jobId: args.jobId,
error: String(error),
});
} else {
// 3️⃣ Schedule the retry using Convex's scheduler
const delay = RETRY_DELAYS_MS[nextAttempt] ?? 30 * 60_000;
await ctx.scheduler.runAfter(
delay,
internal.processor.processJob,
{ jobId: args.jobId }
);
}
}
},
});
3. Snappy UX
Convex의 실시간 동기화는 큰 도움이 되었습니다. 복잡한 WebSocket 코드를 직접 작성할 필요가 없었습니다. Python 백엔드가 데이터베이스에 메모리 작업 상태를 업데이트하면 React UI가 즉시 반영됩니다.
토큰 스트리밍은 Convex가 중간에 끼어 있기 때문에 더 원활하게 동작합니다. 백엔드가 Convex와 연결된 상태를 유지하기 때문입니다. 사용자의 브라우저가 닫히거나 연결이 끊겨도 토큰 생성은 계속 진행되어 답변을 Convex에 전달하고, 가능할 때 사용자에게 스트리밍합니다.
Caveat: 각 업데이트는 함수 사용량에 포함되므로, 스트리밍 업데이트는 100 ms 간격으로 제한되어 응답성 및 데이터베이스 쓰기 효율성을 균형 있게 유지합니다.
결과
차이는 밤과 낮의 차이와 같습니다.
| Before | After |
|---|---|
| 아내는 “컨텍스트 설정” 비용 때문에 새 스레드를 시작하는 것을 두려워했습니다. 그녀는 계속해서 같은 말을 반복하고 새로운 데이터로 마스터 프롬프트를 수동으로 업데이트해야 한다고 느꼈습니다. | 그녀는 그냥 이야기합니다. 시스템은 약 10 000 토큰 정도의 Deep Memory를 유지하며(수개월 간의 채팅을 압축한 것), 자동으로 주입됩니다. |
| 별개의 스레드들은 서로 격리되어 있었고, 컨텍스트가 이어지지 않았습니다. | 모든 스레드는 동일한 Cortex를 공유합니다. 그녀가 “Work” 스레드에서 건강 문제를 언급하면(예: “앉아 있다가 허리가 아파요”), “Health” 스레드는 다음 로그인 시 이를 알고 있습니다. |
결론
이 프로젝트를 통해 우리는 수평 AI 플랫폼(예: 모든 것에 대해 조금씩 아는 ChatGPT)에서 수직 AI 스택(당신에 대해 모든 것을 아는)으로 이동하고 있음을 배웠습니다.
ChatGPT와 Gemini는 이미 사용자 프로필과 스레드 요약을 추가하여 이러한 기억을 구축하고 있습니다. 그들은 동일한 목표를 추구하고 있습니다: 진정으로 개인화된 경험.
핵심 요약:
- 벡터는 검색에 뛰어납니다.
- 지식 그래프는 이해에 필수적입니다.
저는 실제 문제를 해결하는 솔루션을 만드는 것을 계속 즐기고 있습니다. 오늘날의 강력한 도구들을 사용하면 빠르게 그리고 신뢰성 있게 멋진 소프트웨어를 만들 수 있습니다.
프로젝트는 https://synapse-chat.juandastic.dev/ 에서 실시간으로 확인할 수 있습니다.
구현을 자세히 살펴보고 싶다면 코드는 오픈 소스입니다:
- Frontend (Body): https://github.com/juandastic/synapse-chat-ai
- Backend (Cortex): https://github.com/juandastic/synapse-cortex
