1. 학습 주제
챗봇이 이전 대화를 “기억하는 것처럼” 동작하는 구조를 학습했다.
실제로 LLM이 모든 대화를 자동으로 영구 기억하는 것이 아니라, 필요한 정보를 따로 저장하고 답변 시점에 다시 전달하는 방식으로 동작한다.
핵심은 다음과 같다.
- 대화 기록을 저장하는 Message History
- 최근 대화만 사용하는 Short-term Memory
- 사용자 정보를 따로 저장하는 Profile Memory
- 긴 대화를 요약해서 유지하는 Summary Memory
- 최근 몇 개 메시지를 사용할지 정하는 Memory Window
- 민감정보를 저장하지 않도록 처리하는 Privacy
- 세션별 메모리를 JSON 파일로 저장하고 복원하는 구조
2. Context란?
context는 모델이 답변을 만들 때 참고하도록 함께 전달하는 정보 묶음이다.
즉, 사용자가 질문한 문장만 보내는 것이 아니라 다음과 같은 정보를 같이 넘길 수 있다.
사용자 질문
+ 사용자 profile
+ 이전 대화 요약
+ 최근 대화 목록
= 답변 생성을 위한 context
예를 들어 사용자가 “내 수준에 맞게 다시 설명해줘”라고 말하면, 이 문장만으로는 사용자의 수준을 알 수 없다.
그래서 이전에 저장해둔 내 수준은 Python 초보자야 같은 profile 정보가 context에 포함되어야 답변을 맞춰줄 수 있다.
3. Chatbot Memory 주요 개념
| 개념 | 의미 |
| Message History | 지금까지의 전체 대화 목록 |
| Short-term Memory | 최근 몇 개의 대화만 기억하는 방식 |
| Profile Memory | 이름, 관심사, 목표, 수준처럼 오래 유지할 사용자 정보 |
| Summary Memory | 긴 대화를 짧게 요약한 기억 |
| Memory Window | 최근 몇 개 메시지를 context에 포함할지 정한 범위 |
| Privacy | 비밀번호, API Key 같은 저장하면 안 되는 정보를 보호하는 것 |
4. Message History
Message History는 사용자와 챗봇이 주고받은 대화 전체를 저장하는 목록이다.
각 메시지는 보통 다음 정보를 가진다.
{
"role": "user",
"content": "내 이름은 민수야",
"time": "08:25:15"
}
여기서 role은 누가 말했는지를 의미한다.
- user: 사용자가 입력한 메시지
- assistant: 챗봇이 응답한 메시지
- system: 챗봇의 역할이나 규칙을 정하는 메시지
다만 전체 대화를 계속 모델에게 보내면 토큰이 많이 들고, 오래된 대화까지 모두 참고하게 되어 비효율적일 수 있다.
그래서 전체 기록은 저장하되, 실제 답변에는 최근 일부만 사용하는 방식이 필요하다.
5. Short-term Memory와 Memory Window
Short-term Memory는 최근 대화 몇 개만 기억해서 답변에 사용하는 방식이다.
이때 “최근 몇 개까지 사용할 것인지”를 정하는 값이 Memory Window이다.
예를 들어 max_recent_messages = 6이면 전체 대화가 30개 있어도 답변에는 최근 6개만 넣는다.
def recent_messages(self):
return self.messages[-self.max_recent_messages:]
Memory Window를 작게 잡으면 장점은 다음과 같다.
- 토큰 사용량이 줄어든다.
- 답변 속도와 비용 관리에 유리하다.
- 최근 흐름에 집중할 수 있다.
하지만 단점도 있다.
- 오래전에 말한 정보는 최근 대화에서 사라질 수 있다.
- 이름, 관심사, 목표 같은 중요한 정보까지 잊은 것처럼 보일 수 있다.
그래서 최근 대화와 별도로 Profile Memory가 필요하다.
6. Profile Memory
Profile Memory는 사용자에 대해 오래 유지할 정보를 따로 저장하는 공간이다.
예를 들어 다음과 같은 문장을 만나면 profile로 저장한다.
내 이름은 민수야
관심사는 RAG와 챗봇이야
목표는 AI 챗봇을 만드는 거야
내 수준은 Python 초보자야
설명 방식은 짧은 예시 중심이야
저장 결과는 다음처럼 관리할 수 있다.
{
"name": "민수",
"interest": "RAG와 챗봇",
"goal": "AI 챗봇 만들기",
"level": "Python 초보자",
"preferred_style": "짧은 예시 중심"
}
중요한 점은 profile은 최근 대화에서 사라져도 유지될 수 있다는 것이다.
즉, Memory Window에는 이름을 말한 대화가 없어도 profile에 이름이 남아 있으면 챗봇이 계속 참고할 수 있다.
7. Summary Memory
Summary Memory는 긴 대화를 짧게 압축해서 저장하는 방식이다.
전체 대화를 매번 context에 넣으면 너무 길어지기 때문에, 오래된 대화는 요약본으로 관리하고 최근 대화만 그대로 유지한다.
구조는 다음과 비슷하다.
[Profile]
사용자 이름, 관심사, 목표, 수준
[Summary]
사용자는 RAG 챗봇에 관심이 있고, Loader와 Text Splitter 개념을 학습했다.
[Recent Messages]
최근 6개 대화
이 방식의 장점은 다음과 같다.
- 긴 대화의 흐름을 유지할 수 있다.
- 토큰을 절약할 수 있다.
- 오래된 대화는 요약으로, 최근 대화는 원문으로 참고할 수 있다.
실제 챗봇에서는 전체 대화를 계속 넣기보다 profile + summary + recent messages 조합을 많이 사용한다.
8. Privacy와 민감정보 처리
챗봇 메모리에서 중요한 부분은 아무 정보나 저장하면 안 된다는 점이다.
비밀번호, 주민등록번호, 계좌번호, API Key 같은 정보는 저장하지 않아야 한다.
예를 들어 사용자가 다음처럼 입력하면:
내 비밀번호는 class1234야
그대로 저장하지 않고 민감정보로 판단해 제거하거나 대체해야 한다.
"[민감정보가 제거된 메시지]"
메모리는 편리하지만, 잘못 관리하면 개인정보가 남을 수 있다.
그래서 챗봇 메모리에서는 “무엇을 기억할지”뿐만 아니라 “무엇을 기억하지 말아야 할지”도 중요하다.
9. Session Persistence
메모리를 프로그램 실행 중에만 저장하면 프로그램을 종료했을 때 모두 사라진다.
그래서 세션별 메모리를 JSON 파일로 저장하고 다시 불러오는 구조를 학습했다.
student-a -> student-a의 memory
student-b -> student-b의 memory
각 사용자 또는 세션마다 독립된 메모리를 가져야 한다.
그래야 A 사용자의 이름이나 관심사가 B 사용자에게 섞이지 않는다.
저장되는 구조는 다음과 비슷하다.
{
"student-a": {
"messages": [],
"profile": {
"name": "민수"
},
"summary": "",
"max_recent_messages": 6
}
}
이 구조를 사용하면 프로그램을 다시 실행해도 이전 profile과 message history를 복원할 수 있다.
10. OpenAI Memory Chatbot 흐름
OpenAI API를 사용하는 챗봇에서는 저장된 메모리를 직접 모델에게 전달해야 한다.
흐름은 다음과 같다.
1. 사용자 메시지 입력
2. profile로 저장할 정보가 있는지 확인
3. memory에서 context 생성
4. profile, summary, recent messages, 현재 질문을 prompt로 구성
5. LLM에 전달
6. 응답을 assistant 메시지로 저장
프롬프트 구조는 다음처럼 만들 수 있다.
너는 AI 수업 도우미다.
[Profile]
사용자 수준: Python 초보자
관심사: RAG 챗봇
[Summary]
이전 대화 요약
[Recent Messages]
최근 대화 목록
[Current User Message]
내 수준에 맞게 다시 설명해줘
즉, 챗봇이 “기억하는 것처럼” 보이는 이유는 모델 자체가 자동으로 기억해서가 아니라, 저장해둔 정보를 다음 요청에 다시 넣어주기 때문이다.
11. 핵심 정리
- 챗봇 메모리는 이전 대화를 저장하고, 필요한 정보를 다음 답변에 다시 전달하는 구조이다.
- context는 모델이 답변을 만들 때 참고하는 정보 묶음이다.
- 전체 대화는 Message History로 저장할 수 있지만, 실제 답변에는 최근 일부만 사용하는 경우가 많다.
- Memory Window는 최근 몇 개 메시지를 사용할지 정하는 값이다.
- 이름, 관심사, 목표, 수준 같은 정보는 Profile Memory로 따로 관리하면 좋다.
- 긴 대화는 Summary Memory로 요약해 토큰 사용량을 줄일 수 있다.
- 비밀번호, 주민등록번호, API Key 같은 민감정보는 저장하지 않아야 한다.
- 세션별로 메모리를 분리해야 다른 사용자의 정보가 섞이지 않는다.
- JSON 파일 저장을 사용하면 프로그램을 다시 실행해도 메모리를 복원할 수 있다.
- LLM이 기억하는 것처럼 보이는 핵심은 profile + summary + recent messages + 현재 질문을 함께 프롬프트로 전달하는 것이다.
'TIL > [TIL]' 카테고리의 다른 글
| [TIL]Chroma VectorStore 기반 RAG와 FastAPI 기초 (0) | 2026.07.24 |
|---|---|
| [TIL]Embedding과 VectorStore (1) | 2026.07.23 |
| [TIL]RAG와 OpenAI Embeddings 기반 문서 검색 흐름 (0) | 2026.07.21 |
| [TIL]GPT Role, Fine-tuning, RAG, LangChain, Streamlit 흐름 정리 (0) | 2026.07.20 |
| [TIL]Prompt Engineering과 Function Calling 기초 (0) | 2026.07.17 |