Deep Agents vs LangChain vs LangGraph
TMThttps://www.langchain.com/blog/deep-agents-vs-langchain-vs-langgraph
Deep Agents, LangChain, LangGraph는 각각 에이전트를 만드는 서로 다른 접근 방식을 제공합니다. 이 글에서는 저희 오픈소스 프레임워크들의 핵심 차이점과 각각 어떤 상황에서 선택해야 하는지 다룹니다.
Deep Agents, LangChain, LangGraph는 저희 오픈소스 에이전트 스택을 이루는 세 계층이며, 같은 철학 위에 서 있습니다. 개발자가 에이전트의 모든 부분, 즉 어떤 모델을 쓸지, 모델에게 어떤 컨텍스트를 보여줄지, 에이전트를 어떤 하니스(harness)로 실행할지를 직접 소유할 수 있어야 한다는 것입니다.
각 계층은 서로 다른 역할을 맡고, 제공하는 제어 수준도 다릅니다. LangGraph는 에이전트 런타임이고, LangChain은 에이전트 프레임워크이며, Deep Agents는 에이전트 하니스입니다. 런타임은 제어권이 가장 크고 추상화가 가장 적으며, 하니스는 그 반대입니다. 세 계층 모두 자유롭게 조합할 수 있으므로, 하나만 골라야 하는 게 아니라 계층 사이를 오가며 쓸 수 있습니다.
각 계층이 제공하는 것
Deep Agents는 바로 꺼내 쓸 수 있는 기성 에이전트 하니스입니다. 에이전트 하니스가 하는 일은 컨텍스트 엔지니어링을 통해 적절한 컨텍스트를 적절한 시점에 모델에 전달하는 것입니다. Deep Agents에는 이를 위한 모범 사례가 처음부터 다양하게 내장되어 있습니다. 예를 들면 다음과 같습니다:
- 파일시스템: 컨텍스트를 읽고 쓰는 공간으로, LLM의 컨텍스트 윈도우에 직접 넣고 싶지 않은 내용을 담아 둘 때 사용합니다
- 서브에이전트: 메인 컨텍스트 윈도우를 부풀리지 않으면서 전문화된 작업을 처리할 때 유용합니다
- 스킬: 에이전트가 필요할 때 불러올 수 있는 지침과 스크립트를 제공할 수 있습니다
- 메모리: 에이전트가 실행을 거듭하며 배우고 나아질 수 있게 합니다
이 밖에도 기본으로 제공되는 요소가 많습니다. 모두 저희 팀이 끊임없이 검토하고 갱신하는, 뚜렷한 방향성을 가진 컨텍스트 관리 모범 사례입니다. Deep Agents를 쓰면 좋은 점 하나는, 저희가 업계 동향을 쉬지 않고 살피며 모범 사례를 이곳에 반영한다는 사실을 믿고 맡길 수 있다는 것입니다.
create_deep_agent로 간단하게 시작할 수 있습니다:
from deepagents import create_deep_agent
agent = create_deep_agent(
model="anthropic:claude-sonnet-5",
tools=[web_search],
system_prompt="you are a research agent...",
# skills path with citation-format, source-eval
skills=["./skills/"],
)LangChain은 에이전트 프레임워크, 즉 추상화와 통합(integration)을 담당하는 계층입니다. 아주 미니멀한 에이전트 하니스가 함께 딸려 옵니다. Deep Agents가 컨텍스트 관리 모범 사례를 기본 탑재하고 나오는 반면, LangChain의 에이전트 추상화는 극도로 미니멀하고 특정 방향을 강요하지 않습니다.
핵심 에이전트 추상화는 꽤 단순합니다. 루프 안에서 돌면서 도구를 호출하는 LLM, 그게 전부입니다.
이 루프는 놀랄 만큼 단순하지만 매우 강력합니다. 다만 이 루프를 손보고 싶어질 때가 있습니다. 보통은 결정적(deterministic)인 단계를 더하기 위해서인데, 컨텍스트가 가득 차 갈 때 요약을 돌리거나 마지막에 검증기를 실행하는 식입니다. LangChain 에이전트의 가장 강력한 부분 중 하나가 바로 이런 수정을 덧붙이는 방식입니다. LangChain 미들웨어는 이 루프를 다양한 방식으로 바꿀 수 있는 훅(hook) 모음을 제공합니다.
재미있는 사실: Deep Agents는 사실 핵심 LangChain 에이전트에 미들웨어 한 무더기를 얹은 것일 뿐입니다!
간단한 create_agent 추상화로 LangChain 에이전트를 사용할 수 있습니다:
from langchain.agents import create_agent
agent = create_agent(
model="anthropic:claude-sonnet-5",
tools=[send_email],
prompt="you are my email assistant...",
middleware=[...]
)LangGraph는 에이전트 런타임입니다. 커스텀 에이전트 워크플로를 위한 그래프 기반 프레임워크로, 휴먼 인 더 루프, 장애 허용, 그리고 단계마다의 관측 가능성을 갖춘 내구성 있는 엔진이 뒷받침합니다. 에이전트를 그래프로 바라보면 좋은 점 하나는, 더 많은 결정성을 그래프에 담아낼 수 있고 실행되는 단계를 더 촘촘하게 제어할 수 있다는 것입니다.
위에서 그래프 형태로 보여드린 LangChain과 Deep Agents의 에이전트 추상화도 모두 LangGraph 위에서 돌아갑니다.
어떤 상황에서 무엇을 선택할까
경험칙
Deep Agents로 시작하세요. 필요한 기능이 전부 갖춰진 매우 강력한 에이전트 하니스입니다. 복잡한 워크플로를 모델링해야 하거나 모든 단계를 완전히 제어하고 싶어지면, 그때 LangChain과 LangGraph로 내려가세요.
Deep Agents
바로 쓸 수 있는 유능한 에이전트가 필요하다면 Deep Agents를 선택하세요. 대부분의 개발자는 여기서 시작하는 것이 맞고, 하니스 자체를 더 세밀하게 제어해야 할 때만 아래 계층으로 내려가면 됩니다.
예를 들어 GTM 에이전트를 만든다고 해 봅시다. 영업 담당자별 메모리(이메일 문체 선호나 고객 관계에 대한 이해 같은 것), QBR 준비 같은 반복 워크플로를 위한 스킬, 그리고 통화 기록과 뉴스, CRM 이력을 넘나들며 계정을 깊이 조사할 서브에이전트가 필요합니다.
이건 그냥 지어낸 예시가 아닙니다. 실제로 저희 GTM 에이전트를 deepagents로 만들었습니다! 지금도 주당 1만 건에 가까운 요청을 처리하고 활성 사용자가 150명을 넘을 만큼 활발히 쓰이고 있습니다. 트래픽의 26%는 사용자가 직접 시작한 것이고, 나머지 74%는 상시(ambient) 에이전트 작업에서 나옵니다. 배포에는 LangSmith deployments를 쓰는데, 한꺼번에 몰리는 트래픽과 예약·이벤트 기반의 상시 실행을 모두 지원합니다.
LangChain
핵심 구성 요소만 가져다 쓰고 싶거나 그 위에 자신만의 맞춤 하니스를 직접 조립할 계획이라면 LangChain을 선택하세요. LangChain의 통합과 추상화는 커스텀 그래프에서든, create_agent에서든, create_deep_agent에서든 어느 수준에서나 유용합니다. 각 단계에서 어떤 도구와 컨텍스트가 모델에 전달되는지 세밀하게 제어하고 싶을 때도 잘 맞는데, 지연 시간에 극도로 민감한 앱이 흔히 이런 제어를 원합니다.
예를 들어 문서 Q&A용 RAG 봇을 만든다고 해 봅시다. 질문이 들어오면 에이전트가 벡터 스토어에서 관련 페이지를 검색합니다. 만족스러운 답에 도달했는지는 에이전트 루프가 판단하고, 질의가 끝날 때까지 봇을 계속 굴립니다. 이런 유형의 에이전트에는 서브에이전트를 통한 위임도, 파일시스템을 통한 컨텍스트 관리도 필요 없습니다. LangChain의 통합을 이용하면 어떤 벡터 스토어든 도구로 끼워 넣고 원하는 모델을 고를 수 있으며, create_agent가 이들을 하나로 묶는 루프를 제공합니다.
LangGraph
에이전트가 표준 루프에 들어맞지 않거나, 한 워크플로 안에서 결정적 단계와 에이전트적 단계를 섞어야 한다면 LangGraph를 선택하세요.
예를 들어 임대 신청서 처리 파이프라인을 만든다고 해 봅시다. 단계는 몇 개 되지 않습니다:
- 각 신청서에서 소득, 신용, 임대 이력을 추출한다
- 임대인의 기준에 따라 점수를 매긴다
- 확실한 적격자는 자동 승인하고, 확실한 부적격자는 거절하고, 경계선에 걸친 건은 사람에게 올린다.
LLM이 관여하는 건 1단계뿐이고, 나머지는 고정된 코드입니다. 이 워크플로는 문서에서 정보를 뽑아내는 데 LLM의 힘을 빌리지만, 모델에게 행동할 수 있는 도구를 쥐여 주지는 않습니다. 비교적 결정적인 파이프라인인 셈입니다.
이미 LangGraph를 쓰고 계신가요? 가치가 그래프의 형태와 결정적 단계들에 있다면 그대로 머무르세요. 반대로 LangGraph 플로가 에이전트적 성격이 강하다면 Deep Agents로 옮기는 편이 이득일 수 있습니다.
셋 다 함께
세 가지는 모두 자유롭게 조합할 수 있습니다. create_agent나 create_deep_agent를 더 큰 LangGraph 워크플로 안에 끼워 넣을 수도 있고, 반대로 커스텀 LangGraph 워크플로를 create_agent나 create_deep_agent 안의 서브에이전트로 넣을 수도 있습니다.
어떤 패키지로 만들든 LangSmith deployments로 배포하고 LangSmith observability로 관측할 수 있습니다.
결정성과 자율성 사이의 균형
에이전트에 자율성을 더 줄수록 잠재 가치는 커지지만, 그 대가로 신뢰성이 낮아집니다. 민감하거나 절차가 미리 정해진 워크플로, 그리고 굳이 에이전트일 필요가 없는 반복 작업에는 결정성이 더 나은 선택입니다. 반대로 에이전트가 동적일수록 더 유능하고 창의적일 수 있습니다. 실제 프로덕션에서 이런 트레이드오프가 어떻게 나타나는지 더 알고 싶다면, 여러 팀이 실제 에이전트 시스템을 설계하고 배포하고 다듬어 가는 이야기를 다루는 저희 팟캐스트 Max Agency를 들어보세요.
세 계층은 이 스펙트럼의 서로 다른 지점에 자리합니다. LangGraph는 결정성이 가장 높습니다. 판단을 모델에 맡기는 대신 도메인 지식을 그래프의 구조 자체에 새겨 넣을 수 있습니다. LangChain은 그 중간에 있습니다. 핵심 에이전트 루프는 본질적으로 비결정적이어서, 다음에 무엇을 할지 매 단계 모델이 결정합니다. Deep Agents는 자율성이 가장 높습니다. 요약과 서브에이전트 같은 내장 기능 덕분에 더 오래 달릴 수 있고 대규모로 뻗어나갈(fan out) 수 있는 에이전트 루프입니다.
최고의 에이전트를 만드는 팀들과 나눈 더 깊은 대화가 궁금하다면 저희 팟캐스트 Max Agency를 들어보세요.
많은 에이전트가 핵심 에이전트 루프 위에서 돌지만, 그래도 몇 가지 결정적 단계는 안에 심어 두어야 합니다. 승인 단계, 컴플라이언스 점검, 모델에 맡겨서는 안 되는 비즈니스 규칙 같은 것들입니다. Deep Agents와 LangChain에서는 미들웨어가 이 문제를 해결해 주어, 핵심 루프 주변에 이런 단계와 휴먼 인 더 루프 개입 지점을 끼워 넣을 수 있습니다.
미들웨어가 내장 훅으로 제공하는 것보다 더 큰 유연성이나 제어가 필요하다면, LangGraph가 탈출구가 되어 줍니다. 위의 '뻗어나갔다가 종합하기(fan-out-and-synthesize)' 예시처럼, 워크플로 고유의 로직을 그래프의 형태에 직접 새겨 넣은 완전한 커스텀 그래프를 만들 수 있습니다.
왜 세 계층인가
LangChain은 2022년 10월, LLM 앱을 가장 빠르게 띄우는 방법으로 출발했습니다. 에이전트가 복잡해지면서 체인(chain)이 줄 수 있는 것보다 더 많은 제어가 필요해졌고, 그래서 2024년 1월 LangGraph를 내놓았습니다. 내구성 있는 실행, 스트리밍, 휴먼 인 더 루프를 일급 기본 요소로 내장한 그래프 기반 런타임입니다.
모델이 좋아지면서, 계획을 세우고 도구를 호출하고 결과에 반응하는 핵심 에이전트 루프가 표준으로 삼아도 될 만큼 강력해졌습니다. 그렇게 create_agent가 LangChain의 미니멀한 하니스가 되었고, 프로덕션 에이전트에는 휴먼 인 더 루프, 관측 가능성, 장애 허용 같은 기본 요소가 꼭 필요하기 때문에 LangGraph 위에 만들었습니다.
그리고 2025년 7월, 한 계층 더 나아가 Deep Agents를 내놓았습니다. 같은 핵심 루프 위에, 앞서 말한 구성 요소들(컨텍스트 관리, 서브에이전트 등)을 기본으로 묶은 것입니다. Claude Code와 Manus에서 영감을 받아, 개발자들도 자신의 용도에 맞는 똑같이 강력한 에이전트를 원하리라는 데 걸었고, 그래서 범용 하니스로 deepagents를 만들었습니다.