## 왜 챗봇에게 '기억'이 필요할까?
여러분은 카카오톡으로 AI 챗봇과 대화하다가, 웹사이트에서 같은 챗봇을 만났을 때 처음부터 다시 설명해야 했던 경험이 있나요? 이것이 바로 전통적인 멀티채널 챗봇 시스템의 가장 큰 문제점입니다.
### 기존 시스템의 한계
대부분의 챗봇 시스템은 채널별로 대화 기록을 분리 저장합니다:
- 텔레그램 봇의 대화 기록
- 웹 API를 통한 대화 기록
- 슬랙 봇의 대화 기록
이렇게 되면 사용자는 채널을 바꿀 때마다 같은 질문을 반복해야 하고, AI는 과거 대화 맥락을 잃어버립니다.
## 통합 대화 컨텍스트 시스템 설계
### 핵심 아이디어: 단일 대화 저장소
모든 채널의 대화를 하나의 테이블에 저장하되, `channel_type`과 `user_id`로 구분합니다:
```sql
CREATE TABLE unified_conversations (
id SERIAL PRIMARY KEY,
user_id VARCHAR(255),
channel_type VARCHAR(50), -- 'telegram', 'api', 'slack' 등
role VARCHAR(20), -- 'user' or 'assistant'
content TEXT,
created_at TIMESTAMP
);
```
이렇게 하면 사용자가 어느 채널에서 접속하든 전체 대화 이력을 조회할 수 있습니다.
### 3단계 계층 컨텍스트 전략
하지만 수천 개의 대화를 매번 AI에게 전달할 수는 없습니다. 토큰 비용과 응답 속도 문제 때문입니다. 이를 해결하기 위한 3-Tier 전략:
**Tier 1: 최근 대화 (Raw Context)**
- 최근 10쌍(20개 메시지)은 원문 그대로 제공
- 즉각적인 대화 흐름 유지
**Tier 2: 중기 대화 요약 (Summary Context)**
- 최근 100개 대화를 요약본으로 압축
- "사용자는 Python Flask 환경에서 인증 오류를 겪고 있음" 같은 핵심만 추출
**Tier 3: 장기 기억 검색 (RAG Context)**
- 과거 모든 대화를 벡터 임베딩으로 저장
- 현재 질문과 유사한 과거 대화를 검색해서 제공
### 구현 핵심 코드
```python
def get_conversation_context(user_id: str, current_query: str):
# Tier 1: 최근 대화
recent = db.query(
"SELECT role, content FROM unified_conversations "
"WHERE user_id = %s ORDER BY created_at DESC LIMIT 20",
[user_id]
)
# Tier 2: 요약 조회
summary = db.query(
"SELECT summary FROM conversation_summaries "
"WHERE user_id = %s AND message_count <= 100",
[user_id]
)
# Tier 3: RAG 검색
query_embedding = embed_text(current_query)
similar_convs = vector_search(query_embedding, top_k=5)
return {
"recent": recent,
"summary": summary,
"related": similar_convs
}
```
### 기존 데이터 마이그레이션
이미 운영 중인 시스템이라면 기존 대화 기록을 통합해야 합니다:
```python
# 채널별 테이블에서 통합 테이블로 이전
for bot_name, old_table in legacy_tables.items():
conversations = db.query(f"SELECT * FROM {old_table}")
for conv in conversations:
db.insert(
"unified_conversations",
user_id=conv['user_id'],
channel_type=infer_channel(bot_name),
role=conv['role'],
content=conv['message']
)
```
## 실제 효과와 이점
### 1. 크로스 채널 연속 대화
사용자가 텔레그램에서 "Python 설치 방법 알려줘"라고 물었다면, 나중에 웹 채팅에서 "아까 말한 방법으로 했는데 오류나"라고 해도 AI가 맥락을 이해합니다.
### 2. 누적 학습 효과
같은 질문을 여러 사용자가 할 때, 과거 성공적인 답변을 RAG로 찾아 일관성 있는 응답을 제공합니다.
### 3. 비용 최적화
- Tier 1만 사용: ~500 토큰
- 전체 대화 전달: ~5,000 토큰
3단계 전략으로 90%의 컨텍스트 품질을 유지하면서 80%의 비용을 절감할 수 있습니다.
## 마치며
이 시스템은 PostgreSQL + Python 환경에서 구현했지만, MongoDB나 Redis를 활용해도 동일한 패턴을 적용할 수 있습니다. 핵심은 **채널 통합**, **계층적 메모리**, **벡터 검색**의 조합입니다.
다음 단계로는 사용자 세션 관리, 대화 주제 자동 분류, 장기 메모리 압축 알고리즘 최적화 등을 고려해볼 수 있습니다.