본문 바로가기
  • think normal
새로워지기/마흔의 생활코딩

Agentic | AI 에이전트를 오케스트레이션 프레임워크 CrewAI

by 청춘만화 2024. 5. 2.
Agentic 컨셉 시리즈
  - Agentic Chunking LangChain RAG
  - AI 소프트웨어 엔지니어 DEVIKA
  👉  AI 에이전트를 오케스트레이션 프레임워크 CrewAI

 

 

CrewAI

CrewAI는 롤플레잉 자율 AI 에이전트를 오케스트레이션(매니징)하는 프레임워크이다. LangChan 위에 있는 추상화된 구조라고 보면 될?것 같다. 유사 서비스로는 MS사의 AUTO-GEN이고 음.. 애매하지만 유사한? 컨셉으로는 LangChain의 LangGraph가 있다. 물론 CrewAI와 LangGraph를 병행해서( 다음 포스팅 콘텐츠로 사용할 예정) 사용하는 방법이 있지만 이들이 탄생?한 시기와 컨셉이 Agentic( MOE)이라는 동일한 방향성을 가지고 있음은 크게 다르지 않은 것 같다.

 

Core Concepts

프레임워크의 아키텍트는 에이전트 Agents, 테스크 Tasks, 툴 Tools, 프로세스 Processes, 크루 Crews로 구성되어 있다.

 

1. Agents( Bot)

  • 일종의 개별 퍼소나 또는 유닛
  • 롤플레잉 페르소나 형태로 에이전트 생성
  • 자율 단위 프로그램
    • 작업 수행
    • 의사 결정
    • 다른 에이전트와의 소통
  • 단, 스스로 일을 처리하기보다, 주어진 특정한 일을 수행하는데 집중
  • 주요 속성
    • Role : 툴, 무엇을 할 수 있는지
    • Goal : 도구를 사용하는 방법, 의사결정 가이드라인 설정
    • Backstory : llm을 통해 컨텍스트 세팅, 시스템 프롬프트 제공, 실제 역할에 대한 구체적인 컨텍스트 설정
    • LLM : 기본 설정은 4.0이지만 수정 가능
    • Tools : 에이전트가 사용할 도구 목록을 패키지화
    • Verbose : 디버깅 또는 모니터링 목적으로 에이전트의 실행에 대한 자세한 로깅을 사용 설정(기본은 false)
    • Allow Delegation : 위임
    • max_iter : 무한 반복 막기
    • Step Callback : 각 단계가 끝날 때마다 외부 함수를 호출할 수 있도록 하는 기능
  • 예시 코드
# Example: Creating an agent with all attributes
from crewai import Agent

agent = Agent(
  role='Data Analyst',
  goal='Extract actionable insights',
  backstory="""
	You're a data analyst at a large company.
  	You're responsible for analyzing data and providing insights to the business.
  	You're currently working on a project to analyze the performance of our marketing campaigns.
	""",
  tools=[my_tool1, my_tool2],  # Optional, defaults to an empty list
  llm=my_llm,  # Optional
  function_calling_llm=my_llm,  # Optional
  max_iter=15,  # Optional
  max_rpm=None, # Optional
  verbose=True,  # Optional
  allow_delegation=True,  # Optional
  step_callback=my_intermediate_step_callback,  # Optional
  memory=True  # Optional
)

*RCI Agent(Checker - 랭체인 기반 검수 전용 에이전트) : 출력을 확인하고 이상이 있으면 다시 정상으로 되돌리는 작업 수행

 

 

2. Tasks

  • 각 에이전트가 수행하는 개별 작업
  • 작업에는 설명, 할당된 상담원, 필요한 도구 등 실행에 필요한 정보가 캡슐화되어 있음
  • 에이전트가 협업 작업 정의도 가능
  • LLM으로 전달하는 내용
  • 주요 속성
    • Description : 작업에 수반되는 내용에 대한 명확하고 간결한 설명. LLM 모델이 무엇인지-무엇을 할 수 있는지-무엇을 해야하는지 정의
    • Agent : 전담 에이전트 지정, 그렇지않으면 크루 프로세스에 따라 지정됨
    • Expected Output : 작업에 대한 예상 결과물을 명확하고 상세하게 정의, 몇가지 예시를 추가할 수 있음
    • Tools
    • Async Execution : 특정 에이전트 간 작업을 동시에 진행하지 않고 단계(순서) 정하기
    • Context
    • Output JSON : API 호출
    • Output Pydantic : 클라이언트(OpenAI)의 사양에 의존
    • Output File
    • Callback
    • Human Input
  • 예시 코드
import os
os.environ["OPENAI_API_KEY"] = "Your Key"
os.environ["SERPER_API_KEY"] = "Your Key" # serper.dev API key

from crewai import Agent, Task, Crew
from crewai_tools import SerperDevTool

research_agent = Agent(
  role='Researcher',
  goal='Find and summarize the latest AI news',
  backstory="""
	You're a researcher at a large company.
  	You're responsible for analyzing data and providing insights
  	to the business.
	""",
  verbose=True
)

search_tool = SerperDevTool()

task = Task(
  description='Find and summarize the latest AI news',
  expected_output='A bullet list summary of the top 5 most important AI news',
  agent=research_agent,
  tools=[search_tool]
)

crew = Crew(
    agents=[research_agent],
    tasks=[task],
    verbose=2
)

result = crew.kickoff()
print(result)

 

 

3. Tools

  • LLM 외부 작업 : api를 호출, 파일 저장
  • 간단한 검색부터 복잡한 상호 작용, 상담원 간의 효과적인 팀워크 관리 기능
  • 크루AI : 툴 킷
  • 랭체인 : 툴스 - 자체 저장소, 검색(깃, 유튜브, 위키피디아) 등
  • 주요 특징
    • 유틸리티 Utility: 웹 검색, 데이터 분석, 콘텐츠 생성, 상담원 협업과 같은 작업을 위해 제작되었습니다.
    • 통합 Integration: 도구를 워크플로우에 원활하게 통합하여 상담원의 역량을 강화합니다.
    • 사용자 지정 기능 Customizability: 상담원의 특정 요구에 맞게 사용자 지정 도구를 개발하거나 기존 도구를 활용할 수 있는 유연성을 제공합니다. 예) 각 에이전트별 데이터베이스 접근 권한을 선택적으로 제공

 

 

4. Processes

  • 프로젝트 관리
  • 에이전트의 작업 실행을 오케스트레이트
  • Build Agent Automations
  • 프로세스 구현 방식
    • 순차적 Sequential Crews
      • 다른 에이전트에 전달 : 다음 단계에 대한 결정을 내릴 수 있는 관리자 구성 manager_llm
      from crewai import Crew
      from crewai.process import Process
      from langchain_openai import ChatOpenAI
      
      # Example: Creating a crew with a sequential process
      crew = Crew(
          agents=my_agents,
          tasks=my_tasks,
          process=Process.sequential
      )
    • 계층적 Hierarchical Crews
      • 투두리스트 구성
      • 각 에이전트 별로 작업 위임
      • 결과 검토
      • 다른 에이전트에 전달 : 다음 단계에 대한 결정을 내릴 수 있는 관리자 구성 manager_llm
      from crewai import Crew
      from crewai.process import Process
      from langchain_openai import ChatOpenAI
      
      # Example: Creating a crew with a hierarchical process
      # Ensure to provide a manager_llm
      crew = Crew(
          agents=my_agents,
          tasks=my_tasks,
          process=Process.hierarchical,
          manager_llm=ChatOpenAI(model="gpt-4")
      )

 

 

5. Crews

  • 팀, 함께 작업하는 상담원들의 협업 그룹
  • 한 가지 분야의 전문가 집단 crew
  • 각 crew는 각자의 툴로, 각자의 작업 실행 전략, 상담원 협업 및 전체 워크플로우를 보유
  • 인스터스화 : Tasks, Agents
  • 속성
    • Tasks, Agents, Process, Verbose, Manager LLM
    • Max RPM : 최대 요청수( 비용 고려)
    • Language
    • Full Output : 과정을 다 출력할지, 최종 결과만 출력할지 설정
  • 승무원(팀) 구성 코드 예
from crewai import Crew, Agent, Task, Process
from langchain_community.tools import DuckDuckGoSearchRun

# Define agents with specific roles and tools
researcher = Agent(
    role='Senior Research Analyst',
    goal='Discover innovative AI technologies',
    tools=[DuckDuckGoSearchRun()]
)

writer = Agent(
    role='Content Writer',
    goal='Write engaging articles on AI discoveries',
    verbose=True
)

# Create tasks for the agents
research_task = Task(
    description='Identify breakthrough AI technologies',
    agent=researcher
)
write_article_task = Task(
    description='Draft an article on the latest AI technologies',
    agent=writer
)

# Assemble the crew with a sequential process
my_crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_article_task],
    process=Process.sequential,
    full_output=True,
    verbose=True,
)
  • 크루 관리감독 코드 예
# Access the crew's usage metrics
crew = Crew(agents=[agent1, agent2], tasks=[task1, task2])
crew.kickoff()
print(crew.usage_metrics)
  • 코드 실행
# Start the crew's task execution
result = my_crew.kickoff()
print(result)

 

 

 

아키텍트 도식화 

실습을 들어가기 전에 앞서 포스팅했던 DEVIKA와 비교해서 기본적인 이해에 대한 멘탈 모델을 정리해보면,,  DEVIKA는 'AI 소프트웨어 엔지니어' 전담 조직 Crews로 구성되었다고 보면된다.

 

Agentic | AI 소프트웨어 엔지니어 DEVIKA(open-source)

Agentic 컨셉 시리즈  - Agentic Chunking LangChain RAG  👉 AI 소프트웨어 엔지니어 DEVIKA  - AI 에이전트를 오케스트레이션 프레임워크 CrewAI...한 달? 두 달? 전 했던 실습을... 미루고 미루다 이제 올린

normalstory.tistory.com

소프트웨어 AI인 DEVIKA에 프롬프트를 입력하면 코드를 생성하기 전에 사용자의 프롬프트를 분석해서 todo list를 작성한다. 그리고 이 todo list를 agents(참고로 DEVIKA는 9개?명?의 개발 전문 agents로 구성되어있다.)에게 할당하고 각 단계가 해결될 때까지 다음 단계로 넘어가지 않도록 구성되었다. 이를 미루어보아 DEVIKA의 프로세스는 (CrewAI의 기준으로 비유하자면)'계층적 프로세스'로 구성되어 있다는 느낌을 받았다. 

DEVIN, OPEN DEVIN, DEVIKA는 모두 동일하게 사전에 AI 소프트웨어 엔지니어링에 최적화된 agents들로 구성한 것에 불과하다. 이를테면 why가 동일하지 how와 what까지 동일하다는 것은 아니다. 이를테면 김찌찌개 집이 아무리 많아도 조직 구조와 레시피가 서로 다르듯 - llm을 적용하는 조직이라면 단순히 허깅페이스 리더보드 huggingface Leaderboard 1등 모델을 만들거나 도입하는 문제를 고민할 것이 아니라.. - 각자의 상황에 맞는 최적을 찾고 방향을 설정하는 과정이 필요하다. 

이 부분이 개인적으로 기획, 서비스 기획, PM/PO로 먹고사는 입장에서 매우 중요한 방점이라고 생각하는, 기획(획을 기하는)이 필요한 부분이라고 생각한다.   

 

다시 돌아와서
위 항목들을 시각적(부족하지만 들어낼 수록 더 혼나고 그래야 배울 수 있기에..)으로 아는 만큼 정리해봤다.. 틀린 부분이 발견되면 귀한 고견 부탁드린다. 

순차적 프로세스의 예 

CrewAI, Sequential Crews diagram

계층적 프로세스의 예 

CrewAI Hierarchical Crews diagram

 

 

 

실습 

1. openAI API를 사용한 예제

1) 회의 자료 준비 Agent 제작 

 

CrewAI_실습01_회의자료조사(api_exaai).ipynb

Colaboratory notebook

colab.research.google.com

2) 프로세스 별 실습

    (1) Sequential 방식

 

Google Colab Notebook

Run, share, and edit Python notebooks

colab.research.google.com

    (2) Hierarchical 방식

 

Google Colab Notebook

Run, share, and edit Python notebooks

colab.research.google.com

3) RCI Agent

 

Google Colab Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

 

 

 

 


*이후 업데이트 할 내용 

openAI API가 아닌 local llm로 대체하는 코드로 업데이트 하기

댓글