CrewAI 개요
CrewAI는 다중 AI 에이전트 간의 협업을 조정하기 위해 설계된 파이썬 프레임워크입니다. 각 에이전트에게 명확한 역할, 목표, 도구를 부여하고 이들 간의 작업 위임 및 상호작용을 정의하여 복잡한 비즈니스 로직을 자동화할 수 있습니다. 단순 챗봇 이상의 전문성을 요구하는 데이터 분석, 리서치 보고서 작성, 소프트웨어 품질 보증 등의 영역에서 특히 강력한 성능을 발휘합니다.
핵심 구성 요소
- Agent: 특정 페르소나, 목표, 배경 서사를 가진 독립적 의사결정 주체입니다.
- Task: 에이전트가 실행해야 할 구체적인 작업 단위입니다.
- Crew: 에이전트와 태스크를 묶어 협업 환경을 조성하는 조직입니다.
- Process: 태스크가 수행되는 전략(순차, 병렬, 계층형)을 결정합니다.
- Tool: 에이전트가 외부 데이터를 조회하거나 기능을 실행할 때 사용하는 인터페이스입니다.
멀티 에이전트 리서치 시스템 구현
from crewai import Agent, Task, Crew, Process
from langchain_openai import ChatOpenAI
from langchain_community.tools import DuckDuckGoSearchRun
llm_model = ChatOpenAI(model="gpt-4o")
web_search = DuckDuckGoSearchRun()
# 전문가 에이전트 정의
analyst = Agent(
role="수석 기술 분석가",
goal="최신 기술 트렌드 심층 조사 및 데이터 수집",
backstory="당신은 복잡한 기술 스택을 빠르게 습득하고 체계적으로 정리하는 전문가입니다.",
tools=[web_search],
llm=llm_model
)
editor = Agent(
role="기술 블로그 편집장",
goal="분석 결과를 사용자 친화적인 글로 변환",
backstory="당신은 난해한 기술적 내용을 쉬운 언어로 풀어내는 데 탁월한 능력을 갖추고 있습니다.",
llm=llm_model
)
# 업무 정의
analysis_work = Task(
description="{topic}에 관한 최신 핵심 동향과 주요 활용 사례를 정리하세요.",
expected_output="기술 트렌드 분석 보고서",
agent=analyst
)
writing_work = Task(
description="제공된 분석 보고서를 바탕으로 초보자용 가이드를 작성하세요.",
expected_output="기술 블로그 포스트",
agent=editor,
context=[analysis_work]
)
# 팀 구성 및 실행
tech_crew = Crew(
agents=[analyst, editor],
tasks=[analysis_work, writing_work],
process=Process.sequential
)
output = tech_crew.kickoff(inputs={"topic": "Agentic Workflow"})
print(output)
고급 활용: 계층형 프로세스 제어
계층형 프로세스를 사용하면 매니저 에이전트가 하위 에이전트들에게 업무를 위임하는 구조를 구축할 수 있습니다.
manager = Agent(
role="프로젝트 총괄 매니저",
goal="팀원들에게 태스크를 배분하고 전체적인 품질을 관리",
backstory="조직의 효율성을 극대화하는 지휘관입니다.",
allow_delegation=True # 위임 권한 부여
)
# 업무 흐름 실행
project_crew = Crew(
agents=[manager, dev_team, qa_expert],
tasks=[dev_task],
process=Process.hierarchical
)
맞춤형 도구 개발 및 확장
CrewAI의 도구 시스템은 BaseTool을 상속받아 쉽게 확장할 수 있습니다.
from crewai.tools import BaseTool
class StaticAnalyzerTool(BaseTool):
name: str = "코드 정적 분석기"
description: str = "소스 코드 내 잠재적인 버그를 탐색합니다."
def _run(self, query: str) -> str:
# 코드 분석 로직 수행
if "eval" in query:
return "보안 경고: eval 함수가 탐지되었습니다."
return "코드 분석 결과: 안전함"
운영 베스트 프랙티스
- 단일 책임 원칙: 에이전트당 하나의 명확한 전문 역할을 부여하세요.
- 적절한 흐름 선택: 단순 반복 작업은 순차적 프로세스로, 독립적인 기능 검증은 병렬 프로세스로 설계하세요.
- 무한 루프 방지: 에이전트 설정 시
max_iter옵션을 지정하여 리소스 고갈을 방지하세요. - 도구 최적화: 에이전트가 혼동하지 않도록 딱 필요한 도구들만 할당하세요.