AI Agent 프레임워크 비교 - AutoGPT vs CrewAI vs LangGraph 실전 가이드

January 15, 2025

AI Agent 프레임워크 비교 - AutoGPT vs CrewAI vs LangGraph 실전 가이드

AI Agent를 처음 만들어보려는 개발자라면, 그 복잡함에 놀랄 수 있다. 단순히 AI에게 질문하고 답변을 받는 것이 아니라, AI가 스스로 목표를 달성하기 위해 여러 단계를 거쳐야 하기 때문이다. 예를 들어 “여행 계획을 세워줘”라고 요청하면, AI는 날씨를 확인하고, 호텔을 검색하고, 교통편을 조사하고, 일정을 정리하는 등 수많은 작업을 스스로 수행해야 한다. 이런 복잡한 로직을 처음부터 직접 구현하려면 상태 관리, 에러 처리, 메모리 관리 등 수많은 고려사항이 있어 상당한 시간과 노력이 필요하다.

다행히도 AutoGPT, CrewAI, LangGraph 같은 프레임워크들이 이런 어려움을 해결해준다. 이들은 마치 건물을 짓기 위한 골조처럼, AI Agent를 만들 때 필요한 기본 구조와 도구들을 미리 제공해준다. 하지만 각 프레임워크는 서로 다른 철학과 접근 방식을 가지고 있어서, 어떤 프로젝트를 만들려는지에 따라 적합한 프레임워크가 달라진다. 이 글에서는 세 프레임워크의 특징을 자세히 비교하고, 실제로 어떻게 사용하는지 구체적인 예시와 함께 설명한다.

AI Agent 프레임워크란?

AI Agent 프레임워크는 자율적으로 목표를 달성하는 AI 시스템을 만들기 위한 도구들의 모음이라고 생각하면 된다. 마치 요리를 할 때 필요한 재료와 도구들을 미리 준비해둔 주방 세트와 같다. 프레임워크는 AI가 LLM을 호출하고, 외부 도구를 사용하고, 상태를 관리하고, 메모리를 처리하는 등의 복잡한 작업들을 자동화해준다. 덕분에 개발자는 “AI가 무엇을 해야 하는가”라는 비즈니스 로직에만 집중할 수 있게 된다.

왜 프레임워크가 필요한가?

AI Agent를 직접 구현하려면 생각보다 많은 것들을 고려해야 한다. 예를 들어 AI가 여러 단계를 거쳐 작업을 수행할 때, 각 단계에서 어떤 상태인지 추적해야 한다. 마치 요리할 때 “지금 어느 단계인지, 뭘 했는지, 다음에 뭘 해야 하는지”를 기억해야 하는 것과 같다. 또한 AI가 여러 도구 중에서 어떤 것을 선택할지 결정하는 로직도 필요하다. 날씨를 물어볼 때는 날씨 API를, 계산을 할 때는 계산기를 사용해야 하는데, 이런 판단을 AI가 스스로 하도록 만들어야 한다.

또한 에러가 발생했을 때 어떻게 처리할지, 실패한 작업을 다시 시도할지, 과거에 했던 작업을 기억할지 등 수많은 세부사항들을 고려해야 한다. 여러 AI가 협업하는 멀티 에이전트 시스템을 만들려면 더욱 복잡해진다. 각 AI가 서로 소통하고, 작업을 나누고, 결과를 공유하는 메커니즘을 직접 구현해야 하기 때문이다.

프레임워크는 이런 모든 것들을 이미 해결해놓았다. 수많은 개발자들이 검증한 아키텍처를 제공하고, 빠르게 프로토타입을 만들 수 있게 해주며, 커뮤니티의 지원을 받을 수 있고, 표준화된 패턴을 따를 수 있게 해준다. 마치 자동차를 직접 만들지 않고 이미 만들어진 자동차를 사서 운전하는 것과 같다. 물론 자동차를 직접 만들 수도 있지만, 대부분의 사람들은 이미 검증된 자동차를 사는 것이 더 효율적이다.

AutoGPT: 장기 목표 추구의 선구자

AutoGPT는 2023년 초에 등장한 오픈소스 프로젝트로, AI가 장기적인 목표를 스스로 달성하는 자율 Agent의 개념을 대중화한 선구자라고 할 수 있다. 마치 한 번 목표를 주면 혼자서 끝까지 일을 처리하는 자율적인 직원을 만든 것과 같다. 사용자는 “이 프로젝트를 완성해줘”라고만 말하면, AutoGPT는 스스로 계획을 세우고, 단계별로 실행하고, 문제가 생기면 다른 방법을 시도하면서 목표를 달성한다.

특징

1. 자율 실행 루프

AutoGPT의 가장 큰 특징은 완전한 자율성이다. 사용자가 목표만 제시하면, AutoGPT는 그 목표를 달성할 때까지 스스로 작업을 진행한다. 예를 들어 “2024년 AI 트렌드에 대한 보고서를 작성해줘”라고 요청하면, AutoGPT는 먼저 최신 정보를 검색하고, 관련 자료를 수집하고, 내용을 분석하고, 보고서를 작성하는 등 모든 과정을 자동으로 수행한다. 중간에 막히거나 실패하면 다른 접근 방법을 시도하고, 필요하면 사용자에게 질문도 할 수 있다. 마치 프로젝트 매니저가 한 번 지시를 받으면 끝까지 책임지고 완료하는 것과 같다.

2. 메모리 시스템

AutoGPT는 벡터 데이터베이스를 사용해 장기 메모리를 저장한다. 이는 마치 사람이 과거 경험을 기억하고 그것을 바탕으로 결정을 내리는 것과 같다. AutoGPT는 이전에 했던 작업들을 기억하고, 비슷한 상황이 오면 과거 경험을 참고해 더 나은 결정을 내릴 수 있다. 예를 들어 이전에 특정 웹사이트에서 정보를 가져왔는데 실패했다면, 다음에는 다른 방법을 시도할 수 있다. Pinecone이나 Weaviate 같은 벡터 데이터베이스를 지원해서, 수많은 과거 경험을 효율적으로 저장하고 검색할 수 있다.

3. 도구 통합

AutoGPT는 다양한 도구를 사용할 수 있다. 웹 검색을 할 수도 있고, 파일을 읽고 쓸 수도 있으며, 코드를 실행할 수도 있다. 마치 만능 도구 상자를 가지고 있는 것과 같다. 또한 플러그인 시스템을 통해 새로운 도구를 추가할 수 있어서, 필요에 따라 기능을 확장할 수 있다. 예를 들어 특정 API를 사용하고 싶다면, 그 API를 호출하는 플러그인을 만들어서 추가하면 된다.

설치 및 기본 사용

# AutoGPT 설치
git clone https://github.com/Significant-Gravitas/AutoGPT.git
cd AutoGPT
pip install -r requirements.txt

# 환경 변수 설정
export OPENAI_API_KEY="your-api-key"

기본 실행 예시

from autogpt.agent import Agent
from autogpt.config import Config

config = Config()
config.openai_api_key = "your-api-key"

# Agent 생성
agent = Agent(
    ai_name="ResearchAgent",
    memory_backend="pinecone",
    config=config
)

# 목표 설정 및 실행
agent.start_interaction_loop(
    initial_goal="2024년 AI 트렌드를 조사하고 보고서를 작성해줘"
)

장점

AutoGPT의 가장 큰 장점은 완전한 자율성이다. 한 번 목표를 주고 시작하면, 사용자가 계속 개입하지 않아도 스스로 진행한다. 마치 신뢰할 수 있는 직원에게 일을 맡기고 가만히 지켜보기만 하면 되는 것과 같다. 또한 벡터 데이터베이스를 통해 과거 경험을 기억할 수 있어서, 시간이 지날수록 더 똑똑해진다. 다양한 도구와 플러그인을 지원해서 필요한 기능을 쉽게 추가할 수 있고, 많은 사용자와 활발한 커뮤니티가 있어서 문제가 생겼을 때 도움을 받기 쉽다.

단점

하지만 AutoGPT는 완벽하지 않다. 가장 큰 문제는 비용이다. AutoGPT는 목표를 달성하기 위해 수많은 LLM 호출을 하기 때문에, 한 번 실행하는데 상당한 비용이 든다. 마치 여러 명의 전문가에게 계속 조언을 구하는 것과 같아서 비용이 누적된다. 또한 순차적으로 작업을 처리하기 때문에 실행 속도가 느리다. 한 작업이 끝나야 다음 작업을 시작하기 때문에, 전체적으로 시간이 오래 걸린다. 초기 설정도 복잡해서 처음 사용하는 사람에게는 부담이 될 수 있다. 그리고 자율적으로 실행되기 때문에, 어디서 문제가 생겼는지 추적하기 어렵다. 마치 자동차가 자율주행 중에 문제가 생겼을 때, 왜 그런 문제가 생겼는지 파악하기 어려운 것과 같다.

실전 활용 사례

1. 시장 조사 자동화

goal = """
다음 주제에 대해 시장 조사를 수행해줘:
1. 경쟁사 분석
2. 고객 리뷰 수집
3. 트렌드 분석
4. 최종 보고서 작성
"""
agent.start_interaction_loop(initial_goal=goal)

2. 코드 리뷰 자동화

goal = """
GitHub 저장소의 코드를 분석하고:
1. 잠재적 버그 찾기
2. 성능 개선 사항 제안
3. 보안 취약점 검사
4. 리뷰 리포트 생성
"""

CrewAI: 멀티 에이전트 협업 전문

CrewAI은 여러 AI Agent가 역할을 나눠서 협업하는 멀티 에이전트 시스템에 특화된 프레임워크다. 마치 회사에서 여러 부서가 협업해서 프로젝트를 완성하는 것과 같다. 각 AI는 서로 다른 전문 분야를 담당하고, 서로 협력해서 복잡한 작업을 완성한다. 예를 들어 마케팅 캠페인을 만들 때, 한 AI는 시장 조사를 하고, 다른 AI는 콘텐츠를 작성하고, 또 다른 AI는 검토하는 식으로 역할을 나눠서 작업한다.

특징

1. 역할 기반 에이전트

CrewAI의 핵심은 각 Agent가 명확한 역할을 가진다는 것이다. 마치 회사에서 기획자는 기획을, 개발자는 개발을, 디자이너는 디자인을 담당하는 것과 같다. CrewAI에서는 각 Agent에게 역할을 부여하면, 그 역할에 맞는 프롬프트와 도구가 자동으로 설정된다. 예를 들어 “시장 조사 전문가”라는 역할을 부여하면, 그 Agent는 자동으로 검색 도구를 사용하고, 시장 조사에 적합한 방식으로 질문하고 답변한다. 이렇게 역할을 명확히 분리하면, 각 Agent가 자신의 전문 분야에 집중할 수 있어서 전체적인 품질이 향상된다.

2. 순차적/병렬 실행

CrewAI는 작업 간의 의존성을 자동으로 관리한다. 어떤 작업은 다른 작업이 완료되어야 시작할 수 있고, 어떤 작업은 독립적으로 동시에 진행할 수 있다. 예를 들어 시장 조사가 완료되어야 마케팅 콘텐츠를 작성할 수 있다면, CrewAI는 자동으로 순차적으로 실행한다. 반면에 여러 도시의 날씨를 조회하는 것처럼 서로 독립적인 작업이라면, 병렬로 동시에 실행해서 시간을 절약한다. 마치 프로젝트 매니저가 작업 순서를 관리하는 것과 같다.

3. 작업(Task) 기반 구조

CrewAI는 작업을 단위로 에이전트에게 할당한다. 각 작업은 명확한 설명과 기대 결과를 가지고 있어서, Agent가 무엇을 해야 하는지 정확히 알 수 있다. 작업이 완료되면 그 결과가 다음 작업을 수행하는 Agent에게 자동으로 전달된다. 예를 들어 “시장 조사” 작업이 완료되면, 그 결과가 “콘텐츠 작성” 작업을 수행하는 Agent에게 전달되어서, 조사 결과를 바탕으로 콘텐츠를 작성할 수 있다. 이렇게 작업 단위로 관리하면 전체 프로세스를 명확하게 추적할 수 있다.

설치 및 기본 사용

# CrewAI 설치
pip install crewai[tools]

# 환경 변수 설정
export OPENAI_API_KEY="your-api-key"

기본 예시: 마케팅 캠페인 팀

from crewai import Agent, Task, Crew
from crewai_tools import SerperDevTool

# 도구 설정
search_tool = SerperDevTool()

# 에이전트 정의
researcher = Agent(
    role='시장 조사 전문가',
    goal='타겟 고객과 경쟁사를 분석',
    backstory='10년 경력의 마케팅 리서처',
    tools=[search_tool],
    verbose=True
)

writer = Agent(
    role='콘텐츠 작가',
    goal='매력적인 마케팅 콘텐츠 작성',
    backstory='크리에이티브한 콘텐츠 전문가',
    verbose=True
)

# 작업 정의
research_task = Task(
    description='스마트워치 시장 조사: 타겟 고객, 경쟁사, 트렌드 분석',
    agent=researcher,
    expected_output='시장 분석 보고서'
)

writing_task = Task(
    description='조사 결과를 바탕으로 마케팅 캠페인 콘텐츠 작성',
    agent=writer,
    expected_output='마케팅 콘텐츠 초안',
    context=[research_task]  # research_task 완료 후 실행
)

# 크루 생성 및 실행
crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, writing_task],
    verbose=2
)

result = crew.kickoff()
print(result)

장점

  • 명확한 역할 분담: 각 에이전트의 책임이 분명함
  • 효율적 협업: 작업 의존성 자동 관리
  • 확장 용이: 에이전트와 작업 추가가 쉬움
  • 직관적 API: 간단하고 이해하기 쉬움

단점

  • 멀티 에이전트에 특화: 단일 에이전트 작업에는 과함
  • 비용 증가: 여러 에이전트로 인한 LLM 호출 증가
  • 상대적으로 신규: 커뮤니티와 자료가 적음
  • 복잡한 디버깅: 여러 에이전트 추적 어려움

실전 활용 사례

1. 소프트웨어 개발 팀 시뮬레이션

# 에이전트 정의
planner = Agent(role='프로젝트 기획자', ...)
developer = Agent(role='개발자', ...)
reviewer = Agent(role='코드 리뷰어', ...)
tester = Agent(role='QA 엔지니어', ...)

# 작업 정의
planning_task = Task(description='프로젝트 계획 수립', agent=planner)
coding_task = Task(description='코드 작성', agent=developer, context=[planning_task])
review_task = Task(description='코드 리뷰', agent=reviewer, context=[coding_task])
testing_task = Task(description='테스트', agent=tester, context=[review_task])

crew = Crew(agents=[planner, developer, reviewer, tester], 
            tasks=[planning_task, coding_task, review_task, testing_task])

2. 콘텐츠 제작 파이프라인

# 리서처 → 작가 → 편집자 → SEO 전문가
researcher = Agent(role='리서처', ...)
writer = Agent(role='작가', ...)
editor = Agent(role='편집자', ...)
seo_specialist = Agent(role='SEO 전문가', ...)

LangGraph: 복잡한 워크플로우 제어

LangGraph는 LangChain의 확장으로, 복잡한 Agent 워크플로우를 그래프 구조로 정의할 수 있게 해주는 프레임워크다. 마치 복잡한 공장의 생산 라인을 설계하는 것과 같다. 각 작업을 노드로 표현하고, 작업 간의 흐름을 엣지로 연결해서, 전체 프로세스를 시각적으로 이해하고 제어할 수 있다. 특히 조건에 따라 다른 경로로 진행하거나, 특정 단계를 반복해야 하는 복잡한 로직을 구현할 때 매우 유용하다.

특징

1. 그래프 기반 상태 머신

LangGraph는 노드와 엣지로 워크플로우를 정의한다. 노드는 각 작업 단계를 나타내고, 엣지는 작업 간의 흐름을 나타낸다. 예를 들어 “입력 검증 → 처리 → 결과 검증 → 출력” 같은 흐름을 노드와 엣지로 표현할 수 있다. 또한 조건에 따라 다른 경로로 진행할 수 있다. 예를 들어 검색이 필요한 질문이면 검색 노드로 가고, 그렇지 않으면 바로 답변 노드로 가는 식이다. 순환 구조도 지원해서, 결과가 만족스럽지 않으면 다시 처리 단계로 돌아가서 개선할 수 있다.

2. 세밀한 제어

LangGraph의 가장 큰 장점은 세밀한 제어가 가능하다는 것이다. 각 단계에서 무엇을 할지, 어떤 조건으로 분기할지, 상태를 어떻게 관리할지 모든 것을 개발자가 직접 제어할 수 있다. 마치 자동차를 직접 조립하는 것과 같아서, 원하는 대로 모든 것을 커스터마이징할 수 있다. 복잡한 비즈니스 로직이나 특수한 요구사항이 있을 때 매우 유용하다. 하지만 그만큼 개발자가 더 많은 것을 직접 구현해야 하기 때문에, 학습 곡선이 가파르다.

3. LangChain 통합

LangGraph는 LangChain의 확장이기 때문에, LangChain의 모든 기능을 활용할 수 있다. 이미 LangChain을 사용하고 있다면, 기존의 Chain이나 Agent를 그대로 사용하면서 LangGraph로 워크플로우를 구성할 수 있다. 점진적으로 마이그레이션할 수 있어서, 기존 프로젝트를 한 번에 바꾸지 않고도 LangGraph의 장점을 활용할 수 있다.

설치 및 기본 사용

# LangGraph 설치
pip install langgraph langchain

# 환경 변수 설정
export OPENAI_API_KEY="your-api-key"

기본 예시: 조건부 분기 Agent

from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from typing import TypedDict, Annotated
from langgraph.graph.message import add_messages

# 상태 정의
class AgentState(TypedDict):
    messages: Annotated[list, add_messages]
    query: str
    needs_search: bool

# LLM 초기화
llm = ChatOpenAI(model="gpt-4")

# 노드 정의
def should_search(state: AgentState) -> str:
    """검색이 필요한지 판단"""
    query = state["query"]
    # 간단한 키워드 기반 판단 (실제로는 LLM 사용 가능)
    if any(keyword in query.lower() for keyword in ["최신", "현재", "오늘"]):
        return "search"
    return "answer"

def search_node(state: AgentState) -> AgentState:
    """검색 수행"""
    # 실제 검색 로직 구현
    search_result = f"검색 결과: {state['query']}"
    state["messages"].append({"role": "assistant", "content": search_result})
    state["needs_search"] = True
    return state

def answer_node(state: AgentState) -> AgentState:
    """답변 생성"""
    response = llm.invoke(state["messages"])
    state["messages"].append(response)
    return state

# 그래프 구성
workflow = StateGraph(AgentState)

# 노드 추가
workflow.add_node("should_search", should_search)
workflow.add_node("search", search_node)
workflow.add_node("answer", answer_node)

# 엣지 추가
workflow.set_entry_point("should_search")
workflow.add_conditional_edges(
    "should_search",
    should_search,
    {
        "search": "search",
        "answer": "answer"
    }
)
workflow.add_edge("search", "answer")
workflow.add_edge("answer", END)

# 그래프 컴파일 및 실행
app = workflow.compile()

# 실행
result = app.invoke({
    "messages": [],
    "query": "오늘 날씨가 어때?",
    "needs_search": False
})

장점

  • 완전한 제어: 모든 단계를 세밀하게 제어
  • 복잡한 로직: 조건부 분기, 순환 구조 지원
  • LangChain 통합: 기존 인프라 활용 가능
  • 유연성: 다양한 패턴 구현 가능

단점

  • 학습 곡선: 그래프 개념 이해 필요
  • 복잡성: 간단한 작업에는 과함
  • 상태 관리: 직접 상태 관리해야 함
  • 디버깅: 그래프 구조 추적 어려움

실전 활용 사례

1. 다단계 검증 프로세스

# 입력 검증 → 처리 → 결과 검증 → 최종 출력
workflow = StateGraph(State)

workflow.add_node("validate_input", validate_input)
workflow.add_node("process", process_data)
workflow.add_node("validate_output", validate_output)
workflow.add_node("format_result", format_result)

workflow.add_conditional_edges(
    "validate_input",
    lambda x: "process" if x["valid"] else END
)
workflow.add_conditional_edges(
    "validate_output",
    lambda x: "format_result" if x["valid"] else "process"  # 재처리
)

2. 반복 개선 Agent

# 생성 → 평가 → 개선 → 재평가 (반복)
def evaluate_quality(state):
    quality = calculate_quality(state["output"])
    if quality < threshold:
        return "improve"
    return "done"

workflow.add_conditional_edges(
    "evaluate",
    evaluate_quality,
    {
        "improve": "improve",
        "done": END
    }
)

세 프레임워크 비교

구분 AutoGPT CrewAI LangGraph
철학 완전 자율 실행 멀티 에이전트 협업 세밀한 워크플로우 제어
주요 특징 장기 목표 추구 역할 기반 협업 그래프 기반 상태 머신
사용 난이도 중간 쉬움 어려움
커스터마이징 중간 높음 매우 높음
멀티 에이전트 지원 (제한적) 전문 지원
복잡한 로직 어려움 중간 쉬움
학습 자료 많음 적음 중간
커뮤니티 활발 성장 중 활발
비용 효율 낮음 중간 높음
실행 속도 느림 중간 빠름

선택 가이드

프로젝트의 특성에 따라 적합한 프레임워크가 다르다. 어떤 상황에서 어떤 프레임워크를 선택해야 하는지 구체적으로 알아보자.

AutoGPT를 선택할 때

AutoGPT는 장기적인 목표를 자동으로 달성해야 할 때 가장 적합하다. 예를 들어 “이 주제에 대해 깊이 있는 연구 보고서를 작성해줘”처럼, 한 번 목표를 주면 사용자가 개입하지 않아도 끝까지 자동으로 실행되어야 할 때 좋다. 벡터 데이터베이스 기반의 장기 메모리가 필요하거나, 빠르게 프로토타입을 만들어서 개념을 검증하고 싶을 때도 AutoGPT가 유용하다. 마치 한 번 지시를 주고 가만히 있으면 모든 것을 처리해주는 자율적인 비서가 필요한 상황과 같다.

CrewAI를 선택할 때

CrewAI는 여러 전문가가 협업하는 시나리오에 가장 적합하다. 예를 들어 소프트웨어 개발 프로젝트에서 기획자가 계획을 세우고, 개발자가 코드를 작성하고, 리뷰어가 검토하고, 테스터가 테스트하는 것처럼, 역할 분담이 명확하고 작업 간 의존성이 있을 때 CrewAI가 빛을 발한다. 또한 직관적이고 간단한 API를 원할 때도 CrewAI가 좋다. 마치 회사에서 여러 부서가 협업해서 프로젝트를 완성하는 것과 같은 구조를 AI로 구현하고 싶을 때 적합하다.

LangGraph를 선택할 때

LangGraph는 복잡한 조건부 로직이나 세밀한 제어가 필요할 때 가장 적합하다. 예를 들어 입력에 따라 다른 처리 경로로 가거나, 결과를 검증해서 만족스럽지 않으면 다시 처리하는 것처럼, 복잡한 워크플로우를 구현해야 할 때 LangGraph가 필요하다. 또한 이미 LangChain을 사용하고 있다면, 기존 프로젝트를 확장하면서 LangGraph의 장점을 활용할 수 있다. 마치 복잡한 공장의 생산 라인을 직접 설계하고 제어해야 할 때와 같다.

실전 통합 예시

예시 1: 연구 보고서 자동 생성 (CrewAI)

from crewai import Agent, Task, Crew

# 에이전트 정의
researcher = Agent(
    role='연구원',
    goal='주제에 대한 깊이 있는 조사',
    backstory='박사 학위를 가진 연구 전문가',
    tools=[search_tool],
    verbose=True
)

analyst = Agent(
    role='분석가',
    goal='데이터를 분석하고 인사이트 도출',
    backstory='10년 경력의 데이터 분석 전문가',
    verbose=True
)

writer = Agent(
    role='작가',
    goal='전문적인 보고서 작성',
    backstory='기술 문서 작성을 전문으로 하는 작가',
    verbose=True
)

# 작업 정의
research_task = Task(
    description='AI 트렌드에 대한 최신 연구 자료 수집',
    agent=researcher,
    expected_output='연구 자료 목록과 요약'
)

analysis_task = Task(
    description='수집된 자료를 분석하고 주요 인사이트 도출',
    agent=analyst,
    expected_output='분석 결과와 인사이트',
    context=[research_task]
)

writing_task = Task(
    description='분석 결과를 바탕으로 전문 보고서 작성',
    agent=writer,
    expected_output='완성된 보고서',
    context=[analysis_task]
)

# 실행
crew = Crew(
    agents=[researcher, analyst, writer],
    tasks=[research_task, analysis_task, writing_task]
)

result = crew.kickoff(inputs={'topic': '2024년 AI 트렌드'})

예시 2: 스마트 검색 Agent (LangGraph)

from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain_community.tools import DuckDuckGoSearchRun

class SearchState(TypedDict):
    query: str
    search_results: list
    answer: str
    iteration: int

llm = ChatOpenAI()
search_tool = DuckDuckGoSearchRun()

def search(state: SearchState) -> SearchState:
    """검색 수행"""
    results = search_tool.run(state["query"])
    state["search_results"].append(results)
    return state

def generate_answer(state: SearchState) -> SearchState:
    """답변 생성"""
    context = "\n".join(state["search_results"])
    prompt = f"다음 정보를 바탕으로 질문에 답해주세요:\n{context}\n\n질문: {state['query']}"
    response = llm.invoke(prompt)
    state["answer"] = response.content
    return state

def should_continue(state: SearchState) -> str:
    """추가 검색이 필요한지 판단"""
    if state["iteration"] >= 3:  # 최대 3번 반복
        return "end"
    # LLM으로 답변 품질 평가 (간단화)
    if len(state["answer"]) > 100:
        return "end"
    return "search"

# 그래프 구성
workflow = StateGraph(SearchState)
workflow.add_node("search", search)
workflow.add_node("generate", generate_answer)
workflow.set_entry_point("search")
workflow.add_edge("search", "generate")
workflow.add_conditional_edges(
    "generate",
    should_continue,
    {
        "search": "search",
        "end": END
    }
)

app = workflow.compile()
result = app.invoke({
    "query": "최신 AI 트렌드는?",
    "search_results": [],
    "answer": "",
    "iteration": 0
})

모범 사례

1. 비용 최적화

프레임워크별 비용 절감 전략

AutoGPT

  • 최대 반복 횟수 제한
  • 저렴한 모델 사용 (GPT-3.5-turbo)
  • 캐싱 활용

CrewAI

  • 불필요한 에이전트 제거
  • 작업 병렬화로 실행 시간 단축
  • 결과 캐싱

LangGraph

  • 조건부 분기로 불필요한 노드 스킵
  • 상태 재사용
  • 배치 처리

2. 에러 처리

# CrewAI 예시
try:
    result = crew.kickoff()
except Exception as e:
    # 에러 로깅
    logger.error(f"크루 실행 실패: {e}")
    # 재시도 로직
    retry_crew_execution()

# LangGraph 예시
def safe_node(state):
    try:
        return process_node(state)
    except Exception as e:
        state["error"] = str(e)
        return state

3. 모니터링 및 로깅

# 실행 추적
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# 각 단계 로깅
def logged_node(state):
    logger.info(f"노드 실행 시작: {state}")
    result = process(state)
    logger.info(f"노드 실행 완료: {result}")
    return result

주의사항과 한계

1. 비용 관리

모든 프레임워크는 많은 LLM 호출로 인해 비용이 발생한다.

대응 방안

  • 토큰 사용량 모니터링
  • 적절한 모델 선택
  • 캐싱 전략 수립
  • 실행 횟수 제한

2. 실행 시간

복잡한 Agent는 실행 시간이 길 수 있다.

대응 방안

  • 병렬 처리 활용
  • 불필요한 단계 제거
  • 타임아웃 설정
  • 비동기 처리

3. 디버깅 어려움

자율 실행으로 인해 디버깅이 어렵다.

대응 방안

  • 상세한 로깅
  • 단계별 검증
  • 테스트 케이스 작성
  • 단순한 시나리오부터 시작

FAQ

Q: 세 프레임워크 중 어떤 것을 선택해야 하나요?
A: 프로젝트 요구사항에 따라 다릅니다. 완전 자율 실행이 필요하면 AutoGPT, 멀티 에이전트 협업이 필요하면 CrewAI, 세밀한 제어가 필요하면 LangGraph를 선택하세요.

Q: 프레임워크를 함께 사용할 수 있나요?
A: 가능합니다. 예를 들어 LangGraph로 워크플로우를 구성하고, 각 노드에서 CrewAI 크루를 호출하거나 AutoGPT를 실행할 수 있습니다.

Q: 비용을 줄이는 방법은?
A: 저렴한 모델 사용, 캐싱 활용, 실행 횟수 제한, 불필요한 단계 제거 등을 통해 비용을 절감할 수 있습니다.

Q: 실무에서 가장 많이 사용되는 프레임워크는?
A: 현재는 LangGraph와 CrewAI가 실무에서 많이 사용되고 있습니다. AutoGPT는 프로토타이핑이나 개인 프로젝트에 주로 사용됩니다.

Q: 프레임워크 없이 직접 구현하는 것이 나을까요?
A: 간단한 Agent는 직접 구현해도 되지만, 복잡한 로직이나 멀티 에이전트 시스템은 프레임워크를 사용하는 것이 효율적입니다.

Q: 프레임워크의 성능 차이는?
A: LangGraph가 가장 빠르고 유연하며, CrewAI는 중간, AutoGPT는 상대적으로 느립니다. 하지만 작업 복잡도에 따라 달라질 수 있습니다.

결론

AutoGPT, CrewAI, LangGraph는 각각 다른 철학과 접근 방식을 가진 강력한 프레임워크다. AutoGPT는 완전 자율 실행에 특화되어 있어서, 한 번 목표를 주면 끝까지 자동으로 처리하는 자율적인 비서가 필요할 때 적합하다. CrewAI는 멀티 에이전트 협업에 특화되어 있어서, 여러 전문가가 역할을 나눠서 협업하는 시나리오에 적합하다. LangGraph는 세밀한 워크플로우 제어에 특화되어 있어서, 복잡한 조건부 로직이나 커스텀 워크플로우가 필요할 때 적합하다.

프로젝트를 시작할 때는 요구사항, 복잡도, 팀의 기술 수준을 종합적으로 고려해서 적절한 프레임워크를 선택하는 것이 중요하다. 때로는 여러 프레임워크를 조합해서 사용하거나, 간단한 작업이라면 프레임워크 없이 직접 구현하는 것도 좋은 선택이 될 수 있다. 마치 도구를 선택할 때 작업의 특성에 맞는 도구를 선택하는 것과 같다.

AI Agent 개발은 빠르게 발전하는 분야다. 각 프레임워크도 계속 업데이트되고 새로운 기능이 추가되고 있다. 따라서 각 프레임워크의 최신 기능과 모범 사례를 지속적으로 학습하고, 실제 프로젝트에 적용해보며 경험을 쌓는 것이 중요하다. 처음에는 어려울 수 있지만, 하나씩 배워가다 보면 점점 익숙해지고, 자신만의 노하우를 쌓을 수 있을 것이다.


Written by Jeon Byung Hun 개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트