언어 AI (NLP)/LLM & RAG
Memory
bellmake
2025. 1. 14. 17:46
아래는 LangChain을 비롯해 LLM 활용 시 자주 등장하는 Memory(메모리) 기법을 예시를 순서대로 정리한 것입니다. 각각이 보여주는 메모리 방식과 특징에 대해 자세히 설명해 드리겠습니다.
1. ConversationBufferMemory
- 개념 요약
- 대화형 AI(예: 챗봇)에서 가장 기본적인 형태의 메모리로, 사용자의 모든 발화(질문·응답) 로그를 그대로 "버퍼(buffer)" 형식으로 쌓아나가는 방식입니다.
- 메모리에 저장된 이전 대화를 그대로 사용해, LLM이 답변을 생성할 때 과거 맥락(context)을 활용하도록 합니다.
- 주요 특징
- 전체 대화 내역 보존: 이전에 오간 대화를 수정 없이 전부 보존합니다.
- 문장 단위 또는 메시지 단위 저장: 메시지를 쌓아두는 기본적인 형태라서 구현이 간단합니다.
- 메모리 사이즈 증가: 대화가 길어질수록 모든 기록이 누적되므로, 토큰/token 사용량이 크게 늘어날 수 있습니다.
2. ConversationBufferWindowMemory
- 개념 요약
- ConversationBufferMemory에서 파생된 것으로, 전체 대화가 아니라 가장 최근의 일정 “창(window)” 내 대화만 저장합니다.
- 예를 들어 “최근 3개 메시지만 보관” 또는 “최근 5개 질의·응답만 보관” 등의 방식으로, 과도한 메모리 부담을 줄이면서 적정 맥락을 유지합니다.
- 주요 특징
- 대화 창 크기 설정: 최근 N개의 발화만 저장함으로써, 토큰 사용량을 제한할 수 있습니다.
- 이전 맥락 손실: N개보다 이전의 옛 대화는 잊어버리기 때문에, 오래된 대화 맥락이 필요한 경우 대응이 어려울 수 있습니다.
- 단순/직관적: 대화를 “슬라이딩 윈도우” 형태로 관리하는 직관적인 방식입니다.
3. ConversationTokenBufferMemory
- 개념 요약
- 위의 ‘Window’ 방식이 메시지(개수) 단위로 제한했다면, 여기서는 토큰(token) 단위로 버퍼를 유지합니다.
- “최근 1,000 토큰까지만 보존” 등과 같이, LLM이 처리할 수 있는 토큰 양을 기준으로 대화 맥락을 조절합니다.
- 주요 특징
- 토큰 단위 관리: GPT 등 LLM에서 토큰 수가 중요하므로, 대화 맥락의 토큰 수를 초과하지 않도록 조절합니다.
- 더 세밀한 제한: 메시지 개수보다 토큰 수로 제어할 때, 실제 LLM 응답 비용(토큰 소모량) 관리를 더욱 정교하게 할 수 있습니다.
- 복잡도 증가: 메시지를 토큰 단위로 쪼개고 계산하는 과정이 필요해 구현 복잡도가 다소 높을 수 있습니다.
4. ConversationEntityMemory
- 개념 요약
- 대화 중 등장하는 사람, 장소, 사물 등의 **“엔티티(entity)”**를 추적하는 형태의 메모리입니다.
- 예: “내 친구 영희”, “마스코트 캐릭터 피카츄” 등 특정 엔티티가 계속 등장할 때, 해당 엔티티와 관련된 정보를 별도로 보관합니다.
- 주요 특징
- 엔티티 식별/추출: 사용자 메시지에서 이름, 고유명사 등을 추출해 메모리에 저장합니다.
- 엔티티 기반 맥락 관리: “영희는 어떤 성격이었더라?” 등 엔티티 관련 질문이 다시 나올 때, 메모리에 기록된 엔티티 정보를 활용합니다.
- 고급 맥락 유지: 단순히 최근 대화만 저장하는 것을 넘어, 대화 속 인물·사물에 대한 세부 속성/정보를 저장하므로 활용도가 높습니다.
5. ConversationKnowledgeGraph
- 개념 요약
- 대화에서 추출된 사실(fact)이나 엔티티를 지식 그래프(knowledge graph) 형태로 축적하는 방식입니다.
- “A는 B의 아들이다”나 “X는 Y에서 근무한다” 같은 관계를 그래프 노드와 엣지로 표현해, 보다 구조화된 형태로 메모리를 관리합니다.
- 주요 특징
- 구조화된 지식 관리: 그래프 노드(엔티티)와 엣지(관계)로 저장하여, 사실 추론이나 관계 질의가 용이합니다.
- 복잡한 질의 처리: 엔티티 간 관계가 복잡해져도, 그래프 탐색으로 보다 정교한 응답이 가능합니다.
- 스케일링 가능성: 외부의 DB나 트리플 스토어(RDF 등)와 연동해 대규모 지식 그래프를 운영할 수도 있습니다.
6. ConversationSummary
- 개념 요약
- 대화 내용을 전부 저장하지 않고, 요약(summary) 형태로 갱신·보존하는 메모리입니다.
- 오래된 대화 부분은 요약문으로 압축하여, 맥락을 유지하되 토큰 사용량을 절감하고, 긴 대화도 효율적으로 처리할 수 있습니다.
- 주요 특징
- 압축 관리: 메시지가 길어지면, 특정 구간을 요약해 과거 내용을 짧게 유지합니다.
- 다단계 요약: 대화가 매우 길어지면, 요약된 것 자체도 다시 재요약하여 점차 압축해나갈 수 있습니다.
- 맥락 왜곡 주의: 요약 과정에서 중요한 세부 정보가 소실되거나 변형될 가능성이 있으므로 주의해야 합니다.
7. VectorStoreRetrieverMemory
- 개념 요약
- 대화 내용을 임베딩(embedding)한 뒤, 벡터 DB에 저장하고, 적절한 질의가 들어오면 벡터 유사도 검색으로 과거 대화나 문서를 불러오는 메모리입니다.
- “질문과 가장 유사한 과거 발화”를 벡터 검색으로 찾아 맥락으로 제공하는 식입니다.
- 주요 특징
- 임베딩 기반 검색: 텍스트를 벡터화하여 의미론적 유사도에 따라 빠르게 검색할 수 있습니다.
- 대규모 데이터 핸들링: 대화가 방대해져도 잘 구조화된 벡터 스토어를 통해 빠르게 원하는 맥락을 찾을 수 있습니다.
- 지식 베이스 연동: 기존에 구축된 문서 DB(예: Elasticsearch, Pinecone 등)와 연계해 QA(질의응답) 시 과거 맥락 + 외부 지식을 동시에 제공할 수 있습니다.
8. LCEL-add-memory
- 개념 요약
- “LCEL”이라는 특정 기능(또는 커스텀 로직)을 추가한 예시로 추정됩니다.
- LangChain에서 제공하는 메모리 인터페이스를 확장/변형하거나, 특정 요구사항(예: 사용자 정의 데이터 구조)으로 메모리를 확장하는 시연일 가능성이 큽니다.
- 주요 특징
- 커스텀 메모리 구현: LangChain에서 제공하지 않는 방식의 메모리를 직접 정의·구현하는 예제일 수 있습니다.
- 특정 로직 연동: 예: 특정 이벤트 발생 시 자동 로그를 남기거나, 외부 API로 정보를 저장·갱신하는 기능을 추가할 수 있습니다.
- 개발 사례 학습: 표준 Memory 클래스들이 갖는 공통 규칙(예: load_memory_variables, save_context 등)을 어떻게 확장하는지 보여줍니다.
9. Memory-using-SQLite
- 개념 요약
- 대화 내용을 SQLite DB에 저장하여 관리하는 방식의 메모리 예시입니다.
- 파일 단위의 경량 DB인 SQLite를 사용해, 영구적으로(세션 간에도) 대화 히스토리를 저장·조회합니다.
- 주요 특징
- 영구 저장: 단순히 파이썬 변수나 휘발성 메모리에 넣는 것이 아니라, DB에 넣어두어 세션 종료 후에도 데이터를 유지할 수 있습니다.
- 관계형 DB 활용: SQLite라는 미니 RDBMS를 써서, 테이블 구조와 함께 대화 기록을 저장할 수 있습니다.
- 데이터 조회/관리 용이: SQL을 통해 원하는 쿼리를 수행하거나, 분석에 활용할 수 있습니다.
10. Conversation-With-History
- 개념 요약
- “대화와 이력(History)”을 결합하는 예제로, 과거 대화를 재사용하거나 특정 시점으로 돌아가 대화를 이어가는 시나리오를 보여줍니다.
- 단순한 버퍼형식 메모리가 아니라, 히스토리 브랜치 또는 특정 시점 복원 등을 시도할 수 있는 기능을 시연할 가능성이 있습니다.
- 주요 특징
- 히스토리 탐색: 과거 특정 시점의 대화 상태를 불러와 계속 진행한다든지, 혹은 “버전” 개념으로 대화를 유지합니다.
- 컨텍스트 재활용: 사용자나 시스템이 “이 시점의 맥락만으로 새 질문을 할 것” 같은 상황에 대비한 구조를 제시합니다.
- 주요 사용 사례: 스토리텔링, 게임 시나리오, 시뮬레이션 등에서 과거 대화 분기를 추적할 때 유용합니다.
마무리
위와 같이, LangChain(또는 유사 프레임워크)에서 제공하는 다양한 Memory 기법들은 대화 맥락을 어떻게 저장·관리하느냐에 따라 여러 설계가 존재합니다.
- 간단한 버퍼(ConversationBufferMemory)부터
- 윈도우 혹은 토큰 기반 제한(ConversationBufferWindow/TokenBufferMemory),
- 엔티티/지식 그래프 기반(ConversationEntityMemory, ConversationKnowledgeGraph),
- 요약 기반(ConversationSummary),
- 벡터 검색 기반(VectorStoreRetrieverMemory),
- 또는 DB에 저장(Memory-using-SQLite),
등의 여러 방법이 있으니, 적용하려는 서비스나 모델의 특성·규모·비용 등에 맞추어 적절히 선택하시면 됩니다.