CrewAI: 역할 기반 에이전트 조정을 위한 실용 가이드
소개
CrewAI는 작업을 완료하기 위해 '크루'처럼 함께 작동하는 자율 AI 에이전트를 조율하기 위한 가볍고 번개처럼 빠른 Python 프레임워크입니다. CrewAI는 처음부터 구축되었으며, 무거운 추상화가 없고 LangChain이나 다른 에이전트 라이브러리에 100% 독립적입니다. CrewAI는 개발자에게 높은 수준의 단순성과 낮은 수준의 제어를 제공합니다. 신뢰성, 관측 가능성, 비용 효율성을 중요시하는 프로덕션 준비된 다중 에이전트 워크플로에 최적화되어 있습니다.
이 크래시 코스에서는 '헬로 월드'부터 CrewAI를 이용한 프로덕션 수준의 멀티 에이전트 워크플로우까지 안내합니다. 핵심 개념을 소개받고, 프로젝트를 설정하며, 실제 워크플로우를 코딩하고, 강력한 도구를 연결하며, 신뢰성과 모니터링을 위한 모범 사례를 배우게 됩니다. 과정을 마치면 CrewAI가 당신의 사용 사례에 적합한지 판단하는 방법과 LangGraph, AutoGen과 같은 유사 프레임워크와 비교하는 방법을 알게 될 것입니다. 시작해봅시다!
핵심 요점
- CrewAI는 데모용이 아니라 실제 운영을 위해 설계되었습니다. CrewAI는 안정성, 관측 가능성, 비용 관리를 우선시합니다. 경량화되어 있으며 LangChain과 독립적으로 작동하므로 실제 다중 에이전트 시스템에 이상적입니다.
- 역할 기반 에이전트는 명확성과 확장성을 향상시킵니다. 에이전트는 단일한 프롬프트 대신 명시적인 역할(연구원, 작가, 관리자 등)을 부여받습니다. 역할은 깔끔하고 확장 가능한 작업 분할과 에이전트 협업을 지원합니다.
- 핵심적인 사고 모델은 간단하면서도 강력합니다. CrewAI의 사고 모델은 네 가지 기본 요소인 에이전트, 작업, 도구, 그리고 크루를 기반으로 합니다. 이러한 접근 방식은 이해하기 쉽고 확장하기 용이하며 디버깅하기 쉬운 간단하고 일관된 워크플로를 만들어냅니다.
- 선언적 + 프로그래밍 방식의 유연성으로 반복 속도가 빨라집니다. CrewAI 워크플로우는 빠른 반복을 위해 YAML로 선언적으로 정의할 수 있으며, 필요할 때 고급 오케스트레이션, 맞춤 로직 및 보다 세밀한 제어를 위해 프로그래밍 방식의 Python API로 업그레이드할 수 있습니다.
- 강력한 엔지니어링 규율이 필수적입니다. 효과적인 CrewAI 시스템은 반복, 환각, 비용 초과를 방지하기 위해 명확한 작업 명세, 제한된 위임, 반복 한도, 도구 기반화, 적절한 관찰 가능성 등 안전장치를 기반으로 합니다.
CrewAI란?
CrewAI는 파이썬용 역할 기반 다중 에이전트 프레임워크입니다. 이를 통해 정의된 전문성과 목적을 가진 여러 LLM 기반 에이전트를 선언하고, 구조화된 워크플로우에서 협업하도록 조직할 수 있습니다. 팀의 구성원은 자신의 전문 분야에서 반자율적으로 작업하며, 별도의 조정 프로세스(관리자 에이전트)를 만들어 워크플로우를 관리할 수도 있습니다.
역할이 명확하게 정의된 팀 안에서 AI 에이전트를 조직하면, 단순한 시스템에서처럼 한 에이전트가 모든 일을 하도록 만드는 것을 피할 수 있습니다. 예를 들어, 한 에이전트는 연구에 뛰어날 수 있고, 다른 에이전트는 글쓰기, 또 다른 에이전트는 의사결정에 능할 수 있습니다. CrewAI는 에이전트 간의 메시지 전달과 조직을 관리하여, 다양한 하위 작업에서 협력하여 최종 결과를 얻을 수 있게 합니다.
설치
전제 조건: Python 3.10에서 3.13까지. CrewAI는 Python >=3.10 및 <3.14를 필요로 합니다. 이 범위 내에 있는지 확인하세요 (python3 --version 명령어로 확인). 그렇지 않다면 먼저 Python을 업데이트해야 합니다. 또한 CrewAI는 내부적으로 OpenAI API를 사용하므로 OpenAI API 키(또는 다른 LLM 제공자의 키)가 필요합니다.
1단계: CrewAI 설치. CrewAI는 PyPI를 통해 배포됩니다. 핵심 라이브러리는 pip를 통해 설치할 수 있습니다. 이렇게 하면 CrewAI의 패키지와 CLI가 설치됩니다.
pip install crewai도구에 대한 완전한 지원을 원하신다면 선택적 도구 패키지를 설치할 수도 있습니다. 이를 통해 CrewAI의 미리 만들어진 도구 라이브러리를 이용할 수 있습니다.
pip install crewai[tools]참고: CrewAI에는 UV라는 자체 환경 관리자가 있으며, 이 관리자도 의존성을 처리해 줍니다. 이는 선택 사항이지만, CrewAI 문서에서는 권장됩니다.
- UV 설치(일회성): macOS/Linux에서는 다음을 실행하세요:
curl \-LsSf https://astral.sh/uv/install.sh이것은 uv 명령어를 설치합니다.
- 그런 다음 UV 도구를 통해 CrewAI를 설치하세요: uv tool install crewai. 이는 pip와 동일한 기능을 하지만, 또한 자동으로 독립 환경과 CLI 도구를 설정해 줍니다.
설치가 완료되면 버전을 확인하여 제대로 동작하는지 확인할 수 있습니다. 설치가 완료되었다면 'crewai v0.x.x'와 같은 출력이 표시될 것입니다.
crewai --version2단계: CrewAI 프로젝트 스캐폴드 생성. CrewAI는 권장 구조로 새 프로젝트를 스캐폴드할 수 있는 CLI를 제공합니다. 터미널에서 다음을 실행하세요:
crewai create crew my_project_namemy_project_name을 프로젝트에 부여하고 싶은 이름으로 바꿔주세요. 그러면 바로 사용할 수 있는 템플릿이 들어 있는 my_project_name/ 폴더가 생성됩니다:
my_project_name/
├── .gitignore
├── pyproject.toml
├── README.md
├── .env # for API keys and config
├── knowledge/ # (optional knowledge base)
└── src/
└── my_project_name/
├── crew.py # Crew orchestration code
├── main.py # Entry point to run your crew
├── agents.yaml # Define your agents here
├── tasks.yaml # Define tasks/workflows here
└── tools/ # Custom tools (with __init__.py and example tool file)이 스캐폴드는 구조화된 시작점을 제공합니다. agents.yaml과 tasks.yaml 파일은 크루의 구성(역할, 목표, 작업 순서 등)을 선언적으로 지정할 수 있는 곳이며, main.py와 crew.py는 코드 기반 구성을 선호할 경우 Python 진입점입니다. .env 파일은 API 키(예: OPENAI_API_KEY=…)를 하드코딩하지 않고 저장하는 곳입니다.
3단계: 프로젝트 의존성 설치. 프로젝트 디렉토리 안에서 다음 명령어를 실행하세요:
crewai install
이 명령어는 프로젝트가 필요로 할 수 있는 모든 종속성을 설치하기 위해 CrewAI CLI를 실행합니다(환경 설정, crewai-tools 패키지 설치 확인 등). 프로젝트에 추가적인 Python 패키지가 필요한 경우, ‘uv add <package>’(UV) 또는 일반적으로 ‘pip install’을 사용하여 지정할 수 있습니다.
4단계: 첫 번째 크루 실행하기. 이제 기본 예제 크루를 실행할 준비가 되었습니다. 다음을 실행하기만 하면 됩니다:
crewai run이것은 당신의 스캐폴드에 정의된 크루를 실행합니다(기본적으로 간단한 두 에이전트 협업 예제를 실행할 수 있습니다). 모든 것이 정상이라면 콘솔에서 에이전트가 생각하고 행동하는 모습을 볼 수 있을 것입니다.
일반적인 설치 시 주의사항*:*
- 파이썬 버전 – 지원되는 버전(3.10–3.13)에 설치하세요. 오래된 파이썬 버전에서는 의존성 문제로 설치가 실패할 수 있습니다.
- OpenAI SDK 버전 – CrewAI는 최소 버전의 OpenAI Python SDK가 필요할 수 있습니다(예: CrewAI 0.175.0의 경우 openai >= 1.13.3이 필요합니다). OpenAI와 관련된 import 오류가 발생하면 OpenAI 패키지를 업데이트했는지 확인하세요.
- Windows 빌드 도구 – Windows에서 chroma-hnswlib 빌드 오류가 발생하면 Visual Studio C++ 빌드 도구를 설치해야 합니다(QueueAI는 메모리 용도로 Chroma를 사용하며, 해결 방법은 C++ 빌드 도구를 사용할 수 있도록 하는 것입니다).
- UV가 PATH에 없음 – 설치 후 uv 명령을 찾을 수 없다면, uv tool update-shell을 실행하여 PATH를 업데이트하세요.
CrewAI 정신 모델: 에이전트, 작업, 도구, 그리고 크루
CrewAI의 네 가지 주요 구성 요소를 살펴볼 가치가 있습니다. CrewAI 워크플로우는 에이전트, 작업, 도구, 그리고 크루 자체(에이전트와 작업을 결합하는 오케스트레이터)라는 네 가지 주요 구성 요소로 이루어져 있습니다.
에이전트: 역할 기반 LLM 작업자
CrewAI에서 에이전트는 지정된 역할과 달성해야 할 목표, 그리고 (선택적으로) 일부 배경 정보를 가진 LLM 기반 작업자입니다. 에이전트는 자율적으로 작동하며, 자신의 전문 분야에서 수행할 수 있다고 판단되는 결정을 내립니다. 예를 들어, 연구 분석가 역할을 가진 에이전트가 연구를 목표로 하고, 보고서를 제공하는 것이 목표인 작가 역할의 에이전트가 있을 수 있습니다. 에이전트는 역할, 목표 및 기타 매개변수를 지정하여 생성합니다. 예시는 다음과 같습니다:
from crewai import Agent
researcher = Agent(
role="Senior Research Analyst",
goal="Identify emerging AI trends and their business implications",
backstory="You have 10 years of experience in AI research...",
llm=your_llm_instance, # (Optional) use a specific LLM for this agent
tools=[web_search_tool, document_loader_tool],
memory=True, # Enable short/long-term memory for this agent
verbose=True # Log the agent's thought process and decisions
)에이전트의 주요 속성:
- 역할: 에이전트의 이름이나 기술 세트(이는 행동에 영향을 줄 수 있음; 예: “재무 상담사”, “SQL 데이터베이스 분석가”).
- 목표: 에이전트가 달성해야 하는 고급 목표.
- 배경 이야기: 배경 맥락 또는 페르소나. 이는 에이전트에게 시각이나 톤을 제공함으로써 프롬프트 품질을 향상시키는 데 도움이 될 수 있습니다(예: "당신은 사이버보안 분야에서 10년의 경력이 있습니다…").
- 도구: 에이전트가 작업을 수행하는 데 도움을 줄 수 있는 호출 가능한 도구(함수/API) 목록.
- llm: 각 에이전트에 특정 LLM을 할당할 수 있습니다. 예를 들어, 간단한 조회/키워드 기반 작업에는 저렴한 모델을 사용하고, 더 복잡한 작업에는 더 강력한 GPT-5 모델을 사용하여 성능 트레이드오프를 최적화할 수 있습니다.
- 메모리: True인 경우, 에이전트는 작업 간에 메모리를 유지하여 과거 상호작용/질문/발견 등을 기억할 수 있습니다.
- verbose: True로 설정하면 에이전트가 활동에 대한 자세한 로그를 출력합니다(디버깅/의사 결정 추적에 유용).
업무: 특정 작업 단위
CrewAI에서 작업(Task)은 에이전트가 수행해야 할 작업 단위를 나타내며, 여기에는 지침과 예상 결과가 포함됩니다. 이는 할 일 항목을 에이전트 중 한 명에게 할당하는 것과 비슷하게 생각할 수 있습니다. 코드에서 작업을 정의하는 방법은 다음과 같습니다:
from crewai import Task
analysis_task = Task(
description="Analyze the top 5 AI trends in 2025 and assess their market potential.",
expected_output="A structured analysis including each trend's name, market size, key players, and growth forecast.",
agent=researcher,
async_execution=False, # False = this task runs synchronously (waits for previous tasks if any)
output_file="analysis.md", # save the output to a file
depends_on=[research_task] # (Optional) task dependency: run after research_task
)작업의 주요 속성:
- 설명: 작업 지침 (에이전트가 수행해야 할 작업).
- expected_output: 출력이 어떻게 보여야 하는지에 대한 설명 (이것은 에이전트가 출력 형식과 구조를 잡는 데도 도움이 됩니다).
- 에이전트: 이 작업에 사용할 에이전트는 무엇인가요 (이전에 정의한 것).
- async_execution: 참이면, 해당 작업은 다른 작업과 병렬로 실행될 수 있습니다(작업이 독립적인 경우 유용). 기본값은 순차 실행을 위해 False입니다.
- output_file: 제공된 경우, CrewAI는 에이전트의 출력을 이 파일에 기록합니다.
- depends_on: 이 작업을 시작하기 전에 완료해야 하는 다른 작업들의 목록입니다. 이를 통해 의존성을 설정할 수 있으며, 필요하다면 올바른 실행 순서를 보장할 수 있습니다.
도구: 에이전트 기능
도구는 에이전트에게 추가적인 기능을 제공하는 방법입니다. 도구는 본질적으로 에이전트가 추론 과정의 일부로 호출할 수 있는 함수나 API 통합입니다. 예를 들어, 웹 검색 도구는 에이전트가 인터넷을 검색할 수 있게 하고, 데이터베이스 도구는 에이전트가 데이터를 가져올 수 있게 합니다.
CrewAI에는 몇 가지 기본 제공 도구가 있으며, 사용자가 직접 맞춤 도구를 정의할 수도 있습니다. 도구를 에이전트에 연결한다는 것은 에이전트가 목표를 달성하기 위해 필요하다고 판단될 때 해당 도구를 사용할 수 있다는 것을 의미합니다.
다음은 CrewAI의 내장 도구 중 하나인 웹 검색 도구와 파일 입출력 도구를 사용하는 예시입니다:
from crewai_tools import SerperDevTool, FileReadTool, FileWriteTool
# Initialize some tools
web_search = SerperDevTool() # web search via Serper (Google)
file_reader = FileReadTool() # read from files
file_writer = FileWriteTool() # write to files
# Give our researcher agent the ability to use these tools
researcher.tools = [web_search, file_reader, file_writer]사용자 정의 도구는 단순히 CrewAI의 @tool로 장식된 Python 함수(또는 클래스)로, 에이전트가 사용할 수 있게 만든 것입니다:
from crewai.tools import tool
import json
@tool("Database Query")
def query_database(sql: str) -> str:
"""Execute an SQL query against the company database."""
# Simple validation example:
if "DROP" in sql.upper():
return "Error: Destructive queries are not allowed."
# (Pretend we run the query and get results)
results = execute_sql(sql)
return json.dumps(results)이 예제에서는 'Database Query'라는 도구를 만들었습니다. 도구의 docstring과 함수 이름은 에이전트가 도구의 기능을 이해할 수 있도록 맥락을 제공합니다. 잠재적으로 해로운 SQL 명령에 대한 안전 검사도 포함했습니다. 에이전트는 실행 시 이 도구를 사용하여 query_database("SELECT * FROM Customers")를 호출할 수 있습니다.
CrewAI는 다양한 유형의 도구와 상호작용을 지원합니다:
- 내장 도구: 다양한 종류의 웹 검색, 파일 읽기/쓰기, HTTP 요청 등을 위한 내장 도구가 있습니다. 이 도구들은 간단하며, 단순히 플러그인처럼 사용할 수 있습니다.
- 사용자 정의 도구: 물론, 직접 작성한 도구로 기능을 확장할 수 있습니다. 이는 위의 예처럼 간단할 수도 있고, CrewAI BaseTool을 상속하여 더 복잡한 동작을 구현할 수도 있습니다.
- 위임: CrewAI 에이전트는 작업을 다른 에이전트에게 위임할 수 있습니다. 필요에 따라 다른 전문 에이전트의 도움이 필요하다고 판단하면 그 에이전트를 위한 하위 작업 생성을 트리거할 수 있습니다(CrewAI가 백그라운드에서 이를 조율합니다).
크루: 오케스트레이션 엔진
크루는 에이전트와 작업을 조율하고 실행 흐름을 제어합니다. Crew 객체를 생성할 때는 에이전트 목록, 작업 목록, 그리고 프로세스를 실행할 방식을 구성하는 설정을 제공해야 합니다. 예를 들어:
from crewai import Crew, Process
crew = Crew(
agents=[researcher, writer, manager],
tasks=[research_task, writing_task, review_task],
process=Process.HIERARCHICAL, # The manager agent will delegate tasks to the others
manager_agent=manager, # Specify which agent is the manager (for hierarchical process)
memory=True, # Enable shared memory among agents (they can see each other's outputs)
verbose=True # Enable detailed logging for debugging
)
result = crew.kickoff(inputs={"topic": "AI Safety"})이 예제에서는 3명의 에이전트와 3개의 작업으로 구성된 팀을 초기화합니다. 또한 관리자 에이전트가 워크플로를 책임지고 작업을 작업자 에이전트에게 할당하는 계층적 프로세스를 선택했습니다. 입력 (주제: “AI 안전”)도 제공되며, 이는 작업 설명이나 에이전트의 목표에 있는 자리 표시자를 채우는 데 사용할 수 있습니다.
프로세스 유형: CrewAI는 프로세스 설정을 통해 여러 실행 전략을 제공합니다:
- 순차적: 에이전트가 지정된 순서대로 하나씩 실행됩니다 (단순 선형 워크플로).
- 계층적: 관리자(또는 코디네이터) 에이전트가 프로세스를 책임집니다. 이는 다른 에이전트에게 작업을 동적으로 할당하거나 위임하고 결과를 추적할 수 있습니다(하위 작업을 관리하는 '상위' 에이전트가 필요한 복잡한 워크플로에 이상적입니다).
- 사용자 정의: 특별한 요구 사항이 있는 경우(내장 프로세스를 벗어난 고급 시나리오용) 자신만의 오케스트레이션 논리를 지정할 수 있습니다.
내부적으로, crew.kickoff()은 프로세스 유형에 따라 워크플로를 안내합니다:
- 순차 모드에서는 CrewAI가 단순히 작업 목록을 순서대로 반복합니다.
- 계층 모드에서는 매니저 에이전트가 작업 순서를 결정하거나 작업을 동적으로 생성할 수 있습니다.
- 만약 memory=True이면, 에이전트들은 공유 메모리 공간에 접근할 수 있으며, 이 공간에서 다른 에이전트의 결과를 활용하거나 문맥을 유지할 수 있습니다.
이제 CrewAI의 구성 요소 기본을 살펴보았으니, 여러분이 만들 수 있는 다중 에이전트 워크플로우의 예를 살펴보겠습니다.
실제 워크플로 만들기 (가이드 프로젝트)
연구와 콘텐츠 작성에 대한 자동화된 워크플로우를 구축하고 싶다고 가정해 봅시다 — 예를 들어 '주제를 조사하고 요약 보고서를 생성하기'. 두 명의 에이전트를 구성할 것입니다: 한 명의 에이전트는 조사를 수행하는 역할(‘연구자’)을 하고, 다른 한 명의 에이전트는 발견된 정보를 사용하여 요약을 작성하는 역할(‘작가’)을 합니다. 이것은 순차적인 협업, 도구 사용(조사용) 및 에이전트 간 결과 전달을 포함하는 실제 사례의 간단한 예가 될 것입니다.
1단계: 에이전트 정의하기. 우리는 연구 에이전트(Researcher Agent)와 작성 에이전트(Writer Agent)가 필요합니다. YAML(agents.yaml)이나 Python에서 다음과 같이 지정할 수 있습니다:
# agents.yaml
agents:
- name: researcher
role: Researcher
goal: "Gather relevant information on a given topic"
backstory: "An expert at finding and analyzing information."
tools: [WebSearchTool] # allow web search capability
allow_delegation: false
- name: writer
role: Writer
goal: "Produce a clear, concise summary of the research findings"
backstory: "Skilled at summarizing information into reports."
tools: [] # no external tools, just relies on LLM
allow_delegation: false연구자에게 WebSearchTool을 할당한 것을 주목하세요 – 이는 웹 검색을 수행할 수 있는 기능을 가진 '더미' 도구입니다 (CrewAI에는 실제로 API를 통해 구글 검색을 하는 SerperApiTool과 같은 도구도 있습니다 – 우리는 해당 API 키를 얻어 필요에 따라 도구를 설정할 수 있습니다). 작가는 도구가 필요 없습니다; 기본 LLM을 사용하여 텍스트를 생성합니다. 두 에이전트 모두 단순화를 위해 allow_delegation: false로 설정되어 있습니다 (이 흐름에서는 다른 에이전트에게 작업을 재할당하지 않을 것입니다). 또한 각 에이전트에 대해 memory: true를 지정할 수도 있습니다 (또는 모든 에이전트가 해당 동작을 가지도록 하고 싶다면 크루 수준에서 memory: true만 설정할 수도 있고 – 크루 설정이 이를 에이전트에 전파합니다).
2단계: 작업 및 프로세스 정의. 우리는 연구자가 먼저 실행되고, 그 다음에 작가가 실행되기를 원합니다. 이것은 순차적 프로세스입니다: 작업 1 (연구) -> 작업 2 (작성). CrewAI에서는 다음과 같이 YAML(tasks.yaml)에서 작업을 정의할 수 있습니다:
# tasks.yaml
tasks:
- id: do_research
description: "Research the topic: {{topic}}"
expected_output: "Key points and relevant facts about {{topic}}."
agent: researcher
- id: write_report
description: |
"Write a summary report on '{{topic}}' using the research findings."
expected_output: "A well-structured summary of the topic."
agent: writer
context: [do_research] # use output of research task as context
process: sequential염두에 두어야 할 몇 가지 사항: 설명에 자리 표시자를 사용할 수 있습니다(예: {{topic}}) 이는 파라미터로 크루를 실행할 때 채워집니다. write_report 작업에 context: [do_research]를 주석 처리했는데, 이는 Writer 에이전트가 Researcher의 출력물을 자동으로 입력/컨텍스트로 받도록 합니다. 이것은 매우 중요합니다 — 데이터/컨텍스트가 에이전트 간에 흐르는 방식입니다. 실행 순서를 명확히 하기 위해 process: sequential을 정의했습니다. expected_output 필드는 에이전트를 안내하기 위해 사용되며(또한 검증을 정의하기 위해서도 사용됩니다).
3단계: 오케스트레이션 코드 작성(crew.py/main.py). YAML 설정을 사용하면, crewai run을 실행할 때 CrewAI가 오케스트레이션을 대신 수행합니다. 내부 동작을 더 잘 이해하기 위해, Python에서 어떻게 구현되는지 살펴봅시다:
# crew.py (conceptual example)
from crewai import Crew, Task, Process
# Import agents and tools definitions (or define inline)
from crewai import Agent
from crewai_tools import WebSearchTool
# Initialize tools
search_tool = WebSearchTool() # assume configured with API key via .env
# Create Agent instances
researcher = Agent(role="Researcher", goal="Gather relevant info on a topic",
tools=[search_tool], allow_delegation=False)
writer = Agent(role="Writer", goal="Summarize research into a report",
tools=[], allow_delegation=False)
# Define Tasks
research_task = Task(
description="Research the topic: {topic}",
agent=researcher,
expected_output="Key facts about {topic}",
)
write_task = Task(
description="Write a summary report on '{topic}' using the research findings.",
agent=writer,
context=[research_task], # link output of research_task
expected_output="Summary report for {topic}"
)
# Create a Crew with sequential process
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, write_task],
process=Process.sequential, # sequential execution
memory=True # enable memory if we want agents to retain info
)이제 이 팀을 실행하려면, crew.kickoff(topic="기후 변화 영향")와 같이 호출합니다(예를 들어, 우리가 작업 설명에서 기대하는 topic 매개변수를 제공하는 식으로). 그러면 CrewAI는 다음을 수행합니다:
- 연구 과제 시작: 연구원 에이전트에게 '주제 연구: 기후 변화의 영향'이라는 프롬프트가 주어집니다. 연구원 에이전트는 WebSearchTool 기능을 가지고 있어, 필요에 따라 도구를 호출할지 여부를 LLM이 결정할 수 있습니다. 예를 들어 '기후 변화 영향 주요 사실'을 검색하고 몇 가지 결과를 가져올 수 있습니다. 도구 호출에서 나온 출력(예: 정보 스니펫)은 에이전트에게 반환되고, 에이전트의 LLM은 이를 자신의 응답으로 사용합니다. 에이전트는 어떤 내용을 출력합니다. 이 경우, 아마 기후 변화의 영향에 대한 주요 사항 목록을 제공할 수 있습니다. CrewAI는 이 출력을 저장하고(인덱싱이 활성화되어 있으면 메모리에 인덱싱도 수행)합니다.
- write_task로 진행: Writer 에이전트는 '연구 결과를 사용하여 ‘기후 변화 영향’에 대한 요약 보고서를 작성하라'라는 프롬프트를 받습니다. CrewAI가 자동으로 제공하는 컨텍스트는 research_task의 결과물입니다. Writer 에이전트는 연구자가 제공한 주요 포인트 목록을 받습니다. Writer의 LLM은 해당 주요 포인트를 기반으로 요약 보고서를 작성합니다.
- 완료: CrewAI는 최종 출력물(작성자의 보고서)을 반환하며, 이는 main.py의 구성에 따라 콘솔에 출력되거나 저장될 수 있습니다. 각 작업에 대해 expected_output을 제공했기 때문에, CrewAI는 출력물이 그 기대치에 대체로 부합하는지 확인할 수도 있습니다(엄격한 검증은 아니며, 단지 가이드일 뿐입니다).
4단계: 워크플로 실행 및 테스트. CLI에서 YAML을 사용하는 경우 crewai run --param topic=“Climate Change Impacts ”를 호출하거나, Python 스크립트에서는 crew.kickoff(topic=“Climate Change Impacts ”)를 호출합니다. 콘솔 출력을 모니터링하세요:
- 연구원 에이전트의 사고 과정을 볼 수 있어야 합니다(crew 또는 agents에서 verbose=True일 경우) – 예를 들어 “연구원: ‘기후 변화 영향 주요 사실’ 검색 중…”, 그 다음 “연구원: 해수면 상승, 극심한 날씨 등 데이터 발견”, 마지막으로 “연구원: 연구 과제 완료”와 같이 출력될 수 있습니다.
- 그러면 작성자 에이전트가 요약을 작성하는 동안 그 출력이 표시될 수 있습니다.
- 마지막으로 요약 보고서 텍스트가 결과로 출력됩니다.
워크플로우 구축을 위한 생산 팁:
- 작업 설명에서 구체적으로 작성하세요: 모호한 지시는 사용하지 마세요. 예를 들어, 작성자 프롬프트에서는 무엇을 요약해야 하는지 명확히 하기 위해 ‘연구 결과를 사용하여’라는 문구를 추가했습니다. 만약 단순히 ‘요약을 작성하세요’라고만 적었다면, 내용이 부정확하게 생성되거나 중요한 포인트를 놓쳤을 수도 있습니다.
- 예상 출력(expected_output)을 사용하여 답변을 구성하세요. 우리는 예상 형식(‘핵심 포인트’ 목록, 그 다음 ‘잘 구성된 요약’)을 제공했습니다. 이를 소프트 스펙이나 제약 조건의 형태로 사용할 수 있습니다. 만약 에이전트의 실제 출력이 일치하지 않는다면, 프롬프트를 다시 작성하거나 코드에서 출력을 처리해야 할 수도 있습니다.
- 각 에이전트를 개별적으로 테스트하세요. 에이전트를 고립된 상태에서 프롬프트와 함께 실행해보면 그 행동 방식을 파악하는 데 도움이 될 수 있습니다. 예를 들어, Researcher의 프롬프트를 단독으로 테스트하여 WebSearchTool이 제대로 작동하고 유용한 정보를 반환하는지 확인하세요. 확인이 끝나면 이를 팀에 통합하세요.
- 빠른 반복을 위해 YAML을 활용하세요. CrewAI의 YAML 구성 파일을 사용하면 기본 코드를 변경하지 않고도 역할, 프롬프트 및 기타 설정을 편집할 수 있습니다. YAML이 올바르게 형식화되었는지 확인하려면 crewai validate(설치된 경우)를 실행할 수 있습니다. 복잡한 로직(루프, 조건문 등)이 필요한 경우, 대신 CrewAI의 SDK를 통해 Python 코드를 사용하여 크루에 추가 로직을 추가할 수 있습니다(예: if 문을 사용하여 조건에 따라 작업을 추가). 하지만 많은 워크플로우는 선언적으로 지정할 수 있습니다.
예시를 확장하면: 이 워크플로우를 쉽게 확장하여 세 번째 에이전트(예: 작성자의 보고서 품질이나 스타일 준수 여부를 확인하는 “편집자” 에이전트)를 추가할 수 있습니다. 또한 사실을 두 번째 웹 검색으로 확인하는 “팩트체커” 에이전트를 추가할 수도 있습니다. 추가 작업을 만들고, 필요한 컨텍스트 링크를 생성하며, 필요할 경우 편집자 에이전트가 수정 요청(위임)을 할 수 있도록 설정할 수도 있습니다.
도구 및 통합
CrewAI는 에이전트가 파일, 웹, 데이터베이스, 벡터 스토어 및 외부 서비스와 상호작용할 수 있도록 하는 다양한 내장 도구 라이브러리를 제공합니다. 아래 표에는 도구의 주요 카테고리, 각 카테고리별 예제 도구, 그리고 일반적으로 사용되는 사례가 간략히 설명되어 있습니다.
CrewAI에는 에이전트가 파일, 웹, 데이터베이스, 벡터 스토어 및 외부 서비스와 상호작용할 수 있도록 돕는 광범위한 내장 도구 라이브러리가 포함되어 있습니다. 아래 표는 주요 도구 범주, 예시 도구 및 일반적인 사용 사례를 요약한 것입니다.
| 도구 (참조 링크) | 설명 |
|---|---|
| 웹사이트 스크레이핑 도구 | HTML 페이지를 가져오고 파싱하여 웹사이트의 내용을 추출합니다. |
| 서퍼데브툴 | 실시간 웹 결과를 위해 Serper API를 통해 Google 검색을 수행합니다. |
| 파일읽기도구 | 다양한 유형의 로컬 파일에서 내용을 읽습니다. |
| 걸레 도구 | 외부 문서를 조회하여 검색 보강 생성(RAG)을 가능하게 합니다. |
| 코드 인터프리터 도구 | 에이전트 환경 내에서 Python 코드 스니펫을 안전하게 실행합니다. |
| DALLE툴 (DallETool) | OpenAI의 DALL-E 모델을 사용하여 텍스트 설명으로부터 이미지를 생성합니다. |
| PG검색도구 | 데이터 검색을 위해 PostgreSQL 데이터베이스를 쿼리합니다 (의미 기반/RAG 스타일 검색 지원). |
통합 및 고급 도구: CrewAI는 또한 공통 인터페이스로 접근할 수 있는 커뮤니티 제작 도구 전체 생태계인 모델 컨텍스트 프로토콜(MCP)과 통합됩니다. 에이전트에서 MCP 통합을 활성화하면 MCP 서버에서 실행되는 수천 개의 도구(복잡한 데이터 처리 서비스, 전문 API 등)에 실제로 접근할 수 있습니다. 이를 위해 crewai-tools[mcp] 추가 패키지를 설치해야 하며, 선택적으로 MCP 서버를 실행하거나 기존 서버에 연결해야 합니다.
다중 에이전트 워크플로우를 위한 신뢰성 패턴
실제 운영 환경에서는 다양한 실패 모드를 고려해야 합니다. 에이전트가 무한 루프에 빠지거나, 도구가 잘못 작동하거나, 비용이 급증하는 등의 상황이 발생할 수 있습니다. CrewAI는 신뢰성을 향상시키기 위한 패턴과 내장 도구를 제공합니다. 알아두면 좋은 중요한 패턴은 다음과 같습니다:
| 신뢰성 패턴 | 예방하는 것(간단한 설명 포함) | CrewAI에 지원하는 방법 (간단한 설명 포함) |
|---|---|---|
| 보호 울타리 도구 결과 | 정확한 도구 출력 후 환각 — 도구가 진실을 반환하더라도 LLM은 '다르게 표현'하면서 오류를 도입합니다. | 권위 있는 도구(DB 쿼리, 계산기, 검색)를 사용할 경우, 워크플로를 구성하여 도구 출력이 최종 답변이 되도록 하거나(혹은 답변에 그대로 복사되도록) 합니다. 또한, 사실 확인을 위해 도구 사용이 명시적으로 필요한 작업을 작성합니다. |
| 반복 한도 | 무한 루프와 토큰 소모 — 에이전트가 수렴하지 않고 계속 생각하고, 재시도하며, 재계획합니다. | 에이전트 max_iter 값을 설정하여 사고/도구 사이클을 제한하세요. 간단한 작업에는 낮게 유지하고, 복잡한 다단계 추론에는 높게 설정하세요. 'max_iter에 도달' 이벤트가 자주 발생하면 이는 프롬프트/작업 설계의 문제 신호로 간주하세요. |
| 실행 시간 초과 | Hung runs — 느린 웹 스크래핑, 네트워크 지연, 또는 긴 도구 호출이 전체 팀을 막습니다. | 에이전트/작업별로 max_execution_time을 설정하세요. 커스텀 도구 내부에서는 타임아웃(HTTP 타임아웃, Selenium 페이지 로드 제한)을 적용하세요. 무한 대기보다는 '타임아웃 + 재시도' 방식을 선호하세요. |
| 재시도 + 백오프 | 일시적인 실패 — 속도 제한, 불안정한 API, 간헐적인 연결 문제. | 도구 코드에서 max_retry_limit를 사용하고 지수 백오프를 구현하세요(예: 1초 → 2초 → 4초 대기). 제한된 재시도 후에는 하류 작업이 결정적으로 처리할 수 있도록 구조화된 오류 페이로드를 반환하세요. |
| 제한된 위임 | 위임 탁구 — 에이전트들이 업무를 계속 서로 주고받기만 하고 끝내지 않는다. | 관리자/코디네이터 에이전트에만 allow_delegation를 활성화하고, 워커 에이전트는 위임하지 않도록 유지합니다. ‘데이터/도구 접근이 없을 때만 위임’과 같은 명시적인 프롬프트 규칙을 추가하고, 워커가 요청이 아니라 구체적인 결과를 반환하도록 요구하세요. |
| 결정적 입력 | 불안정한 출력 — 작은 프롬프트 변화에도 서로 다른 형식/결과가 나타나 하위 자동화가 깨질 수 있습니다. | 엄격한 작업 사양(expected_output), 고정된 스키마(JSON) 및 구조화된 프롬프트를 사용하세요. 추출/분류 에이전트의 경우, 무작위성을 줄이고(온도 낮춤) 출력을 정의된 필드로 제한하세요. |
| 출력 검증 | 잠재적 품질 실패 — 출력물이 겉으로 보기에는 괜찮아 보이지만, 필수 항목이 누락되었거나 제약 조건을 위반하거나 모순을 포함하고 있음. | 스키마, 필수 섹션, 인용, 제약 조건을 확인하는 검증자/검토자 작업을 추가하세요. 검증에 실패하면 대상 수정 피드백(누락된 항목 + 예상되는 정확한 형식)과 함께 다시 실행하세요. |
| 비용 통제 | 급증하는 지출 — 다중 에이전트 워크플로우는 토큰과 도구 호출을 빠르게 증폭시킵니다. | 일상적인 단계에는 더 작고 저렴한 모델을 사용하고, 중요한 추론에는 더 강력한 모델을 사용하세요. 단계나 시간을 제한하고, 반복되는 컨텍스트를 캐시하며, 작업별 토큰/비용을 기록하여 프롬프트나 도구 최적화를 위한 비용 고점을 파악하세요. |
관찰 가능성과 디버깅
이 표는 CrewAI 워크플로우에 가장 실용적인 세 가지 관찰 가능성 계층을 요약한 것입니다. 개발 과정에서는 간단한 콘솔 가시성으로 시작하고, 이후 프로덕션에서는 구조화된 추적과 외부 모니터링으로 발전하는 과정을 보여줍니다. 마지막으로 디버그 훅과 평가를 추가하여 시간에 따라 신뢰성과 출력 품질을 지속적으로 개선합니다.
| 관측 가능 영역 | 그것이 주는 것 (왜 중요한지) | CrewAI에서 사용하는 방법 (실용적, 생산 지향적) |
|---|---|---|
| 기본 로깅 및 상세 수준 | 즉시 확인 가능한 디버깅 — 에이전트의 추론 단계, 도구 호출, 의사 결정 흐름을 실시간으로 확인할 수 있습니다. 개발과 빠른 문제 해결에 가장 적합하지만 장기 분석에는 제한적입니다. | verbose=True를 Crew 또는 특정 Agents에 설정하면 단계별 로그(THINKING → ACTION → OBSERVATION)를 출력할 수 있습니다. 문제를 재현할 때 로컬에서 사용하세요. 운영 환경에서는 상세 출력을 낮추고 가능한 경우 구조화된 로그(JSON)를 생성하여 집계할 수 있도록 하세요. |
| 트레이싱 + 외부 관찰성 + 프로덕션 모니터링 | 구조화된 증거 추적 — 타임스탬프, 입력/출력, 도구 호출 및 실행 ID와 함께 단계별 실행을 기록합니다. 사후 분석, 성능 조정 및 비용 관리(토큰 급증, 느린 도구) 등을 가능하게 합니다. | CrewAI 추적을 활성화하세요(문서에 따라 config/flag/env 사용). 이렇게 하면 각 실행이 고유한 식별자를 가진 추적 데이터를 생성합니다. 추적/메트릭을 관찰 가능 백엔드로 전송하세요(예: LLM 추적을 위한 Langfuse, 로그/메트릭/알림을 위한 Datadog, 모델 모니터링을 위한 Arize/Phoenix, 통합 추적을 위한 LangSmith/LangTrace, 공유 가능한 실행 재생을 위한 Neatlogs). 실패/지연에 대한 알림을 추가하고, 작업별 토큰과 비용을 추적하며, 확장 결정을 위해 처리량을 모니터링하세요. |
| 디버그 훅 + 평가 워크플로 | 실행 가능한 진단 및 품질 관리 — 맞춤 훅은 패턴(위임 루프, 반복 재시도, 도구 오류)을 드러내고, 평가를 통해 출력 품질의 은밀한 퇴보를 방지합니다. | 각 단계 후에 중요한 이벤트(위임 발생, 도구 오류, 재시도 횟수, 스키마 위반)를 주석 달기/기록하기 위해 step_callback을 사용하세요. 최종 출력물에 대해 자동 평가 단계(규칙 검사 + 선택적 LLM 점수 부여)를 추가하고 점수를 저장하세요. 추세를 사용하여 프롬프트/도구를 개선하고 릴리스를 조정하세요(AgentOps 방식의 지속적 개선). |
CrewAI 대 LangGraph 대 AutoGen
서로 다른 에이전트는 사용 사례에 맞는 다양한 철학, 아키텍처 또는 기능을 가질 수 있습니다. 가장 인기 있는 세 가지 프레임워크는 CrewAI, LangGraph, AutoGen입니다. 세 가지를 간략히 비교하여 주요 유사점과 차이점을 살펴보겠습니다:
| 측면 | 크루AI (역할 기반 팀) | LangGraph (그래프 워크플로우) | AutoGen (대화형 에이전트) |
|---|---|---|---|
| 접근 | 구조화된 팀에서 역할을 수행하는 에이전트; 작업과 흐름은 자율성과 통제를 결합합니다. | 단계의 방향성 비순환 그래프(종종 LangChain을 통해); 명시적인 상태 관리. | 다중 에이전트 채팅 세션; 기본적으로 고정된 프로세스 없이 나타나는 행동. |
| 사용 편리성 | 에이전트/크루/작업 모델이 명확하며 빠르게 시작할 수 있습니다. 적절한 도구 없이는 로깅이 까다로울 수 있습니다. | 학습 곡선이 더 가파르며, 더 많은 보일러플레이트와 초기 상태 설계가 필요합니다. | 빠르게 프로토타입을 만들 수 있지만, 에이전트를 조율하려면 주의 깊은 프롬프트 설계가 필요합니다. |
| 워크플로우 제어 | 이중 모드: 자율적인 팀과 결정론적 흐름; 유연성과 구조의 좋은 균형. | 그래프를 통한 강력한 제어; 복잡한 분기에는 좋지만, 실행 시간에는 덜 적응적임. | 제한된 내장 제어; 순서는 대화에서 나오며, 강제하기가 더 어렵다. |
| 상태 및 메모리 | 내장 메모리 모듈(짧음/김/엔터티); 바로 사용할 수 있는 강력함. | 종종 LangChain 메모리에 의존하며, 상태는 코드에서 미리 정의되고 관리되어야 합니다. | 주로, 추가 메모리를 구현하지 않는 한 대화 기록입니다. |
| 도구 및 통합 | 100개 이상의 도구; LangChain에 묶여 있지 않으며, 모든 API/맞춤 도구와 쉽게 통합 가능; 필요하면 여전히 LangChain 도구 사용 가능. | LangChain에 대한 강한 결합; 많은 통합 기능이 있지만 복잡성과 적응 부담이 증가함. | 함수와 AutoGen Studio UI를 통한 도구 사용; 도구 사용 방식은 대화형 패러다임에 의해 형성됩니다. |
| 성능 | 최소한의 오버헤드; 최적화된 핵심; 일부 작업에서 더 빠른 실행 보고; 작고 복잡한 워크플로우에 강함. | 오버헤드가 더 있음(LangChain + 그래프 런타임); 느릴 수 있지만 구조화된 흐름에는 효과적임. | 대화 회수에 따라 달라집니다. 에이전트가 여러 번 반복하면 더 느릴 수 있습니다. |
| 운영 준비 | 프로덕션용으로 제작됨: 관측 훅, 엔터프라이즈 기능, 세분화된 제어, 유지 관리 가능한 시스템. | 신중한 설계로 제작 가능; LangChain 특성 때문에 추가 접착제가 필요할 수 있음. | 연구/데모 중심이며, 생산 환경 강화(로깅, 오류 처리, 제어)는 대부분 직접 해야 합니다. |
| 최적 | 알려진 단계가 있는 역할 기반 워크플로우지만 실행은 유연함(기업 자동화, 분석 파이프라인, 감독이 있는 다단계 RAG). | 이미 LangChain에 투자한 경우 특히 복잡한 분기(예: ETL/QA 파이프라인)가 필요한 정적/예측 가능한 워크플로우. | 단계가 고정되어 있지 않은 대화형 문제 해결(브레인스토밍, 비평 반복, 사람 참여형 채팅)을 통한 열린 문제 해결 |
자주 묻는 질문
1. CrewAI란 무엇이며, 기존 AI 에이전트와 어떻게 다른가요?
CrewAI는 명확하게 정의된 역할, 목표 및 책임을 가지고 함께 작업하는 여러 AI 에이전트를 조율하도록 설계된 프레임워크입니다. 기존의 단일 에이전트 설정과 달리, CrewAI는 인간 팀이 작동하는 방식과 유사하게 협업과 작업 위임을 강조합니다. 이는 계획, 실행 및 검증이 필요한 복잡한 다단계 워크플로우에 특히 효과적입니다.
2. CrewAI에서 역할 기반 에이전트 오케스트레이션은 어떻게 작동하나요?
CrewAI에서는 각 에이전트에게 연구원, 작가, 리뷰어와 같은 특정 역할과 명확한 목표가 부여됩니다. 작업은 이러한 역할에 따라 분배되어 에이전트가 가장 적합한 일에만 집중하도록 합니다. 이러한 구조화된 접근 방식은 효율성을 높이고, 중복을 줄이며, 보다 일관된 결과물을 만들어냅니다.
3. CrewAI의 일반적인 사용 사례는 무엇인가요?
CrewAI는 콘텐츠 생성, 연구 자동화, 데이터 분석 파이프라인 및 AI 기반 제품 워크플로우에 널리 사용됩니다. 특히 작업을 순차적으로 또는 협업적으로 완료해야 하는 시나리오에서 유용합니다. 예시로는 RAG 시스템 구축, 보고서 자동화, 여러 LLM 기반 도구의 조율 등이 있습니다.
4. CrewAI를 시작하는 데 고급 AI나 파이썬 지식이 필요할까요?
Python과 대규모 언어 모델에 대한 기본적인 이해는 도움이 되지만 필수는 아닙니다. CrewAI는 에이전트, 작업, 워크플로우에 대한 명확한 추상화를 제공하여 개발자 친화적으로 설계되었습니다. 초보자는 간단한 예제부터 시작하여 점차 더 복잡한 다중 에이전트 오케스트레이션 패턴으로 나아갈 수 있습니다.
5. CrewAI를 기존 도구 및 프레임워크와 통합할 수 있나요?
네, CrewAI는 인기 있는 LLM 제공업체, API, 벡터 데이터베이스 및 워크플로 엔진과 같은 외부 도구와 통합될 수 있습니다. 이러한 유연성 덕분에 기존 AI 파이프라인에 원활하게 적용할 수 있습니다. 그 결과, 팀은 모든 것을 처음부터 다시 작성하지 않고도 현재 시스템을 향상시킬 수 있습니다.
결론
CrewAI는 '크루'를 단순한 채팅 실험이 아니라 설계된 워크플로우로 취급할 때 가장 유용합니다. 역할과 작업 범위를 할당하고, 핵심 단계를 도구로 뒷받침하며, 무한 반복, 실패, 예상치 못한 비용으로 시스템이 악화되지 않도록 제한을 적용하세요. 그런 다음 모든 것을 기록하고—로그, 추적, 간단한 평가를 포함하여—문제를 빠르게 디버그하고 릴리즈마다 품질을 향상시킬 수 있도록 하세요. 예측 가능한 다단계 자동화가 필요하며 명확한 책임과 운영 제어가 필요하다면 CrewAI가 강력한 기본 선택입니다. 그러나 문제가 주로 복잡한 분기 로직이나 개방형 대화 협업이라면 LangGraph 또는 AutoGen이 더 적합할 수 있습니다.
참조
- CrewAI란 무엇인가요?
- CrewAI 시작하기 - 설치하고 설정한 뒤 첫 번째 AI 팀을 구축하세요
- 에이전트 개요
- CrewAI를 활용한 다중 에이전트 시스템 구축 - 종합 튜토리얼
- 크루AI 도구
- 빠른 시작: 공동 작업 활성화
Linux-Console.net 커뮤니티와 함께 학습해 주셔서 감사합니다.
