LLM API 호출만으로는 앱이 안 된다 — LangChain(랭체인)이 정확히 무엇인지, 5개 부품과 30줄 RAG 코드로 끝내기
ChatGPT API 호출 한 줄로 "AI 기능 붙였다"고 말할 수 있던 시절은 끝났습니다. 내 회사 문서로 답하게 하고, 검색도 시키고, 계산기도 쓰게 하고, 대화 맥락까지 기억하게 하려면 그 사이를 이어 주는 배관 공사가 필요합니다. 그 배관의 표준 도구가 바로 LangChain(랭체인)입니다. 20년 가까이 SI와 클라우드 아키텍처를 하면서 RAG 파이프라인을 직접 만들어 본 입장에서, 랭체인이 정확히 무엇이고 언제 써야 하는지 한 편으로 정리합니다.
LangChain이 뭔가요? 한 문장으로
LangChain은 LLM을 중심으로 애플리케이션을 조립하는 오픈소스 프레임워크입니다. 2022년 10월 Harrison Chase가 공개했고, Python과 JavaScript/TypeScript 두 언어를 지원합니다. 핵심 아이디어는 단순합니다. 모델, 프롬프트, 외부 데이터, 도구, 메모리 같은 부품을 표준화된 인터페이스로 감싸서 레고처럼 연결할 수 있게 하는 것입니다.
덕분에 OpenAI GPT로 만든 체인을 Anthropic Claude나 Google Gemini, 혹은 vLLM으로 띄운 로컬 Llama 모델로 바꿀 때 코드 한두 줄만 손대면 됩니다. 벡터 DB를 Chroma에서 pgvector로 옮길 때도 마찬가지입니다. 이 "교체 가능성"이 랭체인을 쓰는 가장 큰 이유입니다.
핵심 구성요소 5가지만 알면 전체가 보인다
① 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(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로 설계하는 편이 낫습니다.
언제 쓰고, 언제 피해야 할까
쓰면 좋은 경우. RAG를 만들 때, 여러 단계를 거치는 에이전트를 만들 때, 모델이나 벡터 DB를 자주 바꿔 가며 실험할 때입니다. 추상화 덕분에 벤더 락인 없이 빠르게 갈아 끼울 수 있습니다.
굳이 안 써도 되는 경우. 프롬프트 하나로 끝나는 단순 기능이라면 벤더 SDK를 직접 호출하는 편이 가볍고 디버깅도 쉽습니다. 랭체인의 추상화 계층이 오히려 "지금 내부에서 무슨 일이 일어나는지" 가리는 비용이 될 수 있습니다.
실전 팁 세 가지. 첫째, 버전 변화가 빠르니 langchain-core, langchain-openai 같은 분리된 패키지를 쓰고 버전을 반드시 고정하세요. 둘째, 처음부터 LangSmith나 OpenTelemetry 추적을 켜 두세요. 셋째, 프로덕션 에이전트는 LangChain 체인보다 LangGraph 상태 머신으로 설계하면 운영 중 장애 분석이 훨씬 수월합니다.
정리
LangChain은 LLM을 "호출"하는 도구가 아니라 LLM으로 "시스템"을 만드는 도구입니다. 모델·프롬프트·파서·리트리버·도구라는 5개 부품과 LCEL 파이프 문법만 익히면 RAG 챗봇도, 도구를 쓰는 에이전트도 같은 방식으로 조립할 수 있습니다. 단순한 일에는 과하지만, 문서 기반 답변이나 멀티스텝 에이전트처럼 "배관"이 필요한 순간이 오면 가장 먼저 꺼내 드는 도구가 될 겁니다.




댓글
댓글 쓰기