CrewAI Flows를 사용하여 AI 워크플로우를 생성하고 관리하는 방법을 알아보세요.
generate_city
와 generate_fun_fact
두 가지 작업으로 구성된다. generate_city
작업은 Flow의 시작점이고, generate_fun_fact
작업은 generate_city
작업의 출력을 기다린다.
각 Flow 인스턴스는 자동으로 상태에 고유 식별자(UUID)를 받는다. 이 식별자는 Flow 실행을 추적하고 관리하는 데 도움이 된다. 상태는 Flow 실행 동안 지속되는 추가 데이터(생성된 도시와 재미있는 사실 등)도 저장할 수 있다.
Flow를 실행하면 다음과 같은 일이 발생한다:
.env
파일에 OPENAI_API_KEY
를 설정했는지 확인한다. 이 키는 OpenAI API 요청을 인증하는 데 필요하다.
@start()
데코레이터는 메서드를 Flow의 시작점으로 표시한다. Flow가 시작되면 @start()
데코레이터가 붙은 모든 메서드가 병렬로 실행된다. 하나의 Flow에서 여러 개의 시작 메서드를 가질 수 있으며, Flow가 시작될 때 이들 모두가 실행된다.
@listen()
데코레이터는 플로우 내 다른 태스크의 출력을 수신하는 메서드를 표시한다. @listen()
으로 데코레이팅된 메서드는 지정된 태스크가 출력을 내보낼 때 실행된다. 이 메서드는 수신한 태스크의 출력에 접근할 수 있다.
@listen()
데코레이터는 여러 가지 방식으로 사용할 수 있다:
kickoff()
메서드는 이 최종 메서드의 결과를 반환한다.
최종 결과에 접근하는 방법은 다음과 같다:
second_method
가 마지막으로 완료되는 메서드이므로, 이 메서드의 결과가 Flow의 최종 결과가 된다. kickoff()
메서드는 최종 결과를 반환하며, 이 결과는 콘솔에 출력된다.
first_method
와 second_method
가 상태를 업데이트한다. Flow가 실행된 후, 최종 상태에 접근하여 이 메서드들이 수행한 업데이트를 확인할 수 있다.
최종 메서드의 출력을 반환하고 상태에 접근할 수 있도록 함으로써, CrewAI Flow는 AI 워크플로우의 결과를 더 큰 애플리케이션이나 시스템에 통합하기 쉽게 한다. 또한 Flow 실행 중 상태를 유지하고 접근할 수 있다.
Flow
클래스의 state
속성에 저장된다. 이 방식은 개발자가 엄격한 스키마를 정의하지 않고도 상태 속성을 동적으로 추가하거나 수정할 수 있는 유연성을 제공한다. 비정형 상태를 사용하더라도 CrewAI Flows는 각 상태 인스턴스에 대해 고유 식별자(UUID)를 자동으로 생성하고 유지한다.
id
필드는 자동으로 생성되며, 플로우 실행 전반에 걸쳐 유지된다. 이 필드를 수동으로 관리하거나 설정할 필요가 없으며, 새로운 데이터로 상태를 업데이트할 때도 유지된다.
핵심 포인트:
self.state
에 미리 정의된 제약 없이 동적으로 속성을 추가할 수 있다.BaseModel
과 같은 모델을 사용하면 상태의 정확한 구조를 정의할 수 있어, 개발 환경에서 더 나은 검증과 자동 완성 기능을 활용할 수 있다.
CrewAI Flows의 각 상태는 자동으로 고유 식별자(UUID)를 받아 상태 인스턴스를 추적하고 관리한다. 이 ID는 Flow 시스템에 의해 자동으로 생성되고 관리된다.
ExampleState
는 상태 구조를 명확히 정의해 코드의 가독성과 유지보수성을 높인다.id
필드가 없을 경우 자동으로 추가된다.or
or_
함수는 여러 메서드를 동시에 감시하고, 지정된 메서드 중 하나라도 출력을 내면 리스너 메서드를 실행한다.
logger
메서드는 start_method
또는 second_method
중 하나의 출력에 의해 트리거된다. or_
함수는 여러 메서드를 감시하고, 지정된 메서드 중 하나라도 출력을 내면 리스너 메서드를 실행하는 데 사용된다.
and
and_
함수를 사용하면 여러 메서드를 동시에 감시하고, 지정된 모든 메서드가 출력을 내보낼 때만 리스너 메서드를 트리거할 수 있다.
logger
메서드는 start_method
와 second_method
모두가 출력을 내보낼 때만 트리거된다.
and_
함수는 여러 메서드를 감시하고, 지정된 모든 메서드가 출력을 내보낼 때만 리스너 메서드를 실행하는 데 사용된다.
@router()
데코레이터를 사용하면 메서드의 출력값에 따라 조건부 라우팅 로직을 정의할 수 있다. 이를 통해 메서드의 결과에 따라 다른 경로를 지정하고, 실행 흐름을 동적으로 제어할 수 있다.
start_method
는 임의의 불리언 값을 생성해 상태에 설정한다. second_method
는 @router()
데코레이터를 사용해 불리언 값에 따라 조건부 라우팅 로직을 정의한다. 불리언 값이 True
면 "success"
를 반환하고, False
면 "failed"
를 반환한다. third_method
와 fourth_method
는 second_method
의 출력을 기다렸다가 반환된 값에 따라 실행된다.
이 플로우를 실행하면 start_method
에서 생성된 임의의 불리언 값에 따라 출력이 달라진다.
poem_crew
라는 사전 제작된 크루가 포함되어 있다. 이 크루를 템플릿으로 사용해 복사, 붙여넣기, 수정 작업을 통해 다른 크루를 만들 수 있다.
crewai create flow name_of_flow
명령어를 실행한 후, 다음과 같은 폴더 구조를 확인할 수 있다:
디렉토리/파일 | 설명 |
---|---|
name_of_flow/ | 플로우의 루트 디렉토리. |
├── crews/ | 특정 크루를 위한 디렉토리. |
│ └── poem_crew/ | ”poem_crew”를 위한 디렉토리. 여기에는 설정 파일과 스크립트가 포함된다. |
│ ├── config/ | ”poem_crew”의 설정 파일 디렉토리. |
│ │ ├── agents.yaml | ”poem_crew”의 에이전트를 정의하는 YAML 파일. |
│ │ └── tasks.yaml | ”poem_crew”의 태스크를 정의하는 YAML 파일. |
│ ├── poem_crew.py | ”poem_crew”의 기능을 구현한 스크립트. |
├── tools/ | 플로우에서 사용되는 추가 도구를 위한 디렉토리. |
│ └── custom_tool.py | 커스텀 도구 구현 파일. |
├── main.py | 플로우를 실행하는 메인 스크립트. |
├── README.md | 프로젝트 설명과 사용법을 담은 파일. |
├── pyproject.toml | 프로젝트 의존성과 설정을 위한 구성 파일. |
└── .gitignore | 버전 관리에서 무시할 파일과 디렉토리를 지정하는 파일. |
crews
폴더 안에서 여러 크루를 정의할 수 있다. 각 크루는 설정 파일과 크루 정의 파일을 포함하는 고유의 폴더를 가진다. 예를 들어, poem_crew
폴더에는 다음 파일들이 있다:
config/agents.yaml
: 크루에 속한 에이전트를 정의한다.config/tasks.yaml
: 크루에 속한 태스크를 정의한다.poem_crew.py
: 에이전트, 태스크, 그리고 크루 자체를 포함하는 크루 정의 파일이다.poem_crew
를 복사하고 붙여넣어 다른 크루를 만들 수 있다. 필요한 부분을 수정하면 된다.
main.py
에서 크루 연결하기main.py
파일은 여러분의 플로우를 생성하고 크루를 연결하는 곳이다. Flow
클래스와 @start
, @listen
데코레이터를 사용해 실행 흐름을 정의할 수 있다.
다음은 main.py
파일에서 poem_crew
를 연결하는 예제이다:
PoemFlow
클래스는 문장 수를 생성하고, PoemCrew
를 사용해 시를 생성한 후, 이를 파일로 저장하는 플로우를 정의한다. 플로우는 kickoff()
메서드를 호출해 시작한다.
plot()
메서드 사용하기plot()
메서드를 호출해 플롯을 생성할 수 있다. 이 메서드는 플로우의 인터랙티브 플롯을 포함한 HTML 파일을 만든다.
my_flow_plot.html
파일을 생성한다. 웹 브라우저에서 이 파일을 열어 인터랙티브 플롯을 확인할 수 있다.
plot()
메서드와 유사한 플로우 다이어그램이 포함된 HTML 파일이 생성된다. 파일은 프로젝트 디렉토리에 저장되며, 웹 브라우저에서 열어 플로우를 탐색할 수 있다.
plot()
메서드를 사용하든 커맨드라인을 통해 플롯을 생성하든, 워크플로우를 시각적으로 표현하면 개발과 프레젠테이션 모두에 유용하다.