LangChain과 RAG(검색 증강 생성) 아키텍처 완벽 해부 및 실무 구축 가이드
ChatGPT 기반의 AI 서비스를 기획하다 보면 필연적으로 거대한 벽에 부딪힙니다. 바로 "우리 회사의 내부 데이터(사내 규정, 비공개 프로젝트 문서, 최신 실시간 정보)를 AI가 알지 못한다"는 점입니다. 모르는 것을 아는 것처럼 지어내는 환각(Hallucination) 현상을 잡고, 기업용 B2B AI 솔루션을 구축하기 위해 현재 전 세계 IT 업계에서 가장 표준으로 자리 잡은 RAG(Retrieval-Augmented Generation) 아키텍처와 이를 지휘하는 LangChain(랭체인) 프레임워크를 마스터해 봅시다.
1. 파인튜닝(Fine-Tuning)의 한계와 RAG의 등장
과거에는 AI에게 새로운 지식을 가르치기 위해 모델의 가중치(파라미터) 자체를 뜯어고치는 파인튜닝을 시도했습니다. 하지만 이는 GPU 서버 대여 비용이 천문학적으로 들고, 데이터가 업데이트될 때마다 처음부터 다시 학습시켜야 하는 치명적인 단점이 있었습니다.
이에 대한 완벽한 대안이 바로 RAG(검색 증강 생성)입니다. 쉽게 말해 AI에게 '오픈북 테스트(Open-book test)'를 치르게 하는 것입니다. 사용자가 질문을 하면, 백엔드 서버가 우리만의 데이터베이스에서 관련 문서를 먼저 '검색(Retrieval)'해 옵니다. 그리고 그 문서 조각들을 프롬프트에 끼워 넣어 "이 자료들만 참고해서 대답해 줘"라고 AI에게 '생성(Generation)'을 지시하는 매우 스마트하고 경제적인 아키텍처입니다.
2. 텍스트를 고차원 숫자로: 임베딩(Embedding)의 마법
RAG의 핵심은 '질문과 가장 관련된 문서를 어떻게 0.1초 만에 찾아낼 것인가'입니다. 컴퓨터는 한글이나 영어를 이해하지 못하므로, 자연어를 수학적인 공간의 벡터(고차원 숫자 배열)로 변환해야 합니다. 이 과정을 임베딩(Embedding)이라고 합니다.
예를 들어 "강아지"와 "고양이"를 임베딩하면 벡터 공간(보통 1,536차원)에서 서로 매우 가까운 위치에 좌표가 찍힙니다. 반면 "자동차"는 멀리 떨어지게 됩니다. OpenAI의 최신 임베딩 모델인 text-embedding-3-small 등을 활용하면, 수만 페이지의 문서를 저렴하고 빠르게 숫자 벡터로 변환할 수 있습니다.
3. 벡터 데이터베이스(Vector DB)와 유사도 검색
숫자로 변환된 수백만 개의 문장을 전통적인 RDBMS(PostgreSQL, MySQL)에 저장하면 검색 속도가 심각하게 느려집니다. 그래서 AI 시대에는 벡터 데이터베이스(Vector DB)가 필수 인프라로 자리 잡았습니다.
- 대표적인 Vector DB: 오픈소스인 Chroma, Milvus부터 클라우드 완전 관리형인 Pinecone 등이 현업에서 널리 쓰입니다. 기존 PostgreSQL에
pgvector확장 플러그인을 설치해 하이브리드로 쓰는 곳도 많습니다. - 코사인 유사도(Cosine Similarity): 사용자가 "환불 규정 알려줘"라고 질문하면, 이 질문 역시 임베딩하여 벡터로 만듭니다. 그리고 Vector DB 내의 수많은 문서 벡터들과 '각도'를 비교하여, 각도가 가장 좁은(가장 유사한 의미를 가진) Top-K 개의 문서 조각을 순식간에 추출해 냅니다.
4. LangChain: 파이프라인 오케스트레이션 도구
문서를 불러오고, 텍스트를 쪼개고(Chunking), 임베딩하고, Vector DB에 넣고, 다시 검색해서, 프롬프트를 만들고, OpenAI API를 호출하는 이 복잡한 파이프라인을 파이썬 코드 몇 줄로 우아하게 연결(Chain)해 주는 프레임워크가 바로 LangChain입니다.
# LangChain과 FastAPI를 결합한 실무 수준의 RAG 엔드포인트 예시
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from fastapi import FastAPI
app = FastAPI()
# 1. 문서 로드 및 청크 분할 (Chunking Strategy)
# 문서를 너무 크게 자르면 API 토큰 제한에 걸리고, 너무 작게 자르면 문맥이 잘려나갑니다.
loader = PyPDFLoader("company_policy.pdf")
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
splits = text_splitter.split_documents(docs)
# 2. 임베딩 및 벡터 DB 구축 (보통 이 과정은 서버 시작 시 한 번만 하거나 배치 작업으로 뺍니다)
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) # 가장 유사한 문서 3개 추출
# 3. 프롬프트 템플릿과 LLM 설정
template = """
당신은 사내 규정 안내 봇입니다. 아래 제공된 [Context]만 사용하여 질문에 답하세요.
모르는 내용이면 지어내지 말고 '문서에 없습니다'라고 답변하세요.
[Context]: {context}
[Question]: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
llm = ChatOpenAI(model="gpt-4-turbo", temperature=0) # 정보 검색이므로 창의성(temperature)은 0으로 고정
# 4. LCEL (LangChain Expression Language) 체인 구성
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
)
@app.get("/ask")
async def ask_policy(question: str):
# 체인 실행 및 응답 반환
response = rag_chain.invoke(question)
return {"answer": response.content}
5. 실무 고도화: 하이브리드 검색과 리랭킹(Re-ranking)
기본적인 RAG를 구축하고 나면 "검색이 생각보다 부정확한데?"라는 피드백을 받게 됩니다. 벡터 유사도 검색은 '의미'는 잘 찾지만, 특정 고유명사나 상품명(예: "XYZ-9900 모델 부품")을 찾는 '키워드 매칭'에는 약하기 때문입니다.
따라서 현업 시니어 엔지니어들은 하이브리드 검색(Hybrid Search)을 구축합니다. 벡터 검색과 전통적인 키워드 검색(BM25 알고리즘)을 동시에 수행하여 결과를 합친 뒤, Cohere Rerank 같은 교차 인코더 모델을 한 번 더 거쳐 문서의 순위를 가장 정확하게 재정렬(Re-ranking)하여 LLM에 넘겨줍니다. 이 과정을 이해한다면 완벽한 CTO 레벨의 아키텍처 설계가 가능합니다.
6. 마무리
RAG 아키텍처는 엔터프라이즈 AI 백엔드의 심장이자 가장 수요가 폭발하는 기술 스택입니다. Vector DB의 특성과 LangChain의 체인(Chain) 구조를 확실하게 이해했다면, 이제 남은 것은 수많은 비정형 데이터를 어떻게 자동으로 이 파이프라인에 밀어 넣을 것인지에 대한 고민입니다. 다음 글에서는 파이썬 크롤링을 활용한 무인 자동화 콘텐츠 파이프라인을 다루겠습니다.
'인공지능(AI)' 카테고리의 다른 글
| 프론트엔드와 백엔드의 소통 언어: HTTP 프로토콜과 상태 코드 완벽 가이드 (1) | 2026.03.13 |
|---|---|
| 무인화 시대: 파이썬 크롤링과 LLM을 결합한 100% 자동화 콘텐츠 파이프라인(ETL) 구축기 (2) | 2026.03.11 |
| LLM 보안의 핵심: 프롬프트 인젝션(Prompt Injection) 방어 전략 및 아키텍처 (0) | 2026.03.10 |
| FastAPI 기반 AI 챗봇 백엔드 로직 설계: 상태 관리와 스트리밍 (0) | 2026.03.09 |
| IT 서비스 기획 실전: 유저 페르소나(Persona) 분석과 기능 도출 (0) | 2026.03.08 |