Skip to main content

CrewAI 애플리케이션 추적하기

W&B Weave로 CrewAI 애플리케이션을 추적하세요: 가드레일을 적용하고, 모든 에이전트의 결정을 시각화하며, 멀티 에이전트 워크플로를 디버깅해 성능을 향상합니다. 이 글은 AI로 번역되었습니다. 오역이 있을 경우 댓글로 알려주세요.
Created on September 15|Last edited on September 15
추적하기 CrewAI 애플리케이션 은 AI 에이전트의 성능과 상호작용을 최적화하는 데 essential합니다. 모든 결정, 도구 호출, 출력물을 모니터링하면 병목 지점을 파악하고 개선할 수 있습니다. 자율 에이전트가 함께 작동하는 방식. W&B Weave CrewAI 앱에 계측을 적용하는 매끄러운 방법을 제공합니다 풍부한 가시성 – 개발자가 평가하고 디버그할 수 있도록 지원합니다 멀티 에이전트 워크플로우 자세히
이 가이드에서는 Weave를 사용해 CrewAI 애플리케이션을 트레이싱하는 방법과, 이 과정이 견고한 AI 에이전트 팀을 구축하는 데 왜 중요한지 살펴봅니다. 또한 CrewAI의 핵심 기능, 도구를 활용한 에이전트 성능 향상 방법, 더 안전한 출력을 위한 가드레일 구현, 그리고 복잡한 멀티 에이전트 워크플로를 효과적으로 오케스트레이션하는 방법도 함께 다룹니다.
다음 내용을 다룹니다:

목차



CrewAI와 주요 기능 이해

CrewAI는 자율형 AI 에이전트를 만들기 위한 간결하고 매우 빠른 Python 프레임워크로, 처음부터 독자적으로 설계되었으며 다음과 같은 다른 프레임워크에 의존하지 않습니다 LangChain역할 기반 AI 에이전트가 하나의 “크루”로 협업하여 과업을 완료하도록 오케스트레이션하며, 자동화를 위한 강력한 프레임워크를 제공합니다 멀티 에이전트 워크플로우.
크루에 속한 각 에이전트는 고유한 역할과 목표를 부여받아 전문화된 과업을 수행할 수 있습니다(예: 한 에이전트는 연구자, 다른 에이전트는 작가로 동작). 이러한 역할 기반 아키텍처 덕분에 에이전트들은 효율적으로 협업할 수 있으며, CrewAI의 런타임이 이들의 상호작용과 작업 위임을 관리합니다.
CrewAI의 핵심 기능에는 구분된 에이전트 역할 지원, 다중 에이전트 조정(에이전트 오케스트레이션), 외부 도구 통합을 통한 에이전트 능력 확장, 그리고 복잡한 워크플로를 처리할 수 있는 확장성이 포함됩니다.
중요한 점은 CrewAI가 고수준의 단순성과 저수준의 제어를 모두 개발자에게 제공한다는 것입니다. 고수준에서는 Crews라는 추상화를 사용할 수 있는데, 여기서 협업할 에이전트 팀과 작업 집합을 정의하면 자율형 멀티 에이전트 실행을 손쉽게 설정할 수 있습니다.
저수준에서는 CrewAI가 Flows를 제공합니다. 이는 이벤트 기반 또는 조건부 워크플로를 세밀하게 제어하면서 스크립팅할 수 있는 방식으로, 각 단계를 명시적으로 관리할 수 있게 해줍니다. 이러한 이중 접근법 덕분에 AI 에이전트 팀을 빠르게 프로토타이핑하면서도 필요에 따라 복잡한 로직을 자유롭게 커스터마이징할 수 있습니다. CrewAI의 유연성은 다양한 도메인에서 맞춤형 AI 솔루션을 개발하기에 최적이며, 엔터프라이즈급 AI 자동화에 적합한 선택지로 빠르게 자리 잡고 있습니다(활발한 개발자 커뮤니티가 있고, 이후에 설명하듯 실제 운영 배포를 위한 Enterprise 버전도 제공합니다).
CrewAI가 돋보이는 이유 중 하나는 가시성과 멀티 에이전트 환경에서의 디버깅. 애플리케이션은 여러 에이전트가 함께 동작하는 경우가 많기 때문에, 이들이 어떻게 소통하고 수행하는지를 이해하는 것이 매우 중요합니다. 여기서 W&B Weave 연동이 역할을 합니다. CrewAI는 자동으로 연동되어 Weave의 트레이싱 시스템, 에이전트의 성능과 상호작용을 실시간으로 모니터링하고 분석할 수 있도록 해줍니다.
다시 말해, CrewAI와 Weave를 함께 사용하면 AI 크루의 ‘브레인’을 들여다볼 수 있습니다. 즉, 다음에 대한 모든 API 호출— 대규모 언어 모델, 사용된 모든 도구와 에이전트 간에 주고받은 모든 메시지가 검사용으로 기록될 수 있습니다.
다음 섹션에서는 이 통합이 개발자가 AI 에이전트를 효과적으로 모니터링하고 디버그할 수 있도록 어떻게 지원하는지 살펴보겠습니다.

CrewAI로 모니터링과 분석을 수행하는 방법

CrewAI와 W&B Weave의 통합을 통해 개발자는 상세한 실행 트레이스를 자동으로 수집하여 AI 에이전트의 성능을 모니터링하고 분석할 수 있습니다. 다중 에이전트 애플리케이션이 실행되는 동안 Weave는 모든 핵심 이벤트와 동작을 기록합니다. 여기에는 에이전트 간 상호작용, 태스크 실행, LLM 호출이 모두 포함되며, 타임스탬프, 지연 시간, 토큰 사용량과 같은 메타데이터도 함께 수집됩니다. 그 결과 에이전트가 무엇을 어떻게 수행했는지에 대한 완전한 타임라인이 생성되며, Weave 웹 인터페이스를 통해 손쉽게 확인할 수 있습니다.
Weave의 트레이스 시각화는 이러한 세부 정보를 손쉽게 확인할 수 있도록 해줍니다. CrewAI 애플리케이션을 실행한 뒤 프로젝트의 Weave 대시보드로 이동하면 다음과 같은 정보를 검토할 수 있습니다: 각 에이전트가 실행한 태스크의 순서, 프롬프트와 응답의 내용, 호출된 도구, 발생한 오류.
Weave는 각 CrewAI 작업을 계층적 컨텍스트와 함께 자동으로 기록합니다. 예를 들어, 다음과 같은 내용을 확인할 수 있습니다. Research Analyst 에이전트가 리서치 태스크를 시작했고, 그 과정에서 특정 LLM 호출이 이어졌으며, 이후 생성된 출력이 다음으로 전달되었습니다. Report Writer 에이전트의 태스크, 그리고 그 다음 단계까지. 이러한 세밀한 가시성은 “에이전트가 단계 X에서 무엇을 했는가?” 또는 “어떤 입력이 이 출력을 만들었는가?”와 같은 질문에 체계적으로 답할 수 있게 해줍니다.
그림: W&B Weave의 트레이스 인터페이스가 CrewAI 실행을 캡처한 모습. 스크린샷에는 crew.kickoff() 실행에 대한 계층적 트레이스가 표시되며, 두 개의 주요 태스크(Research Analyst와 Report Writer)가 포함되어 있습니다. 각 태스크 아래에는 LLM 호출(예: llm.complete)과 그 파라미터 같은 하위 작업이 나타납니다. 오른쪽 패널에는 선택한 작업의 입력과 출력이 표시되며, 이 경우 “AI in Material Science” 주제로 생성된 투자 보고서의 발췌본이 보여집니다. 이러한 상세 트레이스는 개발자가 에이전트 간 상호작용을 모니터링하고 각 단계에서의 성능을 분석하는 데 도움이 됩니다.
이러한 모니터링을 통해 CrewAI + Weave는 다음과 같은 핵심 분석 질문에 답할 수 있도록 돕습니다: 각 에이전트가 자신의 태스크를 완료하는 데 얼마나 시간이 걸렸는가? LLM 호출은 토큰을 얼마나 소모했는가? 어떤 도구 쿼리가 실행되었는가? 결과가 틀렸다면 추론은 어디에서 잘못되었는가? 이 모든 정보는 즉시 확인할 수 있습니다. Weave의 트레이스 보기에서는 이상 징후나 오류도 하이라이트해 주어, 복잡한 멀티 에이전트 플로우에서 문제를 더 쉽게 디버그할 수 있습니다. 요약하면, CrewAI의 Weave 네이티브 지원은 개발자에게 AI 에이전트의 의사결정 과정을 들여다보는 강력한 확대경��� 제공하며, 이는 자율 시스템의 최적화와 신뢰 확보에 필수적입니다.

CrewAI 애플리케이션 트레이싱 시작하기

W&B Weave를 사용해 CrewAI 애플리케이션 트레이싱을 시작하려면, 먼저 환경을 설정하고 코드에 트레이싱을 위한 계측을 추가해야 합니다. 다행히 CrewAI의 Weave 통합 덕분에 이 과정은 매우 간단합니다. Weave를 초기화하는 몇 줄만 추가하면, 모든 에이전트의 동작과 LLM 호출이 인터랙티브 대시보드에 자동으로 기록됩니다. 이 섹션에서는 설치부터 첫 번째 트레이스를 확인하는 단계까지, 이미 CrewAI 프로젝트나 아이디어가 있다고 가정하고 하나씩 안내합니다.
개략적으로는 다음 과정을 거칩니다: 필요한 패키지를 설치하고, 스크립트 시작 시 Weave를 초기화한 뒤, CrewAI에서 하던 대로 에이전트와 태스크를 정의하고, 크루를 실행합니다. 크루가 실행되면 Weave가 트레이스를 수집하고 이를 시각화할 수 있는 링크를 제공합니다. 아래 단계를 따르면 다음 질문에 답할 수 있습니다: 내 CrewAI 애플리케이션을 어떻게 트레이싱할 수 있나요? 그리고 AI 에이전트의 동작에 대한 유용한 인사이트를 얻으세요.

Weave 시작 단계

  1. CrewAI와 Weave 설치하기: Python 3.10–3.13이 설치되어 있는지 확인한 다음, pip을 통해 필요한 패키지를 설치하세요. 예시는 다음과 같습니다: pip install crewai weaveCrewAI의 추가 도구(예: 웹 브라우징 또는 기타 통합)를 사용할 계획이라면 다음으로 설치할 수 있습니다 pip install 'crewai[tools]' 이렇게 하면 환경에 CrewAI 프레임워크와 W&B Weave 라이브러리 둘 다 설정됩니다.
  2. 아직 가입하지 않았다면 무료 Weights & Biases 계정에 가입하세요이는 Weave가 추적 로그를 W&B 클라우드에 기록하고, 그곳에서 확인할 수 있도록 하기 위해 필요합니다. 계정을 만들고 로그인한 뒤(예를 들어 다음 명령을 실행하여) wandb login 터미널에서 또는 API 키를 사용해 로그인하면, 추적을 기록하고 시각화할 준비가 됩니다.
  3. 애플리케이션에서 Weave를 초기화하세요: Python 스크립트나 Jupyter 노트북에서 다음을 임포트하세요 weave 그리고 호출하세요 weave.init(...) 코드의 시작 부분에서 추적을 초기화하세요. 프로젝트 이름을 지정해야 합니다 weave.init (예: weave.init(project_name="crewai_demo")) — 이 이름은 추적 로그를 정리하는 데 사용됩니다. 초기화가 완료되면, 콘솔에 보통 이 프로젝트의 Weave 대시보드 URL이 출력되며, 브라우저에서 해당 링크를 열 수 있습니다.
  4. 에이전트, 태스크, 그리고 크루를 정의하세요: CrewAI API를 사용해 평소처럼 에이전트와 태스크를 설정하세요. 이는 다음을 포함합니다 LLM 인스턴스(예: GPT-4 기반 모델), 그리고 다음으로 생성하기 Agent 특정 역할과 목표를 가진 객체, 그리고 Task 각 에이전트가 수행해야 할 작업을 설명하는 객체입니다. 예를 들어, 정보를 수집하는 것을 목표로 하는 Researcher 에이전트와 보고서를 작성하는 것을 목표로 하는 Writer 에이전트를 둘 수 있습니다. 각 Task는 에이전트에 할당됩니다(예: Researcher 에이전트를 사용하는 연구 태스크, Writer 에이전트를 사용하는 작성 태스크). 마지막으로, 다음을 생성합니다 Crew 해당 에이전트와 태스크를 포함하고, 태스크를 어떤 방식으로 실행할지(순차 또는 병렬) 프로세스를 결정하세요. 예를 들어, 연구 태스크가 완료된 뒤에 작성 태스크가 시작되도록 순차 프로세스를 사용할 수 있습니다(이 예시에서는 일반적으로 기대되는 흐름입니다).
  5. 크루를 실행하세요: 모든 구성이 끝났다면, 다음을 호출하여 멀티 에이전트 워크플로를 시작하세요 crew.kickoff(inputs={...}) 필요한 입력 매개변수와 함께. 진행 중인 예시에서는 다음과 같은 입력을 전달할 수 있습니다 {"topic": "AI in material science"} Researcher에게 무엇을 조사해야 하는지 알려주기 위해서입니다. 호출을 완료하면 kickoff()CrewAI가 에이전트를 시작하면, 에이전트들은 자신의 태스크를 실행하기 시작합니다. 이 실행 동안 Weave는 최상위 시작 지점부터 에이전트가 수행하는 각 LLM 호출까지 모든 작업을 자동으로 캡처합니다. 코드를 실행하면서 최종 결과나 출력을 출력할 수도 있지만, 진짜 핵심은 전체 프로세스의 트레이스가 백그라운드에서 기록되고 있다는 점입니다.
  6. Weave에서 트레이스를 확인하기: 실행이 완료된 후(또는 실행 중에도, Weave가 데이터를 스트리밍할 수 있으므로), 프로젝트를 초기화할 때 제공된 Weave 대시보드 URL을 열세요. 웹 인터페이스에서 프로젝트와 트레이스 실행 목록을 확인할 수 있습니다(각 실행은 일반적으로 호출한 함수명으로 식별됩니다. 예: crewai.Crew.kickoff). 최신 실행 항목을 클릭해 트레이스 시각화를 열세요. 여기에서 다음 내용을 포함한 트레이스를 탐색할 수 있습니다: 모든 LLM 호출과 해당 메타데이터, 태스크 실행과 에이전트 동작의 순서, 실행 시간과 토큰 수와 같은 성능 지표, 그리고 발생한 오류나 예외. 사이드바나 타임라인을 사용해 특정 작업을 자세히 들여다볼 수 있습니다. 예를 들어, 에이전트가 LLM에 어떤 프롬프트를 보냈고 어떤 응답을 받았는지 확인할 수 있습니다. 이 트레이스 뷰는 CrewAI 애플리케이션의 동작을 디버깅하고 이해하기 위한 기본 도구입니다.
이 단계들을 마치면 첫 번째 CrewAI 애플리케이션 트레이싱을 성공적으로 완료한 것입니다. 이후 앱을 반복적으로 개선하면서(프롬프트 조정, 에이전트 로직 수정, 새 도구 추가 등) 다시 실행하고 트레이스를 비교하여 변경 사항이 워크플로에 어떤 영향을 주는지 확인할 수 있습니다. Weave는 프로젝트 이름 아래에서 실행을 자동으로 버전 관리하고 추적하므로, 시간 경과에 따른 개선 정도를 측정할 수 있습니다.
이제 기본 동작 방식을 이해했으니, 직접 따라 해볼 수 있는 튜토리얼을 진행해 봅시다.

튜토리얼: CrewAI와 W&B Weave로 고객 지원 분류 시스템 트레이싱

사용 사례: 고객 지원 분류 – 들어오는 고객 문의를 분류하고, 그에 맞는 응답 또는 에스컬레이션을 생성하는 단순화된 멀티 에이전트 시스템을 구축하겠습니다. Using CrewAI 에이전트 오케스트레이션에는 CrewAI를, 관찰 가능성에는 W&B Weave를 사용하면, 우리는 트레이스 각 단계(분류, 가드레일 검사, 응답 생성)를 실시간으로 확인합니다. 이 엔드 투 엔드 튜토리얼에서는 단일 노트북 또는 스크립트에서 시스템을 설정하고, 트레이싱을 위한 계측을 적용하며, Weave에서 실행 과정을 관찰하는 방법을 보여줍니다. GitHub에서도 확인할 수 있습니다. 여기.

설치 및 설정

먼저 필요한 패키지를 설치하고 OpenAI API 키를 준비하세요. LLM 에이전트에는 OpenAI의 GPT 모델을 사용할 것이므로, API 키를 환경 변수로 설정하십시오 (OPENAI_API_KEY). 또한 Weave 대시보드에서 트레이스를 확인할 수 있도록 Weights & Biases 계정에 로그인하거나 가입하세요.
pip install crewai wandb weave datasets openai
필요한 클래스를 임포트하고 스크립트 시작 시 Weave를 초기화하세요. weave.init() 호출하면 트레이싱이 활성화되어 모든 CrewAI 에이전트 상호작용, 작업 실행, LLM 호출이 자동으로 당신의 Weights & Biases 프로젝트에 기록됩니다. 조직마다 고유한 프로젝트 이름을 사용하세요:
import os
import wandb
import weave
from crewai import Agent, Task, Crew, LLM, Process

# Set your OpenAI API key (ensure this is configured; you can also use os.environ)
os.environ["OPENAI_API_KEY"] = "<YOUR_OPENAI_KEY>"

# Initialize Weave for tracing (creates a project for logs)
wandb.login()
weave.init(project_name="customer_support_triage")
(실행한 후 weave.init(), Weave는 프로젝트의 트레이스 대시보드로 연결되는 링크를 출력합니다.)

지원 문의용 샘플 데이터셋 로드하기

예제를 현실적으로 만들기 위해 공개 의도 분류 데이터셋을 사용합니다. 예를 들어, the CLINC150 (clinc_oos) 이 데이터셋에는 은행 관련 문의와, 어떤 알려진 의도에도 해당하지 않는 문의에 대한 “범위 외” 레이블이 포함되어 있습니다. 이 데이터셋을 로드한 뒤, 들어오는 지원 티켓을 시뮬레이션하기 위해 샘플 문의 하나를 선택하겠습니다:
from datasets import load_dataset

# Load the CLINC150 out-of-scope dataset (use the 'imbalanced' version for full label set)
data = load_dataset('DeepPavlov/clinc_oos', 'imbalanced', split='test')
# Choose an example customer query from the dataset
sample = data[42]
user_query = sample['text']
true_category = sample['label_text']
print(f"Sample user query: {user_query}")
print(f"True intent (for reference): {true_category}")
우리 예시에서는 user_query 예를 들어 “급여를 계좌로 바로 입금받으려면 어떻게 설정하나요?” 같은 문장에 의도 라벨이 붙어 있을 수 있습니다. direct_depositAI가 이 문의를 실시간으로 분류하도록 하겠습니다.
다음과 같은 내용을 보게 됩니다:


CrewAI 에이전트와 태스크 정의하기

다음으로, 분류 시스템에 사용할 AI 에이전트와 태스크를 정의합니다. 에이전트 두 개를 만들겠습니다:
  • 분류 에이전트: 문의의 범주(의도)를 판별합니다. 단순화를 위해 LLM을 사용해 문의를 알려진 지원 의도 중 하나로 분류합니다(예: 직접 입금, 카드 활성화, 사기 신고, 등), 또는 어떤 범주에도 맞지 않으면 “범위 외”로 표시합니다.
  • 응답 에이전트: 분류된 범주를 바탕으로 유용한 응답을 생성합니다. 문의가 알려진 범주에 속하면, 이 에이전트가 답변을 시도합니다. 범주가 범위 외 (또는 분류 신뢰도가 낮은 경우) 사람 상담원에게 이관하는 것을 모사하여, 에스컬레이션 안내 메시지로 응답합니다.
두 에이전트는 동일한 LLM 백엔드(이 경우 OpenAI GPT)를 사용합니다. 재현성을 위해 LLM을 결정론적 설정(temperature 0)으로 구성합니다:
# Create a deterministic LLM instance (using OpenAI's GPT-3.5 Turbo model)
llm = LLM(model="gpt-4o", temperature=0)

# Define the Classifier agent
classifier = Agent(
role="Support Classifier",
goal="Identify the category of the customer's query (e.g., billing, account, card issue, or out-of-scope)",
backstory="A customer support AI specialized in triaging requests by intent.",
llm=llm,
verbose=True
)

# Define the Responder agent
responder = Agent(
role="Support Agent",
goal="Provide a helpful response to the customer based on the query category, or escalate if out-of-scope.",
backstory="An AI assistant that answers customer questions or escalates them to a human if it cannot handle them.",
llm=llm,
verbose=True
)
이제 각 에이전트의 작업을 정의하십시오. 각 작업 CrewAI에서 에이전트가 수행해야 할 작업과 기대되는 출력을 설명합니다. 작업 설명에는 플레이스홀더를 사용해 동적 입력을 주입합니다. 예를 들어, 분류기 작업에는 사용자의 쿼리를 포함하고, 응답자 작업에는 원본 쿼리와 예측된 범주를 모두 사용합니다:
# Task 1: Classification Task

classification_task = Task(
description=(
"Classify the customer query into a support category. Query: \"{query}\"\n"
"Return ONLY the category name from this list: direct_deposit, card_issue, billing, fraud, atm_support, transfer, oos"
),
expected_output="A single category name only (e.g., 'transfer' or 'billing' or 'oos').",
agent=classifier
)

# Task 2: Response Generation Task
response_task = Task(
description=(
"You have the user's query and the classification result in your context. "
"Based on that, write either a helpful answer or an escalation notice."
),
expected_output="A support reply or escalation message.",
agent=responder,
context=[classification_task],
)
에서 response_task.description 위에서는 에이전트가 어떻게 동작해야 하는지를 보여주기 위해, 이해를 돕는 jinja 유사 의사코드를 사용해 로직을 개략적으로 제시했습니다. 분류 결과가 "oos"이면 에스컬레이션 안내로 응답하고, 그렇지 않으면 답변을 제공합니다. (참고: CrewAI는 기본적으로 …을(를) 파싱하지 않습니다 {% if %} 문법—이는 설명을 위한 것입니다. 실제로는 아래의 가드레일 함수로 에스컬레이션 로직을 처리합니다.)

폴백 로직을 위한 가드레일 추가

선택적 폴백 동작을 포착하고 시스템의 견고성을 보장하기 위해, 우리는 …을(를) 구현합니다. 가드레일 분류 작업에서, 가드레일은 진행 전에 분류기의 출력을 검증하는 단순한 Python 함수입니다. 예측된 범주가 유효하고 신뢰도가 충분한지 확인하고, 그렇지 않으면 실패로 표시한 뒤 시스템에 에스컬레이션하도록 지시합니다.
우리는 …을(를) 사용합니다 @weave.op 가드레일 함수에 데코레이터를 적용해 Weave가 실행 과정을 트레이싱하도록 합니다. 이렇게 하면 가드레일 점검의 입력과 출력이 트레이스에 나타나며, 오분류를 디버깅하는 데 도움이 됩니다.
from typing import Tuple, Any

@weave.op(name="guardrail_validate_classification")
def validate_classification(result: Any) -> Tuple[bool, Any]:
"""
Guardrail check for classification task.
Returns (True, cleaned_result) if category is valid, or (False, error_info) if invalid.
"""
try:
# Extract the raw output from the result
if hasattr(result, 'raw'):
category = str(result.raw).strip()
else:
# Fallback if structure is different
category = str(result).strip()
# List of known categories
known_categories = ["direct_deposit", "card_issue", "billing", "fraud", "atm_support", "transfer", "oos"]
if category not in known_categories:
# If the classifier gave something unexpected, flag it
return (False, {"error": f"Unknown category '{category}'", "code": "CLASSIFICATION_ERROR"})
if category == "oos":
# Out-of-scope category triggers fallback/escalation
return (False, {"error": "Query is out-of-scope", "code": "ESCALATION_TRIGGER"})
# If valid and in-scope, return cleaned category
return (True, category)
except Exception as e:
return (False, {"error": "Exception in guardrail", "code": "SYSTEM_ERROR", "details": str(e)})
이 가드레일을 분류 작업에 연결합니다. 이렇게 설정하면, 분류기 에이전트가 출력을 생성한 뒤에 validate_classification 실행됩니다. False를 반환하면(예: …의 경우) "oos" 또는 알 수 없는 결과)인 경우, Crew는 분류 작업이 검증에 실패했음을 인식합니다. 우리의 단순한 순차 프로세스에서는 여전히 응답 작업으로 진행하지만, 이 신호를 활용해 동작을 조정할 수도 있습니다(예를 들어, 응답자가 오류 플래그를 감지하고 미리 준비된 에스컬레이션 메시지를 출력하도록 할 수 있습니다).
# Attach the guardrail to the classification task
classification_task.guardrail = validate_classification
가드레일에 데코레이터를 적용하면 @weave.op가드레일이 실행되면 Weave에 실행 기록이 남고, 입력값(분류기의 원시 출력)과 점검 결과가 모두 표시됩니다. 이는 가시성 확보에 매우 중요합니다. 트레이스에서 검증 로직이 잘못 라우팅된 쿼리를 실제로 포착했는지 확인할 수 있기 때문입니다.

Crew 초기화 및 워크플로 시작

이제 에이전트와 작업을 하나로 묶어 크루순차 프로세스를 사용하여 분류기가 먼저 실행되고, 그다음에 응답기가 실행되도록 하겠습니다. 마지막으로 호출합니다 crew.kickoff() 사용자 쿼리를 입력으로 받아, CrewAI 프레임워크가 전달을 처리하고 {query} 작업에 플레이스홀더를 넣고 에이전트 상호작용을 관리합니다:"
# Create the crew with the two agents and their tasks in order
crew = Crew(
agents=[classifier, responder],
tasks=[classification_task, response_task],
process=Process.sequential, # tasks will run sequentially
verbose=True
)

# Run the crew on the sample query
result = crew.kickoff(inputs={"query": user_query})
print("\nFinal output from Responder agent:\n", result)
언제 crew.kickoff 가 실행되면 W&B Weave가 크루 실행의 각 단계를 자동으로 트레이싱합니다. 여기에 포함되는 항목은 다음과 같습니다: 분류기 LLM 호출의 프롬프트와 출력, 가드레일 함수의 입력과 판단 결과, 그리고 응답기 LLM 호출의 프롬프트와 출력. 또한 토큰 수, 지연 시간, 오류와 같은 메타데이터도 함께 기록됩니다. 완결성을 위해 최종 결과를 출력했지만, 진짜 인사이트는 Weave UI에서 트레이스를 자세히 살펴볼 때 얻을 수 있습니다.

Weave에서 트레이스 관찰하기

스크립트가 실행되면, 출력에 표시된 Weave 링크를 클릭해 사용할 수 있습니다 weave.init)를 클릭해 트레이스 시각화를 엽니다.

실행 단계의 그래프가 표시되어야 합니다. 분류기 에이전트 노드가 가드레일 검사로 이어지고, 그다음에 응답기 에이전트 노드가 나타납니다. 각 노드는 펼쳐서 입력, 출력, 토큰 사용량이나 모델 지연 시간 같은 추가 세부정보를 확인할 수 있습니다.
실패 상태를 활용해 프롬프트를 디버깅하고 문제를 해결했으며, 분류기가 정상적으로 실행되도록 할 수 있었습니다.
트레이스에서 확인해야 할 핵심 사항:"
  • 분류 단계: 분류기의 프롬프트(사용자의 쿼리가 포함되어 있어야 합니다)와 예측한 카테고리를 확인하세요. 예시에서는 다음과 같은 값을 기대합니다. "direct_deposit" 출력으로서
  • 가드레일 검사: 가드레일 함수 validate_classification 단계로 표시됩니다. 카테고리가 유효하고 "oos"가 아니면 True와 함께 해당 카테고리를 반환합니다. False를 반환한 경우(예: 카테고리가 "oos")에서 오류 코드(ESCALATION_TRIGGER트레이스에 표시됩니다. 이렇게 하면 시스템이 에스컬레이션을 결정하는 시점을 쉽게 파악할 수 있습니다.
  • 응답 생성: 응답자 에이전트의 단계에는 최종 답변이 표시됩니다. 쿼리를 적절히 처리했는지 확인하세요. 예를 들어, 카테고리가 직접 예치의 경우, 답변에는 자동이체 설정 단계가 나열될 수 있습니다. 카테고리가 범위 밖이었다면, 답변은 우리 에이전트의 목표와 로직에 따라 정중한 에스컬레이션 메시지가 되었을 것입니다.
추가 로깅 코드를 작성할 필요 없이, 다음을 사용하기만 하면 모든 단계가 자동으로 캡처됩니다 weave.init() 그리고 @weave.op 데코레이터, Weave는 CrewAI 작업과 LLM 호출을 자동으로 추적합니다UI에서 호출별 지연 시간이나 토큰 수와 같은 성능 지표를 모니터링할 수 있으며, Weave의 비교 도구를 사용해 실행 결과를 나란히 평가할 수도 있습니다.
이 튜토리얼에서는 간단한 두 개의 에이전트로 구성된 CrewAI 애플리케이션을 만들고, W&B Weave 트레이싱을 활성화하여 동작을 관찰했습니다. 고객 지원 문의가 분류와 응답 생성 단계를 거쳐 흐르는 과정을 보여 주었고, 불확실한 경우를 대비해 가드레일이 안전망 역할을 하는 방식도 시연했습니다. 이 예시는 더 정교한 에이전트(예: 지식 베이스를 활용한 답변), 더 많은 가드레일(콘텐츠 정책 준수, 비즈니스 로직 검증 등), 또는 복잡한 워크플로를 위한 조건부 태스크 라우팅으로 확장할 수 있습니다.

CrewAI로 멀티 에이전트 워크플로를 구축하고 오케스트레이션하기

CrewAI의 핵심은 멀티 에이전트 워크플로를 구축하고 오케스트레이션하는 것입니다. 즉, 여러 AI 에이전트가 협업하여 복잡한 목표를 달성하도록 돕는 프레임워크입니다. 지금까지 우리는 에이전트, 태스크, 도구, 가드레일 같은 개별 요소를 살펴보았습니다. 이제 시야를 넓혀, CrewAI로 전체 멀티 에이전트 애플리케이션을 어떻게 구성하는지, 그리고 오케스트레이션을 위해 어떤 패턴을 지원하는지 알아보겠습니다.
가장 단순한 수준에서, CrewAI로 멀티 에이전트 워크플로를 오케스트레이션한다는 것은 크루(에이전트들과 그들의 태스크로 이루어진 그룹)를 정의하고 실행을 시작하는 것을 의미합니다. 크루는 여러 에이전트가 목표를 향해 대체로 자율적으로 작업하면서, 필요할 때 서로 정보를 주고받는 시나리오에 특히 적합합니다. 예를 들어, 다음과 같은 구성을 사용할 수 있습니다 관리자 에이전트가 하위 작업을 연구원, 분석가, 작가 등 전문 에이전트에게 위임하는 방식으로, 실제 회사 팀이 일하는 방식과 유사합니다. CrewAI의 Process 설정을 통해 태스크를 순차적으로, 병렬로, 또는 계층 구조로 할당·실행할 방식을 선택할 수 있으므로 워크플로를 유연하게 설계할 수 있습니다(순차 실행은 단순하지만, 병렬 실행은 서로 의존하지 않는 태스크들을 동시에 처리할 수 있습니다).
더 복잡하거나 엄격한 제어가 필요한 워크플로의 경우, CrewAI는 Flow 추상화를 제공합니다. Flow는 데코레이터로 정의하는 구조화된 자동화로, 각 단계(조건 분기, 반복, 이벤트 기반 트리거 등)에 대해 세밀한 제어가 가능합니다. 결정적 실행 순서가 필요하거나 외부 트리거와의 통합이 요구될 때 Flow를 사용할 수 있습니다. 특히 Flow는 Crew와 매끄럽게 통합되며, Flow 안에서 Crew를 호출하거나 그 반대로도 가능합니다. 즉, 에이전트 크루의 상위 수준 자율성과 Flow의 하위 수준 로직 강제화를 결합할 수 있다는 뜻입니다. CrewAI 문서의 가이드는 다음과 같습니다: 개방형 협업 문제 해결에는 Crew를, 정밀하고 감사 가능한 제어가 필요할 때는 Flow를 사용하세요. 또는 두 가지를 조합해 최고의 결과를 얻을 수도 있습니다.
실무에서는 멀티 에이전트 워크플로를 구성할 때 여러 개의 Crew와 Flow가 함께 쓰일 수 있습니다. 예를 들어 특정 이벤트(예: 신규 데이터가 도착함)를 감지하는 Flow를 두고, 트리거되면 해당 데이터를 분석하고 보고서를 생성하도록 Crew를 실행할 수 있습니다. Weave와의 통합은 Crew와 Flow 모두를 포괄하므로, 에이전트가 Crew의 kickoff로 오케스트레이션되든 Flow의 이벤트 핸들러로 실행되든 모든 단계가 추적됩니다. Weave는 자동으로 패치하여 Flow.kickoff 엔트리 포인트와 Flow 데코레이터(@start, @router, @listen등)를 자동으로 패치하므로, Crew에서와 동일한 수준의 가시성을 Flow에서도 확보할 수 있습니다. 이는 프로덕션 환경에서 멀티 에이전트 시스템을 오케스트레이션하기에 매우 유용합니다. 예를 들어 장시간 실행되는 Flow가 주기적으로 에이전트 Crew를 호출하도록 구성하고, 이 모든 과정을 하나의 통합 대시보드에서 모니터링할 수 있습니다.
배포와 통합 관점에서 보면, CrewAI는 상당히 유연합니다. Python을 지원하는 로컬 머신이나 어떤 환경에서든 CrewAI 워크플로를 실행할 수 있습니다. 클라우드 통합의 경우, 웹 서비스의 일부로 Flow를 호출하거나 비동기 Crew를 사용할 수 있습니다. CrewAI Enterprise 플랫폼은 한 단계 더 나아가 관리형 배포 옵션을 제공합니다. 예를 들어 몇 번의 클릭만으로 클라우드 인프라에 Crew를 배포할 수 있고, 코드를 작성��지 않고도 Crew를 설계하고 실행할 수 있는 Crew Studio(노코드/로우코드 인터페이스)를 제공합니다. 엔터프라이즈 기능에는 Slack, Jira 등과 같은 서비스와의 내장 통합(에이전트가 해당 시스템과 상호작용할 수 있도록 함)과, 배포된 Crew와 프로그래매틱하게 상호작용하기 위한 API도 포함됩니다. 요약하면, 노트북에서 로컬로 워크플로를 오케스트레이션하든, 프로덕션 환경에서 대규모 멀티 에이전트 시스템을 배포하든, CrewAI는 이를 위한 도구를 제공하며, Weave는 전 과정에서 관찰 가능성을 보장합니다.

멀티 에이전트 워크플로의 활용 사례

멀티 에이전트 워크플로는 다양한 산업과 도메인에서 폭넓은 활용 사례를 열어 줍니다. 다음은 CrewAI의 오케스트레이션 강점이 빛나는 대표적인 시나리오들입니다:
  • 자동화된 리서치와 리포팅 – 에이전트 팀이 여러 출처에서 정보를 협업으로 수집하고 데이터를 분석한 뒤, 최소한의 인간 개입으로 종합 보고서를 만들어낼 수 있습니다. 예를 들어 한 에이전트는 문헌과 뉴스를 검색하고, 다른 에이전트는 결과를 해석해 요약하며, 세 번째 에이전트가 최종 보고서를 편집·작성합니다. 이는 시장 조사, 학술 연구 리뷰, 경쟁 정보 수집 같은 분야에서 유용합니다.
  • 콘텐츠 제작 파이프라인 – 모든 작업을 단일 AI가 처리하게 하기보다, 콘텐츠 제작의 각 단계에 특화된 에이전트를 배정할 수 있습니다. 예를 들어, a 연구자 에이전트가 사실을 수집하고, 개요 작성기 글의 구조를 잡고, 작가 콘텐츠를 초안 작성하고, 그리고 한 에디터 에이전트가 초안을 다듬고 검수합니다. 이러한 역할 분담은 단일 에이전트 방식보다 훨씬 효율적으로 더 높은 품질의 기사, 마케팅 카피, 문서를 만들어낼 수 있습니다.
  • 고객 지원 자동화 – 멀티 에이전트 구성은 복잡한 고객 서비스 업무를 처리할 수 있습니다. 예를 들어, 당신은 a 분류 담당자 수신되는 지원 문의를 분류하는 에이전트가 먼저 작업한 뒤, 청구 문제나 기술 문제 해결에 특화된 에이전트 등에게 적절히 위임합니다. 필요하면 에이전트가 더 고급 에이전트나 사람에게 문의를 에스컬레이션할 수도 있습니다. 이러한 크루는 24시간 365일 운영될 수 있어 전자상거래나 IT 서비스 같은 업계에서 응답 시간과 지원의 일관성을 향상시킵니다.
  • 비즈니스 인텔리전스와 데이터 분석 – 비즈니스 인텔리전스 시나리오에서는 서로 다른 에이전트가 각기 다른 데이터 소스나 분석 방법에 집중한 뒤, 그 인사이트를 결합할 수 있습니다. 예를 들어, 한 에이전트는 시장 동향 데이터를 분석하고, 다른 에이전트는 고객 피드백을 파싱하며, 또 다른 에이전트는 매출 지표를 검토합니다. 이후 매니저 에이전트가 이러한 결과를 취합해 의사결정자에게 제공할 일관된 분석으로 정리할 수 있습니다. 이러한 멀티 에이전트 접근은 분석 팀이 업무를 분담하는 방식을 반영하며, 더 빠르게 포괄적인 인텔리전스 보고서를 도출할 수 있습니다.
  • 소프트웨어 개발 지원 – AI 에이전트가 협업하여 소프트웨어 개발 작업을 가속할 수 있습니다. 명세를 기반으로 코드를 생성하는 에이전트, 코드를 리뷰하거나 테스트하는 에이전트, 그리고 해당 코드의 문서를 작성하는 에이전트를 구성할 수 있습니다. 이 에이전트들을 오케스트레이션하면 요구사항부터 테스트된 코드까지 이어지는 자동화된 워크플로를 만들 수 있습니다. 이는 빠른 프로토타이핑이나, 반복적인 코딩·문서화 작업을 대신 처리해 개발자를 보조하는 데에 유용합니다.
이 예시들은 빙산의 일각에 불과합니다. 금융 분석(위험 분석, 예측 등), 제품 R&D(아이디어 발굴, 타당성 분석, 다중 에이전트 기반 프로토타이핑), 교육(여러 전문가 에이전트를 통한 커리큘럼 생성) 등 다른 분야에서도 협업형 멀티 에이전트 접근의 이점을 얻을 수 있습니다. 공통점은 복잡하고 다면적인 작업을 쪼개어, 특화된 AI 에이전트들이 협력하여 해결할 수 있다는 점입니다. CrewAI는 이러한 에이전트 팀을 구축하기 위한 프레임워크를 제공하며, Weave 같은 트레이싱 도구를 활용하면 개발자는 이 팀들이 정확하고 효율적으로 동작하는지를 보장할 수 있습니다.

결론

W&B Weave로 CrewAI 애플리케이션을 트레이싱하는 것은 복잡한 멀티 에이전트 시스템을 구축하고 신뢰하기 위한 핵심입니다. 한 줄짜리 계측 코드만 추가하면 weave.init() 그리고 사용자 정의 로직에 간단히 데코레이터를 적용해 @weave.op(), 자동으로 다음을 캡처합니다:
  • 에이전트 상호작용 (프롬프트, 응답, 토큰 사용량)
  • 가드레일 점검 (검증, 폴백, 에스컬레이션)
  • 작업 오케스트레이션 (크루 전반의 작업 흐름)
엔드 투 엔드 고객 지원 분류 튜토리얼에서는 하나의 노트북 안에서 데이터셋 로딩, 분류기 에이전트와 응답자 에이전트 정의, 가드레일 추가, Crew 시작까지 진행해 완전한 트레이스를 얻는 전 과정을 단계별로 보여드렸습니다. 이 기반 위에서 이제는 프롬프트를 수정하고, 가드레일을 조정하거나, 새로운 에이전트 역할을 추가하는 등의 반복 개선을 빠르게 수행할 수 있으며, 그 영향은 Weave의 시각적 트레이스 UI에서 즉시 확인할 수 있습니다.
더 깊이 탐구하고 싶은 분들을 위해, 고급 기능 섹션에서는 외부 도구와 더욱 정교한 CrewAI 패턴(Crews ↔ Flows 통합, 조건부 라우팅 등)을 활용해 에이전트를 강화하는 방법을 다루며, 이 모든 과정이 Weave에서 완전하게 트레이싱됩니다.
결국 트레이싱은 디버깅을 넘어, 당신의 AI “크루”를 신뢰할 수 있는 프로덕션급 시스템으로 바꾸는 피드백 루프입니다. 만들고, 관찰하고, 학습하고, 개선하세요. 그것이 CrewAI + W&B Weave를 최대한 활용하는 방법입니다. 즐거운 트레이싱 되세요!


이 글은 AI로 번역된 기사입니다. 오역이 의심되는 부분이 있다면 댓글로 알려주세요. 원문 링크는 다음과 같습니다: 원문 보고서 보기