RAG - 대화형 Chatbot & Memory

01. 구현 목표

  • Retriever가 뽑아온 컨텍스트를 기반으로 LLM이 답변하도록 설계

  • 기본 흐름:

    1. 사용자 질문 입력
    2. 필요시 질문 재작성(Query rewriting)
    3. 검색(Retriever)
    4. 컨텍스트와 결합
    5. LLM 응답 생성
  • 추가: Memory를 활용해 대화 맥락 유지

02. Memory 유형

1) Buffer Memory

  • 모든 대화 turn을 그대로 저장
  • 장점: 정확한 회상에 강함 (원문 보존)
  • 단점:
    • 대화가 길어질수록 토큰 비용 증가
    • 중요하지 않은 맥락까지 포함 → 노이즈 발생

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

02) Summary Memory

  • 매 턴 대화를 요약 형태로 저장
  • 장점: 긴 대화에 강함 (토큰 비용 절약)
  • 단점:
    • 요약 품질이 낮으면 디테일 손실 가능
    • 경우에 따라 k(최근 turn 수)를 넓히거나 추가 근거 검색 필요
from langchain.memory import ConversationSummaryMemory
from langchain_openai import OpenAI

llm = OpenAI(model="gpt-3.5-turbo", temperature=0)
memory = ConversationSummaryMemory(llm=llm)

03) 대화형 RAG의 전체 구조

  1. 입력: 사용자 질문
  2. 검색: Retriever로 관련 문서 가져오기
  3. Memory: Buffer 또는 Summary 기반으로 맥락 제공
  4. LLM: 문맥 + 컨텍스트 기반 응답 생성
from langchain.chains import ConversationalRetrievalChain

qa = ConversationalRetrievalChain.from_llm(
    llm=llm,
    retriever=retriever,
    memory=memory
)

qa({"question": "오늘 배운 내용을 요약해줘"})
profile
2025화이팅!

0개의 댓글