본문 바로가기
NLP

CrewAI 로 LLM Agent 푹 담궈 찍어먹어보기

by AI미남홀란드 2024. 9. 4.
728x90

예전에 LangGraph를 활용해서 에이전트 찍어먹어 보기를 실행해 본 적 있습니다. 이전에도 Self-RAG, C-RAG와 같은 논문체를 구현하기 위해 Agent를 사용하는 코드도 작성해 보았는데요.

 

HyperClova X 에 LangGraph 적용하기 A to Z

HyperClova X 를 통한 RAG 기반 이력서 비서나만의 원피스 루피 챗봇 만들기 with HyperClovaXHyper CLOVA 스터디를 참여하게 되었다🙇이직준비와 이직 신입 적응기를 거치며 5월은 빠르게 흘러갔다. 매번

hyun941213.tistory.com

 

이번엔 조금 더 쉬워진 Agent 활용 도구라고 할 수 있는 CrewAI를 통해 주제를 정하고, 역할에 맞는 기능부여를 하고 마지막 한국어 특화모델 하이퍼크로버를 활용해서 조금 더 자연스러운 한국어 답변을 출력시켜 보는 일련의 과정들을 적어보려고 합니다.

 

CrewAI 관련 링크

 

 

 

crewAI - Platform for Multi AI Agents Systems

Most AI agent frameworks are hard to use. We provide power with simplicity. Automate your most important workflows quickly. 300,000 + --> 1,400,000+ Multi-Agent Crews run last 7 days using crewAI.

www.crewai.com

 

 

GitHub - crewAIInc/crewAI: Framework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligen

Framework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks. - crewAIInc/crewAI

github.com

 

 

Crew AI 란?

Crew AI

CrewAI는 다중 에이전트 시스템을 설계하고 실행할 수 있도록 하는 프레임워크입니다. 이 시스템에서는 여러 AI 에이전트가 특정 역할을 맡고, 목표를 공유하며, 협력하여 작업을 수행합니다. CrewAI는 이러한 에이전트들 간의 상호작용을 조직화하고 관리하는 데 중점을 두고 있습니다.

주요 개념

  1. 에이전트(Agents): 에이전트는 특정 역할(role)을 가진 AI입니다. 각 에이전트는 명확한 목표(goal)를 가지고 있으며, 이를 달성하기 위해 특정 도구(tools)를 사용하거나 기억(memory)을 활용할 수 있습니다. 에이전트는 주어진 작업을 수행하며, 협력할 수 있도록 설계되어 있습니다.
  2. 작업(Tasks): 작업은 에이전트가 수행해야 하는 구체적인 작업을 정의합니다. 작업에는 설명(description)과 기대되는 출력(expected output)이 포함됩니다. 에이전트는 작업을 통해 목표를 달성하고, 작업의 결과물을 생성합니다.
  3. 크루(Crew): 크루는 여러 에이전트와 작업을 결합하여 하나의 팀을 구성하는 개념입니다. 각 크루는 특정 프로세스에 따라 작동하며, 작업을 단계적으로 수행하거나 동시에 수행할 수 있습니다.
  4. 프로세스(Process): 프로세스는 크루가 작업을 수행하는 방식을 정의합니다. 예를 들어, 모든 작업을 순차적으로 수행할 수 있는 sequential 프로세스가 있고, 모든 에이전트가 동시에 작업을 수행하는 parallel 프로세스도 있습니다.

재밌는 것이 Crew라는 개념 같습니다. 진짜 우리 생활에 있는 크루라는 개념처럼 여러 Agent들이 작업을 결합해서 팀을 구성하는 개념이 너무 신박했고, 이를 통하면 어떤 거든 재밌는 것을 만들 수 있지 않을까 생각했습니다.

 


Quick Start!

Github readme 나 docs의 처음시작을 기반으로 작성을 하겠습니다. 

 

주제 : 최적의 요리 레시피를 찾아주는 recipe assistant

 

이전에 LangChain에 Google API를 붙여서 구현한 내용이 있는데, 비슷하게 구현해 보겠습니다.

 

[8기 랭체인] RAG 방식의 웹 기반 최신 맛집 찾기

이번주도 역시 재밌는걸 조금 찾다보니깐 이런걸 하게 되었네요 GPT Plugin에서 Webpilot을 다들 많이 쓰실텐데요 이게 그 기반인가 생각햅 볼 수 있는 예제 였습니다 Google 검색엔진 기반으로 우선

www.gpters.org

 

 

1. CrewAI 설치

pip install crewai
pip install 'crewai[tools]' # 더 많은 기능을 위해 설치 합니다

 

 

2.  Crew 환경 설정

- CrewAI는 LangChain 도구와 함께 사용할 수 있는 것이 장점입니다.

import os
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool
from crewai_tools import WebsiteSearchTool

from crewai_tools import YoutubeVideoSearchTool
from crewai_tools import ScrapeWebsiteTool

os.environ["OPENAI_API_KEY"] = "your_key"
os.environ["SERPER_API_KEY"] = "your_key" # serper.dev API key
os.environ["OPENAI_MODEL_NAME"] = "gpt-4o-mini"

 

 

저도 Scale SERP는 처음인데 Tavily AI와 유사한 검색엔진 같습니다. 가입하고 API 키를 적용해 줍니다. 유사사이트 주의!

 

Google 검색결과를 기반을 가져오는 모습을 볼 수 있습니다. 참 세상에 좋은 게 많습니다. 그냥 우리는 골라서 알아서 떠먹고.. 최적의 조합을 선택하면 되는 것이 매우 어렵습니다.

 

Tool Docs 에는 다양한 기능을 지원하는 Tool들이 존재하니 참고해서 에이전트를 만들면 될 듯합니다.

 

search_tool = SerperDevTool()
scrape_tool = ScrapeWebsiteTool()
website_tool = WebsiteSearchTool()
youtube_tool = YoutubeVideoSearchTool()



먼저 Search_tool을 활용해 쿼리에 대한 최적의 키워드를 검색엔진에 검색을 하고, ScrapeWebsite 를 통해서 스크랩을 합니다. 저는 처음에 그냥 검색엔진만 쓰면 되는줄 알았으나 스크랩 tool 을 써야 데이터를 파싱해옵니다. 그 후 웹 데이터를 크로마 DB에 저장하고 RAG를 해줍니다. 그 쿼리기반으로 하나의 Sentence 가 나오고, 그 후 youtube에 쿼리를 검색해서 링크를 뽑아줍니다.

 

recipe_researcher = Agent(
    role="요리 전문가 겸 레시피 큐레이터",
    goal="음식 레시피를 검색하고 관련 YouTube 동영상과 함께 쉽게 설명하기",
    backstory="""
    당신은 요리에 대한 깊은 지식을 가진 전문가이며, 동시에 디지털 미디어 검색에 능숙한 큐레이터입니다.
    """,
    allow_delegation=False,
    verbose=True,
    tools=[
        search_tool,
        scrape_tool,
        website_tool,
        youtube_tool,
    ],
)

 

Agent 활용 파라미터 

  1. role: "요리 전문가 겸 레시피 큐레이터" - 에이전트의 역할을 정의합니다.
  2. goal: "음식 레시피를 검색하고 관련 YouTube 동영상과 함께 쉽게 설명하기" - 에이전트의 목표를 설정합니다.
  3. backstory: 에이전트의 배경 이야기를 제공합니다. 요리 전문가이자 디지털 미디어 검색에 능숙한 큐레이터로 설정되었습니다.
  4. allow_delegation: False - 이 에이전트가 다른 에이전트에게 작업을 위임할 수 없도록 설정합니다.
  5. verbose: True - 상세한 로그 출력을 활성화합니다.
  6. tools: 에이전트가 사용할 수 있는 도구들을 리스트로 제공합니다. search_tool, scrape_tool, website_tool, youtube_tool이 포함되어 있습니다.

추가 주요 파라미터들:

  1. llm (Language Model): 기본값은 "gpt-4"입니다. 에이전트가 사용할 언어 모델을 지정합니다.
  2. max_iter (최대 반복 횟수): 기본값은 25입니다. 에이전트가 최선의 답변을 내기 전에 수행할 수 있는 최대 반복 횟수를 설정합니다.
  3. max_rpm (분당 최대 요청 수): 기본값은 None입니다. API 호출 속도 제한을 설정할 수 있습니다.
  4. cache: 기본값은 True입니다. 도구 사용에 대한 캐싱을 활성화하여 성능을 향상할 수 있습니다.
  5. allow_code_execution: 기본값은 False입니다. 에이전트가 코드를 실행할 수 있는지 여부를 결정합니다.

만약 Opensource LLM으로 구현하는 경우 prompt template 도 작성이 가능하다.

agent = Agent(
        role="{topic} specialist",
        goal="Figure {goal} out",
        backstory="I am the master of {role}",
        system_template="""<|start_header_id|>system<|end_header_id|>

{{ .System }}<|eot_id|>""",
        prompt_template="""<|start_header_id|>user<|end_header_id|>

{{ .Prompt }}<|eot_id|>""",
        response_template="""<|start_header_id|>assistant<|end_header_id|>

{{ .Response }}<|eot_id|>""",
    )

 

 

리서처들이 요리에 대한 정보를 찾고 다시 쿼리를 re-write를 하는 Agent를 만든다. 여기서 HyperClova를 활용하면 되지 않을까 싶다.

recipe_editor = Agent(
    role="레시피 에디터 및 설명 전문가",
    goal="수집된 레시피 정보를 간결하게 정리하고 이해하기 쉽게 설명하기",
    backstory="""
    당신은 복잡한 요리 정보를 간결하고 명확하게 정리하는 데 탁월한 능력을 가진 레시피 에디터입니다.
    요리에 대한 폭넓은 이해를 바탕으로, 다양한 출처에서 수집된 레시피 정보를 분석하고 
    가장 효과적이고 실용적인 방식으로 재구성하는 것이 당신의 전문 분야입니다.
    초보자도 쉽게 따라할 수 있도록 각 조리 단계를 논리적으로 설명하고, 
    중요한 팁과 요령을 강조하여 요리의 성공 확률을 높입니다.
    또한, YouTube 동영상 링크를 적절히 활용하여 시각적 가이드를 제공하고,
    레시피의 역사나 문화적 배경 등 흥미로운 정보를 추가하여 요리에 대한 이해를 높입니다.
    """,
    verbose=True,
    llm = custom_llm # hyperclovaX
)

 

그 후 tool들이 수행할 작업을 task 라 부르고 여러 task도 만들 수가 있다.

 

my_crew = Crew(agents=[agent1, agent2], tasks=[task1, task2])

 

만약 다중 Agent이고, task를 단계별로 수행해야 하는 경우 Context를 task 1 값을 넣고 agent 2에서 실행한다.

korean_editor = Agent(
    role="당신은 한국어로 깔끔하게 마크다운의 형태로 정리하는 봇",
    goal="영어는 한글로 바꿔서 제목과 내용을 적절하게 마크다운 형태로 수정해서 재 출력하세요.",
    backstory="당신은 요리전문가로 요리 정보를 출력시킵니다.",
    verbose=True,
    llm = hyperClovaX
)

task2 = Task(
    description="좀 더 깔끔하게 만들어주세요",
    expected_output="5 bullet point summary of the biography",
    agent=korean_editor,
    context=[task],
    output_file="한국어_레시피.md",
)

 

output_file을 설정해서 md 형태로 저장도 가능하다. 나는 마크다운을 설정해서 md 파일로 저장을 했다.

 

그 후 실행을 해주면 된다.

result = crew.kickoff(
    inputs=dict(
        dish="김치찌개 먹고싶은데 레시피알려줘"
    )
)

 

어디서 익숙한.. verbose의 형태! LangGraph에서 봤던 것이다. search_query를 알아서 뽑아서 각 agent tool에 맞게 검색하는 모습이다.

 


결과

 

### 김치찌개 레시피

재료 (4인분 기준)

- 돼지고기 목살 또는 앞다리살: 300g \n- 신김치: 1/4 포기 (약 200-300g) \n- 두부: 1/2모 \n- 양파: 1/2개 \n- 대파: 1대 \n- 청양고추: 1개 \n- 다진 마늘: 1큰술 \n- 고춧가루: 2.5큰술 \n- 간장: 2.5큰술 \n- 설탕: 1큰술 \n- 물: 8컵 (약 1.6L) \n- 된장: 1/2큰술 \n- 새우젓: 2큰술 \n- 들기름: 적당량 \n\n**조리 방법** \n1. 돼지고기는 핏물을 빼고 한 입 크기로 자릅니다. \n2. 김치는 적당한 크기로 썰고, 양파와 대파는 채 썰고, 청양고추는 송송 썰어줍니다. \n3. 냄비에 들기름을 두르고 김치를 넣어 볶습니다. 이때 다진 마늘과 설탕도 함께 넣습니다. \n4. 물 8컵을 붓고 센 불에서 끓입니다. \n5. 끓기 시작하면 준비한 돼지고기를 넣고, 된장과 간장, 새우젓, 고춧가루를 추가합니다. \n6. 양파와 청양고추를 넣고 중불로 줄여서 30분 이상 끓입니다. \n7. 마지막으로 대파를 넣고 5분 정도 더 끓인 후, 맛을 보고 필요에 따라 소금으로 간을 맞춥니다.

 

### 추천 레시피 출처

1. [백종원 돼지고기 김치찌개 만들기 - 만개의 레시피](https://www.10000recipe.com/recipe/6850116?srsltid=AfmBOoofXonjikQyUZjt4oLeHdHOAKVL7pT5QNXlxcHGhn6Z2K3CmNyr)

 

2. [참치김치찌개 - 우리의 식탁](https://wtable.co.kr/recipes/ynveZVxzRQECJPwJsLQabsiA) \n\n### 관련 YouTube 요리 동영상\n1. [한국인 99%가 좋아하는 김치찌개](https://www.youtube.com/watch?v=e4NnhT99fr0) \n - 채널: 만개의 레시피 \n - 평가: 재료와 조리 방법이 간단하고 따라 하기 쉬워 초보자에게 적합합니다.

 

3. [성공률 100% 돼지고기 김치찌개](https://www.youtube.com/watch?v=qWbHSOplcvY) \n - 채널: 백종원 PAIK JONG WON \n - 평가: 유명 셰프의 노하우가 담겨 있어 맛을 보장합니다.

 

4. [육수 없이 초간단 참치김치찌개 이렇게 끓이세요](https://www.youtube.com/watch?v=zDobLGk9_tE) \n - 채널: 김대석 셰프 \n - 평가: 간단한 재료로도 깊은 맛을 낼 수 있는 레시피입니다. \n\n이 레시피와 동영상들을 통해 김치찌개를 맛있게 만들 수 있는 방법을 배울 수 있습니다. 맛있게 요리하세요!'


 

이미 LangGraph 관련해서 많이 구현을 해보았는데 확실히 퀄리티가 더 좋아진 모습이다. 굳이 어렵게 Docs 봐가면서 구축하지 않아도 잘 만들어준다. 요즘은 Prompt flow, n8n과 같은 흐름도를 통해 구현 실행되는 LLMops 가 많이 구현되어 있는데, 코드가 지원이 안 되는 경우도 있고, 원리를 알고 쓰는 느낌은 없다. crew ai로 간편하게 구축해 보고, 쓰는 게 어떨까도 싶다. 그래야 product 개발도 가능할 것 같다. 다음엔 조금 더 복잡한 Agent 들을 엮어서 활용해 봐야겠다. + 참고로 토큰이 살살.. 한번 호출에 GPT-4o-mini 기준 백원이상 쓰는것 같은데 GPT-4o 면 과금 우려 예상 되니 꼭 모델을 설정하고 쓰는걸 추천..🤣

728x90