Tasks
CrewAI 프레임워크 내에서 작업을 관리하고 생성하는 방법에 대한 상세 가이드
Task 개요
CrewAI 프레임워크에서 Task
는 Agent
가 수행하는 특정 작업을 의미한다.
Task는 설명, 담당 Agent, 필요한 도구 등 실행에 필요한 모든 세부 정보를 제공한다. 이를 통해 다양한 복잡도의 작업을 처리할 수 있다.
CrewAI의 Task는 여러 Agent가 협력해야 하는 경우도 있다. Task 속성을 통해 이를 관리하며, Crew의 프로세스가 조율하여 팀워크와 효율성을 높인다.
작업 실행 흐름
작업은 두 가지 방식으로 실행할 수 있다:
- 순차적: 정의된 순서대로 작업을 실행
- 계층적: 에이전트의 역할과 전문성에 따라 작업을 할당
실행 흐름은 크루를 생성할 때 정의한다:
태스크 속성
속성 | 파라미터 | 타입 | 설명 |
---|---|---|---|
설명 | description | str | 태스크의 내용을 명확하고 간결하게 설명한다. |
예상 출력 | expected_output | str | 태스크 완료 시 기대하는 결과를 상세히 기술한다. |
이름 (선택) | name | Optional[str] | 태스크를 식별하기 위한 이름이다. |
에이전트 (선택) | agent | Optional[BaseAgent] | 태스크 실행을 담당하는 에이전트이다. |
도구 (선택) | tools | List[BaseTool] | 태스크 수행에 사용할 수 있는 도구나 리소스를 제한한다. |
컨텍스트 (선택) | context | Optional[List["Task"]] | 이 태스크에 컨텍스트로 사용될 다른 태스크의 출력이다. |
비동기 실행 (선택) | async_execution | Optional[bool] | 태스크를 비동기적으로 실행할지 여부를 결정한다. 기본값은 False이다. |
사람 입력 (선택) | human_input | Optional[bool] | 에이전트의 최종 답변을 사람이 검토할지 여부를 결정한다. 기본값은 False이다. |
설정 (선택) | config | Optional[Dict[str, Any]] | 태스크별 설정 파라미터이다. |
출력 파일 (선택) | output_file | Optional[str] | 태스크 출력을 저장할 파일 경로이다. |
출력 JSON (선택) | output_json | Optional[Type[BaseModel]] | JSON 출력을 구조화하기 위한 Pydantic 모델이다. |
출력 Pydantic (선택) | output_pydantic | Optional[Type[BaseModel]] | 태스크 출력을 위한 Pydantic 모델이다. |
콜백 (선택) | callback | Optional[Any] | 태스크 완료 후 실행할 함수나 객체이다. |
작업 생성하기
CrewAI에서 작업을 생성하는 방법은 두 가지가 있다: YAML 설정 파일 사용(권장) 또는 코드에서 직접 정의하는 방법이다.
YAML 설정 (권장)
YAML 설정을 사용하면 작업을 정의하는 더 깔끔하고 유지보수하기 쉬운 방법을 제공한다. CrewAI 프로젝트에서 작업을 정의할 때 이 방법을 적극 권장한다.
설치 섹션에서 설명한 대로 CrewAI 프로젝트를 생성한 후, src/latest_ai_development/config/tasks.yaml
파일로 이동해 템플릿을 수정하여 특정 작업 요구사항에 맞게 조정한다.
YAML 파일의 변수(예: {topic}
)는 crew를 실행할 때 입력값으로 대체된다:
다음은 YAML을 사용해 작업을 구성하는 예제이다:
이 YAML 설정을 코드에서 사용하려면 CrewBase
를 상속받는 crew 클래스를 생성한다:
YAML 파일(agents.yaml
및 tasks.yaml
)에서 사용하는 이름은 Python 코드의 메서드 이름과 일치해야 한다.
직접 코드로 정의하기 (대안)
YAML 설정 없이 코드에서 직접 작업을 정의할 수도 있다:
agent
를 직접 지정하거나, hierarchical
CrewAI 프로세스가 역할, 가용성 등을 기반으로 결정하도록 할 수 있다.
작업 출력 이해하기
작업 출력을 이해하는 것은 효과적인 AI 워크플로우를 구축하는 데 중요하다. CrewAI는 TaskOutput
클래스를 통해 작업 결과를 구조화된 방식으로 처리하며, 다양한 출력 포맷을 지원하고 작업 간에 쉽게 전달할 수 있다.
CrewAI 프레임워크에서 작업의 출력은 TaskOutput
클래스로 캡슐화된다. 이 클래스는 작업 결과에 접근할 수 있는 구조화된 방식을 제공하며, raw 출력, JSON, Pydantic 모델 등 다양한 포맷을 지원한다.
기본적으로 TaskOutput
은 raw
출력만 포함한다. pydantic
또는 json_dict
출력은 원래 Task
객체가 output_pydantic
또는 output_json
으로 구성된 경우에만 포함된다.
작업 출력 속성
속성 | 매개변수 | 타입 | 설명 |
---|---|---|---|
설명 | description | str | 작업에 대한 설명 |
요약 | summary | Optional[str] | 작업의 요약, 설명의 첫 10단어에서 자동 생성 |
원본 | raw | str | 작업의 원본 출력. 이는 출력의 기본 형식 |
Pydantic | pydantic | Optional[BaseModel] | 작업의 구조화된 출력을 나타내는 Pydantic 모델 객체 |
JSON 딕셔너리 | json_dict | Optional[Dict[str, Any]] | 작업의 JSON 출력을 나타내는 딕셔너리 |
에이전트 | agent | str | 작업을 실행한 에이전트 |
출력 형식 | output_format | OutputFormat | 작업 출력의 형식. RAW, JSON, Pydantic 중 선택 가능. 기본값은 RAW |
작업 메서드와 속성
메서드/속성 | 설명 |
---|---|
json | 출력 형식이 JSON일 경우, 작업 출력의 JSON 문자열 표현을 반환한다. |
to_dict | JSON 및 Pydantic 출력을 딕셔너리로 변환한다. |
str | 작업 출력의 문자열 표현을 반환한다. Pydantic, JSON, 원시 데이터 순으로 우선순위를 둔다. |
태스크 출력에 접근하기
태스크가 실행된 후, Task
객체의 output
속성을 통해 출력 결과에 접근할 수 있다. TaskOutput
클래스는 이 출력 결과를 다루고 표현하는 다양한 방법을 제공한다.
예제
작업 의존성과 컨텍스트
작업은 context
속성을 사용해 다른 작업의 출력에 의존할 수 있다. 예를 들어:
태스크 가드레일
태스크 가드레일은 한 태스크의 출력을 다음 태스크로 전달하기 전에 검증하고 변환하는 방법을 제공한다. 이 기능은 데이터 품질을 보장하고, 에이전트의 출력이 특정 기준을 충족하지 못할 때 피드백을 제공하는 데 유용하다.
태스크 가드레일 사용하기
태스크에 가드레일을 추가하려면 guardrail
파라미터를 통해 검증 함수를 제공한다:
가드레일 기능 요구사항
-
함수 시그니처:
- 반드시 하나의 파라미터만 받아야 함 (태스크 출력값)
(bool, Any)
형태의 튜플을 반환해야 함- 타입 힌트는 권장되지만 필수는 아님
-
반환값:
- 성공 시:
(True, 검증된_결과)
반환 - 실패 시:
(False, 오류_상세정보)
반환
- 성공 시:
에러 처리 모범 사례
- 구조화된 에러 응답:
-
에러 카테고리:
- 구체적인 에러 코드 사용
- 관련 컨텍스트 포함
- 실행 가능한 피드백 제공
-
검증 체인:
가드레일 결과 처리
가드레일이 (False, error)
를 반환하면:
- 에러를 에이전트에게 전달한다
- 에이전트가 문제를 해결하려고 시도한다
- 다음 중 하나가 발생할 때까지 이 과정을 반복한다:
- 가드레일이
(True, result)
를 반환한다 - 최대 재시도 횟수에 도달한다
- 가드레일이
재시도 처리를 포함한 예제:
구조화된 일관된 출력 얻기
크루의 최종 작업 결과는 크루 자체의 최종 출력이 된다는 점을 주목해야 한다.
output_pydantic
사용하기
output_pydantic
속성을 사용하면 작업의 출력이 준수해야 하는 Pydantic 모델을 정의할 수 있다. 이를 통해 출력이 구조화될 뿐만 아니라 Pydantic 모델에 따라 검증된다.
다음은 output_pydantic
을 사용하는 예제이다:
이 예제에서:
title
과content
필드를 가진 Pydantic 모델Blog
를 정의했다.task1
작업은output_pydantic
속성을 사용해 출력이Blog
모델을 준수하도록 지정했다.- 크루를 실행한 후, 여러 가지 방법으로 구조화된 출력에 접근할 수 있다.
출력값에 접근하는 방법 설명
- 딕셔너리 스타일 인덱싱:
result["field_name"]
을 사용해 필드에 직접 접근할 수 있다. 이는 CrewOutput 클래스가__getitem__
메서드를 구현했기 때문에 가능하다. - Pydantic 모델에서 직접 접근:
result.pydantic
객체에서 속성을 직접 접근한다. to_dict()
메서드 사용: 출력값을 딕셔너리로 변환한 후 필드에 접근한다.- 전체 객체 출력:
result
객체를 그대로 출력해 구조화된 결과를 확인한다.
output_json
사용하기
output_json
속성을 사용하면 JSON 형식으로 예상 출력을 정의할 수 있다. 이를 통해 작업의 출력이 유효한 JSON 구조로 반환되도록 보장하며, 애플리케이션에서 쉽게 파싱하고 활용할 수 있다.
다음은 output_json
을 사용하는 예제다:
이 예제에서:
title
과content
필드를 가진 Pydantic 모델Blog
를 정의하여 JSON 출력의 구조를 명시한다.- 작업
task1
은output_json
속성을 사용해Blog
모델에 맞는 JSON 출력을 기대함을 나타낸다. - 크루를 실행한 후, 구조화된 JSON 출력에 접근하는 두 가지 방법을 보여준다.
출력에 접근하는 방법 설명
- 딕셔너리 스타일 인덱싱을 사용해 속성에 접근하기:
result["field_name"]
과 같은 방식으로 필드에 직접 접근할 수 있다. 이는CrewOutput
클래스가__getitem__
메서드를 구현하고 있어 출력을 딕셔너리처럼 다룰 수 있기 때문이다. 이 옵션에서는title
과content
를result
에서 가져온다. - 전체 블로그 객체 출력하기:
result
를 출력하면CrewOutput
객체의 문자열 표현을 얻을 수 있다.__str__
메서드가 JSON 출력을 반환하도록 구현되어 있기 때문에, 이는 블로그 객체를 나타내는 포맷된 문자열로 전체 출력을 보여준다.
output_pydantic
또는 output_json
을 사용하면 여러분의 작업이 일관되고 구조화된 형식으로 출력을 생성하도록 보장할 수 있다. 이를 통해 애플리케이션 내부나 여러 작업 간에 데이터를 더 쉽게 처리하고 활용할 수 있다.
도구와 작업 통합하기
CrewAI Toolkit과 LangChain Tools에서 제공하는 도구를 활용해 작업 성능과 에이전트 상호작용을 강화한다.
도구를 사용하여 작업 생성하기
이 예제는 특정 도구를 사용하여 작업을 생성할 때, 에이전트의 기본 설정을 재정의하여 맞춤형 작업 실행을 보여준다.
다른 태스크 참조하기
CrewAI에서는 한 태스크의 출력이 자동으로 다음 태스크로 전달된다. 하지만 특정 태스크의 출력을 다른 태스크의 컨텍스트로 사용하고 싶을 때, 여러 태스크의 출력을 명시적으로 정의할 수 있다.
이 기능은 특정 태스크가 바로 다음에 실행되지 않는 다른 태스크의 출력에 의존할 때 유용하다. 이를 위해 태스크의 context
속성을 사용한다:
비동기 실행
작업을 비동기적으로 실행하도록 정의할 수 있다. 이는 크루가 해당 작업이 완료될 때까지 기다리지 않고 다음 작업을 계속 진행한다는 의미다. 이 방법은 완료까지 오랜 시간이 걸리거나 다음 작업을 수행하는 데 반드시 필요하지 않은 작업에 유용하다.
나중에 실행될 작업에서 context
속성을 사용하여 비동기 작업의 출력이 완료될 때까지 기다리도록 정의할 수 있다.
콜백 메커니즘
콜백 함수는 작업이 완료된 후 실행되며, 작업 결과에 따라 특정 동작을 수행하거나 알림을 보낼 수 있다.
특정 작업 결과에 접근하기
크루의 실행이 완료되면, 작업 객체의 output
속성을 사용해 특정 작업의 결과에 접근할 수 있다:
도구 재정의 메커니즘
작업에 도구를 지정하면 에이전트의 능력을 동적으로 조정할 수 있다. 이를 통해 CrewAI의 유연성을 극대화한다.
오류 처리와 검증 메커니즘
태스크를 생성하고 실행할 때, 태스크 속성의 견고성과 신뢰성을 보장하기 위해 여러 검증 메커니즘이 적용된다. 주요 검증 사항은 다음과 같다:
- 각 태스크에 대해 하나의 출력 타입만 설정하도록 하여 출력 결과에 대한 명확한 기대를 유지한다.
- 고유 식별자 시스템의 무결성을 유지하기 위해
id
속성을 수동으로 할당하지 못하도록 방지한다.
이러한 검증 메커니즘은 crewAI 프레임워크 내에서 태스크 실행의 일관성과 신뢰성을 유지하는 데 도움을 준다.
태스크 가드레일
태스크 가드레일은 한 태스크의 출력 결과를 다음 태스크로 전달하기 전에 검증, 변환, 필터링하는 강력한 방법을 제공한다. 가드레일은 선택적으로 사용하는 함수로, 다음 태스크가 시작되기 전에 실행된다. 이를 통해 태스크 출력이 특정 요구사항이나 형식을 충족하는지 확인할 수 있다.
기본 사용법
가드레일 작동 방식
- 선택적 속성: 가드레일은 작업 수준에서 선택적으로 추가할 수 있는 속성이다. 필요한 곳에만 검증을 적용할 수 있다.
- 실행 시점: 가드레일 함수는 다음 작업이 시작되기 전에 실행된다. 이를 통해 작업 간에 유효한 데이터 흐름을 보장한다.
- 반환 형식: 가드레일은 반드시
(success, data)
튜플을 반환해야 한다:success
가True
이면data
는 검증되거나 변환된 결과다.success
가False
이면data
는 오류 메시지다.
- 결과 라우팅:
- 성공(
True
) 시 결과는 자동으로 다음 작업으로 전달된다. - 실패(
False
) 시 오류는 에이전트로 전송되어 새로운 답변을 생성한다.
- 성공(
일반적인 사용 사례
데이터 형식 검증
콘텐츠 필터링
데이터 변환
고급 기능
여러 검증을 연결하기
커스텀 재시도 로직
파일 저장 시 디렉토리 생성 기능
이제 작업이 파일에 출력을 저장할 때 디렉토리를 생성할지 여부를 지정할 수 있다. 이 기능은 출력물을 체계적으로 정리하고 파일 경로를 올바르게 구성하는 데 특히 유용하다.
결론
태스크는 CrewAI에서 에이전트의 행동을 이끄는 핵심 요소다. 태스크와 그 결과물을 올바르게 정의하면, AI 에이전트가 독립적으로 또는 협력적으로 효과적으로 작업할 수 있는 기반을 마련할 수 있다. 태스크에 적절한 도구를 제공하고, 실행 과정을 이해하며, 강력한 검증 절차를 따르는 것은 CrewAI의 잠재력을 극대화하는 데 필수적이다. 이를 통해 에이전트가 주어진 과제에 완벽히 대비하고, 태스크가 의도한 대로 실행되도록 보장할 수 있다.