[AI 서비스 개발] 대화 히스토리 관리 두가지 방법 (ConversationBufferMemory, RunnableWithMessageHistory)
1. 구현 방법 비교
ConversationBufferMemory | RunnableWithMessageHistory |
대화 히스토리를 내부적으로 저장하는 메모리 객체 | 대화 히스토리를 외부 데이터베이스 또는 메모리 저장소에서 |
단일 사용자가 지속적인 대화를 할때 | 여러 사용자의 대화 세션을 관리해야 할 때 |
대화 히스토리를 외부 데이터베이스에 저장할 필요가 없을때 | 대화 히스토리를 외부 데이터 베이스나 클라우드에 저장할 때 |
간단한 대화형 애플리케이션에서 빠르게 시작하고 싶을 때 | 특정 세션별로 독립적인 히스토리가 필요할 때 |
2. ConversationBufferMemroy의 사용자별 메모리 분리
from langchain.memory import ConversationBufferMemory
# 사용자별 메모리 저장소
user_memory_store = {}
# 사용자 세션 ID 기반 메모리 생성 또는 가져오기
def get_user_memory(session_id):
if session_id not in user_memory_store:
user_memory_store[session_id] = ConversationBufferMemory()
return user_memory_store[session_id]
# 사용자 세션 ID
session_id = "user_123"
# 사용자 메모리 가져오기
memory = get_user_memory(session_id)
# 대화 저장
memory.save_context({"input": "What is AI?"}, {"output": "AI stands for Artificial Intelligence."})
# 히스토리 출력
print(memory.chat_memory.messages)
우선 ConversationBufferMemory로 구현해보고 RunnableWithMessageHistory로 확장해봐야겠다.
3. 세션이란?
- 세션(session)은 사용자와 서버 간의 상호작용을 추적하기 위한 방법이다.
- 웹 애플리케이션에서 세션은 특정 사용자가 애플리케이션에 접속한 동안의 상태를 저장하고 관리하는 역할을 한다.
- 사용자별로 고유한 세션ID를 사용해 개별 데이터를 유지
- streamlit에서 st.session_state란? 세션 상태를 유지하기 위한 데이터 저장소이다.
* streamlit은 새로고침하면 st.session_state는 유지되지 않는다!!
4. streamlit에서 state를 유지하는 방법
1) URL parameters사용: URL에 세션ID나 데이터를 저장하고, 페이지가 새로 로드될때 이를 다시 복원
2) streamlit-cookies-manager 라이브러리를 사용해 쿠키를 설정하여 새로고침 후에도 데이터를 유지
3) 대화 기록이나 세션 상태를 외부 데이터 베이스에 저장하고, 새로고침 시 이를 다시 로드(Redis, Firebase등)
5. UUID
- UUID란? Universally Unique Identifier, 범용 고유 식별자
- 무작위로 UUID를 생성하는 라이브러리 : uuid
- 전 세계적으로 고유한 식별자를 생성하기 위한 표준
- 128비트 숫자로 구성되며, 일반적으로 36문자 길이의 하이픈(-)으로 구분된 5개 블록으로 표현됨
예) 550e8400-e29b-41d4-a716-446655440000