LangChain 완벽 가이드 | LLM 앱 개발·Chain·Agent·RAG·실전 활용
이 글의 핵심
LangChain으로 LLM 앱을 개발하는 완벽 가이드. Chain, Agent, Memory, RAG, Vector Store까지 실전 예제로 정리. LangChain·LLM·AI 중심으로 설명합니다. Start now.
이 글의 핵심
LangChain으로 LLM 앱을 개발하는 완벽 가이드입니다. Chain, Agent, Memory, RAG, Vector Store까지 실전 예제로 정리했습니다.
실무 경험 공유: 단순 GPT API 호출을 LangChain으로 전환하면서, 복잡한 워크플로우 구현이 가능해지고 응답 품질이 크게 향상된 경험을 공유합니다.
들어가며: “LLM 앱 개발이 어려워요”
실무 문제 시나리오
시나리오 1: Prompt 관리가 복잡해요
하드코딩은 유지보수가 어렵습니다. LangChain은 Template을 제공합니다. 시나리오 2: 문서 검색이 필요해요
단순 GPT는 제한적입니다. LangChain은 RAG를 지원합니다. 시나리오 3: 복잡한 워크플로우가 필요해요
순차 호출은 번거롭습니다. LangChain은 Chain과 Agent를 제공합니다.
1. LangChain이란?
핵심 특징
LangChain은 LLM 앱 개발 프레임워크입니다. 주요 기능:
- Chain: 여러 단계 연결
- Agent: 자율적 의사결정
- Memory: 대화 기억
- RAG: 문서 기반 응답
- Vector Store: 임베딩 저장
2. 설치 및 기본 사용
설치
pip install langchain langchain-openai
기본 LLM 호출
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-4",
temperature=0.7,
api_key="your-api-key"
)
response = llm.invoke("Hello, how are you?")
print(response.content)
3. Prompt Template
from langchain.prompts import ChatPromptTemplate
template = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant that translates {input_language} to {output_language}."),
("human", "{text}")
])
prompt = template.format_messages(
input_language="English",
output_language="Korean",
text="Hello, how are you?"
)
response = llm.invoke(prompt)
print(response.content)
4. Chain
Simple Chain
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=template)
result = chain.invoke({
"input_language": "English",
"output_language": "Korean",
"text": "Hello"
})
print(result[text])
Sequential Chain
from langchain.chains import SequentialChain
# 첫 번째 Chain: 요약
summary_chain = LLMChain(llm=llm, prompt=summary_template, output_key="summary")
# 두 번째 Chain: 번역
translate_chain = LLMChain(llm=llm, prompt=translate_template, output_key="translation")
# 연결
overall_chain = SequentialChain(
chains=[summary_chain, translate_chain],
input_variables=[text],
output_variables=["summary", "translation"]
)
result = overall_chain.invoke({"text": "Long article..."})
5. Agent
Tool 정의
from langchain.agents import Tool
from langchain.tools import DuckDuckGoSearchRun
search = DuckDuckGoSearchRun()
tools = [
Tool(
name="Search",
func=search.run,
description="Useful for searching the internet"
),
Tool(
name="Calculator",
func=lambda x: eval(x),
description="Useful for math calculations"
)
]
Agent 실행
from langchain.agents import initialize_agent, AgentType
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
result = agent.invoke("What is the population of Seoul in 2024?")
print(result[output])
6. Memory
Conversation Buffer
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
conversation.invoke("Hi, I'm John")
conversation.invoke("What's my name?")
# "Your name is John"
7. RAG (Retrieval-Augmented Generation)
문서 로드
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = TextLoader("document.txt")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
splits = text_splitter.split_documents(documents)
Vector Store
from langchain_openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
documents=splits,
embedding=embeddings
)
Retrieval QA
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
result = qa_chain.invoke("What is the main topic of the document?")
print(result[result])
8. 실전 예제: 챗봇
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
from langchain.prompts import ChatPromptTemplate
llm = ChatOpenAI(model="gpt-4", temperature=0.7)
template = ChatPromptTemplate.from_messages([
("system", "You are a helpful customer service assistant."),
("human", "{input}")
])
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=llm,
memory=memory,
prompt=template,
verbose=True
)
def chat(message: str) -> str:
response = conversation.invoke({"input": message})
return response[response]
# 사용
print(chat("Hi, I need help with my order"))
print(chat("My order number is 12345"))
print(chat("When will it arrive?"))
정리 및 체크리스트
핵심 요약
- LangChain: LLM 앱 개발 프레임워크
- Chain: 여러 단계 연결
- Agent: 자율적 의사결정
- Memory: 대화 기억
- RAG: 문서 기반 응답
- Vector Store: 임베딩 저장
구현 체크리스트
- LangChain 설치
- Prompt Template 작성
- Chain 구현
- Agent 구현
- Memory 추가
- RAG 구현
- 챗봇 구현
같이 보면 좋은 글
- FastAPI 완벽 가이드
- OpenAI API 가이드
- Vector Database 가이드
이 글에서 다루는 키워드
LangChain, LLM, AI, GPT, RAG, Agent, Python
내부 동작과 핵심 메커니즘
이 글의 주제는 「LangChain 완벽 가이드 | LLM 앱 개발·Chain·Agent·RAG·실전 활용」입니다. 여기서는 앞선 설명을 구현·런타임 관점에서 한 번 더 압축합니다. 데이터 흐름과 실패 모드를 기준으로 생각하면, “입력이 어디서 검증되고, 핵심 연산이 어디서 일어나며, 부작용(I/O·네트워크·디스크)이 어디서 터지는가”가 한눈에 드러납니다.
처리 파이프라인(개념도)
flowchart TD A[입력·요청·이벤트] --> B[파싱·검증·디코딩] B --> C[핵심 연산·상태 전이] C --> D[부작용: I/O·네트워크·동시성] D --> E[결과·관측·저장]
알고리즘·프로토콜 관점에서의 체크포인트
- 불변 조건(Invariant): 각 단계가 만족해야 하는 조건(예: 버퍼 경계, 프로토콜 상태, 트랜잭션 격리)을 문장으로 적어 두면 디버깅 비용이 줄어듭니다.
- 결정성: 동일 입력에 동일 출력이 보장되는 순수한 층과, 시간·네트워크에 의해 달라질 수 있는 층을 분리해야 테스트와 장애 분석이 쉬워집니다.
- 경계 비용: 직렬화/역직렬화, 문자 인코딩, syscall 횟수, 락 경합처럼 “한 번의 호출이 아니라 누적되는 비용”을 의심 목록에 넣습니다.
프로덕션 운영 패턴
실서비스에서는 기능 구현과 함께 관측·배포·보안·비용이 동시에 요구됩니다. 아래는 팀에서 자주 쓰는 최소 체크리스트입니다.
| 영역 | 운영 관점에서의 질문 |
|---|---|
| 관측성 | 요청 단위 상관 ID, 에러율/지연 분위수, 주요 의존성 타임아웃이 보이는가 |
| 안전성 | 입력 검증·권한·비밀 관리가 코드 경로마다 일관적인가 |
| 신뢰성 | 재시도는 멱등한 연산에만 적용되는가, 서킷 브레이커·백오프가 있는가 |
| 성능 | 캐시 계층·배치 크기·풀링·백프레셔가 데이터 규모에 맞는가 |
| 배포 | 롤백 룬북, 카나리, 마이그레이션 호환성이 문서화되어 있는가 |
운영 환경에서는 “개발자 PC에서는 재현되지 않던 문제”가 시간·부하·데이터 크기 때문에 드러납니다. 따라서 스테이징의 데이터 양·네트워크 지연을 가능한 한 현실에 가깝게 맞추는 것이 중요합니다.
문제 해결(Troubleshooting)
| 증상 | 가능 원인 | 조치 |
|---|---|---|
| 간헐적 실패 | 레이스 컨디션, 타임아웃, 외부 의존성 불안정 | 최소 재현 스크립트 작성, 분산 트레이스·로그 상관관계 확인 |
| 성능 저하 | N+1 쿼리, 동기 I/O, 잠금 경합, 과도한 직렬화 | 프로파일러·APM으로 핫스팟 확인 후 한 가지씩 제거 |
| 메모리 증가 | 캐시 무제한, 클로저/이벤트 구독 누수, 대용량 객체의 불필요한 복사 | 상한·TTL·스냅샷 비교(힙 덤프/트레이스) |
| 빌드·배포만 실패 | 환경 변수·권한·플랫폼 차이 | CI 로그와 로컬 diff, 컨테이너/런타임 버전 핀(pin) |
권장 디버깅 순서: (1) 최소 재현 만들기 (2) 최근 변경 범위 좁히기 (3) 의존성·환경 변수 차이 확인 (4) 관측 데이터로 가설 검증 (5) 수정 후 회귀·부하 테스트.
자주 묻는 질문 (FAQ)
Q. OpenAI API만으로는 안 되나요?
A. 단순 호출은 가능하지만, 복잡한 워크플로우는 LangChain이 훨씬 편합니다.
Q. 다른 LLM도 사용할 수 있나요?
A. 네, Claude, Gemini, Llama 등 다양한 LLM을 지원합니다.
Q. 비용은 얼마나 드나요?
A. LangChain은 무료이고, LLM API 비용만 발생합니다.
Q. 프로덕션에서 사용해도 되나요?
A. 네, 많은 AI 스타트업에서 사용하고 있습니다.