一、前言
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