第七章:主流 Agent 开发框架实战 (二):AutoGen 与 CrewAI 的协作智能

引言

在上一章中,我们掌握了使用 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 的配置方式较多,请参考其官方文档。
    • 关键代码示例:

      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” 的消息。
    • 观察重点: 运行代码时,观察控制台输出。你会看到两个 Agent 之间的对话消息,包括 Coder 生成的代码块(通常在 python ... 标记内),以及 Executor 执行代码后的结果。留意它们是如何通过对话完成任务的。

    • (图增强思考 - 可选): 在这个场景中,可以探讨如何让 Coder 访问一个共享的代码知识库或最佳实践知识图谱。在生成代码前,Coder 可以先向知识图谱查询相关的代码片段、设计模式或 API 用法,从而提升代码质量和效率。

7.2 CrewAI:面向结构化流程的协作 Agent 框架

CrewAI 专注于帮助开发者构建面向流程的、角色明确的多 Agent 协作系统。它的设计哲学是,复杂的任务可以通过定义清晰的角色、分配具体的任务,并设定好协作流程来高效完成。
在这里插入图片描述

  • 核心元素详解:

    • Agent: 定义具有特定 Role, GoalBackstory 的智能体。
    • 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 的某些组件。
    • 关键代码示例:

      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 作为搜索工具)。
      • 创建了两个 Agentresearcherwriter,分别赋予了清晰的 role, goal, backstory 和可用的 tools
      • 创建了两个 Taskresearch_task 分配给 researcherwrite_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

(initial)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值