Rag를 사용해서 자신의 전문 비서를 만들어 보자 - Lang Chain

2025. 7. 8. 18:53·Web

직전 글인 "Rag를 사용해서 자신의 전문 비서를 만들어 보자"에서는 Lang Chain을 사용하지 않았다. Lang Chain은 LLM을 활용한 애플리케이션을 쉽게 만들 수 있도록 도와주는 프레임워크이다. 때문에 해당 프레임워크를 사용하면 더욱 깔끔한 코드로 이전에 작성한 코드를 개선할 수 있을 것이다.

해당 페이지에서는 그저 이전 코드를 Lnag chain을 통해 바꾸면 어떤식으로 구현되는지만 파악하고 넘어가 볼 것이다.

 


Lang Chain이란?

다양한 외부 데이터(문서, DB, 웹, API 등)와 LLM을 연결하거나, 복잡한 파이프라인(Chain), 에이전트(Agent), 툴을 구축할 때 사용한다.

주요 특징은 아래와 같다.

  • Document Loader: PDF, txt, 웹, 데이터베이스 등 다양한 소스로부터 데이터를 쉽게 불러올 수 있음.
  • Text Splitter: 긴 텍스트를 LLM에 맞게 청크(Chunk) 단위로 분할.
  • Embedding & Vector Store: 텍스트를 임베딩(벡터)으로 변환하고, 벡터DB(Qdrant, FAISS 등)에 저장/검색.
  • Chain: LLM과 다양한 구성 요소를 연결하여 파이프라인(예: 질문 → 문서 검색 → LLM에 컨텍스트 넣기 → 답변 생성) 구축.
  • Agent: 여러 개의 도구(예: 계산, 웹검색, DB질의 등)를 사용해서 LLM이 상황에 따라 적절히 툴을 선택해서 답변하도록 함.
  • Prompt Template: 프롬프트를 유연하게 조합해서 관리할 수 있음.

적용해보기

기존 코드를 Lang Chain을 통해서 개선해보자.

코드를 실행하기 위해서는 아래와 같은 패키지들이 필요하다.

  • langchain
  • langchain_community
  • qdrant-client
  • sentence-transformers
  • pdfplumber
  • langchain-google-genai

아래 코드를 보면 from langchain_community.document_loaders와 같이 langchain_community와 langchain만 있으면 될 것 같은데 나머지는 왜 설치해야할까?

 

그것은 LangChain이 "Wrapper" 역할만 하고 실제 기능(임베딩 모델, 벡터DB, PDF 로더 등)은 외부 패키지를 그대로 사용하기 때문이다. langchain 자체는 "공통 인터페이스"만 갖고 있고, 실제 데이터 로딩, 임베딩, 벡터스토어, LLM 호출 등은 별도 community 패키지 또는 외부 패키지에서 처리되는 구조이기 때문이다.

 

import os
from langchain_community.document_loaders import PDFPlumberLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Qdrant
from langchain_google_genai import ChatGoogleGenerativeAI

# 1. 환경설정
os.environ["GOOGLE_API_KEY"] = "키 입력"
qdrant_url = "http://localhost:6333"
collection_name = "pdf_chunks"

# 2. PDF에서 텍스트 추출 및 문서 객체 생성
loader = PDFPlumberLoader("example.pdf")
documents = loader.load()

# 3. 텍스트 chunk 단위 분할
splitter = RecursiveCharacterTextSplitter(
    chunk_size=300, chunk_overlap=50, separators=["\n", " "]
)
docs = splitter.split_documents(documents)
print(f"총 {len(docs)}개 chunk 추출됨.")

# 4. 임베딩 모델 로드 (한국어 SBERT)
embedding = HuggingFaceEmbeddings(
    model_name="snunlp/KR-SBERT-V40K-klueNLI-augSTS"
)

# 5. Qdrant 벡터스토어에 저장
vectorstore = Qdrant.from_documents(
    docs,
    embedding,
    url=qdrant_url,
    collection_name=collection_name,
    force_recreate=True  # 기존 컬렉션 삭제 후 생성
)

# 6. Retriever 생성
retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 3})

# 7. Gemini LLM 래퍼 (langchain-google-genai)
llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash", temperature=0)

# 8. RAG 파이프라인 함수
def rag_ask_gemini(query):
    # 1. Vectorstore에서 유사 chunk 검색
    relevant_docs = retriever.get_relevant_documents(query)
    context = "\n".join([doc.page_content for doc in relevant_docs])

    # 2. Gemini LLM에 프롬프트 전달
    prompt = f"""아래 내용을 참고하여 질문에 답변해줘.

[참고 내용]
{context}

[질문]
{query}
"""
    response = llm.invoke(prompt)
    print(f"\n[질문] {query}\n")
    print(f"[AI 답변] {response.content.strip()}\n")
    print("-" * 40)

# 9. 질의 예시
rag_ask_gemini("이 문서의 핵심 주제를 요약해줘.")
rag_ask_gemini("문서에서 등장하는 주요 인물은 누구야?")
rag_ask_gemini("문서에서 다루는 기술적 내용이 뭐야?")

 

Retriever(리트리버) : 어떤 질문(쿼리)이 들어왔을 때, 내가 가진 문서(혹은 텍스트 조각, chunk)들 중 가장 관련성이 높은 것들만 골라서 뽑아주는 역할을 하는 컴포넌트

 

명령어 실행을 통해 이전과 비슷한 응답을 받을 수 있는것을 확인했다. 기존 코드보다 위의 코드가 더 깔끔해진 것을 느낄 수 있었다. 이는 벡터DB에 데이터를 저장하고 조회하는 부분에서 느꼈고, 파이썬과 LLM을 사용해서 무언가 한다면 Lang Chain은 사용하지 않을 수 없겠다고 생각했다. 이후에는 에이전트 기능에대해 알아 볼 예정이다.

'Web' 카테고리의 다른 글

카프카 리벨런싱 조건  (1) 2025.07.16
Rag를 사용해서 자신의 전문 비서를 만들어 보자  (5) 2025.07.08
MSA에 꼭 필요한 Terraform 사용해보기  (2) 2025.07.05
ElasticSearch 인덱스 갱신을 위한 Debezium 사용해보기  (1) 2025.06.22
ElasticSearch를 이용한 검색 기능 만들어보기 - 1  (1) 2025.06.20
'Web' 카테고리의 다른 글
  • 카프카 리벨런싱 조건
  • Rag를 사용해서 자신의 전문 비서를 만들어 보자
  • MSA에 꼭 필요한 Terraform 사용해보기
  • ElasticSearch 인덱스 갱신을 위한 Debezium 사용해보기
마술사의 수습생
마술사의 수습생
언젠간 당신처럼 되고 싶어요.
  • 마술사의 수습생
    개발 기록 블로그
    마술사의 수습생
  • 전체
    오늘
    어제
    • 분류 전체보기 (53)
      • Web (50)
      • 일기 (2)
      • 잡담 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
마술사의 수습생
Rag를 사용해서 자신의 전문 비서를 만들어 보자 - Lang Chain
상단으로

티스토리툴바