🤖 AI/ML 🌳 고급

RAG 시스템 구축

LangChain으로 RAG 파이프라인 만들기

⏱️ 8시간 👁️ 37 조회
📖 강좌 내용
# 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": "그것에 대해 더 알려줘"}) # 이전 대화 기억
```