引言
在上一章中,我们掌握了使用 LangChain 和 LlamaIndex 构建强大单 Agent 应用或基础多 Agent 交互的方法。然而,随着任务复杂度的提升,模拟团队协作、执行结构化流程的需求日益增长,这时,专门为多 Agent 系统 (Multi-Agent Systems, MAS) 设计的框架便应运而生。本章,我们将深入实战另外两个备受瞩目的主流 Agent 框架:来自微软研究院的 AutoGen 和新兴的 CrewAI。它们各自为 Agent 间的协作提供了独特的范式——AutoGen 擅长模拟灵活的对话式协作,而 CrewAI 则专注于定义结构化的工作流。通过本章的代码实践,你将掌握构建更复杂、更协同的 AI Agent 应用的新武器。
7.1 Microsoft AutoGen:构建灵活的可对话多 Agent 系统
AutoGen 是一个强大的开源框架,旨在简化和赋能基于多 Agent 对话的复杂 LLM 工作流。它的核心理念是让不同的 Agent 通过“交谈”来协同解决问题。
-
核心概念详解:
ConversableAgent
: AutoGen 中 Agent 的基石,强调其核心能力是参与对话。- 关键 Agent 类型:
AssistantAgent
(LLM 驱动的助手),UserProxyAgent
(代表人类,可执行代码或请求输入)。 GroupChatManager
: 协调多个 Agent 之间对话流程的核心组件。
-
多 Agent 交互模式:
AutoGen 侧重于模拟灵活的、基于对话的交互。协作模式(谁与谁对话、对话顺序)可由GroupChatManager
配置或通过更复杂的自定义逻辑动态生成,模拟自由讨论或特定沟通协议。 -
应用场景与特点:
实现自动化任务流(如代码生成->测试->报告),模拟人类团队讨论解决复杂问题。 -
实战代码演练:构建一个简单的 AutoGen 代码生成与执行小组
-
目标/场景: 下面的代码将演示如何使用 AutoGen 构建一个简单的两 Agent 小组:一个
AssistantAgent
(Coder) 负责编写 Python 代码打印 “Hello, AutoGen!”,一个UserProxyAgent
负责执行这段代码并报告结果。 -
前提条件:
- 你需要安装 AutoGen 库:
pip install pyautogen
- 你需要拥有一个 OpenAI API Key(或其他 AutoGen 支持的 LLM 配置),并以 AutoGen 要求的方式进行配置(例如,设置
OAI_CONFIG_LIST
环境变量指向一个包含模型配置的 JSON 文件,或直接在代码中配置)。为简化,示例假设你已配置好OAI_CONFIG_LIST
。 - 注意: AutoGen 的配置方式较多,请参考其官方文档。
- 你需要安装 AutoGen 库:
-
关键代码示例:
import os import autogen # --- 前提:配置 LLM --- # AutoGen 通常通过 OAI_CONFIG_LIST 环境变量读取 LLM 配置 # 示例:假设你已创建了一个名为 "OAI_CONFIG_LIST" 的文件(JSON格式) # 文件内容类似: # [ # { # "model": "gpt-3.5-turbo", # "api_key": "sk-..." # } # ] # 并设置了环境变量: export OAI_CONFIG_LIST="path/to/your/OAI_CONFIG_LIST" # 如果没有配置,后续创建 AssistantAgent 会报错 # 尝试加载配置列表 try: config_list = autogen.config_list_from_json( "OAI_CONFIG_LIST", # 环境变量名称 filter_dict={ "model": ["gpt-3.5-turbo"], # 可以指定使用的模型 }, ) if not config_list: raise ValueError("无法从 OAI_CONFIG_LIST 加载有效的配置") except Exception as e: print(f"加载 LLM 配置失败: {e}") print("请确保已正确设置 OAI_CONFIG_LIST 环境变量并包含有效的模型配置。") # 在无法加载配置时退出或提供备用方案 exit() # --- 1. 定义 LLM 配置 --- # 对于 AssistantAgent,我们需要指定 LLM 的配置 llm_config = { "config_list": config_list, # 使用加载的配置 "cache_seed": 42, # 设置种子以获得可重复结果(可选) "temperature": 0, } # --- 2. 创建 Coder Agent (助手 Agent) --- coder = autogen.AssistantAgent( name="Coder", llm_config=llm_config, system_message="你是一个乐于助人的 AI 助手,擅长编写简单的 Python 代码。" # Agent 的角色指令 ) # --- 3. 创建 Executor Agent (用户代理 Agent) --- # UserProxyAgent 可以代表用户执行代码或请求输入 # code_execution_config 设置代码执行方式 # work_dir 指定代码执行的工作目录 # use_docker=False 表示在本地执行(注意安全风险!实际应用推荐使用 Docker) executor = autogen.UserProxyAgent( name="Executor", human_input_mode="NEVER", # 不需要人类输入 max_consecutive_auto_reply=10, # 限制连续自动回复次数 is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"), # 定义对话结束条件 code_execution_config={ "work_dir": "coding", # 代码将保存在 coding 目录下 "use_docker": False, # 警告:不在 Docker 中执行代码存在安全风险 }, system_message="执行代码并报告结果。" # 简单指令 ) # --- 4. 开始对话 --- print("\n--- 开始 Agent 对话 ---") # UserProxyAgent 发起对话,给出初始任务 try: executor.initiate_chat( coder, # 与 Coder Agent 对话 message="编写一段 Python 代码,打印出 'Hello, AutoGen!',然后结束对话(回复 TERMINATE)。" ) print("\n--- Agent 对话结束 ---") except Exception as e: print(f"Agent 对话出错: {e}")
-
代码解释:
- 我们首先配置了 LLM(假设通过
OAI_CONFIG_LIST
)。 - 创建了一个
AssistantAgent
(Coder),赋予它编写代码的角色和 LLM 配置。 - 创建了一个
UserProxyAgent
(Executor),配置它不需要人类输入 (human_input_mode="NEVER"
),可以执行代码 (code_execution_config
),并定义了对话结束的标志 (“TERMINATE”)。注意:use_docker=False
是为了简化演示,实际应用中强烈建议设为True
以确保安全。 Executor
通过initiate_chat
方法向Coder
发起对话,给出初始任务。- AutoGen 会自动协调两个 Agent 之间的多轮对话:Coder 生成代码块 -> Executor 尝试执行 -> Executor 将结果(或错误)发回给 Coder -> Coder 可能根据结果修改代码 -> … 直到 Executor 收到包含 “TERMINATE” 的消息。
- 我们首先配置了 LLM(假设通过
-
观察重点: 运行代码时,观察控制台输出。你会看到两个 Agent 之间的对话消息,包括 Coder 生成的代码块(通常在
python ...
标记内),以及 Executor 执行代码后的结果。留意它们是如何通过对话完成任务的。 -
(图增强思考 - 可选): 在这个场景中,可以探讨如何让
Coder
访问一个共享的代码知识库或最佳实践知识图谱。在生成代码前,Coder
可以先向知识图谱查询相关的代码片段、设计模式或 API 用法,从而提升代码质量和效率。
-
7.2 CrewAI:面向结构化流程的协作 Agent 框架
CrewAI 专注于帮助开发者构建面向流程的、角色明确的多 Agent 协作系统。它的设计哲学是,复杂的任务可以通过定义清晰的角色、分配具体的任务,并设定好协作流程来高效完成。
-
核心元素详解:
Agent
: 定义具有特定 Role, Goal 和 Backstory 的智能体。Task
: 定义需要由 Agent 完成的具体任务,包含指令 (Instructions) 和预期输出 (Expected Output)。Tool
: Agent 可以使用的工具。Process
: 定义Task
被执行的流程(如顺序)。Crew
: 将Agents
,Tasks
,Process
组合在一起的协作团队。
-
多 Agent 交互模式:
CrewAI 强调预先定义好的、结构化的协作工作流。任务按照Process
中定义的顺序或逻辑,明确地分配给具有相应角色的 Agent。协作模式更像是工厂流水线或明确分工的项目团队。 -
应用场景与特点:
构建需要清晰步骤和角色分工的自动化流程,如市场分析报告生成、内容创作流水线等。 -
实战代码演练:构建一个简单的 CrewAI 内容创作小组
-
目标/场景: 下面的代码将演示如何使用 CrewAI 构建一个包含两个 Agent 的简单 Crew:一个 Agent (Researcher) 负责查找关于 AI Agent 的信息,另一个 Agent (Writer) 负责基于前一个 Agent 的发现,撰写一段简短的介绍性文字。
-
前提条件:
- 你需要安装 CrewAI 库及其可能的依赖(示例中使用 DuckDuckGo 搜索工具和 OpenAI LLM):
pip install crewai crewai-tools langchain-openai
- 你需要拥有一个 OpenAI API Key,并将其设置为环境变量
OPENAI_API_KEY
。 - CrewAI 底层可能依赖 LangChain 的某些组件。
- 你需要安装 CrewAI 库及其可能的依赖(示例中使用 DuckDuckGo 搜索工具和 OpenAI LLM):
-
关键代码示例:
import os from crewai import Agent, Task, Crew, Process from crewai_tools import SerperDevTool, DirectoryReadTool, FileReadTool # 导入一些常用工具 # 如果使用 DuckDuckGo 搜索工具,可以取消下一行注释 # from crewai_tools import DuckDuckGoSearchRunTool from langchain_openai import ChatOpenAI # CrewAI 通常与 LangChain 的 LLM 接口兼容 # --- 前提:设置 API Key --- # os.environ["OPENAI_API_KEY"] = "sk-..." # 如果使用 SerperDevTool,还需要设置 SERPER_API_KEY # os.environ["SERPER_API_KEY"] = "Your_Serper_API_Key" # --- 1. 定义工具 (可选,但常用) --- # 示例中使用 DuckDuckGo (如果安装并配置了API Key) 或 SerperDevTool 作为搜索工具 # search_tool = DuckDuckGoSearchRunTool() search_tool = SerperDevTool() # 需要 SERPER_API_KEY # --- 2. 定义 Agents --- # 定义研究员 Agent researcher = Agent( role='高级 AI 研究员', goal='发现关于 AI Agent 的最新技术和应用', backstory=( "你是一位在人工智能领域工作了十年的研究员。" "你擅长从网络上查找、分析和总结最新的技术动态。" ), verbose=True, # 打印 Agent 的思考过程 allow_delegation=False, # 此 Agent 不会将任务委托给其他 Agent tools=[search_tool] # 赋予研究员搜索工具 # llm=ChatOpenAI(model="gpt-4-turbo") # 可以为每个 Agent 单独指定 LLM ) # 定义作家 Agent writer = Agent( role='专业技术作家', goal='根据研究员的发现,撰写一篇引人入胜的关于 AI Agent 的简短介绍', backstory=( "你是一位擅长将复杂技术概念转化为易于理解内容的作家。" "你的文章清晰、简洁且吸引人。" ), verbose=True, allow_delegation=False, # writer 通常不需要直接使用搜索工具,它依赖 researcher 的输出 # llm=ChatOpenAI(model="gpt-3.5-turbo") ) # --- 3. 创建 Tasks --- # 创建研究任务 research_task = Task( description=( "查找当前关于 AI Agent 的关键技术、主要应用领域以及面临的挑战。" "专注于最新的进展和行业报告。" ), expected_output='一份包含3-5个关键点的要点总结报告,涵盖技术、应用和挑战。', agent=researcher # 将任务分配给 researcher Agent ) # 创建写作任务 # 注意:写作任务会利用 research_task 的输出作为上下文 write_task = Task( description=( "使用研究员提供的要点总结报告作为基础。" "撰写一段约 150 字的关于 AI Agent 的介绍性文字。" "文字需要流畅、吸引人,并准确反映研究要点。" ), expected_output='一段格式良好、约150字的关于 AI Agent 的介绍性文字。', agent=writer # 将任务分配给 writer Agent # context=[research_task] # 可以显式指定任务依赖的上下文,通常 CrewAI 会自动处理 ) # --- 4. 组建 Crew --- # 定义一个顺序执行的流程 crew = Crew( agents=[researcher, writer], tasks=[research_task, write_task], process=Process.sequential, # 指定任务按顺序执行 verbose=2 # verbose=2 会打印出任务执行的详细步骤 ) # --- 5. 运行 Crew --- print("\n--- 开始运行 Crew ---") try: result = crew.kickoff() print("\n--- Crew 执行完毕 ---") print("最终结果:") print(result) except Exception as e: print(f"Crew 执行出错: {e}")
-
代码解释:
- 我们首先定义了所需的工具(示例中用了
SerperDevTool
作为搜索工具)。 - 创建了两个
Agent
:researcher
和writer
,分别赋予了清晰的role
,goal
,backstory
和可用的tools
。 - 创建了两个
Task
:research_task
分配给researcher
,write_task
分配给writer
。注意write_task
的描述中提到了要使用上一个任务的输出。 - 使用
Crew
类将 Agents 和 Tasks 组合起来,并指定了Process.sequential
表示任务按顺序执行。 - 调用
crew.kickoff()
来启动整个流程。CrewAI 会自动管理任务的执行和结果的传递。
- 我们首先定义了所需的工具(示例中用了
-
观察重点: 运行代码时,注意观察
verbose=2
打印出的详细日志。你会看到 Crew 如何按顺序执行任务,researcher
Agent 如何使用搜索工具,以及writer
Agent 如何接收researcher
的输出并完成写作任务。体会 CrewAI 结构化流程的特点。 -
(图增强思考 - 可选): 在这个场景中,可以探讨如何让
researcher
Agent 在搜索的同时,也查询一个包含 AI 领域关键概念、技术演进路径、重要研究机构和人物关系的知识图谱。这能帮助研究员更快地定位核心信息,理解技术间的联系,并为后续的分析和写作提供更深层次的结构化背景。
-
7.3 框架应用场景对比:灵活对话 vs. 结构化流程
AutoGen 和 CrewAI 都旨在解决多 Agent 协作的问题,但它们采取了截然不同的路径,适用于不同的场景:
-
核心差异点:
- 协作模式: AutoGen 的动态对话驱动 vs. CrewAI 的预定义流程驱动。
- 灵活性: AutoGen 更灵活,适合探索性、需要动态调整协作方式的任务。CrewAI 更结构化,适合流程固定、角色明确、可预测性要求高的任务。
- 定义复杂度: AutoGen 可能需要更精细地设计对话管理逻辑。CrewAI 需要清晰地定义好每个 Agent 的角色、任务和整个流程。
-
选择考量:
- 模拟团队会议、迭代开发选 AutoGen。
- 构建自动化生产线、执行 SOP 选 CrewAI。
总结
在本章中,我们通过具体的代码示例,实战演练了 AutoGen 和 CrewAI 这两个在多 Agent 协作领域各具特色的框架。我们学习了 AutoGen 如何通过灵活的对话机制模拟团队互动,以及 CrewAI 如何通过定义结构化的角色、任务和流程来构建协作流水线。理解它们的核心差异和适用场景,将帮助你为特定的多 Agent 应用选择合适的开发工具。
多 Agent 协作无疑是 AI Agent 技术发展的一个重要前沿方向,它使得模拟更复杂的智能系统、解决更宏大的问题成为可能。在下一章,我们将把目光投向更远方,探索更多新兴的、面向特定领域(如编码、科学研究)的 Agent 框架,以及 Agent 技术未来的发展趋势与挑战。
内容同步在gzh:智语Bot