LLM API 호출만으로는 앱이 안 된다 — LangChain(랭체인)이 정확히 무엇인지, 5개 부품과 30줄 RAG 코드로 끝내기

ChatGPT API 호출 한 줄로 "AI 기능 붙였다"고 말할 수 있던 시절은 끝났습니다. 내 회사 문서로 답하게 하고, 검색도 시키고, 계산기도 쓰게 하고, 대화 맥락까지 기억하게 하려면 그 사이를 이어 주는 배관 공사가 필요합니다. 그 배관의 표준 도구가 바로 LangChain(랭체인)입니다. 20년 가까이 SI와 클라우드 아키텍처를 하면서 RAG 파이프라인을 직접 만들어 본 입장에서, 랭체인이 정확히 무엇이고 언제 써야 하는지 한 편으로 정리합니다.

LangChain 완전 정복: LLM 앱의 조립 프레임워크

LangChain이 뭔가요? 한 문장으로

LangChain은 LLM을 중심으로 애플리케이션을 조립하는 오픈소스 프레임워크입니다. 2022년 10월 Harrison Chase가 공개했고, Python과 JavaScript/TypeScript 두 언어를 지원합니다. 핵심 아이디어는 단순합니다. 모델, 프롬프트, 외부 데이터, 도구, 메모리 같은 부품을 표준화된 인터페이스로 감싸서 레고처럼 연결할 수 있게 하는 것입니다.

덕분에 OpenAI GPT로 만든 체인을 Anthropic Claude나 Google Gemini, 혹은 vLLM으로 띄운 로컬 Llama 모델로 바꿀 때 코드 한두 줄만 손대면 됩니다. 벡터 DB를 Chroma에서 pgvector로 옮길 때도 마찬가지입니다. 이 "교체 가능성"이 랭체인을 쓰는 가장 큰 이유입니다.

핵심 구성요소 5가지만 알면 전체가 보인다

LangChain 핵심 구성요소 5가지: Model, Prompt, Parser, Retriever, Tool/Agent

① Model — 채팅 모델(ChatOpenAI, ChatAnthropic 등)과 임베딩 모델을 같은 인터페이스로 다룹니다. 어떤 벤더든 invoke() 한 번으로 호출합니다.

② Prompt Template — 프롬프트를 코드에 하드코딩하지 않고 변수가 있는 템플릿으로 관리합니다. 시스템 메시지, 예시(few-shot), 대화 기록을 조합하기 쉽습니다.

③ Output Parser — 모델이 뱉은 텍스트를 JSON, Pydantic 객체, 리스트 등 프로그램이 쓸 수 있는 형태로 바꿉니다. 구조화 출력(structured output)이 여기서 나옵니다.

④ Retriever — 벡터 DB에서 질문과 비슷한 문서를 찾아오는 부품입니다. RAG의 심장입니다.

⑤ Tool / Agent — 모델에게 함수(검색, 계산, DB 조회, API 호출)를 쥐여 주고, 모델이 상황에 따라 스스로 어떤 도구를 쓸지 결정하게 합니다.

이 부품들을 잇는 문법이 LCEL(LangChain Expression Language)입니다. 유닉스 파이프처럼 | 하나로 체인을 만듭니다.

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_template("{topic}을 초등학생에게 3문장으로 설명해줘")
model = ChatOpenAI(model="gpt-4o-mini")
chain = prompt | model | StrOutputParser()

print(chain.invoke({"topic": "쿠버네티스"}))

프롬프트 → 모델 → 파서, 세 줄이 전부입니다. 모델을 ChatAnthropic(model="claude-sonnet-4-5")로 바꿔도 나머지 코드는 그대로입니다.

실전: 내 문서로 답하는 RAG 챗봇

RAG 파이프라인: Load, Split, Embed, Store, Retrieve, Generate

랭체인이 가장 빛나는 영역은 RAG(Retrieval-Augmented Generation)입니다. 사내 규정집, 제품 매뉴얼, 운영 위키처럼 모델이 학습하지 않은 문서로 답하게 만드는 패턴이고, 세 단계로 돌아갑니다.

1단계 인덱싱. Document Loader로 PDF·웹·DB에서 문서를 읽고, Text Splitter로 500~1,000자 단위 조각(chunk)으로 자른 뒤, 임베딩 모델로 벡터화해서 FAISS, Chroma, pgvector, Milvus 같은 벡터 DB에 저장합니다.

2단계 검색. 사용자의 질문도 같은 임베딩 모델로 벡터화하고, Retriever가 가장 가까운 문서 조각 Top-k개를 가져옵니다.

3단계 생성. 검색된 조각을 프롬프트에 "참고 자료"로 끼워 넣고 모델에게 답을 시킵니다. 모델은 지어내는 대신 근거를 보고 답하므로 환각이 크게 줄고, 문서를 갱신하면 답변도 바로 최신화됩니다.

from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

docs = PyPDFLoader("운영매뉴얼.pdf").load()
chunks = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100).split_documents(docs)
vs = FAISS.from_documents(chunks, OpenAIEmbeddings())
retriever = vs.as_retriever(search_kwargs={"k": 4})

prompt = ChatPromptTemplate.from_template(
    "아래 자료만 근거로 답해줘.\n\n자료:\n{context}\n\n질문: {question}")
rag = ({"context": retriever, "question": RunnablePassthrough()}
       | prompt | ChatOpenAI(model="gpt-4o-mini") | StrOutputParser())

print(rag.invoke("AKS 업그레이드 전에 꼭 확인할 항목은?"))

30줄이 안 되는 코드로 "내 문서 전용 챗봇"이 됩니다. 실무에서는 여기에 청크 전략 튜닝, 하이브리드 검색(BM25 + 벡터), 리랭커(reranker) 정도를 얹으면 꽤 쓸 만한 품질이 나옵니다.

LangGraph와 LangSmith, 세트로 알아두기

랭체인 생태계는 이제 세 축입니다. LangChain은 부품과 체인, LangGraph는 상태(state)를 가진 에이전트 워크플로를 그래프로 설계하는 도구, LangSmith는 체인 실행을 한 단계씩 추적·평가하는 관측(observability) 플랫폼입니다. 에이전트가 "어디서 왜 이상한 답을 했는지" 찾으려면 LangSmith 같은 추적 도구 없이는 사실상 디버깅이 불가능합니다. 복잡한 분기와 재시도, 사람 승인(human-in-the-loop)이 필요한 에이전트는 처음부터 LangGraph로 설계하는 편이 낫습니다.

언제 쓰고, 언제 피해야 할까

LangChain 도입 전 체크리스트: 언제 쓰고 언제 피할까

쓰면 좋은 경우. RAG를 만들 때, 여러 단계를 거치는 에이전트를 만들 때, 모델이나 벡터 DB를 자주 바꿔 가며 실험할 때입니다. 추상화 덕분에 벤더 락인 없이 빠르게 갈아 끼울 수 있습니다.

굳이 안 써도 되는 경우. 프롬프트 하나로 끝나는 단순 기능이라면 벤더 SDK를 직접 호출하는 편이 가볍고 디버깅도 쉽습니다. 랭체인의 추상화 계층이 오히려 "지금 내부에서 무슨 일이 일어나는지" 가리는 비용이 될 수 있습니다.

실전 팁 세 가지. 첫째, 버전 변화가 빠르니 langchain-core, langchain-openai 같은 분리된 패키지를 쓰고 버전을 반드시 고정하세요. 둘째, 처음부터 LangSmith나 OpenTelemetry 추적을 켜 두세요. 셋째, 프로덕션 에이전트는 LangChain 체인보다 LangGraph 상태 머신으로 설계하면 운영 중 장애 분석이 훨씬 수월합니다.

정리

LangChain은 LLM을 "호출"하는 도구가 아니라 LLM으로 "시스템"을 만드는 도구입니다. 모델·프롬프트·파서·리트리버·도구라는 5개 부품과 LCEL 파이프 문법만 익히면 RAG 챗봇도, 도구를 쓰는 에이전트도 같은 방식으로 조립할 수 있습니다. 단순한 일에는 과하지만, 문서 기반 답변이나 멀티스텝 에이전트처럼 "배관"이 필요한 순간이 오면 가장 먼저 꺼내 드는 도구가 될 겁니다.

댓글

이 블로그의 인기 게시물

금융권 망분리 환경에서 클로드 코드 도입할 때 실제로 걸리는 5가지 — 보안팀 질문과 대응 설정

맥 스튜디오 M5 Ultra 512GB, 3,000만원을 어떻게 결제할까 — 카드 한도 상향·18개월 무이자·잔존가치 금융리스 총정리

Kubernetes Pod Pending 해결법: FailedScheduling 원인별 실전 점검 가이드