LangChain v1: 현재 상태, 실제 정체, 그리고 우리가 여기에 전념하는 이유
LangChain v1,: where we're at, what it actually is, and why we're committing to it
핵심 요약
LangChain v1은 복잡성을 줄이고 create_agent와 미들웨어 중심으로 API를 단순화하여 생산성을 높이는 데 집중함.
- API 단순화 — create_agent를 통해 5줄 내외의 코드로 에이전트 구축이 가능해짐.
- 미들웨어 도입 — HITL, PII, 요약 등 필요한 기능만 선택적으로 추가하는 유연한 구조 제공.
- LangGraph 통합 — LangGraph 기반으로 구현되어 스트리밍, 체크포인팅 등 고급 기능을 별도 학습 없이 사용 가능.
- 버전 관리 강화 — v1부터 SemVer를 엄격히 적용하여 하위 호환성을 보장하고 안정적인 개발 환경 제공.
안녕하세요 여러분! 저는 LangChain의 메인테이너 중 한 명입니다. v1이 처음 출시된 지 1년이 채 되지 않았기에, v0를 보고 떠났거나 프로덕션 환경에서 정신없이 일하느라 확인하지 못한 분들을 위해 다시 소개하는 글을 쓰게 되었습니다.
이번 글의 목적은 무엇이 바뀌었고, 무엇이 그대로이며, 앞으로 무엇에 전념할 것인지 솔직하게 말씀드리는 것입니다. 댓글로 질문이나 비판을 남겨주시면 기꺼이 답변하겠습니다.
TL;DR
- 하나의 메인 진입점:
create_agent. 기본 사례는 약 5줄의 코드로 작성됩니다. - 하나의 확장 지점: 미들웨어. 필요하지 않다면 전혀 신경 쓸 필요가 없습니다.
- LangGraph 기반: LangGraph를 직접 배우지 않아도 체크포인팅, 스트리밍, Human-in-the-loop, 타임 트래블 기능을 그대로 상속받습니다.
- LCEL 시대의 모든 것은 별도 패키지인
langchain-classic으로 이동하여 메인 네임스페이스가 매우 가벼워졌습니다(이전의 흔한 비판이었던 라이브러리 무게 문제 해결). - v1부터 SemVer가 엄격히 적용됩니다. 마이너 버전 업데이트로 코드가 깨지지 않습니다(자세한 내용은 버전 관리 페이지 참조).
v0 시절의 많은 불만(비즈니스 로직을 작성하는 것보다 래퍼와 싸우는 데 더 많은 시간을 쓴다는 점)은 타당했습니다. 중복되는 부분이 많았고, 비즈니스 로직을 한 줄도 작성하기 전에 무엇을 선택할지 고민하는 것 자체가 학습 곡선이었습니다.
v1은 이러한 문제를 의도적으로 해결했습니다. 프레임워크는 이제 대략 하나의 형태를 가집니다.
from langchain.agents import create_agent
agent = create_agent(
model="...", # 모든 대규모 언어 모델 또는 공급자
tools=[...],
system_prompt="...",
...
)
result = agent.invoke({"messages": "Hello"})
이게 전부입니다. RunnablePassthrough | RunnableParallel | LLMChain | OutputParser 파이프라인을 조립할 필요가 없습니다. AgentExecutor, LCEL 체인, 그래프 사이에서 고민할 필요도 없습니다. 사용 사례가 "모델 + 도구 + 시스템 프롬프트"라면, API의 크기는 사용 사례만큼 작습니다.
더 많은 기능(예: 동적 프롬프트, 대화 요약, HITL 승인, 도구 호출 제한, 사용자 정의 재시도, PII 삭제)이 필요할 때는 미들웨어를 사용하는 것을 권장합니다. 이는 작은 훅 프로토콜(before_model, after_model, wrap_model_call, wrap_tool_call, before_agent, after_agent)이며, 필요한 부분만 배우면 됩니다. 미리 빌드된 미들웨어들은 대부분의 명백한 사례를 다루며, 에이전트가 진화함에 따라 새로운 미들웨어를 계속 추가하고 있습니다.
from langchain.agents import create_agent
from langchain.agents.middleware import (
HumanInTheLoopMiddleware,
PIIMiddleware,
SummarizationMiddleware,
)
agent = create_agent(
model="claude-sonnet-4-6",
tools=[read_email, send_email],
middleware=[
PIIMiddleware("email", strategy="redact"),
SummarizationMiddleware(model="result = agent.invoke({"messages": [{"role": "user", "content": "..."}]})", trigger={"tokens": 500}),
HumanInTheLoopMiddleware(interrupt_on={"send_email": {"allowed_decisions": ["approve", "edit", "reject"]}}),
],
)
result = agent.invoke({"messages": "Hello"})


