Agent 프레임워크
Agent 개발을 위한 주요 프레임워크 비교
Agent 프레임워크 개요
주요 프레임워크 소개
Agent를 직접 구현하는 것은 복잡하고 시간이 많이 걸립니다. 다행히 여러 오픈소스 프레임워크들이 Agent 개발을 위한 추상화와 도구를 제공합니다. 각 프레임워크는 서로 다른 철학과 강점을 가지고 있습니다.
LangChain
가장 널리 사용되는 LLM 애플리케이션 프레임워크. Chain과 Agent를 위한 풍부한 추상화 제공.
LlamaIndex
데이터 연결에 특화된 프레임워크. RAG와 데이터 Agent 구축에 최적화.
AutoGen
멀티 에이전트 대화에 특화. 여러 Agent 간의 협업 워크플로우 구축에 최적.
CrewAI
역할 기반 AI Agent 협업 프레임워크. 직관적인 "팀" 메타포로 Agent 구성.
Semantic Kernel
엔터프라이즈 환경을 위한 SDK. Azure 및 Microsoft 생태계와 긴밀히 통합.
Claude Agent SDK
Anthropic의 공식 Agent SDK. Claude 모델에 최적화된 간결한 Agent 구현.
프레임워크 상세 비교
기능별 비교표
| 기능 | LangChain | LlamaIndex | AutoGen | CrewAI |
|---|---|---|---|---|
| Single Agent | Excellent | Good | Basic | Good |
| Multi Agent | LangGraph | Limited | Excellent | Excellent |
| RAG 통합 | Excellent | Best | Basic | Basic |
| Tool 생태계 | 100+ Tools | 50+ Tools | 30+ Tools | 20+ Tools |
| 학습 곡선 | High | Medium | Low | Low |
| 프로덕션 준비 | High | High | Medium | Medium |
| 문서화 | Excellent | Good | Good | Growing |
| 커뮤니티 | Largest | Large | Growing | Growing |
코드 예시 비교
같은 작업을 각 프레임워크로 구현
같은 작업(웹 검색 Agent)을 각 프레임워크에서 어떻게 구현하는지 비교해 봅니다.
from langchain.agents import create_react_agent, AgentExecutor from langchain_openai import ChatOpenAI from langchain_community.tools import TavilySearchResults from langchain import hub # LLM 설정 llm = ChatOpenAI(model="gpt-4") # Tool 설정 search = TavilySearchResults(max_results=3) tools = [search] # ReAct 프롬프트 로드 prompt = hub.pull("hwchase17/react") # Agent 생성 agent = create_react_agent(llm, tools, prompt) agent_executor = AgentExecutor( agent=agent, tools=tools, verbose=True, max_iterations=5 ) # 실행 result = agent_executor.invoke({ "input": "2024년 AI 트렌드는?" })
from llama_index.core.agent import ReActAgent from llama_index.llms.openai import OpenAI from llama_index.core.tools import FunctionTool # 커스텀 검색 함수 def web_search(query: str) -> str: """웹에서 정보를 검색합니다.""" # 실제 검색 API 호출 return f"'{query}'에 대한 검색 결과..." # Tool 생성 search_tool = FunctionTool.from_defaults(fn=web_search) # LLM 설정 llm = OpenAI(model="gpt-4") # ReAct Agent 생성 agent = ReActAgent.from_tools( tools=[search_tool], llm=llm, verbose=True, max_iterations=5 ) # 실행 response = agent.chat("2024년 AI 트렌드는?")
from autogen import AssistantAgent, UserProxyAgent, config_list_from_json # LLM 설정 config_list = [{ "model": "gpt-4", "api_key": os.environ["OPENAI_API_KEY"] }] # Assistant Agent (AI) assistant = AssistantAgent( name="researcher", system_message="당신은 연구 전문가입니다. 웹 검색을 통해 정보를 찾아주세요.", llm_config={"config_list": config_list} ) # User Proxy (코드 실행 가능) user_proxy = UserProxyAgent( name="user", human_input_mode="NEVER", code_execution_config={ "work_dir": "workspace", "use_docker": False } ) # 대화 시작 user_proxy.initiate_chat( assistant, message="2024년 AI 트렌드를 검색해서 요약해줘" )
from crewai import Agent, Task, Crew from crewai_tools import SerperDevTool # Tool 설정 search_tool = SerperDevTool() # Agent 정의 (역할 기반) researcher = Agent( role="Research Analyst", goal="최신 AI 트렌드를 조사하고 분석", backstory="당신은 10년 경력의 기술 분석가입니다.", tools=[search_tool], verbose=True ) # Task 정의 research_task = Task( description="2024년 AI 트렌드를 조사하고 핵심 내용을 정리해주세요.", expected_output="주요 트렌드 5가지와 각각에 대한 설명", agent=researcher ) # Crew 구성 및 실행 crew = Crew( agents=[researcher], tasks=[research_task], verbose=2 ) result = crew.kickoff()
프레임워크 선택 가이드
상황에 맞는 프레임워크 선택
상황별 추천
프레임워크 선택에 정답은 없습니다. 팀의 기술 스택, 프로젝트 요구사항, 그리고 향후 확장성을 고려하세요. 또한 프레임워크 없이 직접 구현하는 것도 좋은 선택일 수 있습니다. 특히 간단한 Agent의 경우 프레임워크의 오버헤드가 더 클 수 있습니다.
LangGraph
상태 기반 Agent 워크플로우
LangGraph는 LangChain 팀에서 만든 상태 기반 워크플로우 라이브러리입니다. 복잡한 Agent 로직을 그래프 형태로 표현하여 조건부 분기, 루프, 병렬 처리 등을 명시적으로 정의할 수 있습니다.
from langgraph.graph import StateGraph, END from typing import TypedDict, Annotated import operator # 상태 정의 class AgentState(TypedDict): messages: Annotated[list, operator.add] next_action: str # 노드 함수 정의 def think(state: AgentState) -> AgentState: """LLM이 다음 행동을 결정""" ... def act(state: AgentState) -> AgentState: """도구 실행""" ... def should_continue(state: AgentState) -> str: """조건부 분기 결정""" if state["next_action"] == "end": return "end" return "continue" # 그래프 구성 workflow = StateGraph(AgentState) workflow.add_node("think", think) workflow.add_node("act", act) workflow.set_entry_point("think") workflow.add_edge("think", "act") workflow.add_conditional_edges( "act", should_continue, {"continue": "think", "end": END} ) app = workflow.compile()
# LangGraph로 구현한 ReAct Agent from langgraph.prebuilt import create_react_agent from langchain_openai import ChatOpenAI from langchain_community.tools.tavily_search import TavilySearchResults # 설정 llm = ChatOpenAI(model="gpt-4") tools = [TavilySearchResults(max_results=3)] # LangGraph의 prebuilt ReAct Agent 사용 agent = create_react_agent(llm, tools) # 실행 (스트리밍 지원) for chunk in agent.stream({ "messages": [{"role": "user", "content": "AI 트렌드 알려줘"}] }): print(chunk) # 체크포인트 저장 (상태 지속성) from langgraph.checkpoint.sqlite import SqliteSaver memory = SqliteSaver.from_conn_string(":memory:") agent = create_react_agent(llm, tools, checkpointer=memory)
LangChain의 기존 AgentExecutor보다 LangGraph가 더 권장됩니다. LangGraph는 명시적인 상태 관리, 더 나은 디버깅, 체크포인팅을 통한 복구 기능을 제공합니다. 복잡한 Agent 로직은 LangGraph로 구현하세요.
핵심 요약
- LangChain: 가장 큰 생태계, 범용 Agent, 높은 복잡도
- LlamaIndex: RAG 특화, 데이터 연결 최적화
- AutoGen: Multi-Agent 대화, 코드 실행 지원
- CrewAI: 역할 기반 협업, 직관적 API
- LangGraph: 상태 기반 워크플로우, LangChain과 함께 사용
- 선택 기준: 프로젝트 요구사항, 팀 역량, 확장성 고려