본문 바로가기
AI/RAG 이론

RAG 구현시 고려사항 : (6) 멀티턴 대화(ConversationBufferMemory)

by 데이터 쿡북 2025. 7. 11.

멀티턴 RAG에서의 문맥 유지 전략

멀티턴 대화란 사용자가 여러 번 연속적으로 질문을 던지는 상황을 말합니다.
예를 들어, 사용자와 AI 사이에 다음과 같은 흐름이 있다고 해봅시다.

User: "X100 제품의 무게는 얼마야?"
User: "그보다 가벼운 모델은 있어?"
User: "그 모델은 방수되니?"

이처럼 두 번째 이후의 질문들은 대부분 앞선 질문의 문맥을 전제로 합니다.
따라서 RAG 시스템이 이런 흐름을 정확히 파악하고 연결된 문맥을 유지하며 검색과 생성을 수행할 수 있어야 합니다.


멀티턴 문맥이 필요한 이유

유형설명
지시어 생략 “그거” “그 제품” “그 사람”처럼 이전 대상이 명시되지 않음
조건 누적 “그중 가장 저렴한 걸 알려줘” → 이전 질문의 결과에 기반
시간 경과 사용자와의 대화가 길어질수록 이전 정보 잊지 않아야 함
일관된 응답 기대 동일 맥락에서 동일 답변을 기대 (고객지원, 상담 등)
 

문맥 유지를 위한 기술적 접근 방식

1. 전체 대화 삽입 방식

  • 이전 대화 전부를 prompt에 넣음
  • 가장 단순하지만 context 길이 제한이 크고, 비용이 많이 듦
User: A 제품의 배터리 용량은?
AI: 5000mAh입니다.

User: 그보다 큰 건?
→ 이 대화 전체를 LLM에 다시 전달하여 문맥을 유지함

 


2. Query Rewriting 방식

  • 현재 질문과 이전 대화를 기반으로 명확한 검색용 쿼리로 재작성
  • 예시:
    • “그보다 가벼운 모델은 있어?”
      → “X100 제품보다 가벼운 모델이 있는지 알려줘”
  • 장점: 검색 정확도 향상, token 절약
  • 구현: GPT-4, T5, FLAN 등을 사용하거나 LangChain의 ConversationalRetrievalChain 활용

3. Conversation Summary 방식

  • 전체 대화를 한두 문장으로 요약하여 context에 넣음
  • 장점: 긴 대화를 compact하게 전달
  • 단점: 요약 품질이 성능에 직접 영향

4. Slot Memory 방식

  • 각 턴에서 추출된 정보(제품명, 조건 등)를 저장하고 다음 질문에 자동 주입
  • 자연어보다는 구조화된 대화 시스템에 적합

ConversationBufferMemory란?

LangChain에서 제공하는 메모리 전략 중 하나로,
지금까지의 모든 대화 이력을 저장하여 LLM 호출 시 함께 프롬프트로 삽입하는 기능입니다.

특징:

항목설명
저장 내용 User와 AI 사이의 전체 대화 이력
구현 방식 문자열로 저장되어 LLM 호출 시 messages로 주입됨
사용 시기 문맥을 직접 LLM에 제공하고 싶은 경우
단점 대화가 길어질수록 토큰 초과 위험 ↑
 

예시 코드 (LangChain 기준, Python):

from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
from langchain.chat_models import ChatOpenAI

memory = ConversationBufferMemory(return_messages=True)

conversation = ConversationChain(
    llm=ChatOpenAI(),
    memory=memory,
    verbose=True
)

conversation.predict(input="Z3 모델은 무게가 얼마나 나가?")
conversation.predict(input="그보다 더 가벼운 모델은?")

위 예시에서 두 번째 질문을 받을 때, LLM은 자동으로 첫 질문–응답을 기억한 상태로 작동합니다.


ConversationBufferMemory vs 다른 메모리

메모리 전략설명장단점
ConversationBufferMemory 대화 전체를 문자열로 저장 문맥 완전 유지 / context 제한 있음
ConversationSummaryMemory 대화 내용 요약 저장 토큰 효율 ↑ / 요약 오류 가능성
ConversationKGMemory 대화 내용을 개체 간 관계로 저장 (KG 형태) 구조화 필요 / 복잡한 흐름에 적합
CombinedMemory 위 메모리들을 조합 정확도 + 효율 균형 가능
 

멀티턴 문맥 유지 전략 요약

전략설명
전체 삽입 정확하지만 비효율적
Query Rewriting 검색 품질 극대화, 비용 절감
요약 삽입 긴 대화 처리에 유리
ConversationBufferMemory 구현 쉬움, 토큰 효율 낮음
Slot Memory 구조화된 대화에는 강력함
 
공감버튼이 큰 힘이 됩니다

댓글