LangChain을 이용한 RAG 프로세스 구현
LangChain을 활용하여 RAG 프로세스를 구현하는 방법을 단계별로 설명함. LangChain 라이브러리와 함께 다양한 모듈과 메서드를 이용해 문서 로드, 분할, 임베딩 생성, 검색, 프롬프트 및 모델 생성 등의 과정이 포함됨.
1. 문서 로드 (Load)
LangChain의 PyMuPDFLoader
를 이용하여 PDF 파일과 같은 문서를 로드함. 이 모듈을 사용하면 다양한 형식의 문서를 쉽게 불러올 수 있음.
from langchain_community.document_loaders import PyMuPDFLoader
# PDF 문서 로드 예시
loader = PyMuPDFLoader("sample.pdf")
documents = loader.load()
2. 분할 (Split)
문서를 로드한 후, RecursiveCharacterTextSplitter
를 사용하여 문서를 청크 단위로 분할함. 이를 통해 문서의 길이에 따라 모델에 적합한 크기로 나눌 수 있음.
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 텍스트 분할 설정
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
split_documents = splitter.split_documents(documents)
3. 임베딩 (Embedding) 생성
LangChain에서는 다양한 임베딩 모델을 사용할 수 있음. 예를 들어, Hugging Face의 KoE5 모델을 사용하는 경우, HuggingFaceEmbeddings
를 활용하여 임베딩 벡터를 생성할 수 있음.
from langchain_huggingface.embeddings import HuggingFaceEmbeddings
# Hugging Face 임베딩 모델 설정
model_name = "nlpai-lab/KoE5"
hf_embeddings = HuggingFaceEmbeddings(
model_name=model_name,
model_kwargs={"device": "cpu"}, # cpu
encode_kwargs={"normalize_embeddings": True},
)
위의 예제에서는 nlpai-lab/KoE5
모델을 이용하여 한국어 문서에 특화된 임베딩 벡터를 생성함.
4. 벡터 DB (VectorStore)
생성된 벡터를 효율적으로 저장하고 검색하기 위해 FAISS
와 같은 벡터 데이터베이스를 사용함. FAISS는 검색 속도가 빠르고, 대규모 데이터에 대한 유사도 계산을 효과적으로 지원함.
from langchain_community.vectorstores import FAISS
# FAISS 벡터 저장소 초기화
vector_store = FAISS.from_embeddings(embeddings)
5. 검색 (Retrieval)
저장된 벡터를 바탕으로 유사도 검색을 수행함. Multi-Query와 Multi-Retriever 등의 기능을 통해 검색의 정확도와 다양성을 높일 수 있음.
query = "검색할 내용"
similar_documents = vector_store.similarity_search(query)
6. 프롬프트 (Prompt)
검색된 결과를 활용해 모델이 답변을 생성할 수 있도록 프롬프트를 설정함. PromptTemplate
클래스를 활용하여 사용자가 원하는 질문 형태를 맞춤 설정 가능함.
from langchain_core.prompts import PromptTemplate
# 프롬프트 템플릿 설정
prompt_template = PromptTemplate(template="다음 정보를 요약해 주세요: {content}")
7. 모델 (LLM)
OpenAI 또는 Hugging Face의 대형 언어 모델을 사용해 답변을 생성함. ChatOpenAI
모듈을 통해 GPT-4와 같은 모델을 연결해 사용할 수 있음.
from langchain_openai import ChatOpenAI
# 모델 초기화 (예: GPT-4)
llm = ChatOpenAI(model_name="gpt-4o-mini",temperature=0)
8. 체인 (Chain) 생성
다음으로, 검색된 문서와 질문을 체인으로 연결하여 처리할 수 있도록 설정함. RunnablePassthrough
, prompt
, llm
, StrOutputParser
를 체인 형태로 연결하여 질문에 대한 응답을 생성함.
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
# 체인 생성
chain = (
{"context":retriever, "question":RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
9. 체인 실행 (Run Chain)
체인을 실행하여 질문에 대한 응답을 생성하고, 출력함. stream
을 사용하여 토큰 단위로 실시간 응답을 출력할 수 있음.
question = "구글은 앤스로픽에 얼마를 투자했나요?"
response = chain.stream(question)
for token in response:
print(token, end="", flush=True)
LangChain을 통해 구현된 이 RAG 프로세스는 문서 로드부터 임베딩 및 검색, 프롬프트와 모델을 통한 생성까지, 모든 단계를 간편하게 연결하여 처리할 수 있음. 이를 통해 원하는 데이터를 효율적으로 추출하고 의미 있는 답변을 생성할 수 있음.
'LangChain' 카테고리의 다른 글
[LangChain] Cache (0) | 2024.11.06 |
---|---|
[LangChain] OutputParser 종류 (2) | 2024.11.03 |
[LangChain] load prompt 파일 형식 (0) | 2024.10.26 |
[LangChain] Output Parser (1) | 2024.10.23 |
배움에 즐거움을 느끼는 마네의 데이터랩 이미지 출처 : https://www.instagram.com/hoseobiiiiiii._.0410/
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!