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
'LLM & Generative AI > RAG in Practice' 카테고리의 다른 글
[LangChain RAG 구축 시리즈 Ep.14] 🔧 프로젝트 구조 설계 및 의존성 설치 (1) | 2025.04.05 |
---|---|
[LangChain RAG 구축 시리즈 Ep.13] 🧪 Stuff / MapReduce / Refine 전략 비교 (1) | 2025.04.05 |
[LangChain RAG 구축 시리즈 Ep.11] 🔄 Retrieval QA 실습: 문서 기반 답변 구성 (1) | 2025.04.05 |
[LangChain RAG 구축 시리즈 Ep.10] 🧪 벡터 검색 결과 해석하기 (top-k, score 등) (1) | 2025.04.05 |
[LangChain RAG 구축 시리즈 Ep.09] 🗂️ ChromaDB로 벡터 저장소 구성하기 (1) | 2025.04.05 |