MCP 기반 컨텍스트 관리와 장기 메모리 시스템의 연결
왜 장기 메모리가 필요한가?
일반적인 LLM은 한 세션, 한 컨텍스트 윈도우 내에서만 문맥을 유지합니다.
하지만 실제 사용 시에는 다음과 같은 문제가 발생합니다
- 사용자의 과거 대화 맥락을 잃어버림
- 수천 건의 문서를 모두 프롬프트에 넣을 수 없음
- 이전 작업 기록을 참조하지 못함
이를 해결하기 위해 장기 메모리(Long-term Memory) 가 필요합니다.
장기 메모리는 다음과 같은 정보를 유지합니다
- 사용자 프로필 (성향, 선호, 일정)
- 프로젝트 기록 (문서, 파일, 이슈 기록)
- 과거 대화 히스토리 요약본
- 도메인 지식베이스
MCP의 핵심 개념
MCP(Model Context Protocol)는 LLM이 컨텍스트를 동적으로 관리하기 위한 일종의 계층화된 컨텍스트 관리 시스템입니다.
- Node (컨텍스트 노드): 각각 독립된 단위 컨텍스트 (ex: 대화 세션, 검색 결과, 문서 요약 등)
- Store (컨텍스트 스토어): 전체 컨텍스트를 저장/관리하는 시스템
- Retriever (검색자): Store에서 필요한 컨텍스트를 선별하여 모델 입력으로 전달
MCP는 결국 모델이 필요한 시점마다 "관련된 컨텍스트 조각"만 선택해서 LLM 입력으로 구성해주는 역할을 합니다.
MCP가 장기 메모리와 만날 때: 아키텍처
장기 메모리 시스템과 MCP가 결합될 때, 일반적으로 아래와 같은 흐름으로 작동합니다.
사용자 입력 --> 단기 컨텍스트 관리 (MCP Node)
↕
장기 메모리 검색 (Vector DB 등)
↕
MCP Retriever에서 컨텍스트 조립
↕
LLM 호출
- 최근 대화 기록은 단기 컨텍스트 (MCP Node) 가 관리
- 오래된 히스토리/파일/프로필은 장기 메모리 DB 에 보관 (보통 Vector DB 기반)
- 둘을 묶어주는 게 MCP의 Retriever
Retriever는 유사도 검색, 시간 가중치, 사용자 설정에 따라 최적의 컨텍스트 묶음을 만들어 모델 입력으로 보냅니다.
코드 예시
아래는 간소화된 MCP + Long-term Memory 통합 흐름을 Typescript 기반으로 예시화한 코드입니다.
interface ContextNode {
id: string;
content: string;
timestamp: number;
}
class MCPStore {
private nodes: ContextNode[] = [];
addNode(node: ContextNode) {
this.nodes.push(node);
}
getRecentNodes(limit: number): ContextNode[] {
return this.nodes.sort((a, b) => b.timestamp - a.timestamp).slice(0, limit);
}
}
class LongTermMemory {
async retrieveRelevantMemories(query: string): Promise<string[]> {
// 실제 시스템에서는 Vector DB 검색 발생
return ["Project Alpha summary", "User preference: prefers dark mode"];
}
}
async function assembleContext(userInput: string, store: MCPStore, ltm: LongTermMemory) {
const recentNodes = store.getRecentNodes(5);
const longTermMemories = await ltm.retrieveRelevantMemories(userInput);
const context = [
...recentNodes.map(n => n.content),
...longTermMemories
].join("\n");
return context;
}
- 이 코드는 아주 단순화된 형태지만, 실제 GPT-4o 기반 멀티모달 MCP 시스템에서도 거의 비슷한 흐름이 반복됩니다.
장점
MCP + Long-term Memory 조합의 장점은
- 최적화된 토큰 사용: LLM 입력에 과거 전체 히스토리를 넣을 필요 없음
- 동적 컨텍스트 확장성: 필요할 때마다 검색/조립
- 개인화 유지: 사용자 선호, 이력 반영
- 스케일링 용이성: 컨텍스트 노드와 메모리 스토어가 분리되어 확장 가능
사례
| 서비스 | MCP 기반 활용 | Long-term Memory 활용 |
| ChatGPT의 Custom GPTs | 스레드 단위 컨텍스트 | 파일 업로드, 지식베이스 |
| Anthropic Claude | 인서트 컨텍스트 관리 | 장문 문서 chunk 저장 |
| Personal AI | 대화 기록 DB화 | 과거 사용자 기록 전수 관리 |
SaaS 아키텍처 관점에서의 MCP + Long-term Memory 구축
실제 SaaS에서 MCP와 장기 메모리를 결합하려면 다음과 같은 아키텍처 구성이 자주 활용됩니다
전체 아키텍처 흐름
[사용자 요청]
↓
[API Gateway / BFF]
↓
[Session Context Manager (MCP Store)]
↓
[Retriever Layer]
↙ ↘
[Short-term Buffer] [Long-term Memory DB (Vector DB, SQL)]
↓
[Context Composer]
↓
[Prompt Builder]
↓
[LLM Inference (OpenAI, Anthropic, 등)]
각 컴포넌트 설명
- API Gateway / BFF: SaaS 클라이언트와 LLM 시스템을 중계하며 인증, 속도제어, 로깅 담당
- Session Context Manager: 최근 몇 분~몇 시간 내의 대화 기록을 관리 (MCP Node 관리)
- Retriever Layer: 검색 오케스트레이션. 단기 컨텍스트 + 장기 컨텍스트 통합 검색
- Long-term Memory DB: 일반적으로 Vector DB (Pinecone, Weaviate, Qdrant 등) + RDBMS (Postgres 등) 조합
- Context Composer: LLM 입력으로 들어갈 최종 컨텍스트 조립
- Prompt Builder: 시스템 프롬프트, 인스트럭션, 유저 인풋, 컨텍스트를 조합하여 최종 프롬프트 생성
- LLM Inference: SaaS가 사용하는 LLM 엔진 호출
SaaS 구축시 주의사항
- Vector DB 인덱싱 및 업데이트 주기 설계
- Retrieval Filtering (semantic score cutoff, user scope 제한 등)
- 토큰 예산 고려하여 context size 튜닝
- 개인정보, 보안 고려 (PII masking 등)
- 멀티 테넌시 지원 시 테넌트 분리 전략 필요
'개발 공부' 카테고리의 다른 글
| Node.js, Redis (0) | 2025.06.25 |
|---|---|
| 트랜잭션(Transaction) (0) | 2025.06.19 |
| MCP (Model Context Protocol) (1) (11) | 2025.06.12 |
| $, _name$ 네이밍 컨벤션 (0) | 2025.06.03 |
| Chrome DevTools (1) | 2025.05.25 |