LangChain 필수 요소 — LangGraph를 배우기 전 반드시 알아야 할 것들
요약
LangGraph를 효과적으로 사용하기 위해 반드시 숙지해야 할 LangChain의 핵심 구성 요소를 정리합니다. LLM 설정, 프롬프트 템플릿, LCEL, 그리고 도구(Tools) 활용법 등 실질적으로 필요한 최소한의 개념을 다룹니다.
핵심 포인트
- LangGraph 사용 시에도 LangChain의 핵심 빌딩 블록 이해는 필수적임
- LLM 설정 및 ChatOpenAI를 통한 모델 연동 방법
- 프롬프트 템플릿과 LCEL을 활용한 체인 구성
- Pydantic을 이용한 구조화된 출력(Structured Output) 구현
- @tool 데코레이터를 활용한 에이전트용 도구 정의
참고: 이 글은 LangChain 0.3.x를 사용하여 2026년 7월에 작성되었습니다. API는 향후 버전에서 변경될 수 있으므로, 작동하지 않는 부분이 있다면 LangChain 문서를 확인하세요.
제가 LangChain을 배우기 시작했을 때, 저는 압도당했습니다. 체인 (Chains), 에이전트 (Agents), 메모리 (Memory), 리트리버 (Retrievers), 출력 파서 (Output Parsers) 등 수십 개의 추상화 개념들이 있었습니다. 그러다 깨달았습니다: 그중 대부분은 더 이상 사용되지 않습니다 (Deprecated).
LangGraph (동일한 팀에서 개발)가 오케스트레이션 레이어 (Orchestration layer)를 대체했습니다. 하지만 LangGraph 노드 내부에서는 여전히 LangChain의 핵심 빌딩 블록 (Building blocks)들이 필요합니다. 그래서 저는 실제로 배워야 할 최소한의 것들을 파악했습니다.
여기에 그 모든 내용을 한 파일에 담았습니다.
중요한 4가지 요소
| # | 주제 | LangGraph에서 중요한 이유 |
|---|---|---|
| 1 | LLM 설정 (LLM Setup) | 모델과 대화해야 함 |
| ... |
각 요소를 하나씩 살펴보겠습니다.
1. LLM 설정 (LLM Setup)
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
...
ChatOpenAI는 OpenAI와 호환되는 모든 API와 작동합니다. 여기서는 Llama 3.3을 사용하여 무료로 빠르고 효율적인 추론을 하기 위해 Groq를 사용하고 있습니다.
2. 프롬프트 템플릿 (Prompt Templates) + LCEL
from langchain_core.prompts import ChatPromptTemplate
template_string = """백틱 세 개로 구분된 텍스트를 번역하세요 \
...
{text}
"""
...
from pydantic import BaseModel, Field
class ReviewInfo(BaseModel):
"""제품 리뷰에서 추출된 정보."""
gift: bool = Field(description="아이템이 선물로 구매되었습니까?")
delivery_days: int = Field(description="도착까지 며칠이 걸립니까? 모를 경우 -1.")
price_value: list[str] = Field(description="가치 또는 가격에 관한 문장.")
structured_llm = llm.with_structured_output(ReviewInfo, method="function_calling")
result = (prompt | structured_llm).invoke({"text": review})
print(result.gift) # True (문자열 "true"가 아닌 실제 bool 타입)
print(result.delivery_days) # 2 (실제 int 타입)
역할 분담:
...
from langchain_core.tools import tool
@tool
def get_current_weather(city: str) -> str:
"""주어진 도시의 현재 날씨를 가져옵니다."""
return {"berlin": "17°C, cloudy"}.get(city.lower(), "No data")
@tool
def get_population(city: str) -> int:
"""도시의 대략적인 인구를 가져옵니다."""
return {"berlin": 3_700_000}.get(city.lower(), -1)
`@tool` 데코레이터(decorator)는 이 함수들을 `BaseTool` 객체로 변환합니다. 독스트링(docstring)은 LLM이 해당 도구를 언제 호출할지 결정하기 위해 읽는 설명(description)이 됩니다.
...
tools = [get_current_weather, get_population]
lm_with_tools = llm.bind_tools(tools)
messages = [HumanMessage("What's the weather and population in Berlin?")]
ai_response = llm_with_tools.invoke(messages)
print(ai_response.tool_calls)
[{"name": "get_current_weather", "args": {"city": "Berlin"}, "id": "..."},
{"name": "get_population", "args": {"city": "Berlin"}, "id": "..."}]
LLM은 도구를 **직접 실행하지 않습니다**. 대신 _사용자에게_ 도구를 실행해 달라고 요청하는 구조화된 요청(structured request)을 반환합니다.
...
tool_map = {t.name: t for t in tools}
messages.append(ai_response)
for tc in ai_response.tool_calls:
result = tool_map[tc["name"]].invoke(tc["args"])
messages.append(ToolMessage(content=str(result), tool_call_id=tc["id"]))
final_response = llm_with_tools.invoke(messages)
print(final_response.content)
"The weather in Berlin is 17°C and cloudy, with a population of 3.7 million."
이 루프 — **LLM이 결정 → 사용자가 실행 → 결과를 다시 전송 → 반복** — 가 바로 LangGraph의 `ToolNode`가 자동화하는 핵심 과정입니다.
...
git clone https://github.com/santanu2908/langchain-essentials.git
cd langchain-essentials
uv sync
.env 파일에 GROQ_API_KEY를 추가하세요
uv run main.py
_다음 단계: LangGraph. 이 내용이 도움이 되었다면 계속 함께해 주세요 — 저 또한 그 여정을 공유할 예정입니다._
저는 **Santanu Mohanta**입니다 — [LinkedIn](https://www.linkedin.com/in/santanu29/)에서 저와 연결되거나 [GitHub](https://github.com/santanu2908)에서 제 프로젝트를 확인해 보세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기