LLM

[LangChain] LangChain과 RAG(Retrieval-Augmented Generation)로 나만의 똑똑한 AI 챗봇 만들기

SS_G 2025. 6. 22. 15:15
반응형

https://116116.tistory.com/entry/%F0%9F%A6%9C%EF%B8%8F-LangChain

 

🦜️ LangChain

“LLM 앱을 레고처럼 쉽게 조립하는 오픈소스 도구”1. LangChain이 뭐예요?LLM(대규모 언어 모델) 을 이용한 챗봇·요약기·분석기를 “블록”처럼 이어 붙여 만드는 프레임워크입니다.데이터 읽기,

116116.tistory.com

 

이전 포스팅에서 LangChain의 기본 개념을 살펴보았다면, 오늘은 한 단계 더 나아가 현재 AI 분야에서 가장 뜨거운 기술 중 하나인 "RAG(Retrieval-Augmented Generation)"에 대해 깊이 알아보겠습니다. RAG를 활용하면 대규모 언어 모델(LLM)이 알지 못하는 최신 정보나 특정 도메인의 전문 지식까지 답변할 수 있는, 훨씬 더 똑똑하고 유용한 AI 챗봇을 만들 수 있습니다.

 

RAG(Retrieval-Augmented Generation)란 무엇인가?

RAG는 단어 뜻 그대로 '검색 증강 생성'을 의미합니다. LLM이 답변을 생성(Generation)할 때, 우리가 제공하는 외부 데이터베이스나 문서 저장소에서 관련된 정보를 먼저 검색(Retrieval)하여 그 내용을 '참고'해서 답변을 생성하도록 만드는 기술입니다.

 

기존 LLM의 한계:

  • 지식의 한계: 훈련 데이터에 포함되지 않은 최신 정보나 특정 회사의 내부 문서 같은 비공개 정보는 알지 못합니다.
  • 환각(Hallucination): 그럴듯하지만 사실이 아닌 정보를 지어내는 경우가 있습니다.

RAG의 장점:

  • 정확성 향상: 신뢰할 수 있는 정보 소스를 기반으로 답변하므로 환각 현상을 크게 줄일 수 있습니다.
  • 최신성 유지: 모델을 재학습시키지 않고도 외부 데이터만 업데이트하면 항상 최신 정보를 반영할 수 있습니다.
  • 비용 효율성: 특정 도메인 지식을 위해 LLM을 처음부터 파인튜닝하는 것보다 훨씬 경제적이고 빠릅니다.

 

RAG 시스템의 핵심 구성 요소

RAG 시스템은 크게 IndexingRetrieval & Generation 두 단계로 구성됩니다.

1. Indexing (색인)

외부 문서를 LLM이 이해하고 검색할 수 있는 형태로 가공하여 저장하는 과정입니다.

  • Load: 문서를 불러옵니다. (Document Loaders 사용)
  • Split: 문서를 의미 있는 단위(Chunk)로 자릅니다. (Text Splitters 사용)
  • Embed: 각 Chunk를 벡터(숫자의 배열)로 변환합니다. (Embedding Models 사용)
  • Store: 변환된 벡터를 벡터 저장소(Vector Store)에 저장합니다.

2. Retrieval & Generation (검색 및 생성)

사용자의 질문에 답변하는 실시간 처리 과정입니다.

  • Retrieve: 사용자의 질문을 임베딩하여 벡터 저장소에서 가장 유사한 문서 Chunk를 찾아냅니다. (Retriever 사용)
  • Generate: 검색된 문서 Chunk와 사용자의 원래 질문을 함께 프롬프트에 담아 LLM에게 전달하고, LLM은 이를 바탕으로 최종 답변을 생성합니다.

 

LangChain으로 RAG 시스템 구축하기 (실전 코드)

이제 LangChain을 사용하여 간단한 RAG 시스템을 직접 만들어 보겠습니다.

 

1. 필요 라이브러리 설치

pip install langchain langchain-openai langchain-community langchain-chroma beautifulsoup4

 

2. 환경 설정

OpenAI API 키를 환경 변수로 설정합니다.

import os
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"

 

3. Indexing 과정

a. 문서 로드 (Load): 웹 기반 문서를 예시로 불러옵니다.

from langchain_community.document_loaders import WebBaseLoader

# 예시로 LangChain 공식 블로그의 RAG 관련 글을 가져옵니다.
loader = WebBaseLoader(web_path="https://blog.langchain.dev/langchain-v0-1-0/")
docs = loader.load()

 

b. 문서 분할 (Split): 불러온 문서를 적절한 크기의 Chunk로 나눕니다.

from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)

 

c. 임베딩 및 저장 (Embed & Store): OpenAI 임베딩 모델과 로컬 벡터 저장소인 ChromaDB를 사용합니다.

from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma

# OpenAI 임베딩 모델을 사용하여 벡터로 변환하고 Chroma DB에 저장
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())

4. Retrieval & Generation 과정

a. 검색기 생성 (Retriever): 벡터 저장소로부터 관련 문서를 가져올 검색기를 만듭니다.

retriever = vectorstore.as_retriever()

 

b. 프롬프트 템플릿 정의: LLM에게 어떤 역할을 부여할지 정의합니다.

from langchain_core.prompts import PromptTemplate

template = """You are an assistant for question-answering tasks. 
Use the following pieces of retrieved context to answer the question. 
If you don't know the answer, just say that you don't know. 
Use three sentences maximum and keep the answer concise.

Question: {question} 
Context: {context} 

Answer:
"""
prompt = PromptTemplate.from_template(template)

 

c. LLM 모델 정의: 답변을 생성할 LLM 모델을 선택합니다.

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

 

d. RAG 체인(Chain) 구성: 위에서 만든 요소들을 LCEL(LangChain Expression Language)을 사용하여 하나로 엮어줍니다.

from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

 

e. 체인 실행 및 결과 확인:

question = "What is the main change in LangChain v0.1.0?"
answer = rag_chain.invoke(question)

print(answer)

 

이제 rag_chain.invoke()에 질문을 던지면, 우리가 제공한 웹 문서의 내용을 기반으로 LLM이 답변을 생성해 줄 것입니다!

 

마치며

오늘은 LangChain을 활용하여 RAG 시스템을 구축하는 심화 과정을 함께 살펴보았습니다. RAG는 단순히 LLM을 사용하는 것을 넘어, 우리가 가진 데이터를 활용하여 LLM의 능력을 특정 목적에 맞게 확장하는 강력한 도구입니다.

물론 실제 서비스에 적용하기 위해서는 검색 성능 최적화, 대용량 문서 처리, 비용 관리 등 고려해야 할 점이 더 많습니다. 다음 포스팅에서는 이러한 심화 주제들에 대해서도 다루어 보도록 하겠습니다.

궁금한 점이 있으시면 언제든지 댓글로 질문해주세요. 감사합니다!

 

출처

https://koreascience.kr/article/JAKO202302557619339.pdf

반응형