검색 증강 생성(Retrieval Augmented Generation, RAG)은 대규모 언어 모델(LLM)의 성능을 향상시키는 강력한 기술입니다.
LangChain을 활용하여 RAG 시스템을 구축하면 외부 데이터 소스를 활용해 더 정확하고 맥락에 맞는 응답을 생성할 수 있습니다.
이 글에서는 LangChain으로 RAG 시스템을 구축하는 방법을 단계별로 알아보겠습니다.
RAG는 언어 모델이 학습 데이터 외의 공개 없는 지식 베이스를 참조하여 응답을 생성하는 프레임워크입니다.
이 방식은 다음과 같은 LLM의 한계를 극복합니다.
RAG는 기업이 내부 지식 베이스나 특정 도메인에 LLM을 적용할 때 모델을 재학습시키지 않고도 효과적으로 활용할 수 있게 해줍니다.
RAG 시스템은 다음 네 가지 주요 단계로 작동합니다.
먼저 필요한 라이브러리를 설치합니다.
pip install langchain langchain_community faiss-cpu sentence-transformers transformers
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# PDF 문서 로드
loader = PyPDFLoader("your_document.pdf")
documents = loader.load()
# 문서 분할
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
splits = text_splitter.split_documents(documents)
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
# 임베딩 모델 초기화
embeddings = HuggingFaceEmbeddings()
# FAISS 벡터 저장소 생성
vectorstore = FAISS.from_documents(splits, embeddings)
retriever = vectorstore.as_retriever()
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
# 프롬프트 템플릿 정의
prompt_template = """다음 정보를 바탕으로 질문에 답변해주세요:
{context}
질문: {question}
답변: """
prompt = ChatPromptTemplate.from_template(prompt_template)
# LLM 초기화
llm = ChatOpenAI(model="gpt-3.5-turbo")
# 문서 체인 생성
document_chain = create_stuff_documents_chain(llm, prompt)
# 검색 체인 생성
retrieval_chain = create_retrieval_chain(retriever, document_chain)
def ask_question(question):
response = retrieval_chain.invoke({"question": question})
return response["answer"]
# 예시 질문
result = ask_question("이 문서의 주요 내용은 무엇인가요?")
print(result)
기본 RAG 기법의 한계를 극복하기 위해 Parent Document Retriever 기법을 활용할 수 있습니다.
이 방식은 문서의 맥락을 유지하면서 더 정확한 검색을 가능하게 합니다.
from langchain.retrievers import ParentDocumentRetriever
from langchain.storage import InMemoryStore
# 메모리 스토어 초기화
store = InMemoryStore()
# 부모 및 자식 청크 분할기 정의
parent_splitter = RecursiveCharacterTextSplitter(chunk_size=2000)
child_splitter = RecursiveCharacterTextSplitter(chunk_size=500)
# Parent Document Retriever 설정
retriever = ParentDocumentRetriever(
vectorstore=vectorstore,
docstore=store,
child_splitter=child_splitter,
parent_splitter=parent_splitter
)
# 문서 추가
retriever.add_documents(documents)
RAG는 다양한 산업 분야에서 활용되고 있습니다:
기본 RAG 시스템을 넘어 성능을 더욱 향상시키는 고급 기법들이 있습니다.
LangChain을 활용한 RAG 시스템은 언어 모델의 한계를 극복하고 외부 데이터 소스를 활용하여 더 정확하고 맥락에 맞는 응답을 생성할 수 있게 해줍니다.
이 기술은 기업이 내부 지식 베이스나 특정 도메인에 LLM을 효과적으로 적용할 수 있게 하며, 다양한 산업 분야에서 혁신적인 애플리케이션을 구축하는 데 활용되고 있습니다.