본문 바로가기

개발 공부

MCP (Model Context Protocol) (3)

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