偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

萬字長文解析基于CrewAI創(chuàng)建Agent的各個細節(jié)

發(fā)布于 2025-5-27 06:19
瀏覽
0收藏

1. 引言

在人工智能領域,Multi Agent 系統(tǒng)正逐漸成為解決復雜問題、實現(xiàn)高效協(xié)作的關鍵技術(shù)。CrewAI 作為一款強大的多 Agent 協(xié)作工具,為開發(fā)者提供了便捷的方式來構(gòu)建智能協(xié)作系統(tǒng)。本文將詳細介紹如何基于 CrewAI 構(gòu)建 Multi Agent 系統(tǒng)。

2. CrewAI 核心概念詳解

2.1 代理(Agent)

2.1.1 Agent的定義與功能

Agent是 CrewAI 中的自主單元,具備執(zhí)行任務、做出決策和與其他代理通信的能力。它們?nèi)缤瑘F隊中的成員,各自承擔特定角色,如研究員、作家或客戶支持等,共同為實現(xiàn)團隊目標貢獻力量。

2.1.2 代理屬性

  • 角色(Role):明確代理在團隊中的功能定位,決定其最適合執(zhí)行的任務類型。例如,研究員角色的代理擅長收集和分析信息,而作家角色的代理則專注于創(chuàng)作內(nèi)容。
  • 目標(Goal):指導代理的決策過程,是代理努力實現(xiàn)的個體目標。比如,數(shù)據(jù)分析師代理的目標可能是提取可操作的見解,以支持業(yè)務決策。
  • 背景故事(Backstory):為代理的角色和目標提供豐富背景信息,增強互動和協(xié)作的動態(tài)性。以數(shù)據(jù)分析師為例,其背景故事可以是 “您是一家大公司的數(shù)據(jù)分析師。您負責分析數(shù)據(jù)并為業(yè)務提供見解。您目前正在進行一個項目,分析我們營銷活動的表現(xiàn)?!?/li>
  • LLM(可選):表示運行代理的語言模型。若未指定,默認從??OPENAI_MODEL_NAME??環(huán)境變量中獲取模型名稱,否則默認為 "gpt - 4"。開發(fā)者可以根據(jù)需求選擇合適的語言模型,以滿足不同任務的處理要求。
  • 工具(可選):代理可使用的一組能力或功能集,通常是與執(zhí)行環(huán)境兼容的自定義類實例,默認值為空列表。這些工具能夠擴展代理的能力,使其能夠執(zhí)行諸如網(wǎng)頁搜索、數(shù)據(jù)分析等操作。
  • 調(diào)用功能的 LLM(可選):指定處理該代理工具調(diào)用的語言模型,若傳遞則覆蓋團隊功能調(diào)用 LLM,默認值為??None??。通過靈活配置此屬性,開發(fā)者可以更精準地控制代理的工具調(diào)用行為。
  • 最大迭代次數(shù)(可選):代理在被強制給出最佳答案前可執(zhí)行的最大迭代次數(shù),默認值為 25。合理設置該參數(shù)有助于控制任務執(zhí)行的深度和效率。
  • 最大請求次數(shù)(可選):代理每分鐘可執(zhí)行的最大請求數(shù),用于避免速率限制,默認值為??None??。開發(fā)者可根據(jù)實際情況進行設置,以確保系統(tǒng)穩(wěn)定運行。
  • 最大執(zhí)行時間(可選):代理執(zhí)行任務的最大時長,默認值為??None??,表示無最大執(zhí)行時間限制。此屬性可用于控制任務的執(zhí)行周期,防止任務長時間占用資源。
  • 詳細模式(可選):將其設置為??True???可配置內(nèi)部記錄器提供詳細執(zhí)行日志,便于調(diào)試和監(jiān)控,默認值為??False??。在開發(fā)和優(yōu)化過程中,開啟詳細模式有助于快速定位問題。
  • 允許委托(可選):代理之間可相互委托任務或問題,確保任務由最合適的代理處理,默認值為??True??。這一特性促進了團隊內(nèi)部的靈活協(xié)作,提高了任務處理的準確性和效率。
  • 步驟回調(diào)(可選):在代理每個步驟后調(diào)用的函數(shù),可用于記錄操作或執(zhí)行其他操作,會覆蓋團隊??step_callback??。開發(fā)者可以利用此回調(diào)函數(shù)實現(xiàn)自定義的監(jiān)控和處理邏輯。
  • 緩存(可選):指示代理是否使用工具使用緩存,默認值為??True??。緩存機制有助于提高任務執(zhí)行效率,減少重復計算。

2.1.3 創(chuàng)建代理

代理可以使用 crewAI 內(nèi)置的委托和通信機制相互交互。這允許在團隊內(nèi)進行動態(tài)任務管理和問題解決。

要創(chuàng)建代理,通常會使用所需屬性初始化??Agent??類的實例。以下是一個包含所有屬性的概念示例:

# 示例:創(chuàng)建具有所有屬性的代理
from crewai import Agent


agent = Agent(
  role='數(shù)據(jù)分析師',
  goal='提取可操作的見解',
  backstory="""您是一家大公司的數(shù)據(jù)分析師。
  您負責分析數(shù)據(jù)并為業(yè)務提供見解。
  您目前正在進行一個項目,分析我們營銷活動的表現(xiàn)。""",
  tools=[my_tool1, my_tool2],  # 可選,默認為空列表
  llm=my_llm,  # 可選
  function_calling_llm=my_llm,  # 可選
  max_iter=15,  # 可選
  max_rpm=None, # 可選
  verbose=True,  # 可選
  allow_delegation=True,  # 可選
  step_callback=my_intermediate_step_callback,  # 可選
  cache=True  # 可選
)

2.2 任務(Task)

2.2.1 任務定義與協(xié)作

在 CrewAI 框架中,任務是代理需要完成的具體工作,包含執(zhí)行所需的各種細節(jié),如清晰的描述、負責執(zhí)行的代理、所需工具等。任務可以是協(xié)作性的,通過屬性管理和流程編排,實現(xiàn)多個代理的協(xié)同工作,提升團隊合作效率。

2.2.2 任務的屬性

  • 描述(Description):對任務內(nèi)容的清晰簡明陳述,讓代理明確知道需要做什么。例如 “查找并總結(jié)有關人工智能的最新和最相關新聞”。
  • 代理(Agent):負責任務執(zhí)行的代理,可以直接指定,也可由 Crew 的流程根據(jù)角色、可用性等因素分配。這確保了任務能夠找到合適的執(zhí)行者。
  • 預期輸出(Expected Output):對任務完成后的詳細描述,使代理清楚任務的目標和期望結(jié)果。比如 “對前 5 條最重要的人工智能新聞進行項目符號列表總結(jié)”。
  • 工具(可選):代理執(zhí)行任務時使用的功能或能力,可增強任務性能和代理交互。通過選擇合適的工具,代理能夠更高效地完成任務。
  • 異步執(zhí)行(可選):設置后任務將異步執(zhí)行,允許在不等待完成的情況下繼續(xù)推進其他任務,適用于耗時較長或?qū)罄m(xù)任務執(zhí)行影響不大的任務。
  • 上下文(可選):指定輸出用作此任務上下文的任務,明確任務之間的依賴關系,實現(xiàn)任務輸出的有效傳遞和利用。
  • 配置(可選):用于執(zhí)行任務的代理的附加配置細節(jié),提供了進一步定制任務執(zhí)行的靈活性。
  • 輸出 JSON(可選):輸出 JSON 對象,需要 OpenAI 客戶端,且只能設置一種輸出格式。此屬性方便與其他系統(tǒng)進行數(shù)據(jù)交互和集成。
  • 輸出 Pydantic(可選):輸出 Pydantic 模型對象,同樣需要 OpenAI 客戶端,且只能設置一種輸出格式。開發(fā)者可根據(jù)實際需求選擇合適的輸出格式。
  • 輸出文件(可選):將任務輸出保存到文件,若與??輸出JSON???或??輸出Pydantic??一起使用,可指定輸出保存方式。這有助于數(shù)據(jù)的持久化和后續(xù)分析。
  • 回調(diào)(可選):任務完成后執(zhí)行的 Python 可調(diào)用函數(shù),可用于根據(jù)任務結(jié)果觸發(fā)操作或通知,如發(fā)送郵件等。
  • 人工輸入(可選):指示任務是否需要最終人工反饋,對于需要人工監(jiān)督的任務非常有用,確保任務結(jié)果的準確性和可靠性。

2.2.3 創(chuàng)建任務

創(chuàng)建任務涉及定義其范圍、負責代理以及任何額外屬性以實現(xiàn)靈活性:

from crewai import Task


task = Task(
    description='查找并總結(jié)有關人工智能的最新和最相關新聞',
    agent=sales_agent
)

“任務分配”:直接為分配指定一個 ??代理???,或者讓 ???分層??? 的 CrewAI 流程根據(jù)角色、可用性等決定。

2.2.4 使用工具創(chuàng)建任務

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='研究員',
  goal='查找并總結(jié)最新的人工智能新聞',
  backstory="""您是一家大公司的研究員。
  您負責分析數(shù)據(jù)并為業(yè)務提供見解。""",
  verbose=True
)


search_tool = SerperDevTool()


task = Task(
  description='查找并總結(jié)最新的人工智能新聞',
  expected_output='對前 5條最重要的人工智能新聞進行項目符號列表總結(jié)',
  agent=research_agent,
  tools=[search_tool]
)


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


result = crew.kickoff()
print(result)

2.2.5 任務依賴

在 crewAI 中,一個任務的輸出會自動傳遞到下一個任務,當有一個任務依賴于另一個任務的輸出,但并非立即在其后執(zhí)行時,這將非常有用。這通過任務的 ??上下文?? 屬性完成:

# ...


research_ai_task = Task(
    description='查找并總結(jié)最新的人工智能新聞',
    expected_output='對前 5條最重要的人工智能新聞進行項目符號列表總結(jié)',
    async_execution=True,
    agent=research_agent,
    tools=[search_tool]
)


research_ops_task = Task(
    description='查找并總結(jié)最新的人工智能運營新聞',
    expected_output='對前 5條最重要的人工智能運營新聞進行項目符號列表總結(jié)',
    async_execution=True,
    agent=research_agent,
    tools=[search_tool]
)


write_blog_task = Task(
    description="撰寫一篇關于人工智能重要性及其最新新聞的完整博客文章",
    expected_output='4段長的完整博客文章',
    agent=writer_agent,
    context=[research_ai_task, research_ops_task]
)


#...

2.2.6 異步執(zhí)行

任務以異步方式執(zhí)行,意味著 Crew 不會等待其完成才繼續(xù)下一個任務。這對于需要很長時間完成的任務或?qū)ο乱粋€任務執(zhí)行不是至關重要的任務非常有用??梢允褂?nbsp;??上下文?? 屬性在將來的任務中定義,它應等待異步任務的輸出完成。

#...


list_ideas = Task(
    description="探索有關人工智能文章的 5個有趣想法。",
    expected_output="一份包含 5個文章想法的項目符號列表。",
    agent=researcher,
    async_execution=True # 將以異步方式執(zhí)行
)


list_important_history = Task(
    description="研究人工智能的歷史,并告訴我 5個最重要的事件。",
    expected_output="包含 5個重要事件的項目符號列表。",
    agent=researcher,
    async_execution=True # 將以異步方式執(zhí)行
)


write_article = Task(
    description="撰寫一篇關于人工智能、其歷史和有趣想法的文章。",
    expected_output="一篇關于人工智能的 4段文章。",
    agent=writer,
    context=[list_ideas, list_important_history] # 將等待兩個任務的輸出完成
)


#...

2.2.7 回調(diào)機制

在任務完成后執(zhí)行回調(diào)函數(shù),允許根據(jù)任務結(jié)果觸發(fā)操作或通知。

# ...


def callback_function(output: TaskOutput):
    # 任務完成后執(zhí)行某些操作
    # 例如:向經(jīng)理發(fā)送電子郵件
    print(f"""
        任務完成!
        任務:{output.description}
        輸出:{output.raw_output}
    """)


research_task = Task(
    description='查找并總結(jié)最新的人工智能新聞',
    expected_output='對前 5條最重要的人工智能新聞進行項目符號列表總結(jié)',
    agent=research_agent,
    tools=[search_tool],
    callback=callback_function
)


#...

2.2.8 訪問特定任務輸出

一組 Crew 運行完成后,可以通過使用任務對象的 ??output?? 屬性訪問特定任務的輸出:

# ...
task1 = Task(
    description='查找并總結(jié)最新的人工智能新聞',
    expected_output='對前 5條最重要的人工智能新聞進行項目符號列表總結(jié)',
    agent=research_agent,
    tools=[search_tool]
)


#...


crew = Crew(
    agents=[research_agent],
    tasks=[task1, task2, task3],
    verbose=2
)


result = crew.kickoff()


# 返回一個 TaskOutput 對象,其中包含任務的描述和結(jié)果
print(f"""
    任務完成!
    任務:{task1.output.description}
    輸出:{task1.output.raw_output}
""")

2.2.9 工具覆蓋機制

在任務中指定工具允許動態(tài)調(diào)整代理能力,突出了 CrewAI 的靈活性。

2.2.10 錯誤處理和驗證機制

在創(chuàng)建和執(zhí)行任務時,存在某些驗證機制,以確保任務屬性的健壯性和可靠性。這些驗證包括但不限于:

  • 確保每個任務僅設置一種輸出類型,以保持清晰的輸出期望。
  • 防止手動分配 ??id?? 屬性,以維護唯一標識符系統(tǒng)的完整性。

這些驗證有助于在 crewAI 框架內(nèi)維護任務執(zhí)行的一致性和可靠性。

2.3 工具(Tool)

2.3.1 工具的作用與類型

CrewAI 工具賦予代理多種能力,包括網(wǎng)頁搜索、數(shù)據(jù)分析、內(nèi)容生成和任務委派等,使代理能夠執(zhí)行各種復雜操作,實現(xiàn)從簡單搜索到復雜互動以及有效團隊合作的跨越。

2.3.2 工具的關鍵特征

  • 實用性(Utility):專為任務設計,涵蓋了多個領域的功能需求,如網(wǎng)頁搜索、數(shù)據(jù)分析、內(nèi)容生成等,滿足代理在不同場景下的工作需求。
  • 集成性(Integration):能夠無縫集成到工作流程中,與代理和任務緊密配合,提升代理的整體能力,實現(xiàn)高效協(xié)作。
  • 可定制性(Customizability):提供了靈活性,開發(fā)者既可以開發(fā)定制工具滿足特定需求,也可以利用現(xiàn)有工具,根據(jù)代理的實際需求進行個性化配置。
  • 錯誤處理(Error Handling):具備強大的錯誤處理機制,確保工具在運行過程中遇到異常時能夠優(yōu)雅地處理,保證系統(tǒng)的平穩(wěn)運行。
  • 緩存機制(Caching Mechanism):具有智能緩存功能,可優(yōu)化性能,減少冗余操作。開發(fā)者還可以通過??cache_function??屬性對緩存機制進行更精細的控制,進一步提高效率。

2.3.3 使用 crewAI 工具

要通過 crewAI 工具增強代理的能力,需要先安裝額外工具包:

pip install 'crewai[tools]'

下面是使用案例

import os
from crewai import Agent, Task, Crew


# 導入 crewAI 工具
from crewai_tools import (
    DirectoryReadTool,
    FileReadTool,
    SerperDevTool,
    WebsiteSearchTool
)
# 設置 API 密鑰
os.environ["SERPER_API_KEY"] = "Your Key" # serper.dev API 密鑰
os.environ["OPENAI_API_KEY"] = "Your Key"


# 實例化工具
docs_tool = DirectoryReadTool(directory='./blog-posts')
file_tool = FileReadTool()
search_tool = SerperDevTool()
web_rag_tool = WebsiteSearchTool()


# 創(chuàng)建代理
researcher = Agent(
    role='市場研究分析師',
    goal='提供關于人工智能行業(yè)最新市場分析',
    backstory='一位對市場趨勢敏銳的專家分析師。',
    tools=[search_tool, web_rag_tool],
    verbose=True
)


writer = Agent(
    role='內(nèi)容撰寫人員',
    goal='撰寫有關人工智能行業(yè)的引人入勝的博客文章',
    backstory='一位對技術(shù)充滿激情的熟練撰稿人。',
    tools=[docs_tool, file_tool],
    verbose=True
)
# 定義任務
research = Task(
    description='研究人工智能行業(yè)的最新趨勢并提供摘要。',
    expected_output='關于人工智能行業(yè)前三個熱門發(fā)展的摘要,并對其重要性提供獨特視角。',
    agent=researcher
)
write = Task(
    description='根據(jù)研究分析師的摘要撰寫一篇引人入勝的博客文章。從目錄中最新的博客文章中汲取靈感。',
    expected_output='一篇以 markdown 格式排版的四段博客文章,內(nèi)容引人入勝、信息豐富且易懂,避免使用復雜術(shù)語。',
    agent=writer,
    output_file='blog-posts/new_post.md'  # 最終的博客文章將保存在此處
)


# 組建團隊
crew = Crew(
    agents=[researcher, writer],
    tasks=[research, write],
    verbose=2
)


# 執(zhí)行任務
crew.kickoff()

2.3.3 可用的 CrewAI 工具

CrewAI 提供了豐富的工具,如??CodeDocsSearchTool???(搜索代碼文檔和相關技術(shù)文檔的 RAG 工具)、???CSVSearchTool???(在 CSV 文件中搜索的 RAG 工具,處理結(jié)構(gòu)化數(shù)據(jù))、???DirectorySearchTool???(用于目錄搜索,瀏覽文件系統(tǒng))等眾多工具,每個工具都有其特定的用途和優(yōu)勢,可根據(jù)任務需求選擇合適的工具。

2.3.4 創(chuàng)建自己的工具

需要先安裝工具包

pip install 'crewai[tools]'
  • 子類化??BaseTool???:通過繼承??BaseTool???類,開發(fā)者可以創(chuàng)建自定義工具。需要定義工具的名稱、描述,并實現(xiàn)??_run??方法來定義工具的具體功能邏輯。例如:

from crewai_tools import BaseTool


class MyCustomTool(BaseTool):
    name: str = "我的工具名稱"
    description: str = "清晰描述此工具用于什么,您的代理將需要這些信息來使用它。"
    def _run(self, argument: str) -> str:
        # 實現(xiàn)在這里
        return "自定義工具的結(jié)果"
  • 利用??tool???裝飾器:使用??tool???裝飾器可以更簡潔地創(chuàng)建自定義工具。只需定義函數(shù),在函數(shù)上方添加??@tool??裝飾器,并提供工具名稱和描述即可。例如:

from crewai_tools import tool


@tool("我的工具名稱")
def my_tool(question: str) -> str:
    """清晰描述此工具用于什么,您的代理將需要這些信息來使用它。"""
    # 函數(shù)邏輯在這里
    return "您的自定義工具的結(jié)果"
  • 自定義緩存機制:工具可以選擇實現(xiàn)??cache_function??來微調(diào)緩存行為。根據(jù)特定條件確定何時緩存結(jié)果,提供對緩存邏輯的細粒度控制。例如:

from crewai_tools import tool


@tool
def multiplication_tool(first_number: int, second_number: int) -> str:
    """當您需要將兩個數(shù)字相乘時有用。"""
    return first_number * second_number


def cache_func(args, result):
    # 在這種情況下,僅在結(jié)果是2的倍數(shù)時才緩存結(jié)果
    cache = result % 2 == 0
    return cache


multiplication_tool.cache_function = cache_func

2.3.5 使用 LangChain 工具

CrewAI 與 LangChain 的工具包無縫集成,開發(fā)者可以利用 LangChain 提供的內(nèi)置工具,如??GoogleSerperAPIWrapper??等,通過簡單的配置將其集成到 CrewAI 系統(tǒng)中,擴展代理的能力。例如:

from crewai import Agent
from langchain.agents import Tool
from langchain.utilities import GoogleSerperAPIWrapper


# 設置API密鑰
os.environ["SERPER_API_KEY"] = "Your Key"
search = GoogleSerperAPIWrapper()


# 創(chuàng)建并將搜索工具分配給代理
serper_tool = Tool(
  name="中級答案",
  func=search.run,
  description="用于基于搜索的查詢的工具"
)


agent = Agent(
  role='研究分析師',
  goal='提供最新的市場分析',
  backstory='一位對市場趨勢敏銳的專家分析師。',
  tools=[serper_tool]
)

2.4 流程(Process)

2.4.1 流程實現(xiàn)方式

  • 順序執(zhí)行(Sequential):任務按照預先定義的順序依次執(zhí)行,一個任務的輸出作為下一個任務的上下文,確保任務執(zhí)行的有序性和連貫性。
  • 分級(Hierarchical):將任務組織在管理層級中,通過指定管理語言模型(??manager_llm??)啟用該流程。管理者代理負責監(jiān)督任務執(zhí)行,包括規(guī)劃、委派和驗證任務,任務根據(jù)代理能力分配,而非預分配。
  • 共識流程(計劃中):旨在實現(xiàn)代理之間在任務執(zhí)行上的協(xié)作決策,引入民主的任務管理方式,目前尚未在代碼庫中實施,但體現(xiàn)了 CrewAI 對持續(xù)發(fā)展和創(chuàng)新的追求。

2.4.2 流程在團隊合作中的作用

流程使個體代理能夠作為一個有凝聚力的整體運作,簡化協(xié)作努力,以高效、協(xié)調(diào)的方式實現(xiàn)共同目標。通過合理的流程設計,團隊能夠更好地應對復雜任務,提高整體工作效率。

2.4.3 將流程分配給manager

在創(chuàng)建manager時,開發(fā)者可以指定流程類型來設置執(zhí)行策略。對于分級流程,必須為管理者代理定義??manager_llm??。例如:

from crewai import Crew
from crewai.process import Process
from langchain_openai import ChatOpenAI


# 順序流程
crew = Crew(
    agents=my_agents,
    tasks=my_tasks,
    process=Process.sequential
)


# 分級流程,確保提供manager_llm
crew = Crew(
    agents=my_agents,
    tasks=my_tasks,
    process=Process.hierarchical,
    manager_llm=ChatOpenAI(model="gpt - 4")
)

2.4.4 附加任務特性

  • 異步執(zhí)行(Asynchronous Execution):允許任務異步執(zhí)行,實現(xiàn)并行處理,提高船員整體生產(chǎn)力。開發(fā)者可以根據(jù)任務特點靈活選擇同步或異步執(zhí)行方式。
  • 人工輸入審查(Human Input Review):提供可選的人工審查任務輸出功能,在最終確定任務結(jié)果前確保質(zhì)量和準確性,引入了額外的監(jiān)督層,保障任務執(zhí)行的可靠性。
  • 輸出定制(Output Customization):任務支持多種輸出格式,如 JSON(??output_json???)、Pydantic 模型(??output_pydantic???)和文件輸出(??output_file??),滿足不同需求,方便數(shù)據(jù)的處理和利用。

2.5 團隊(Crews)

2.5.1 團隊屬性

  • 任務(Tasks):分配給團隊的任務列表,明確團隊需要完成的工作內(nèi)容。
  • 代理(Agents):屬于團隊的代理列表,確定團隊成員構(gòu)成,每個代理都有其獨特的角色和能力。
  • 流程(可選):團隊遵循的流程類型,如順序或分層流程,決定任務執(zhí)行的順序和方式。
  • 詳細程度(可選):執(zhí)行過程中日志記錄的詳細程度,便于開發(fā)者在調(diào)試和監(jiān)控時獲取足夠信息。
  • 經(jīng)理 LLM(可選,分層流程必需):分層流程中經(jīng)理代理使用的語言模型,用于管理任務執(zhí)行過程。
  • 功能調(diào)用 LLM(可選):若傳遞,團隊將使用此 LLM 為所有代理進行工具的功能調(diào)用,開發(fā)者可根據(jù)需求靈活配置。
  • 配置(可選):團隊的可選配置設置,以??Json???或??Dict[str, Any]??格式提供,用于進一步定制團隊行為。
  • 最大 RPM(可選):團隊執(zhí)行過程中每分鐘可執(zhí)行的最大請求數(shù),避免速率限制,可覆蓋個別代理的??max_rpm??設置。
  • 語言(可選):團隊使用的語言,默認為英語,可根據(jù)實際需求進行調(diào)整。
  • 語言文件(可選):用于團隊的語言文件路徑,方便進行多語言支持。
  • 內(nèi)存(可選):用于存儲執(zhí)行記憶(短期、長期、實體記憶),增強團隊的執(zhí)行能力和學習能力。
  • 緩存(可選):指定是否使用緩存存儲工具執(zhí)行結(jié)果,提高流程效率。
  • 嵌入器(可選):團隊使用的嵌入器配置,主要用于內(nèi)存功能,影響數(shù)據(jù)的嵌入和檢索方式。
  • 完整輸出(可選):決定團隊是否返回包含所有任務輸出的完整輸出或僅最終輸出,滿足不同的結(jié)果獲取需求。
  • 步驟回調(diào)(可選):在每個代理的每個步驟后調(diào)用的函數(shù),用于記錄操作或執(zhí)行其他操作,不覆蓋特定于代理的??step_callback??。
  • 任務回調(diào)(可選):在每個任務完成后調(diào)用的函數(shù),用于監(jiān)控或執(zhí)行任務后的其他操作。
  • 共享團隊(可選):是否與 CrewAI 團隊共享完整的團隊信息和執(zhí)行情況,以改進庫并允許訓練模型。
  • 輸出日志文件(可選):是否創(chuàng)建包含完整團隊輸出和執(zhí)行情況的文件,可指定文件路徑和名稱。

2.5.2 創(chuàng)建團隊示例

以下是一個組建團隊的示例,展示如何將具有互補角色和工具的代理結(jié)合在一起,分配任務并選擇流程:

from crewai import Crew, Agent, Task, Process
from langchain_community.tools import DuckDuckGoSearchRun


# 定義具有特定角色和工具的代理
researcher = Agent(
    role='高級研究分析師',
    goal='發(fā)現(xiàn)創(chuàng)新的人工智能技術(shù)',
    tools=[DuckDuckGoSearchRun()]
)


writer = Agent(
    role='內(nèi)容撰稿人',
    goal='撰寫有關人工智能發(fā)現(xiàn)的引人入勝的文章',
    verbose=True
)


# 為代理創(chuàng)建任務
research_task = Task(
    description='識別突破性人工智能技術(shù)',
    agent=researcher
)
write_article_task = Task(
    description='撰寫關于最新人工智能技術(shù)的文章',
    agent=writer
)


# 使用順序流程組裝團隊
my_crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_article_task],
    process=Process.sequential,
    full_output=True,
    verbose=True,
)

2.5.3 團隊執(zhí)行流程

  • 順序流程(Sequential):任務依次執(zhí)行,工作線性流動,簡單直觀,適用于任務之間有明確先后順序的場景。
  • 分層流程(Hierarchical):經(jīng)理代理協(xié)調(diào)團隊,委派任務并在繼續(xù)之前驗證結(jié)果。此流程需要??manager_llm??,適用于復雜任務的管理和分配,確保任務的高效執(zhí)行和質(zhì)量控制。
  • 啟動團隊:使用??kickoff()??方法啟動團隊工作流程,根據(jù)定義的流程開始執(zhí)行任務,獲取任務執(zhí)行結(jié)果。例如:

# 啟動團隊的任務執(zhí)行
result = my_crew.kickoff()
print(result)

2.6 記憶(Memory)

2.6.1 記憶系統(tǒng)組成部分

  • 短期記憶(Short - term Memory):暫時存儲最近的互動和結(jié)果,使代理能夠迅速回憶和利用與當前情境緊密相關的信息,從而在對話或任務序列中保持連貫性,做出更貼合實際情況的決策和回應。
  • 長期記憶(Long - term Memory):猶如一個知識寶庫,保留從過往執(zhí)行中積累的寶貴見解和學習成果。隨著時間的推移,代理能夠不斷從中汲取經(jīng)驗,逐步構(gòu)建和完善自身的知識體系,進而提升未來決策和問題解決的能力,以更好地應對復雜多變的任務場景。
  • 實體記憶(Entity Memory):專注于捕獲和組織在任務執(zhí)行過程中遇到的各類實體信息,涵蓋人、地點、概念等。這有助于代理深入理解復雜信息之間的內(nèi)在聯(lián)系,通過對實體關系的精準映射,更高效地處理和整合相關知識,為解決問題提供更全面、深入的視角。
  • 上下文記憶(Context Memory):致力于維護互動過程中的上下文信息,確保代理在一系列任務或連續(xù)對話中,能夠始終保持響應的連貫性和相關性。即使在長時間的交互過程中,也能準確理解任務背景和意圖,避免出現(xiàn)信息斷層或誤解,從而提供更加準確、合理的輸出。

2.6.2 記憶系統(tǒng)如何賦能代理

  • 上下文意識增強:借助短期記憶和上下文記憶的協(xié)同作用,代理能夠在對話或任務的演進過程中,牢牢把握上下文脈絡。無論是多輪對話中的信息關聯(lián),還是任務序列中的邏輯延續(xù),代理都能依據(jù)存儲的上下文信息,生成更加連貫、一致且符合情境的回應,極大地提升了交互體驗的流暢性和邏輯性。
  • 經(jīng)驗積累與學習加速:長期記憶為代理提供了一個不斷成長和進化的平臺。通過存儲和回顧過去的行動及結(jié)果,代理能夠從中總結(jié)經(jīng)驗教訓,發(fā)現(xiàn)規(guī)律和模式,進而不斷優(yōu)化自身的決策策略和問題解決方法。這種經(jīng)驗積累的過程使得代理在面對類似問題時,能夠迅速做出更明智、更高效的決策,顯著提高工作效率和質(zhì)量。
  • 實體理解與信息處理優(yōu)化:實體記憶賦予代理識別和記憶關鍵實體的能力,使其在處理復雜信息時能夠快速聚焦核心要點,理清信息之間的相互關系。這不僅有助于代理更準確地理解任務需求,還能在面對海量信息時,迅速篩選出有價值的內(nèi)容,提高信息處理的速度和精度,從而更有效地應對復雜任務和多樣化的問題場景。

2.6.3 在團隊中實施記憶

在配置團隊時,開發(fā)者可以根據(jù)團隊目標和任務性質(zhì),靈活啟用和定制每個記憶組件。默認情況下,記憶系統(tǒng)處于關閉狀態(tài),通過在團隊配置中設置??memory = True???,即可激活記憶功能,為團隊注入強大的記憶能力。記憶默認使用 OpenAI Embeddings,但開發(fā)者也可以通過調(diào)整???embedder???參數(shù),將其設置為其他模型,如 Google AI、Azure OpenAI、GPT4ALL、Vertex AI 或 Cohere 等,以滿足不同場景下的需求。例如:

from crewai import Crew, Agent, Task, Process


# 使用具有記憶功能的團隊,采用默認的OpenAI Embeddings
my_crew = Crew(
    agents=[...],
    tasks=[...],
    process=Process.sequential,
    memory=True,
    verbose=True
)


# 使用具有記憶功能的團隊,切換為Google AI嵌入
my_crew = Crew(
    agents=[...],
    tasks=[...],
    process=Process.sequential,
    memory=True,
    verbose=True,
    embedder={
        "provider": "google",
        "config":{
            "model": 'models/embedding - 001',
            "task_type": "retrieval_document",
            "title": "Embeddings for Embedchain"
        }
    }
)

2.6.4 使用 CrewAI 記憶系統(tǒng)的好處

  • 自適應學習與持續(xù)優(yōu)化:隨著時間的推移和任務的不斷執(zhí)行,團隊能夠逐漸適應新的信息和任務要求,不斷完善處理任務的方法和策略。記憶系統(tǒng)使代理能夠從過往經(jīng)驗中學習,自動調(diào)整行為模式,從而在面對新情況時更加從容,團隊整體效率也會隨著經(jīng)驗的積累而不斷提升。
  • 個性化體驗提升:記憶功能使代理能夠記錄和識別用戶的偏好、歷史互動等信息,從而為用戶提供更加個性化的服務和體驗。無論是在內(nèi)容推薦、問題解答還是交互方式上,代理都能夠根據(jù)用戶的個性化特征進行精準回應,滿足用戶的特定需求,增強用戶與系統(tǒng)之間的粘性和滿意度。
  • 問題解決能力強化:豐富的記憶存儲庫為代理提供了強大的知識后盾,使其在解決問題時能夠充分借鑒過去的學習成果和上下文信息。通過快速檢索和利用相關經(jīng)驗,代理能夠更全面地分析問題,發(fā)現(xiàn)潛在的解決方案,做出更明智、更準確的決策,從而有效提升解決復雜問題的能力,為團隊的成功運作提供有力支持。

3. 基于 CrewAI 構(gòu)建 Multi Agent 系統(tǒng)的實踐步驟

3.1 準備工作

3.1.1 環(huán)境配置

確保系統(tǒng)滿足 CrewAI 和相關依賴項的安裝要求。根據(jù)不同的操作系統(tǒng),可能需要安裝特定的軟件包或配置環(huán)境變量。例如,在某些系統(tǒng)上可能需要安裝 Python 環(huán)境、相關的庫以及配置 API 密鑰等。

3.1.2 安裝 CrewAI 和 Ollama(可選)

按照官方文檔的指導,依次安裝 CrewAI 和 Ollama(如果需要使用 Ollama)。安裝過程中可能需要注意版本兼容性、依賴關系等問題,確保安裝順利完成。例如,使用 pip 命令安裝 CrewAI 及其工具包:??pip install crewai[tools]??,并根據(jù) Ollama 的安裝指南進行相應操作。

3.1.3 設置模型

在 CrewAI 的配置文件中,將語言模型(LLM)設置為所需的模型,如 Llama3 等。這一步驟確保代理在執(zhí)行任務時能夠使用合適的語言模型進行推理和決策。

3.2 創(chuàng)建代理

3.2.1 定義代理角色和目標

根據(jù)任務需求,明確每個代理的角色和目標。例如,創(chuàng)建一個負責信息收集的代理,其角色可以定義為 “信息采集員”,目標為 “收集特定領域的相關信息”;再如,創(chuàng)建一個專注于數(shù)據(jù)分析的代理,角色為 “數(shù)據(jù)分析師”,目標是 “對收集到的數(shù)據(jù)進行深入分析,提取有價值的見解”。

3.2.2 配置代理屬性

根據(jù)代理的角色和任務特點,合理配置代理的屬性,如選擇合適的語言模型、添加必要的工具、設置最大迭代次數(shù)、緩存策略等。以信息采集員代理為例,可以為其配置網(wǎng)頁搜索工具,設置較大的最大請求次數(shù)以提高信息獲取效率,同時開啟緩存以減少重復搜索;而數(shù)據(jù)分析師代理可能需要連接到特定的數(shù)據(jù)庫工具,根據(jù)分析任務的復雜程度調(diào)整最大迭代次數(shù)等屬性。

3.2.3 編寫代理背景故事(可選但推薦)

為代理編寫詳細的背景故事,雖然這是可選步驟,但可以為代理的行為和決策提供更豐富的上下文,增強代理的擬人化特征,有助于提升系統(tǒng)的交互性和可解釋性。例如,為信息采集員編寫背景故事:“您是一名專業(yè)的信息采集員,擅長在海量的網(wǎng)絡信息中快速篩選出有價值的內(nèi)容。您長期從事數(shù)據(jù)收集工作,對各種信息源了如指掌,并且熟練掌握多種搜索技巧和工具。此次任務是為了幫助團隊獲取關于 [具體領域] 的最新信息,為后續(xù)的分析和決策提供有力支持?!?/p>

3.3 定義任務

3.3.1 明確任務描述

對每個任務進行清晰、準確的描述,確保代理能夠明確理解任務的具體要求。例如,“分析過去一個月內(nèi)社交媒體上關于 [產(chǎn)品名稱] 的用戶反饋,提取主要的意見和建議”“根據(jù)市場數(shù)據(jù)預測未來三個月內(nèi) [行業(yè)名稱] 的發(fā)展趨勢” 等。

3.3.2 分配任務代理

根據(jù)代理的角色和能力,將任務合理分配給相應的代理??梢灾苯又付ㄘ撠焾?zhí)行任務的代理,也可以利用 CrewAI 的流程機制,讓系統(tǒng)根據(jù)代理的可用性、專業(yè)技能等因素自動分配任務。例如,將信息收集任務分配給信息采集員代理,將數(shù)據(jù)分析任務分配給數(shù)據(jù)分析師代理。

3.3.3 配置任務屬性

根據(jù)任務需求,設置任務的其他屬性,如預期輸出格式(JSON、Pydantic 模型或文件等)、是否需要異步執(zhí)行、是否需要人工輸入審查、設置任務上下文等。例如,對于實時性要求較高的任務,可以設置為異步執(zhí)行,以提高系統(tǒng)的整體響應速度;對于重要的決策性任務,可以開啟人工輸入審查,確保結(jié)果的準確性。

3.4 集成工具

3.4.1 選擇合適的工具

從 CrewAI 提供的豐富工具庫中選擇適合任務的工具,如用于網(wǎng)頁搜索的??WebsiteSearchTool???、用于文件讀取的???FileReadTool???、用于數(shù)據(jù)分析的???CSVSearchTool???等。也可以根據(jù)需要創(chuàng)建自定義工具,以滿足特定任務的獨特需求。

3.4.2 將工具與代理和任務集成

將選定的工具分配給相應的代理,使代理能夠在執(zhí)行任務時調(diào)用這些工具。在定義任務時,明確指定任務所需使用的工具,確保工具與任務緊密結(jié)合,協(xié)同工作。例如,在信息收集任務中,為信息采集員代理配備??WebsiteSearchTool???和???DirectorySearchTool???,以便其能夠從網(wǎng)頁和本地目錄中獲取信息。

3.5 組建團隊

3.5.1 組合代理

將具有不同角色和能力的代理組合在一起,形成一個協(xié)同工作的團隊。確保團隊成員之間的角色互補,能夠共同完成復雜的任務。例如,一個團隊可以包括信息采集員、數(shù)據(jù)分析師、內(nèi)容創(chuàng)作者等不同角色的代理,各自發(fā)揮專長,共同實現(xiàn)項目目標。

3.5.2 定義團隊流程

根據(jù)任務的特點和要求,選擇合適的團隊流程,如順序流程或分級流程。順序流程適用于任務之間具有明確先后順序的場景,代理按照預定順序依次執(zhí)行任務;分級流程則適用于需要管理和協(xié)調(diào)的復雜任務,通過經(jīng)理代理進行任務分配和監(jiān)督。

3.5.3 配置團隊屬性

根據(jù)團隊的需求,設置團隊的各種屬性,如日志記錄詳細程度、最大請求速率、語言設置、內(nèi)存和緩存配置、是否共享團隊信息等。合理的團隊屬性配置能夠優(yōu)化團隊的運行效率,滿足不同場景下的需求。

3.6 執(zhí)行任務與監(jiān)控

3.6.1 啟動團隊任務執(zhí)行

使用??kickoff()??方法啟動團隊的任務執(zhí)行流程,系統(tǒng)將根據(jù)定義的流程和任務分配,驅(qū)動代理開始工作。在任務執(zhí)行過程中,可以通過日志記錄、控制臺輸出等方式實時監(jiān)控任務的進展情況。

3.6.2 監(jiān)控任務執(zhí)行過程

利用 CrewAI 提供的日志記錄功能和相關監(jiān)控工具,密切關注任務的執(zhí)行狀態(tài)、代理的操作步驟、輸出結(jié)果等信息。通過詳細的監(jiān)控,及時發(fā)現(xiàn)任務執(zhí)行過程中可能出現(xiàn)的問題,如代理執(zhí)行錯誤、任務超時、資源占用過高等。

3.6.3 處理任務執(zhí)行結(jié)果

任務執(zhí)行完成后,獲取并處理任務的輸出結(jié)果。根據(jù)任務的預期輸出格式,對結(jié)果進行解析和分析,將有價值的信息提取出來,用于后續(xù)的決策或進一步的處理。同時,根據(jù)任務執(zhí)行的結(jié)果和監(jiān)控過程中發(fā)現(xiàn)的問題,對代理、任務或團隊配置進行必要的調(diào)整和優(yōu)化,以提高系統(tǒng)的性能和準確性。

4. 案例分析:CrewAI 在實際項目中的應用

4.1 智能客服系統(tǒng)

4.1.1 系統(tǒng)架構(gòu)與代理角色

在智能客服系統(tǒng)中,構(gòu)建了多個代理來模擬人類客服的工作流程。其中包括用戶問題接收代理、問題分類代理、信息查詢代理、回答生成代理和回答審核代理等。用戶問題接收代理負責接收用戶的咨詢問題,并將其傳遞給問題分類代理;問題分類代理根據(jù)問題的類型,將其分配給相應的信息查詢代理;信息查詢代理利用各種工具(如知識庫查詢工具、數(shù)據(jù)庫搜索工具等)查找相關信息;回答生成代理根據(jù)查詢到的信息生成初步回答;回答審核代理對生成的回答進行審核和優(yōu)化,確?;卮鸬臏蚀_性和質(zhì)量。

4.1.2 任務流程與協(xié)作

當用戶提出問題時,用戶問題接收代理將問題記錄并傳遞給問題分類代理。問題分類代理通過對問題的關鍵詞分析、語義理解等技術(shù),將問題分類為常見問題、技術(shù)問題、售后問題等不同類型。然后,根據(jù)分類結(jié)果,將問題分配給對應的信息查詢代理。信息查詢代理根據(jù)問題類型,在知識庫、數(shù)據(jù)庫或外部資源中查找相關信息。例如,對于常見問題,直接從知識庫中檢索答案;對于技術(shù)問題,可能需要查詢技術(shù)文檔或與技術(shù)專家系統(tǒng)進行交互?;卮鹕纱砀鶕?jù)查詢到的信息,運用自然語言生成技術(shù),將信息轉(zhuǎn)化為清晰、易懂的回答。最后,回答審核代理對回答進行語法檢查、邏輯審核和禮貌性評估,如有必要,進行進一步的優(yōu)化和修改。整個過程中,各個代理通過 CrewAI 的通信機制和任務編排功能,實現(xiàn)了高效的協(xié)作,為用戶提供了快速、準確的回答。

4.2 智能內(nèi)容創(chuàng)作助手

4.2.1 代理功能與分工

智能內(nèi)容創(chuàng)作助手由多個代理協(xié)同工作,包括主題策劃代理、素材收集代理、內(nèi)容生成代理和內(nèi)容潤色代理等。主題策劃代理負責根據(jù)用戶需求或市場趨勢確定創(chuàng)作主題;素材收集代理利用網(wǎng)絡搜索工具、數(shù)據(jù)庫查詢工具等收集相關的素材,如文章、圖片、數(shù)據(jù)等;內(nèi)容生成代理根據(jù)主題和素材,運用自然語言生成算法創(chuàng)作初稿;內(nèi)容潤色代理則對初稿進行語法優(yōu)化、風格調(diào)整和邏輯梳理,使其更符合用戶的要求和預期。

4.2.2 創(chuàng)作過程與協(xié)同機制

當用戶提出創(chuàng)作需求(如撰寫一篇關于 [特定主題] 的文章)時,主題策劃代理首先進行主題分析和策劃,確定文章的大致框架和重點內(nèi)容。然后,素材收集代理根據(jù)主題,在互聯(lián)網(wǎng)上搜索相關的文章、研究報告、案例等素材,并將其整理后傳遞給內(nèi)容生成代理。內(nèi)容生成代理根據(jù)主題框架和收集到的素材,運用深度學習模型生成文章初稿。例如,它可以根據(jù)素材中的觀點、數(shù)據(jù)等生成段落內(nèi)容,組織文章結(jié)構(gòu)。最后,內(nèi)容潤色代理對初稿進行全面的潤色,檢查語法錯誤、優(yōu)化詞匯選擇、調(diào)整句子結(jié)構(gòu),使文章更加通順、流暢、有吸引力。在整個創(chuàng)作過程中,代理之間通過 CrewAI 的通信和協(xié)作機制,實時共享信息和反饋,確保創(chuàng)作工作的順利進行。

4.3 智能投資決策系統(tǒng)

4.3.1 系統(tǒng)組成與代理職責

智能投資決策系統(tǒng)由市場數(shù)據(jù)采集代理、數(shù)據(jù)分析代理、風險評估代理、投資策略推薦代理和投資組合優(yōu)化代理等組成。市場數(shù)據(jù)采集代理負責從各種金融數(shù)據(jù)源(如股票交易所、財經(jīng)新聞網(wǎng)站、金融數(shù)據(jù)庫等)實時采集市場數(shù)據(jù),包括股票價格、成交量、宏觀經(jīng)濟指標等;數(shù)據(jù)分析代理對采集到的數(shù)據(jù)進行清洗、整理和分析,提取有價值的信息,如市場趨勢、行業(yè)動態(tài)、公司財務狀況等;風險評估代理根據(jù)數(shù)據(jù)分析結(jié)果,運用風險評估模型評估投資標的的風險水平;投資策略推薦代理根據(jù)市場情況和投資者的風險偏好,推薦合適的投資策略,如長期投資、短期投機、分散投資等;投資組合優(yōu)化代理則根據(jù)推薦的投資策略,對投資組合進行優(yōu)化,確定最佳的資產(chǎn)配置比例。

4.3.2 決策流程與協(xié)作模式

市場數(shù)據(jù)采集代理持續(xù)不斷地收集最新的市場數(shù)據(jù),并將其傳遞給數(shù)據(jù)分析代理。數(shù)據(jù)分析代理對數(shù)據(jù)進行深度分析,例如通過技術(shù)分析方法預測股票價格走勢,通過基本面分析評估公司的內(nèi)在價值。風險評估代理根據(jù)數(shù)據(jù)分析結(jié)果,結(jié)合歷史數(shù)據(jù)和風險模型,評估不同投資標的的風險程度。投資策略推薦代理綜合考慮市場趨勢、風險評估結(jié)果和投資者的風險偏好,為投資者推薦個性化的投資策略。例如,對于風險偏好較高的投資者,可能推薦更多的股票投資比例;對于保守型投資者,則推薦更穩(wěn)健的債券和基金投資組合。最后,投資組合優(yōu)化代理根據(jù)推薦的投資策略,運用數(shù)學優(yōu)化算法,確定最優(yōu)的投資組合配置,以實現(xiàn)收益最大化和風險最小化。在整個決策過程中,各個代理緊密協(xié)作,通過 CrewAI 的流程編排和通信機制,實現(xiàn)數(shù)據(jù)的高效流轉(zhuǎn)和決策的科學化。

本文轉(zhuǎn)載自???鴻煊的學習筆記???,作者:乘風破浪jxj

收藏
回復
舉報
回復
相關推薦