LLM & Generative AI/RAG in Practice

[LangChain RAG 구축 시리즈 Ep.12] 🧵 대화형 검색과 맥락 기억 기능 구현해보기

ygtoken 2025. 4. 5. 20:19
728x90

이 글에서는 GPT 기반 RAG 시스템에 대화 기능과 맥락 유지(memory) 기능을 추가하여
사용자가 연속적인 질문을 할 수 있도록 만들어보겠습니다.
바로 ConversationalRetrievalChain의 등장입니다!


🧠 ConversationalRetrievalChain이란?

단일 질의 응답이 아닌, 이전 질문과 답변을 바탕으로 문맥을 기억하며 이어지는 대화를 가능하게 하는 RAG 체인입니다.

특징 설명
🧵 대화 흐름 유지 앞선 질문 내용을 기억
🧠 메모리 사용 ConversationBufferMemory로 과거 대화 저장
🔗 Retriever + LLM 통합 문서 검색 + 문맥형 응답 생성

📦 기본 흐름

[질문1] → 문서 검색 → GPT 응답
[질문2] (이전 내용 기억) → 문서 검색 → GPT 응답
...

🛠️ Step 1. 필요한 모듈 임포트

from langchain.chains import ConversationalRetrievalChain         # 대화형 체인
from langchain.memory import ConversationBufferMemory              # 대화 히스토리 저장 메모리
from langchain.chat_models import ChatOpenAI                       # GPT 모델
from langchain.vectorstores import Chroma                          # 벡터 저장소
from langchain.embeddings import OpenAIEmbeddings                  # 임베딩 모델

🔗 Step 2. Chroma + Retriever + LLM 준비

# ✅ 임베딩 모델
embedding = OpenAIEmbeddings()

# ✅ 저장된 ChromaDB 로드
vectordb = Chroma(
    persist_directory="./chroma_db",
    embedding_function=embedding,
    collection_name="iceberg_tables"
)

# ✅ 문서 검색기 생성
retriever = vectordb.as_retriever(search_kwargs={"k": 2})

# ✅ LLM 설정 (GPT-3.5)
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.1)

🧠 Step 3. 대화 기록을 저장할 메모리 구성

# ✅ 대화 기록을 저장하는 메모리 구성
memory = ConversationBufferMemory(
    memory_key="chat_history",    # 체인 내부에서 사용할 키 이름
    return_messages=True          # 메시지 형식으로 대화 이력 반환
)

🔄 Step 4. ConversationalRetrievalChain 생성

# ✅ 대화형 RAG 체인 생성
conversation_chain = ConversationalRetrievalChain.from_llm(
    llm=llm,                      # 사용할 GPT 모델
    retriever=retriever,          # 문서 검색기
    memory=memory,                # 대화 메모리
    return_source_documents=True  # 참조 문서 반환 여부
)

💬 Step 5. 대화 흐름 테스트

# ✅ 대화 1: 첫 질문
query1 = "상품 테이블이 뭐야?"
result1 = conversation_chain.run(query1)

# ✅ 대화 2: 맥락 기반 질문 (앞에서 "상품"을 말한 걸 기억해야 함)
query2 = "그 테이블에는 어떤 컬럼이 있어?"
result2 = conversation_chain.run(query2)

# ✅ 결과 출력
print("📣 응답 1:", result1)
print("📣 응답 2:", result2)

📤 예상 출력 예시

📣 응답 1: 상품 정보를 담은 테이블은 'products'입니다. 컬럼에는 product_id, name, category가 포함됩니다.
📣 응답 2: 해당 테이블에는 다음과 같은 컬럼이 있습니다: product_id (long), name (string), category (string).

✅ 두 번째 질문에서 **“그 테이블”**이 products를 의미한다는 걸 기억하고 정확히 응답합니다.


📎 요약 및 핵심 정리

  • ConversationalRetrievalChain을 사용하면 질문 간 맥락 유지가 가능합니다.
  • 대화 히스토리는 ConversationBufferMemory에 저장됩니다.
  • 사용자는 한 번에 여러 번 질문하며, GPT는 앞 내용을 바탕으로 자연스럽게 이어지는 답변을 생성할 수 있습니다.
728x90