CrewAI๋ ์ฌ๋ฌ AI Agent๊ฐ ์ธ๊ฐ ํ์ฒ๋ผ ์ญํ ์ ๋๋๊ณ ํ๋ ฅํ์ฌ ๋ณต์กํ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ฉํฐ ์์ด์ ํธ ์ค์ผ์คํธ๋ ์ด์ ํ๋ ์์ํฌ์ ๋๋ค. ๋จ์ผ LLM ํธ์ถ๋ก๋ ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ด ๋ฆฌ์์นยท์์ฑยท๋ถ์ยท์ฝ๋ฉ ๋ฑ ๋ค๋จ๊ณ ์์ ์ Agent ํ์ด ๋ถ์ ํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค. ์ด ๊ธ์์๋ ํต์ฌ ๊ตฌ์ฑ์์, ํ๋ก์ธ์ค ์ ํ, ๋ฉ๋ชจ๋ฆฌ ์์คํ , Python ์ฝ๋ ์์ ๋ฅผ ์ค๋ฌด ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌํฉ๋๋ค.
๐ค CrewAI๋? #
CrewAI๋ ์ญํ ๊ธฐ๋ฐ AI Agent ํ์ ํ๋ซํผ์ ๋๋ค. ๊ฐ Agent๋ ํน์ ์ ๋ฌธ ์ญํ (๋ฆฌ์์ฒ, ์๊ฐ, ๋ถ์๊ฐ ๋ฑ)์ ๋ถ์ฌ๋ฐ๊ณ , ๋ ๋ฆฝ์ ์ผ๋ก ์์ ์ ์ํํ๊ฑฐ๋ ๋ค๋ฅธ Agent์๊ฒ ์์ํ๋ฉด์ ํ ๋ชฉํ๋ฅผ ๋ฌ์ฑํฉ๋๋ค.
1์ฌ์ฉ์ ์
๋ ฅ (๋ชฉํ)
2 โ
3 Crew ์ค์ผ์คํธ๋ ์ดํฐ
4 โโโโโโดโโโโโ
5Agent A Agent B Agent C
6(๋ฆฌ์์ฒ) (์๊ฐ) (๊ฒ์์)
7 โโโโโโฌโโโโโ
8 ์ต์ข
๊ฒฐ๊ณผ๋ฌผ| ํญ๋ชฉ | ๋จ์ผ LLM | CrewAI ๋ฉํฐ ์์ด์ ํธ |
|---|---|---|
| ์์ ๋ณต์ก๋ | ๋จ์ ๋จ๋ฐ์ฑ | ๋ค๋จ๊ณยท๋ณตํฉ ์์ |
| ์ ๋ฌธํ | ๋ฒ์ฉ | ์ญํ ๋ณ ์ ๋ฌธํ |
| ์ปจํ ์คํธ | ๋จ์ผ ๋ํ | ์์ด์ ํธ ๊ฐ ๊ณต์ ยท๋์ |
| ํ์ฅ์ฑ | ์ ํ์ | Agent ์ถ๊ฐ๋ก ์ํ ํ์ฅ |
๐งฑ ํต์ฌ ๊ตฌ์ฑ์์ #
Agent โ ์์จ ์์ ๋จ์ #
Agent๋ ํน์ ์ญํ ๊ณผ ๋ชฉํ๋ฅผ ๊ฐ์ง ์์จ์ AI ์ํํธ์จ์ด์ ๋๋ค.
| ํ๋ผ๋ฏธํฐ | ์ค๋ช |
|---|---|
role | Agent์ ๊ธฐ๋ฅ/์ง์ฑ ์ ์ |
goal | ๊ฐ๋ณ ๋ชฉํ๋ก ์์ฌ๊ฒฐ์ ๋ฐฉํฅ ์ ์ |
backstory | ๋ฐฐ๊ฒฝ ์คํ ๋ฆฌ๋ก ์ญํ ๋งฅ๋ฝ ๊ฐํ |
tools | ์ฌ์ฉ ๊ฐ๋ฅํ ๋๊ตฌ ๋ชฉ๋ก |
llm | ์ฌ์ฉํ LLM (๊ธฐ๋ณธ๊ฐ: OpenAI GPT-4) |
verbose | True ์ค์ ์ ์คํ ๋ก๊ทธ ์ถ๋ ฅ |
allow_delegation | True๋ฉด ๋ค๋ฅธ Agent์๊ฒ ์์
์์ ๊ฐ๋ฅ |
memory | True๋ฉด ๋ฉ๋ชจ๋ฆฌ ์์คํ
ํ์ฑํ |
max_iter | ์ต๋ ๋ฐ๋ณต ํ์ (๊ธฐ๋ณธ๊ฐ: 15) |
Task โ ๊ตฌ์ฒด์ ์์ ๋จ์ #
Agent๊ฐ ์ํํ ๋ช ํํ ๊ณผ์ ๋ฅผ ์ ์ํฉ๋๋ค.
| ํ๋ผ๋ฏธํฐ | ์ค๋ช |
|---|---|
description | ์์ ๋ด์ฉ๊ณผ ์ํ ๋ฐฉ๋ฒ |
agent | ๋ด๋น Agent ์ง์ |
expected_output | ๊ธฐ๋ ๊ฒฐ๊ณผ๋ฌผ ํ์ ์ค๋ช |
tools | ํด๋น Task์๋ง ์ฌ์ฉ๋๋ ๋๊ตฌ |
context | ์ด์ Task ์ถ๋ ฅ์ ์ปจํ ์คํธ๋ก ์ ๋ฌ |
output_file | ๊ฒฐ๊ณผ๋ฅผ ํ์ผ๋ก ์ ์ฅ |
Tool โ Agent์ ์ธ๋ถ ๋ฅ๋ ฅ #
Agent๊ฐ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ฑฐ๋ ์ธ๋ถ ์๋น์ค์ ์ํธ์์ฉํ๋ ํจ์์ ๋๋ค.
1from crewai_tools import SerperDevTool, ScrapeWebsiteTool, WebsiteSearchTool
2
3search_tool = SerperDevTool() # Google ๊ฒ์
4scrape_tool = ScrapeWebsiteTool() # ์น ํ์ด์ง ์คํฌ๋ํ
5rag_tool = WebsiteSearchTool() # ์น ์ฝํ
์ธ RAG ๊ฒ์Process โ ์์ ํ๋ฆ ์กฐ์จ ๋ฐฉ์ #
| ํ๋ก์ธ์ค | ์ค๋ช |
|---|---|
Process.sequential | ์์ ์ ์์๋๋ก ์คํ, ์ ๊ฒฐ๊ณผ๊ฐ ๋ค์ ์ปจํ ์คํธ๊ฐ ๋จ |
Process.hierarchical | ๋งค๋์ Agent๊ฐ ์์ ์ ํ์ Agent์๊ฒ ์์ยท๊ฒ์ |
Crew โ ์ต์์ ์ค์ผ์คํธ๋ ์ดํฐ #
Agent์ Task๋ฅผ ๋ชจ์์ ์คํ ๊ณํ์ ๊ด๋ฆฌํ๋ ์ต์์ ๊ตฌ์กฐ์ ๋๋ค.
๐ฆ ์ค์น #
1pip install crewai
2pip install 'crewai[tools]' # ๊ธฐ๋ณธ ๋๊ตฌ ๋ชจ์ ํฌํจํ๊ฒฝ ๋ณ์ ์ค์ (.env ํ์ผ):
1OPENAI_API_KEY=sk-...
2SERPER_API_KEY=... # SerperDevTool ์ฌ์ฉ ์ ํ์๐ ๋น ๋ฅธ ์์: ๋ธ๋ก๊ทธ ๊ธ ์๋ ์์ฑ ์์ด์ ํธ #
๋ฆฌ์์ฒ Agent๊ฐ ์ฃผ์ ๋ฅผ ์กฐ์ฌํ๊ณ , ์๋ํฐ Agent๊ฐ ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํ๋ 2์ธ ํ ์์ ์ ๋๋ค.
1import os
2from dotenv import load_dotenv
3from crewai import Agent, Task, Crew, Process
4from crewai_tools import SerperDevTool, ScrapeWebsiteTool
5
6load_dotenv()
7os.environ["OPENAI_MODEL_NAME"] = "gpt-4o"
8
9# โโ Tools โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
10search_tool = SerperDevTool()
11scrape_tool = ScrapeWebsiteTool()
12
13# โโ Agents โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
14researcher = Agent(
15 role="์๋์ด ๋ฆฌ์์ฒ",
16 goal="์ฃผ์ด์ง ์ฃผ์ ์ ๋ํด ์น์์ ์ต์ ์ ๋ณด๋ฅผ ์์งํ๊ณ ํต์ฌ ์ธ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ๋ค",
17 backstory="๋ค์ํ ๊ธฐ์ ๋ฌธ์์ ๋ธ๋ก๊ทธ๋ฅผ ๋ถ์ํ์ฌ ์ต๊ณ ์ ๋ฆฌ์์น ๊ฒฐ๊ณผ๋ฅผ ๋ง๋๋ ์ ๋ฌธ๊ฐ",
18 tools=[search_tool, scrape_tool],
19 allow_delegation=False,
20 verbose=True,
21)
22
23editor = Agent(
24 role="IT ๋ธ๋ก๊ฑฐ / ์๋ํฐ",
25 goal="๋ฆฌ์์น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ์ฝ๊ธฐ ์ฝ๊ณ ์ค์ฉ์ ์ธ ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํ๋ค",
26 backstory="๊ฐ๋ฐ์ ๋
์๋ฅผ ์ํด ๋ช
ํํ๊ณ ์ ์ตํ ๊ธฐ์ ์ฝํ
์ธ ๋ฅผ ์์ฑํ๋ ์ ๋ฌธ ๋ธ๋ก๊ฑฐ",
27 verbose=True,
28)
29
30# โโ Tasks โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
31research_task = Task(
32 description="""'{topic}'์ ๊ดํ ์ต์ ์ ๋ณด๋ฅผ ์น์์ ๊ฒ์ํ๊ณ ๋ถ์ํ์ธ์.
33 ํต์ฌ ๊ฐ๋
, ์ฃผ์ ๊ธฐ๋ฅ, ์ค์ ํ์ฉ ์ฌ๋ก๋ฅผ ์ ๋ฆฌํ์ธ์.""",
34 agent=researcher,
35 expected_output="์ฃผ์ ์ ํต์ฌ ๋ด์ฉ, ์ฃผ์ ๊ธฐ๋ฅ, ํ์ฉ ์ฌ๋ก๋ฅผ ํฌํจํ ๋ฆฌ์์น ๋ณด๊ณ ์",
36)
37
38writing_task = Task(
39 description="""๋ฆฌ์์น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก '{topic}'์ ๋ํ ๋ธ๋ก๊ทธ ํฌ์คํธ๋ฅผ ์์ฑํ์ธ์.
40 ๋์
๋ถ, ์ฃผ์ 3๊ฐ ์น์
, ์ค์ฉ์ ์์, ๊ฒฐ๋ก ์ผ๋ก ๊ตฌ์ฑํ์ธ์.""",
41 agent=editor,
42 expected_output="๋งํฌ๋ค์ด ํ์์ ๋ธ๋ก๊ทธ ํฌ์คํธ (๋์
๋ถ, 3๊ฐ ์น์
, ๊ฒฐ๋ก ํฌํจ)",
43 context=[research_task], # ๋ฆฌ์์น ๊ฒฐ๊ณผ๋ฅผ ์ปจํ
์คํธ๋ก ์ ๋ฌ
44 output_file="output_blog.md",
45)
46
47# โโ Crew โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
48crew = Crew(
49 agents=[researcher, editor],
50 tasks=[research_task, writing_task],
51 process=Process.sequential,
52 verbose=True,
53)
54
55result = crew.kickoff(inputs={"topic": "CrewAI ๋ฉํฐ ์์ด์ ํธ ํ๋ ์์ํฌ"})
56print(result.raw)โ๏ธ ํ๋ก์ธ์ค ์ ํ #
Sequential (์์ฐจ ์ฒ๋ฆฌ) #
์์ ๋ชฉ๋ก ์์๋๋ก ์คํํ๋ฉฐ, ์ Task์ ์ถ๋ ฅ์ด ๋ค์ Task์ ์ปจํ ์คํธ๊ฐ ๋ฉ๋๋ค. ๊ฐ์ฅ ๋จ์ํ๊ณ ์์ธก ๊ฐ๋ฅํ ํ๋ฆ์ ๋๋ค.
1crew = Crew(
2 agents=[researcher, editor, reviewer],
3 tasks=[research_task, writing_task, review_task],
4 process=Process.sequential,
5)1research_task โ writing_task โ review_task
2 (์ถ๋ ฅ) โ (์ปจํ
์คํธ) โ (์ปจํ
์คํธ)Hierarchical (๊ณ์ธต ์ฒ๋ฆฌ) #
๋งค๋์ Agent๊ฐ ์๋ ์์ฑ๋์ด ์์ ์ ํ์ Agent์๊ฒ ์์ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํฉ๋๋ค. ๋ณต์กํ๊ณ ๋์ ์ธ ์ํฌํ๋ก์ ์ ํฉํฉ๋๋ค.
1from langchain_openai import ChatOpenAI
2
3crew = Crew(
4 agents=[researcher, editor, reviewer],
5 tasks=[complex_task],
6 process=Process.hierarchical,
7 manager_llm=ChatOpenAI(model="gpt-4o"), # ๋งค๋์ LLM ์ง์
8)1Manager Agent (์๋ ์์ฑ)
2 โโโ researcher ์๊ฒ ์กฐ์ฌ ์์
3 โโโ editor ์๊ฒ ์์ฑ ์์
4 โโโ ๊ฒฐ๊ณผ ๊ฒ์ ํ ์ต์ข
์น์ธ๐ง ๋ฉ๋ชจ๋ฆฌ ์์คํ #
CrewAI v1.10+ ์์๋ ํตํฉ ๋ฉ๋ชจ๋ฆฌ ์์คํ ์ ์ ๊ณตํฉ๋๋ค. Agent๊ฐ ์ด์ ์คํ ๋งฅ๋ฝ์ ๊ธฐ์ตํ๊ณ ์ค๋ณต ์์ ์ ์ค์ผ ์ ์์ต๋๋ค.
| ๋ฉ๋ชจ๋ฆฌ ์ ํ | ๋ฒ์ | ์ค๋ช |
|---|---|---|
| Short-term | ํ์ฌ Crew ์คํ ๋ด | ๋ํ ์ค ์ปจํ ์คํธ ์ ์ง |
| Long-term | ์คํ ๊ฐ ์์ | ๋ฒกํฐ ์คํ ์ด์ ์ ์ฅ, ์ฌ์คํ ์ ํ์ฉ |
| Entity | ํ์ฌ ์คํ ๋ด | ์ธ๊ธ๋ ์ธ๋ฌผยท์กฐ์งยท๊ฐ๋ ์ถ์ |
1researcher = Agent(
2 role="๋ฆฌ์์ฒ",
3 goal="์ ๋ณด ์์ง",
4 backstory="...",
5 memory=True, # ๋ฉ๋ชจ๋ฆฌ ํ์ฑํ
6)
7
8crew = Crew(
9 agents=[researcher],
10 tasks=[task],
11 memory=True, # Crew ๋ ๋ฒจ ๋ฉ๋ชจ๋ฆฌ ํ์ฑํ
12)๐ง ์ปค์คํ Tool ๊ตฌํ #
@tool ๋ฐ์ฝ๋ ์ดํฐ๋ก Python ํจ์๋ฅผ Agent๊ฐ ์ฌ์ฉํ ์ ์๋ ๋๊ตฌ๋ก ๋ฑ๋กํฉ๋๋ค.
1from crewai.tools import tool
2
3@tool('naver_news_search')
4def search_naver_news(query: str) -> str:
5 """๋ค์ด๋ฒ ๋ด์ค API์์ ์ต์ ๊ธฐ์ฌ URL์ ๊ฒ์ํฉ๋๋ค."""
6 import requests
7 # ์ค์ API ํธ์ถ ๊ตฌํ
8 response = requests.get(
9 "https://openapi.naver.com/v1/search/news.json",
10 params={"query": query, "display": 5},
11 headers={
12 "X-Naver-Client-Id": os.getenv("NAVER_CLIENT_ID"),
13 "X-Naver-Client-Secret": os.getenv("NAVER_CLIENT_SECRET"),
14 }
15 )
16 items = response.json().get("items", [])
17 return "\n".join(item["link"] for item in items)Tip: docstring์ด Tool์ ์ค๋ช ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. Agent๊ฐ ์ธ์ ์ด Tool์ ์จ์ผ ํ๋์ง ๋ช ํํ ์์ฑํ๋ฉด ํธ์ถ ์ ํ๋๊ฐ ๋์์ง๋๋ค.
๐ YAML ์ค์ ๋ฐฉ์ (๋๊ท๋ชจ ํ๋ก์ ํธ ๊ถ์ฅ) #
Agent์ Task ์ ์๋ฅผ YAML ํ์ผ๋ก ๋ถ๋ฆฌํ๋ฉด ์ฝ๋์ ์ค์ ์ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ๊ธฐ ์ฝ์ต๋๋ค.
config/agents.yaml:
1researcher:
2 role: ์๋์ด ๋ฆฌ์์ฒ
3 goal: ์ฃผ์ด์ง ์ฃผ์ ์ ์ต์ ์ ๋ณด๋ฅผ ์์งํ๊ณ ํต์ฌ ์ธ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ๋ค
4 backstory: ๋ค์ํ ๊ธฐ์ ๋ฌธ์๋ฅผ ๋ถ์ํ์ฌ ์ต๊ณ ์ ๋ฆฌ์์น ๊ฒฐ๊ณผ๋ฅผ ๋ง๋๋ ์ ๋ฌธ๊ฐ
5
6editor:
7 role: IT ๋ธ๋ก๊ฑฐ ์๋ํฐ
8 goal: ๋ฆฌ์์น ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ธฐ ์ฌ์ด ๋ธ๋ก๊ทธ ๊ธ๋ก ์์ฑํ๋ค
9 backstory: ๊ฐ๋ฐ์ ๋
์๋ฅผ ์ํด ๋ช
ํํ ๊ธฐ์ ์ฝํ
์ธ ๋ฅผ ์์ฑํ๋ ์ ๋ฌธ ๋ธ๋ก๊ฑฐconfig/tasks.yaml:
1research_task:
2 description: "{topic}"์ ๊ดํ ์ต์ ์ ๋ณด๋ฅผ ์์งํ๊ณ ํต์ฌ ๋ด์ฉ์ ์ ๋ฆฌํ์ธ์.
3 expected_output: ํต์ฌ ๊ฐ๋
, ์ฃผ์ ๊ธฐ๋ฅ, ํ์ฉ ์ฌ๋ก๋ฅผ ํฌํจํ ๋ฆฌ์์น ๋ณด๊ณ ์
4 agent: researcher
5
6writing_task:
7 description: ๋ฆฌ์์น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก "{topic}" ๋ธ๋ก๊ทธ ํฌ์คํธ๋ฅผ ์์ฑํ์ธ์.
8 expected_output: ๋งํฌ๋ค์ด ๋ธ๋ก๊ทธ ํฌ์คํธ
9 agent: editor
10 context:
11 - research_taskcrew.py:
1from crewai import Agent, Task, Crew, Process
2from crewai.project import CrewBase, agent, task, crew
3
4@CrewBase
5class BlogCrew:
6 agents_config = 'config/agents.yaml'
7 tasks_config = 'config/tasks.yaml'
8
9 @agent
10 def researcher(self) -> Agent:
11 return Agent(config=self.agents_config['researcher'], tools=[search_tool])
12
13 @agent
14 def editor(self) -> Agent:
15 return Agent(config=self.agents_config['editor'])
16
17 @task
18 def research_task(self) -> Task:
19 return Task(config=self.tasks_config['research_task'])
20
21 @task
22 def writing_task(self) -> Task:
23 return Task(config=self.tasks_config['writing_task'])
24
25 @crew
26 def crew(self) -> Crew:
27 return Crew(
28 agents=self.agents,
29 tasks=self.tasks,
30 process=Process.sequential,
31 )๐๏ธ ์ค์ ์์ : ๋ด์ค ๋ฆฌ์์น ๋ฉํฐ ์์ด์ ํธ #
๊ฒ์ โ ๋ด์ฉ ์ถ์ถ โ ์์ฝ ์๋ต์ 3๊ฐ Agent๊ฐ ๋ถ๋ดํ๋ ํ์ดํ๋ผ์ธ์ ๋๋ค.
1from crewai import Agent, Task, Crew, Process
2from crewai.tools import tool
3
4@tool('fetch_article')
5def fetch_article(url: str) -> str:
6 """์ฃผ์ด์ง URL์ ๊ธฐ์ฌ ๋ณธ๋ฌธ์ ์ถ์ถํฉ๋๋ค."""
7 from newspaper import Article
8 article = Article(url)
9 article.download()
10 article.parse()
11 return article.text
12
13# Agents
14searcher = Agent(
15 role="๋ด์ค ๊ฒ์ ์ ๋ฌธ๊ฐ",
16 goal="์ฌ์ฉ์ ์ง๋ฌธ์ ๋ง๋ ์ต์ ๋ด์ค URL์ ์์งํ๋ค",
17 backstory="๋ค์ํ ๋ด์ค ์์ค์์ ์ ํํ ๊ธฐ์ฌ๋ฅผ ์ฐพ๋ ๋ฆฌ์์น ์ ๋ฌธ๊ฐ",
18 tools=[search_tool],
19)
20
21analyzer = Agent(
22 role="์ฝํ
์ธ ๋ถ์๊ฐ",
23 goal="๊ธฐ์ฌ URL์์ ๋ณธ๋ฌธ์ ์ถ์ถํ๊ณ ํต์ฌ ๋ด์ฉ์ ๋ถ์ํ๋ค",
24 backstory="๋ณต์กํ ๊ธฐ์ฌ๋ฅผ ๋น ๋ฅด๊ฒ ํ์
ํ๊ณ ํต์ฌ์ ์ถ์ถํ๋ ๋ถ์๊ฐ",
25 tools=[fetch_article],
26)
27
28answerman = Agent(
29 role="์ต์ข
์๋ต ์์ฑ์",
30 goal="๋ถ์๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ฌ์ฉ์์๊ฒ ๋ช
ํํ ๋ต๋ณ์ ์ ๊ณตํ๋ค",
31 backstory="๋ณต์กํ ์ ๋ณด๋ฅผ ์ฝ๊ณ ์ ํํ๊ฒ ์ ๋ฌํ๋ ์ปค๋ฎค๋์ผ์ด์
์ ๋ฌธ๊ฐ",
32)
33
34# Tasks
35search_task = Task(
36 description="'{query}'์ ๊ดํ ์ต์ ๋ด์ค ๊ธฐ์ฌ URL 5๊ฐ๋ฅผ ์์งํ์ธ์.",
37 agent=searcher,
38 expected_output="๊ด๋ จ ๋ด์ค ๊ธฐ์ฌ URL ๋ชฉ๋ก (์ต์ 5๊ฐ)",
39)
40
41analysis_task = Task(
42 description="์์ง๋ URL์์ ๊ธฐ์ฌ ๋ณธ๋ฌธ์ ์ถ์ถํ๊ณ ํต์ฌ ๋ด์ฉ์ ์ ๋ฆฌํ์ธ์.",
43 agent=analyzer,
44 expected_output="๊ฐ ๊ธฐ์ฌ์ ํต์ฌ ๋ด์ฉ ์์ฝ",
45 context=[search_task],
46)
47
48answer_task = Task(
49 description="๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก '{query}'์ ๋ํ ์ข
ํฉ ๋ต๋ณ์ ์์ฑํ์ธ์.",
50 agent=answerman,
51 expected_output="์ถ์ฒ์ ๊ทผ๊ฑฐ๋ฅผ ํฌํจํ ๋ช
ํํ ๋ต๋ณ",
52 context=[analysis_task],
53)
54
55# Crew ์คํ
56crew = Crew(
57 agents=[searcher, analyzer, answerman],
58 tasks=[search_task, analysis_task, answer_task],
59 process=Process.sequential,
60)
61
62result = crew.kickoff(inputs={"query": "2026๋
AI Agent ํธ๋ ๋"})
63print(result.raw)โ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ #
Q. CrewAI์ LangChain์ ์ฐจ์ด๋? #
LangChain์ LLM ์ฒด์ด๋๊ณผ ๋๊ตฌ ํตํฉ์ ์ํ ๋ฒ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. CrewAI๋ ๋ฉํฐ ์์ด์ ํธ ํ์ ์ค์ผ์คํธ๋ ์ด์ ์ ํนํ๋์ด ์์ผ๋ฉฐ, LangChain ์์์ ๋์ํ ์ ์์ต๋๋ค.
Q. OpenAI ์ธ์ ๋ค๋ฅธ LLM์ ์ฌ์ฉํ ์ ์๋์? #
๋ค, llm ํ๋ผ๋ฏธํฐ๋ก Anthropic Claude, Google Gemini, Ollama(๋ก์ปฌ LLM) ๋ฑ์ ์ง์ ํ ์ ์์ต๋๋ค.
1from langchain_anthropic import ChatAnthropic
2
3agent = Agent(
4 role="๋ถ์๊ฐ",
5 goal="...",
6 backstory="...",
7 llm=ChatAnthropic(model="claude-sonnet-4-6"),
8)Q. Sequential๊ณผ Hierarchical ์ค ์ด๋ค ๊ฑธ ์จ์ผ ํ๋์? #
๋จ๊ณ๋ณ ํ๋ฆ์ด ๋ช ํํ๊ณ ์์ธก ๊ฐ๋ฅํ๋ฉด Sequential, ์์ ์ ๋ณต์ก๋๊ฐ ๋๊ณ ๋์ ์์์ด ํ์ํ๋ฉด Hierarchical์ ์ ํํ์ธ์.