# RAG 시스템 구축 가이드
## 1. RAG란?
Retrieval-Augmented Generation. 외부 문서를 검색해서 LLM 응답에 활용하는 기법입니다.
## 2. RAG 파이프라인
```
문서 → 청킹 → 임베딩 → 벡터DB 저장
질문 → 임베딩 → 유사 문서 검색 → LLM에 컨텍스트로 전달 → 응답
```
## 3. 필수 라이브러리
```bash
pip install langchain langchain-openai chromadb
pip install pypdf sentence-transformers
```
## 4. 문서 로딩
```python
from langchain_community.document_loaders import PyPDFLoader, TextLoader
# PDF 로딩
loader = PyPDFLoader("document.pdf")
pages = loader.load()
# 텍스트 파일
loader = TextLoader("data.txt")
docs = loader.load()
```
## 5. 텍스트 청킹
```python
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = splitter.split_documents(pages)
```
## 6. 임베딩 생성
```python
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
# 또는 로컬 임베딩
from langchain_community.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-en")
```
## 7. 벡터 저장소
```python
from langchain_community.vectorstores import Chroma
# 벡터DB 생성 및 저장
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
# 검색
results = vectorstore.similarity_search("질문 내용", k=3)
```
## 8. RAG 체인 구성
```python
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
llm = ChatOpenAI(model="gpt-4")
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever
)
answer = qa_chain.invoke("회사 휴가 정책이 뭐야?")
print(answer["result"])
```
## 9. 프롬프트 커스터마이징
```python
from langchain.prompts import PromptTemplate
template = """다음 문서를 참고해서 질문에 답하세요.
문서에 없는 내용은 모른다고 답하세요.
문서: {context}
질문: {question}
답변:"""
prompt = PromptTemplate(template=template, input_variables=["context", "question"])
```
## 10. 대화형 RAG
```python
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
qa = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=retriever,
memory=memory
)
qa.invoke({"question": "첫 번째 질문"})
qa.invoke({"question": "그것에 대해 더 알려줘"}) # 이전 대화 기억
```