🧠 LLM 엔지니어링

LangChain으로 시작하는 RAG 파이프라인 구축 여정

개발자 린다씨 2025. 4. 23. 17:02
반응형

🤖 LangChain으로 시작하는 RAG 파이프라인 구축 여정

이 글은 RAG(Retrieval-Augmented Generation) 개념을 바탕으로, LangChain을 활용해 실제 지식 검색 + 응답 파이프라인을 구축하는 흐름을 정리한 내용입니다.


🔁 RAG 복습

  • RAG란?
    사용자의 질문과 의미적으로 유사한 정보를 벡터 기반 검색을 통해 찾아내고,
    해당 정보를 프롬프트에 포함해 LLM이 더 정확한 응답을 생성하는 방식입니다.
  • 핵심 구성요소
    • 질문 → 벡터화
    • 벡터 DB에서 관련 문서 검색
    • 검색된 문서 + 질문 → LLM 입력
    • LLM이 응답 생성

🧱 오늘의 핵심: LangChain으로 RAG 구현하기

🧩 LangChain이란?

LangChain은 다양한 LLM 기능(문서 검색, 질의응답, 요약, 생성 등)을
블록처럼 연결(chain)해서 빠르고 유연하게 LLM 기반 애플리케이션을 만들 수 있도록 도와주는 파이썬 프레임워크입니다.

항목 설명
등장 시점 2022년 말
주요 기능 문서 로딩, 텍스트 분할, 벡터 임베딩, 벡터 검색, LLM 연결
지원 LLM OpenAI, Anthropic Claude, HuggingFace 등
벡터DB 통합 FAISS, Chroma, Weaviate, Pinecone 등
특이점 대부분의 LLM API와 도구를 표준화된 인터페이스로 래핑

✨ LangChain의 장점

  • 빠른 프로토타이핑: 몇 줄의 코드로 전체 파이프라인 구성 가능
  • 도구 통합: 데이터 로딩, 분할, 임베딩, 검색, QA까지 일괄 처리
  • 프롬프트 최적화: RAG에 최적화된 RetrievalQA, ConversationalRetrievalChain 등 제공
  • 모델 간 호환성 확보: OpenAI → Claude 같은 전환이 쉬움
  • 코드 재사용성 향상: 구성 요소들이 모두 모듈화돼 있어 확장과 커스터마이징에 유리

🛠 LangChain 기반 RAG 파이프라인 구성 흐름

  1. 문서 로딩
    • DirectoryLoader, TextLoader, PDFLoader 등으로 폴더 내 문서 일괄 불러오기
  2. 문서 메타데이터 추가
    • 파일명, 카테고리 등 정보를 부가적으로 저장 (후처리, 필터링 용도)
  3. 텍스트 분할 (Chunking)
    • RecursiveCharacterTextSplitter 등을 통해 텍스트를 작고 연관된 청크로 나누기
  4. 벡터 임베딩
    • 청크를 의미 기반 벡터로 변환
    • 예: OpenAIEmbeddings, HuggingFaceEmbeddings, InstructorEmbeddings
  5. 벡터 DB 저장
    • FAISS, Chroma, Weaviate 등 벡터 검색 DB에 저장
  6. 질문 → 벡터화 → 검색 → 문서 + 질문으로 LLM 호출
    • LangChain의 RetrievalQA, ConversationalRetrievalChain 으로 구현

🧪 예시 체인 구성 (간략 코드 예)

from langchain.chains import RetrievalQA
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.llms import OpenAI

# 1. 벡터 DB 로드
vectorstore = FAISS.load_local("path_to_index", OpenAIEmbeddings())

# 2. 체인 생성
qa_chain = RetrievalQA.from_chain_type(
    llm=OpenAI(temperature=0),
    chain_type="stuff",
    retriever=vectorstore.as_retriever()
)

# 3. 질문에 답하기
response = qa_chain.run("에이미 랭커스터는 누구야?")
print(response)
반응형