최근 AI 분야에서 스스로 생각하고 행동하는 '에이전트(Agent)'에 대한 관심이 폭발적으로 증가하고 있습니다. 'Precedence Research'에서 발표된 내용에 따르면 아래 그림과 같이 올해 79억 2천만 달러에서 2034년까지 2,360억 3천만 달러에 이를 것으로 예상합니다.

출처
AI Agent Frameworks(5가지)
아래 5가지의 Framework은 많이 주목받는 프레임워크입니다.
출처
AutoGen : 복잡한 작업을 수행하는 다중 에이전트 AI 애플리케이션을 만들기 위한 Microsoft의 오픈소스 프레임워크로 Core, AgnetChat, Extensions 구성되어 있음.
관련 Github
CrewAI : 다중 에이전트 AI 솔루션을 위한 오케스트레이션 프레임워크이고, 오픈소스 프레임워크 Agent AI를 작업자(Crew)로 취급함. Agents, Tasks, Process로 구성됨.
관련 Github
LlamaIndex : 생성형 AI(gen AI) 및 에이전틱 AI 솔루션을 구축하기 위한 오픈소스 데이터 오케스트레이션 프레임워크로, 최근 Agent와 Tool을 제공함.
관련 Github
LangChain : LangChain은 ChatGPT와 같은 챗봇 및 AI 에이전트를 포함하여 LLM 기반 애플리케이션을 구축하기 위한 또 다른 오픈소스 프레임워크로 '체인(Chain)'이라는 개념을 통해 정해진 순서대로 작업을 처리하는 데 특화됨.
관련 Github
LangGraph : LangChain 생태계 내에서 다중 에이전트 시스템을 위한 복잡한 워크플로우를 오케스트레이션하는 프레임워크,
관련 Github
OpenAI Agents SDK : GPT를 만든 회사인 OpenAI에서 제공하는 다중 에이전트 워크플로우를 구축하기 위한 가벼우면서도 강력한 프레임워크.
관련 Github
Semantic Kernel : Semantic Kernel은 엔터프라이즈급 생성형 AI 애플리케이션을 구축하기 위한 Microsoft의 오픈소스 개발 키트로 오케스트레이션 프레임워크,
관련 Github
관련해서 'Langfuse'에서 정리한 내용.
출처
| Framework | Core Paradigm | Primary Strength | Best For |
|---|---|---|---|
| LangGraph | Graph-based workflow of prompts | Explicit DAG control, branching, debugging | Complex multi-step tasks with branching, advanced error handling |
| OpenAI Agents SDK | High-level OpenAI toolchain | Integrated tools such as web and file search | Teams relying on OpenAI’s ecosystem who want official support & specialized features |
| Smolagents | Code-centric minimal agent loop | Simple setup, direct code execution | Quick automation tasks without heavy orchestration overhead |
| CrewAI | Multi-agent collaboration (crews) | Parallel role-based workflows, memory | Complex tasks requiring multiple specialists working together |
| AutoGen | Asynchronous multi-agent chat | Live conversations, event-driven | Scenarios needing real-time concurrency, multiple LLM “voices” interacting |
| Semantic Kernel | Skill-based, enterprise integrations | Multi-language, enterprise compliance | Enterprise settings, .NET ecosystems, or large orgs needing robust skill orchestration |
| LlamaIndex Agents | RAG with integrated indexing | Retrieval + agent synergy | Use-cases that revolve around extensive data lookup, retrieval, and knowledge fusion |
| Strands Agents | Model-agnostic agent toolkit | Runs anywhere; multi-model via LiteLLM; strong OTEL observability | Teams needing provider-flexible agents (Bedrock, Anthropic, OpenAI, Ollama) with production tracing |
| Pydantic AI | Type-safe Python agent framework | Strong type safety & FastAPI-style DX | Python developers wanting structured, validated agent logic |
LangChain은 잘 닦인 고속도로처럼, 시작부터 끝까지 명확한 경로를 따라 작업을 수행하는 데 최적화되어 있습니다. 특히 이름에서 부터 Chain으로 하나의 사슬 처럼 하나의 프로세스가 처리된 뒤, 다음 프로세스가 실행되는 구조입니다.
LangChain의 일반적인 WorkFlow
사용자 입력 ➔ 체인 시작 ➔ (순차적 실행) LLM 호출 ➔ 도구 사용 ➔ 결과 처리 ➔ 최종 결과
LangChain의 핵심 개념:
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_react_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.prompts import PromptTemplate
# 1. 모델과 도구 준비
llm = ChatOpenAI(model="gpt-4-turbo-preview")
tools = [TavilySearchResults(max_results=1)]
# 2. 에이전트가 사용할 프롬프트 정의
prompt = PromptTemplate.from_template("""
다음 질문에 최선을 다해 답하세요. 당신은 다음 도구들을 사용할 수 있습니다: {tools}
다음 형식을 사용하세요:
Question: 답변해야 할 질문
Thought: 무엇을 해야 할지 항상 생각해야 합니다.
Action: 수행할 행동. [{tool_names}] 중 하나여야 합니다.
Action Input: 행동에 대한 입력
Observation: 행동의 결과
... (이 Thought/Action/Action Input/Observation 과정은 여러 번 반복될 수 있습니다)
Thought: 이제 최종 답변을 알 것 같습니다.
Final Answer: 원래 질문에 대한 최종 답변
시작!
Question: {input}
Thought:{agent_scratchpad}
""")
# 3. 에이전트와 실행기(Executor) 생성
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 4. 에이전트 실행
agent_executor.invoke({"input": "LangGraph는 어떤 문제를 해결하기 위해 만들어졌나요?"})
LangGraph는 지도 없이 미지의 세계를 탐험하듯, 상황에 따라 경로를 변경하고, 왔던 길을 되돌아가며 최적의 해답을 찾아냅니다. LangChain의 단방향성(DAG) 구조가 가진 한계를 극복하기 위해 설계되었으며, 순환, 상태 관리, 여러 에이전트 간의 협력이 필요한 복잡한 애플리케이션 구축에 최적화되어 있습니다.
LangGraph의 일반적인 WorkFlow
상태 초기화 ➔ 노드 실행 (판단) ➔ 엣지 (조건부 분기)
ↆ ⬑
(필요시) 다른 노드 실행 (도구 등) ➔ 상태 업데이트 ➔ (반복 또는 종료) ➔ 최종 결과
LangGraph의 핵심 개념
import operator
from typing import TypedDict, Annotated
from langchain_openai import ChatOpenAI
from langchain_core.messages import AnyMessage, SystemMessage, HumanMessage, ToolMessage
from langchain_community.tools.tavily_search import TavilySearchResults
from langgraph.graph import StateGraph, END
# 1. 도구와 모델 준비
tool = TavilySearchResults(max_results=2)
model = ChatOpenAI(model="gpt-4-turbo-preview", temperature=0)
# 2. 상태(State) 객체 정의: 그래프의 모든 노드가 공유하는 데이터 구조
class AgentState(TypedDict):
messages: Annotated[list[AnyMessage], operator.add]
# 3. 노드(Node) 함수 정의: 그래프의 각 작업 단위
# - 에이전트 노드: 모델을 호출하여 다음 행동을 결정
def call_model(state: AgentState):
response = model.invoke(state['messages'])
return {"messages": [response]}
# - 도구 노드: 에이전트의 결정을 받아 실제 도구를 실행
def call_tool(state: AgentState):
last_message = state['messages'][-1]
tool_call = last_message.tool_calls[0]
result = tool.invoke(tool_call['args'])
return {"messages": [ToolMessage(content=str(result), tool_call_id=tool_call['id'])]}
# 4. 엣지(Edge) 로직 정의: 다음 노드를 결정하는 조건부 함수
def should_continue(state: AgentState):
if state['messages'][-1].tool_calls:
return "continue" # 도구를 호출해야 하면 'continue'
else:
return "end" # 끝나도 되면 'end'
# 5. 그래프 생성 및 노드/엣지 연결
graph = StateGraph(AgentState)
graph.add_node("agent", call_model)
graph.add_node("tool", call_tool)
graph.set_entry_point("agent")
graph.add_conditional_edges(
"agent",
should_continue,
{"continue": "tool", "end": END},
)
graph.add_edge("tool", "agent")
# 6. 그래프 컴파일 및 실행
runnable = graph.compile()
result = runnable.invoke({"messages": [HumanMessage(content="LangGraph는 어떤 문제를 해결하기 위해 만들어졌나요?")]})
print(result['messages'][-1].content)
LangChain과 LangGraph의 주요 차이점은 다음과 같습니다.
1. 제어 흐름 (Control Flow)
LangChain: 주로 선형적이거나 분기하는 순서로 작업을 실행하는 DAG를 사용합니다. 이는 순차적인 워크플로우에는 훌륭하지만, 순환이나 반복이 필요한 복잡한 프로세스를 모델링하는 데는 한계가 있습니다.
LangGraph: 보다 유연한 그래프 기반 제어 흐름을 제공합니다. 이는 흐름에 순환을 도입할 수 있음을 의미하며, 에이전트가 만족스러운 결과를 얻을 때까지 작업을 반복하고, 생각하고, 다시 시도할 수 있게 합니다.
2. 상태 관리 (State Management)
LangChain: 상태 관리가 암묵적인 경우가 많으며, 주로 메모리 컴포넌트를 통해 관리됩니다. 상태는 일반적으로 체인 내에 캡슐화되어 있어, 여러 에이전트 간에 상태를 공유하거나 수정하기가 더 어렵습니다.
LangGraph: 명시적이고 중앙 집중화된 상태 객체를 도입합니다. 이 상태 객체는 그래프의 모든 노드에 전달되고 수정될 수 있습니다. 이러한 접근 방식은 상태 관리를 단순화하고, 여러 에이전트가 동일한 상태에 대해 작업하는 복잡한 애플리케이션을 더 쉽게 구축할 수 있도록 합니다.
3. 순환 프로세스 (Cyclical Processes)
LangChain: 순환 프로세스를 구현하는 것은 까다로울 수 있으며, 종종 복잡한 해결 방법이 필요합니다. DAG 구조는 본질적으로 순환을 지원하지 않습니다.
LangGraph: 순환 프로세스를 기본적으로 지원하도록 설계되었습니다. 이는 에이전트가 작업을 미세 조정하고, 도구로부터 피드백을 통합하며, 최종 결과를 내놓기 전에 여러 번의 반복을 거쳐야 하는 시나리오에 이상적입니다.
4. 모듈성 및 재사용성 (Modularity and Reusability)
LangChain: 체인과 에이전트를 모듈식 컴포넌트로 사용할 수 있지만, 제어 흐름이 종종 단단히 결합되어 있습니다.
LangGraph: 노드를 재사용 가능한 컴포넌트로 정의함으로써 모듈성을 촉진합니다. 각 노드는 특정 작업을 수행하며, 다른 그래프에서 쉽게 결합되어 새로운 애플리케이션을 만들 수 있습니다.
5. 디버깅 및 시각화 (Debugging and Visualization)
LangChain: 체인이 복잡해질수록 "블랙박스"처럼 느껴질 수 있어 디버깅이 어려울 수 있습니다.
LangGraph: 그래프 구조 덕분에 제어 흐름을 시각화하고 추적하기가 더 쉽습니다. LangSmith와 같은 도구는 그래프 실행을 시각화하여 디버깅 과정을 크게 단순화할 수 있습니다.
위의 내용을 쭉 읽어보면 사실 LangChain과 LangGraph는 경쟁 관계가 아닌, 서로 다른 복잡성 수준의 문제를 해결하기 위한 상호 보완적인 도구입니다. 단일 Agent는 LangChain으로 구성하고, 이렇게 구성된 단일 Agent를 잘활용하기 위해서는 LangGraph를 사용하면 좋은거죠.
하지만, 저는 기본적으로 LangGraph 기반으로 작성하는것을 추천드립니다.
그 이유는 다음과 같습니다.
단순한 워크플로우도 포용하는 유연성: LangGraph로 만든 간단한 '직선형 그래프'는 사실상 LangChain의 '체인'과 동일하게 작동합니다. 즉, LangGraph는 LangChain이 할 수 있는 모든 것을 포함하면서, 미래에 필요할지 모를 복잡한 로직(순환, 조건부 분기)을 추가할 수 있는 확장성을 처음부터 제공합니다. 프로젝트가 단순하게 시작하더라도, 차후 복잡해질때 다시 코드를 구성하지 않아도 됩니다.
미래는 멀티-에이전트의 시대: 현재 AI 에이전트 기술의 화두는 단연 A2A(Agent-to-Agent) 상호작용과 멀티-에이전트(Multi-Agent) 시스템입니다. 여러 전문 에이전트가 서로 협력하여 복잡한 문제를 해결하는 이 패러다임은 LangChain의 선형적인 DAG 구조만으로는 구현하기 매우 어렵습니다. 반면, LangGraph는 바로 이러한 멀티-에이전트 협업을 위해 설계된 프레임워크입니다.
따라서 "LangChain으로 단일 에이전트를 만들고, 나중에 LangGraph로 묶는다"고 생각하기보다, "처음부터 LangGraph라는 확장 가능한 작업대 위에서 에이전트를 조립한다"고 접근하는 것이 훨씬 전략적입니다.