如何使用 CrewAI 構建協作型 AI Agents

一、前言

AI Agents 的開發是當前軟件創新領域的熱點。隨著大語言模型 (LLM) 的不斷進步,預計 AI 智能體與現有軟件系統的融合將出現爆發式增長。借助 AI 智能體,我們可以通過一些簡單的語音或手勢命令,就能完成以往需要手動操作應用程序才能實現的任務。但目前, AI 智能體的開發還處于初期階段,正如 1990 年代的互聯網,我們還在基礎設施、工具和框架開發的初步階段探索前行。本文將介紹一個名為 CrewAI 的新型智能體開發框架。

本文主要包含以下內容

  • 認識 AI 智能體。
  • 探索 CrewAI —— 一個構建智能體的開源工具。
  • 學習如何構建一個共同創作內容的 AI 團隊。
  • 了解 AI 智能體在現實生活中的應用案例。

二、什么是 AI Agents?

語言模型在翻譯、總結和推理方面表現出色。但它們的潛力遠不止于此。讓大語言模型 (LLM) 具備代理性是充分挖掘其推理潛力的一種方法。AI 智能體就是被賦予適當工具和指令的 LLM,能夠自動完成網頁瀏覽、網絡抓取、執行 SQL 查詢、文件操作等任務。利用 LLM 的推理能力,這些智能體能夠根據當前需求選擇合適的工具。而且,我們還可以將多個智能體組合起來,共同完成更復雜的任務。

當我們談論如何構建 AI Agents時,首先想到的工具就是 LangChain。然而,使用 LangChain 手動協調 AI 智能體執行協作任務可能會相當困難。CrewAI 正是為了解決這一問題而生。

三、什么是 CrewAI?

CrewAI 是一個開源框架,專門用于協調具有角色扮演和自主操作的 AI 智能體。它可以幫助我們輕松創建能夠共同實現復雜目標協作的 AI 智能體。這個框架的設計目的是讓 AI 智能體能夠扮演不同的角色、分配任務并共享目標,就像現實世界中的團隊成員一樣。CrewAI 的幾大特性包括:

  • 基于角色的AI智能體設計:定義具備特定角色、目標和背景故事的智能體,讓 LLM 在生成回答前有更豐富的上下文。
  • 靈活的任務管理方式:通過可定制化工具定義任務,并能夠動態地分配給不同的智能體。
  • 智能體間的自主委派機制:智能體能夠自行決定任務分配并相互協作,這大大提高了解決問題的效率。
  • 流程驅動策略:目前系統只支持按順序執行任務和按層級組織流程,Crew AI正在研發更為復雜的流程管理方式,比如基于共識和自主決策的流程。
  • 保存任務輸出:可以將任務產生的數據保存為文件,便于后續使用。
  • 輸出解析功能:根據需要,可以將任務輸出解析成 Pydantic 模型或 Json 格式。
  • 支持開源模型集成:可以利用 Open AI 或其他開源模型來運行你的團隊。

CrewAI 能夠與 LangChain 生態系統無縫集成。這意味著我們可以利用 LangChain 提供的工具和大語言模型 (LLM) 的集成功能,與 CrewAI 一起工作。

CrewAI 是一個旨在增強人工智能代理協作的最先進框架。這種創新方法通過營造一個讓人工智能代理作為一個統一團隊更有效地運作的環境,解決了 Autogen 和 ChatDev 等現有解決方案的局限性。

AutoGen 在促進創建協同工作的對話代理方面發揮了重要作用。然而,當涉及到協調代理之間的交互時,尤其是對于較大的任務,它會遇到困難。另一方面,ChatDev引入了進程的概念,盡管缺乏靈活性和可擴展性,使其不太適合實際應用。 CrewAI 克服了這些挑戰,并為人工智能協作樹立了新標準。

四、CrewAI 的工作原理

在 CrewAI 的背后,CrewAI 的每個智能體在核心上都是基于 LangChain 的智能體,但它們被賦予了特殊的能力,通過 ReActSingleInputOutputParser 進行增強。這種特別設計的解析器不僅優化了角色扮演功能,還添加了用于增強上下文關注點的綁定停止詞,并通過 LangChain 的會話摘要記憶機制實現了任務連續性。

由于這些智能體是構建在 LangChain 之上的,它們自然而然地帶來了所謂的“飛輪效應”,最直接的好處就是你可以無縫接入所有 LangChain 提供的工具和工具包,極大地拓寬了應用場景。

目前版本的智能體能夠獨立自主運作,它們通過內部對話來選擇合適的工具。不過,CrewAI 計劃在未來版本中加入更多樣化的流程類型,這將支持在不同的團隊配置中進行協作,實現在運行時動態分配任務的能力。

任務從一開始就指定給智能體,并且可以根據需要調整智能體可用的工具,這樣既可以靈活地指導智能體完成不同的任務,又避免了給它們分配過多工具造成的負擔。

Crew 本質上是一個框架,它包含了智能體和任務,并促進了它們按順序完成工作。在實踐中,采用多個獨立 Crew 的模塊化部署方式往往更加高效,每個 Crew 包含少量智能體。這種方式不僅使每個 Crew 能夠達到不同的成果,而且避免了單一大型 Crew 處理眾多任務和智能體時可能出現的瓶頸。

五、構建協作 AI 團隊

如果想要更深入地了解 CrewAI,我們可以嘗試構建一個用于創意寫作的協作 AI 團隊。首先,我們需要設定智能體的角色、工具以及每個智能體的具體任務。在這個內容創作團隊中,我們設想了三個角色:創意分析師、撰稿人和編輯。每個角色都將承擔特定的任務。

創意分析師負責分析主題并制定詳盡的寫作大綱。撰稿人則根據大綱撰寫文章初稿。最后,編輯將對初稿進行格式化、編輯和校對。正如我們所知,CrewAI 允許我們為智能體添加定制工具。例如,我們可以為編輯智能體添加一個工具,使其能夠將文檔保存到本地硬盤。為了實現這些功能,我們需要一個大語言模型 (LLM)。在這個例子中,我們選擇了 Google 的 Gemini 模型。

接下來,讓我們開始編碼。

和任何 Python 項目一樣,首先創建一個虛擬環境并安裝必要的依賴庫。我們需要 Crewai 庫以及 LangChain 提供的 Google GenAI 實現。當然,你也可以選擇其他大語言模型,比如 Anthropic、Ollama、Tongyi Qwen 或 OpenAI 提供的開放模型。

注:CrewAI 可以使用 Ollama(一個用于人工智能代理開發的開源庫)在本地運行。此功能可實現與現有系統的無縫集成,并消除對外部 API 的依賴,從而確保數據隱私和安全。

pip install crewai langchain-google-genai

首先,我們需要定義我們的 LLM 和協作智能體。為此,創建一個名為 agents.py 的文件來定義這些智能體。

import osfrom crewai import Agent
from langchain.tools import tool
from langchain_google_genai import GoogleGenerativeAIGOOGLE_API_KEY = "Your Key"
llm = GoogleGenerativeAI(model="gemini-pro", google_api_key=GOOGLE_API_KEY)

接下來,我們定義一個文件保存工具。

class FileTools:@tool("Write File with content")def write_file(data: str):"""這個工具用于將指定內容寫入到特定路徑的文件中。
輸入格式應該是一個由豎線 (|) 分隔的字符串,包含兩部分:文件的完整路徑(例如:./lore/...)和你想要寫入文件的具體內容。"""try:path, content = data.split("|")path = path.replace("\n", "").replace(" ", "").replace("`", "")if not path.startswith("./lore"):path = f"./lore/{path}"with open(path, "w") as f:f.write(content)return f"File written to {path}."except Exception:return "Error with the input format for the tool."

上述的 write_file 方法使用了 LangChain 的工具函數進行裝飾。由于 CrewAI 在后臺使用 LangChain,所以工具必須遵循 LangChain 的規范。這個方法期望接收一個字符串,其中包含文件路徑和內容,兩者通過豎線 (|) 分隔。方法的文檔字符串也作為函數的附加上下文,所以請確保提供詳細的方法信息。

接下來,讓我們定義智能體。

idea_analyst = Agent(role = "創意分析師",goal = "深入剖析創意,為文章撰寫制定詳細大綱。",backstory="""作為一名資深的內容分析師,你擅長深入挖掘創意,并為其制定出一套完整的寫作計劃。""",llm = llm,verbose=True
)
writer = Agent(role = "小說作家",goal = "根據分析師提供的創意,創作出吸引人的奇幻和科幻小說作品。",backstory="""作為一名享譽盛名的小說家,你曾兩次榮登《人民文學》暢銷書榜,專攻虛構和科幻領域。""",llm=llm,verbose=True
)editor = Agent(role= "內容編輯",goal = "對作家撰寫的內容進行精心編輯。",backstory="""作為一名經驗豐富的編輯,你在編輯書籍和故事方面擁有多年的專業經驗,能夠確保作品質量。
復制再試一次分享""",llm = llm,tools=[FileTools.write_file],verbose=True
)

我們有三個智能體,每個都有不同的角色、目標和背景故事。這些信息將作為提示,幫助 LLM 更好地理解上下文。編輯智能體還關聯了一個寫作工具。

接下來,我們需要定義任務。為此,創建一個名為 tasks.py 的文件。

from textwrap import dedentclass CreateTasks:def expand_idea():return dedent("""分析給定任務 {idea}。為完成給定任務準備全面的要點。確保想法切題、連貫且引人入勝。確保遵守規則。不要使用任何工具。規則:- 用項目符號列出想法。- 避免成人內容的想法。""")def write():return dedent("""根據創意分析師給出的藍圖想法,寫一個1200字的引人入勝的故事。確保內容連貫、易于傳達且吸引人。不要使用任何工具。 確保遵守規則。規則:- 寫作必須語法正確。- 盡可能少使用術語""")def edit():return dedent("""查找任何語法錯誤,進行編輯和格式化(如果需要)。在需要時為文本添加標題和副標題。不要縮短內容或添加評論。為內容創建一個合適的文件名,使用 .txt 擴展名。你必須使用工具將其保存到路徑 ./lore/(你的標題.txt) 中。""")

這里的任務是你希望智能體執行的具體行動計劃。

最后,創建 main.py 文件,我們將在這里組合智能體和任務,構建一個功能完備的團隊。

from textwrap import dedentfrom crewai import Crew, Taskfrom agents import editor, idea_analyst, writer
from tasks import CreateTasksclass ContentWritingCrew():def __init__(self, idea):self.idea = ideadef __call__(self):tasks = self._create_tasks()crew = Crew(tasks=tasks,agents=[idea_analyst, writer, editor],verbose=True)result = crew.kickoff()return resultdef _create_tasks(self):idea = CreateTasks.expand_idea().format(idea=self.idea)expand_idea_task = Task(description=idea,agent = idea_analyst)write_task =  Task(description=CreateTasks.write(),agent=writer)edit_task = Task(description=CreateTasks.edit(),agent=editor)return [expand_idea_task, write_task, edit_task]if __name__ == "__main__":dir = "./lore"if not os.path.exists(dir):os.mkdir(dir)idea = input("idea: ")my_crew = ContentWritingCrew(idea=idea)result = my_crew()print(dedent(result))

在上述代碼中,我們定義了一個名為 ContentWritingCrew 的類,它接受用戶輸入的創意主題。_create_tasks 方法用于創建任務,而 call 方法則用于初始化并啟動團隊。運行腳本后,你可以在終端或筆記本上觀察到一系列動作的執行。任務將按照團隊定義的順序執行。以下是執行日志的一個示例。

這是最終智能體,即編輯器的執行日志。它編輯了撰稿人智能體提供的初稿,并使用文件編寫工具以合適的文件名保存文件。

這就是使用 CrewAI 創建協作 AI 智能體的基本流程。你還可以結合其他 LangChain 工具或創建自定義工具,通過有效的提示來完成更復雜的任務。

六、AI智能體應用案例

自主 AI 智能體在現實生活中有著廣泛的應用前景。從個人助理到虛擬教練,以下是一些 AI 智能體的實際應用案例。

個人 AI 助理:不久的將來,個人助理將成為我們日常生活的一部分。想象一下,有一個像 Jarvis 那樣的智能助理,它能處理你的所有數據,實時提供有用的信息,并自動完成一些日常瑣事。

代碼解釋器:OpenAI 的代碼解釋器展示了 AI 智能體的強大潛力。這個解釋器能夠執行任何 Python 腳本,并根據文本提示返回結果。這可能是迄今為止最成功的 AI 智能體應用之一。

虛擬教練:隨著 AI 技術的不斷進步,我們可以預見在教育、培訓等領域將出現大量的虛擬教練。

智能體優先軟件開發:AI 智能體在軟件開發領域有著巨大的應用潛力。與傳統的手動操作相比,AI 智能體能夠根據語音指令自動完成各種任務。

空間計算:隨著增強現實 (AR) 和虛擬現實 (VR) 技術的不斷發展,AI 智能體將在虛擬世界與現實世界之間架起橋梁,發揮至關重要的作用。

七、總結

盡管我們仍處于 AI 智能體開發的初級階段,但目前要實現 AI 智能體的最佳性能,我們還需要依賴于 GPT-4,這在成本上可能較為昂貴。然而,隨著開源模型逐漸趕上 GPT-4,我們將有更多的選擇,能夠在合理的成本下高效運行 AI 智能體。同時,智能體開發的框架也在不斷進步,未來將使智能體能夠執行更加復雜的任務。

7.1、關鍵要點

  • AI 智能體利用大語言模型 (LLM) 的推理能力,選擇適當的工具來完成復雜任務。
  • CrewAI 是一個構建協作 AI 智能體的開源框架。
  • CrewAI 的獨特特性包括基于角色的智能體設計、智能體間的自主委托以及靈活的任務管理。
  • CrewAI 能夠與現有的 LangChain 生態系統無縫集成,我們可以結合使用 LangChain 工具和大語言模型 (LLM) 與 CrewAI。

八、References

[1]. CrewAI GitHub:https://github.com/joaomdmoura/crewAI

[2]. Google GenAI:https://python.langchain.com/docs/integrations/llms/google_ai

[3]. Ollama:https://python.langchain.com/docs/integrations/llms/ollama

[4]. Tongyi Qwen:https://python.langchain.com/docs/integrations/llms/tongyi

[5]. Building AI Agents: https://www.analyticsvidhya.com/blog/2024/01/building-collaborative-ai-agents-with-crewai/

[6]. CrewAI Docs:https://docs.crewai.com/

[7]. CrewAI Examples:https://github.com/joaomdmoura/crewAI-examples

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717559.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717559.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717559.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

運維的利器–監控–zabbix–grafana

運維的利器–監控–zabbix–grafana 一、介紹 Grafana 是一個跨平臺的開源的度量分析和可視化工具 , 可以通過將采集的數據查詢然后可視化的展示 。zabbix可以作為數據源,為grafana提供數據,然后grafana將數據以圖表或者其他形式展示出來。zabbix和gra…

基于YOLOv的目標追蹤與無人機前端查看系統開發

一、背景與簡介 隨著無人機技術的快速發展,目標追蹤成為無人機應用中的重要功能之一。YOLOv作為一種高效的目標檢測算法,同樣適用于目標追蹤任務。通過集成YOLOv模型,我們可以構建一個無人機前端查看系統,實現實時目標追蹤和可視化…

零基礎學編程,中文編程工具之進度標尺構件的編程用法

零基礎學編程,中文編程工具之進度標尺構件的編程用法 一、前言 今天給大家分享的中文編程開發語言工具 進度條構件的用法。 編程入門視頻教程鏈接 https://edu.csdn.net/course/detail/39036 編程工具及實例源碼文件下載可以點擊最下方官網卡片——軟件下載——…

機器人持續學習基準LIBERO系列9——數據集軌跡查看

0.前置 機器人持續學習基準LIBERO系列1——基本介紹與安裝測試機器人持續學習基準LIBERO系列2——路徑與基準基本信息機器人持續學習基準LIBERO系列3——相機畫面可視化及單步移動更新機器人持續學習基準LIBERO系列4——robosuite最基本demo機器人持續學習基準LIBERO系列5——…

Python AI 實現繪畫功能(附帶源碼)

本文我們將為大家介紹如何基于一些開源的庫來搭建一套自己的 AI 作圖工具。 需要使用的開源庫為 Stable Diffusion web UI,它是基于 Gradio 庫的 Stable Diffusion 瀏覽器界面 Stable Diffusion web UI GitHub 地址:GitHub - AUTOMATIC1111/stable-dif…

快速解決maven依賴沖突

我們在開發過程中經常出現maven依賴沖突,或者maven版本不匹配的情況,我們可以使用阿里云原生腳手架來做maven管理,添加需要的組件,然后點擊獲取代碼,就可以獲得對應的依賴文件。

【重要公告】對BSV警報系統AS的釋義

??發表時間:2024年2月15日 由BSV區塊鏈協會開發并管理的BSV警報系統(Alert System,以下簡稱“AS”)是BSV網絡的重要組件。它是一個復雜的系統,主要職能是在BSV區塊鏈網絡內發布信息。這些信息通常與網絡訪問規則NAR相…

c# 任務(Task)介紹

任務(Task) Task作為C#異步的核心,Task位于System.Threading.Tasks命名空間下。 創建任務的基本原理是使用線程池,也就是說任務最終也是要交給線程去執行的。但是微軟優化了任務的線程池,使線程的控制更加精準和高效…

自定義TypeHandler

自定義TypeHandler 繼承BaseTypeHandler指定具體的泛型 MappedTypes({Date.class}) MappedJdbcTypes({JdbcType.DATE}) public class DateTimeWithTImeZoneTypeHandler extends BaseTypeHandler<Date> {Log log LogFactory.getLog(DateTimeWithTImeZoneTypeHandler.cl…

C++基于多設計模式下的同步異步日志系統day4

&#x1f4df;作者主頁&#xff1a;慢熱的陜西人 &#x1f334;專欄鏈接&#xff1a;C基于多設計模式下的同步&異步日志系統 &#x1f4e3;歡迎各位大佬&#x1f44d;點贊&#x1f525;關注&#x1f693;收藏&#xff0c;&#x1f349;留言 只要內容主要實現了同步日志消息…

Kubernetes的Sevice管理

服務原理: 所有服務都是根據這個服務衍生或者變化出來,根服務---- 服務感知后端靠標簽 slelector 標簽選擇器 kubectl label pods web1 appweb kubectl cluter-info dump | grep -i service-cluster-ip-range 服務ip取值范圍 Service 管理: 創建服務: --- kind: Serv…

React富文本編輯器開發(六)

現在&#xff0c;相關的基礎知識我們應該有個大概的了解了&#xff0c;但離我們真正的開發出一個實用型的組件還有一段距離&#xff0c;不過不用擔心&#xff0c;我們離目標已經越來越近。 以現在我們所了解的內容而言&#xff0c;或許你發現了一個問題&#xff0c;就是我們的編…

CentOS配網報錯:network is unreachable

常用命令&#xff1a; 打開&#xff1a; cd /etc/sysconfig/network-scripts/ 修改&#xff1a; vim ifcfg-ens33 打開修改&#xff1a; vim /etc/sysconfig/network-scripts/ifcfg-ens33 保存&#xff1a; 方法1&#xff1a;ESCZZ&#xff08;Z要大寫&#xff09; 方…

LabelImg官方文檔摘錄

LabelImg官方文檔&#xff1a;https://github.com/HumanSignal/labelImg 注釋&#xff08;annotation&#xff09;以 PASCAL VOC 格式保存為 XML 文件&#xff0c;這是ImageNet使用的格式。此外&#xff0c;它還支持 YOLO 和 CreateML 格式。 安裝 使用CSDN博主打包的程序&a…

Linux:地址空間的轉換以及線程的理解和使用

文章目錄 線程的理解地址空間的轉換問題總結 線程的優點線程的缺點線程的健壯性問題 本篇主要進行對于進程和線程的理解&#xff0c;以及對于線程的一部分使用方法和使用的原理 線程的理解 首先回顧前面一篇的內容中&#xff0c;對于進程的基本認識&#xff1a; 什么是線程&…

OWASP TOP 10解析:構建堅不可摧的Web應用安全防線

當涉及到Web應用程序安全的話題時&#xff0c;OWASP&#xff08;開放式Web應用程序安全項目&#xff09;的TOP 10是一個不可忽視的參考點。OWASP TOP 10列舉了當前Web應用程序中最嚴重的安全風險&#xff0c;幫助開發人員、測試人員和安全專業人員更好地理解并針對這些風險采取…

【LeetCode:2368. 受限條件下可到達節點的數目 + BFS】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

Mybatis實戰(1)

mybatis-pageHelper 1&#xff0c;添加依賴&#xff1a; <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version></dependency><!--pag…

SpringBoot-yaml語法

1.概念 在Springboot的項目中&#xff0c;配置文件有以下幾種格式&#xff1a; Application.propertiesApplication.yamlApplication.yml 其中官方推薦我們使用yaml的格式(因為能表示的數據類型很多樣) 2.基本語法 # yaml形式的配置文件# 普通的key-value&#xff08;分號之后…

用numpy搭建自己的神經網絡

搭建之前的基礎與思考 構建模型的基本思想&#xff1a; 構建深度學習的過程&#xff1a;產生idea&#xff0c;將idea轉化成code&#xff0c;最后進行experiment&#xff0c;之后根據結果修改idea&#xff0c;繼續idea–>code–>experiment的循環&#xff0c;直到最終訓練…