DLAI-多-AI-智能体实践笔记-全-
DLAI 多 AI 智能体实践笔记(全)
001:课程介绍 🎯

在本节课中,我们将学习吴恩达与crewAI创始人João Moura共同推出的《多AI智能体实践与高级应用》课程的核心内容与学习路径。这是一门高度实践性的课程,旨在教你构建能够实际部署并创造价值的智能体系统。
多AI智能体系统涉及多个AI智能体通过协作、委派和共享信息来共同完成复杂任务。如果你学习过之前的多AI智能体系统课程,你会了解到可以创建多个具有特定任务或角色的智能体,这些智能体可以协作执行复杂的工作流。
在本课程中,你将学习如何为更高级的用例构建基于智能体的应用程序,并看到许多基于当前行业实践的真实用例。构建多智能体应用时,一个关键挑战是在保持结果一致性的同时,平衡速度与质量。不同的模型选择和规模会影响这些因素。
在本课程中,你将学习通过测量关键指标来严格测试你的应用程序,并利用这些指标持续推动改进。你还将学习如何使用人类反馈来训练你的智能体,从而随着时间的推移不断完善你的应用。
很高兴能与crewAI的创始人João Moura一同在这里,João将是本课程的讲师。他也曾教授之前的多AI智能体系统课程。欢迎回来。
非常感谢。很高兴能再次与你一起。通过这门关于多智能体系统的新实践课程,我们看到许多公司正在使用crewAI构建多AI智能体应用程序,运行并聚合数千万个智能体,创建涉及多个智能体并行工作、多个“团队”协作的更复杂工作流,并进行大量严格的性能测试和应用训练。
在之前的课程中,你解释并演示了多智能体系统的基本构建模块,例如智能体如何协作完成任务、如何使用工具,以及如何用相对较少的代码构建一些非常酷的应用程序。
也许你可以谈谈学习者在本课程中可以期待什么?
当然。我们将从快速回顾智能体系统开始。然后,你将学习如何通过内部和外部系统来编排你的多智能体自动化流程。这使你的应用能够执行诸如查询内部数据、调用现有系统、发送电子邮件等操作。
接下来,你将学习如何创建从顺序执行到并行执行以及介于两者之间的各种“团队”设置,包括一些混合设置。你将学习如何并行运行任务,以及如何在流水线中连接多个“团队”。
然后,我们将探讨如何使用任务和训练方法来优化多智能体系统的性能。之后,你将学习如何创建使用多种不同大语言模型来完成任务的“团队”。例如,你可以让一个研究员智能体使用更小、更快的模型来处理相对简单的任务,而让一个写作智能体使用经过微调以反映你公司品牌声音的大型模型。我将这种方法称为多模型方法,它允许你根据手头的任务混合搭配多种大语言模型,从而帮助你构建更高效、更定制化的AI系统。
许多人共同努力创建了这门课程。我要感谢整个crewAI团队,以及来自DeepLearning.AI的Ed Gagliardi和Jeff Ladwig,他们也为本课程做出了贡献。
这门课程将充满乐趣。你将构建几个实践项目,例如自动化项目规划、潜在客户评分与互动自动化、支持数据分析和规模化内容创作。我自己非常喜欢使用crewAI,我相信你也会喜欢。

让我们进入下一个视频,开始学习吧。
002:系统概述 🧠
在本节课中,我们将对多AI智能体系统进行概述。我们将讨论构建这些AI智能体的核心模块,包括智能体本身、任务和团队。同时,我们也会探讨使这些智能体工作的不同要素,例如缓存、内存、防护栏等。这将帮助你全面了解开始使用AI智能体系统所需的一切知识。让我们开始学习。
课程学习目标 📚
在本课程中,你将学到很多内容。
我们将讨论现实世界中的多智能体自动化。
这意味着你将亲自动手实践,并构建许多不同的项目。这些项目将帮助你理解如何为任何可能的应用场景构建自动化系统。

你将使用CrewAI和多智能体构建一个自动化项目规划系统。
你还将构建项目监控、资格审核与评分等应用案例。此外,还有更多内容。
我们将讨论对支持数据的分析与报告、定制内容创作、规模化以及许多其他应用案例。
请继续学习,因为这将非常有趣。



一个强大的示例 💪

在开始深入讨论之前,让我们先看一个快速示例,了解这些系统有多么强大,以及你能从它们中获得何种自动化能力。
让我们观看这个快速示例。

在这里,你可以看到我即将与Zendesk的CEO进行通话。我希望准备一些销售材料。我只需将他的电子邮件输入系统,系统便开始对Tom进行研究。我们了解到他拥有销售、营销和领导力的背景。同时,我们也了解了很多关于Zendesk的信息,例如它成立于2007年。所有这些数据都是由智能体研究完成的。现在,这个智能体整理了一份登陆页PDF,我们可以导出并实际发送给Tom。这份PDF从Zendesk的角度出发,详细介绍了Zendesk公司及其如何努力简化复杂性。这是一个非常酷的应用案例,你可以看到这些智能体不仅进行研究,还能生成完整的报告,以协助我们完成通话等任务。此外,还有许多其他应用案例。




你可以看到许多运营自动化案例,其中也有很多销售应用案例。我们还看到许多营销应用案例、代码开发、研究、教育、支持等。有许多不同的应用案例跨越了众多垂直领域。关键在于,无论你为哪个垂直领域构建应用案例,我们都能看到一个共同的模式:这些智能体和自动化尝试做的事情通常呈现长尾分布。
通用工作流程 🔄
它通常始于你从现有系统中提取数据。这些系统可能是ERP、CRM、数据库或其他任何系统。一旦从这些系统中提取数据,通常会有一个研究步骤。这里的研究可以是研究文档、互联网或你可能拥有的其他系统。之后,你会进入分析过程。分析可以包括比较数据、提取特定数据,甚至推断你之前没有的新数据。经过一些分析后,大多数应用案例会进入总结过程,你可能希望提取经验教训、绘制图表或生成特定的执行摘要。最后,你可以进行报告。有时,你可能希望报告以PDF或JSON格式呈现,以便推送到另一个系统,或者以Markdown格式呈现。
关键在于,最终你可能希望将结果推送到现有系统中。因此,无论是什么垂直领域,无论是销售、营销、人力资源还是其他,大多数应用案例通常都围绕研究、分析、总结和报告这一过程展开。并非所有步骤都是必需的,也不一定总是按照这个顺序进行,但这是我们看到的大多数应用案例的核心。当然,有些公司正在将这项技术推向前沿,尝试使用视频模型和图像模型等做非常创新的事情,我们也会讨论其中的一些内容。
智能体系统简介 🤖
快速回顾一下,如果这是你第一次了解多智能体系统和CrewAI,我想谈谈它们是什么以及如何构建它们。
我们工程师多年来构建的常规应用程序与这种新型AI应用程序之间存在差异。
如果你考虑常规应用程序,它通常具有非常强的类型化。我的意思是,你非常清楚进入应用程序的数据是什么,也非常清楚这些数据将经历哪些转换才能得到预期的输出。一个很好的例子是一个从潜在客户表单获取输入的系统,你理解根据这些答案,你将有一系列条件来决定执行哪些自动化或输出。
但是,如果你看看这些新的应用程序,我在这里称之为AI应用程序,它们非常不同,因为它们现在更加模糊。这意味着你不太清楚进入这些应用程序的数据是什么。例如,如果你考虑ChatGPT,你不知道用户输入的文本是食谱还是博士论文,或者其他任何内容,它是模糊的。然后,这些数据经过一个黑盒模型,最终产生模糊的输出,因为你不知道输出会是什么,它将严重依赖于输入和模型。
因此,你可以将多AI智能体视为一种更加模糊的AI应用程序。但正因为如此,它允许你构建以前不可能的自动化系统,因为现在你不需要处理每一个边缘情况。你基本上可以让你的智能体实时决定如何对特定数据做出反应,并决定使用哪些工具来完成你想要的任务。
智能体的构成 🧩
当你观察这些智能体时,它们的构成是什么?其实很简单。
中心有一个大语言模型(LLM),这个LLM可以访问一些工具。一旦你给这个LLM一个任务,它就会想办法使用这些工具来提供最终答案。当你再进一步观察时,你实际上看到的是这种多智能体系统,现在你不仅有一个智能体,而是有两个、三个或更多。现在,这些智能体不仅可以自己使用工具,还可以相互委托工作,相互提问,以完成你想要的最终结果。它通常始于非常简单的情况,但一旦你开始将这些自动化系统投入生产环境,你会发现有很多需求。
生产环境需求 🏗️
你会意识到需要一个缓存层。无论你的智能体使用什么工具,它们都不需要反复消耗必要的额度或重复使用这些工具。你还希望确保它们有一个内存层,这样它们就能记住过去做过的事情,并与其他智能体共享记忆。因此,如果它们再次遇到相同的数据点,它们会记得上次是如何处理的。还有训练数据,我们将在特定课程中讨论这一点,我对此非常兴奋。此外,还有防护栏,以及如何保护这些智能体避免产生疯狂的幻觉等等。
编排与流程 ⚙️
不仅包括所有这些功能,一旦这些智能体协同工作,你真的需要仔细考虑如何编排它们。有时,你只希望它们按顺序工作;其他时候,你可能希望有一个管理者智能体来委托工作和审查输出。但你可以在这方面发挥创意,可以采用混合方法,其中一些任务并行执行,而其他任务则等待多个任务完成后再继续。你也将创建一个这样的示例。有些任务可能完全并行,有些则可能完全异步。因此,有许多不同的应用案例。如果你愿意,你还可以通过使用多团队(multi-crews)变得更加复杂,你将使用我们称为“流”的功能,能够将一个团队的结果与另一个团队连接起来。
核心构建模块 🧱
好了,你刚刚了解了AI智能体、它们如何工作、它们的构成以及如何让它们协同工作。那么,构建这些多AI智能体系统的主要构建模块是什么?
一切都始于智能体,但你也需要确保有任务。
在这个应用案例中,你可以看到任务比智能体多,这不是问题,因为一个智能体可以执行多个任务,我们将在示例中看到这一点。为了让这个智能体能够完成这些任务,我们需要给它们工具。因此,你可以给你的智能体分配工具,让它们在执行任何任务时使用;或者你可以给你的任务分配工具,让你的智能体知道要使用哪些工具来完成该任务。一旦你有了这些,你基本上就有了一个团队。
一个团队(Crew)是多智能体及其任务的组合。
一旦你拥有了所有这些智能体和任务,CrewAI就会介入,并提供你所需的所有功能,以便在生产环境中运行这些系统。它通过添加防护栏来避免你的智能体产生幻觉,还提供任务质量评估功能,允许委托,让你的智能体可以自动相互委托和提问,以及训练数据,以便你可以进一步训练这些智能体,还有内存功能,让这些智能体随着时间的推移变得更好。我们将讨论很多内容,请务必继续学习。
智能体与任务定义 📝
让我们看看这些智能体和任务。CrewAI中的每个智能体都需要有一个角色、一个目标和一个背景故事。每个任务都需要有一个描述、一个预期输出和一个指定的智能体。
现在,这些智能体实际上被定义为YAML文件,我们将在课程中详细讲解。你可以轻松地看到这些智能体如何设置其角色、目标和背景故事,以及任务如何设置其描述和预期输出。这使得非技术人员能够轻松地为这些智能体和任务做出贡献,只需更新YAML文件,而无需更新任何代码。

动手实践 🚀

好了,既然我们知道可以使用YAML文件创建智能体和任务,为什么不亲自动手构建我们的第一个团队呢?这将非常令人兴奋。让我们切换到下一个标签页,进入Jupyter笔记本,一起构建我们的第一个团队。我们稍后见。



总结 📌



在本节课中,我们一起学习了多AI智能体系统的基本概述。我们探讨了智能体系统的核心概念、构成要素以及从研究到报告的通用工作流程。我们还比较了传统应用与AI应用的区别,并介绍了使用CrewAI构建智能体系统的主要构建模块:智能体、任务和团队。最后,我们了解了如何通过YAML文件定义智能体和任务,为动手实践奠定了基础。下一节,我们将进入Jupyter笔记本,开始构建第一个实际的智能体团队。
003:自动化项目规划、估算与分配 📋
在本节课中,我们将学习如何使用CrewAI构建一个自动化项目规划系统。该系统能够将项目分解为任务、估算时间并进行资源分配,这对于需要快速响应客户需求的机构(如咨询公司或网络代理)非常有用。

概述
我们将创建一个由三个智能体组成的“团队”,每个智能体负责一个特定任务。通过输入项目的基本信息,这个团队可以快速生成一个结构化的项目计划,包括任务列表、时间估算和人员分配,最终输出格式化的JSON数据,便于集成到Jira、Trello等项目管理工具中。
环境与模型设置

首先,我们需要导入必要的库并设置AI模型。
import os
import yaml
from crewai import Agent, Task, Crew
from langchain_openai import ChatOpenAI
# 设置模型,例如使用GPT-4o-mini以控制成本
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)
定义智能体与任务
智能体和任务的配置通过YAML文件管理,这使配置更清晰且易于修改。
以下是智能体YAML文件 (agents.yaml) 的示例结构:
project_planner:
role: "资深项目规划师"
goal: "将 {project_type} 项目分解为清晰、可执行的任务列表。"
backstory: "你是一位经验丰富的项目经理,擅长将模糊的需求转化为具体的行动计划。"
estimation_analyst:
role: "估算分析师"
goal: "为 {project_type} 项目中的每个任务提供现实的时间估算。"
backstory: "你是一位数据分析专家,精通评估软件开发任务的工作量。"
allocation_strategist:
role: "资源分配策略师"
goal: "根据 {team_members} 的技能,为 {project_type} 项目中的任务分配最佳人选。"
backstory: "你是一位人力资源专家,擅长将合适的人匹配到合适的任务上。"
以下是任务YAML文件 (tasks.yaml) 的示例结构:
task_breakdown:
description: |
分析 {project_requirements},为 {project_type} 项目创建一个详细的任务分解结构。
expected_output: "一份包含任务描述、依赖关系和初步责任人的任务列表。"
time_estimation:
description: |
基于 {project_requirements} 和任务分解结果,估算每个任务所需的小时数。
expected_output: "一个包含每个任务名称和估算工时的列表。"
resource_allocation:
description: |
根据 {team_members} 的可用性和技能,为所有任务分配具体的团队成员。
expected_output: "最终的项目计划,包含任务、估算、分配和里程碑。"
在代码中加载这些配置:
# 加载YAML配置
with open('agents.yaml', 'r') as file:
agents_config = yaml.safe_load(file)
with open('tasks.yaml', 'r') as file:
tasks_config = yaml.safe_load(file)
# 创建智能体
project_planner_agent = Agent(config=agents_config['project_planner'], llm=llm)
estimation_analyst_agent = Agent(config=agents_config['estimation_analyst'], llm=llm)
allocation_strategist_agent = Agent(config=agents_config['allocation_strategist'], llm=llm)
# 创建任务
breakdown_task = Task(config=tasks_config['task_breakdown'], agent=project_planner_agent)
estimation_task = Task(config=tasks_config['time_estimation'], agent=estimation_analyst_agent)
allocation_task = Task(
config=tasks_config['resource_allocation'],
agent=allocation_strategist_agent,
output_pydantic=ProjectPlan # 指定结构化输出模型
)
定义结构化输出
为了获得可被外部系统使用的输出,我们使用Pydantic模型来定义数据结构。
from pydantic import BaseModel
from typing import List
class TaskEstimate(BaseModel):
task_name: str
estimated_hours: float
required_resources: List[str]
class Milestone(BaseModel):
name: str
tasks: List[str]

class ProjectPlan(BaseModel):
tasks: List[TaskEstimate]
milestones: List[Milestone]
ProjectPlan 模型将作为最终任务的输出格式,确保结果是结构化的JSON。

组装团队并执行
现在,我们将智能体和任务组合成一个“团队”,并提供项目输入信息。


# 创建团队
crew = Crew(
agents=[project_planner_agent, estimation_analyst_agent, allocation_strategist_agent],
tasks=[breakdown_task, estimation_task, allocation_task],
verbose=2 # 启用详细日志以观察执行过程
)



# 定义项目输入
inputs = {
"project_type": "网站开发",
"industry": "科技",
"project_objectives": "为一家小型科技企业创建官方网站。",
"team_members": ["项目经理", "软件工程师", "设计师", "QA工程师1", "QA工程师2"],
"project_requirements": """
1. 响应式设计。
2. 现代且视觉吸引力强。
3. 用户友好。
4. 包含‘关于我们’、‘服务’、‘联系我们’页面。
5. 集成博客版块。
6. 加载速度快。
7. 集成社交媒体链接。
8. 展示客户评价。
"""
}
# 执行团队任务
result = crew.kickoff(inputs=inputs)





分析结果与成本
执行完成后,我们可以查看结构化的输出结果,并计算本次运行的大致成本。
# 查看原始输出(ProjectPlan对象)
print(result)
# 将任务列表转换为Pandas DataFrame以便查看
import pandas as pd
tasks_df = pd.DataFrame([t.dict() for t in result.tasks])
print(tasks_df)

# 查看里程碑
milestones_df = pd.DataFrame([m.dict() for m in result.milestones])
print(milestones_df)
# 成本估算(示例,实际值取决于使用量)
# 假设使用了约7000个token,GPT-4o-mini模型每百万tokens输入$0.15,输出$0.60
# 总成本 ≈ (输入token数 * 0.15 + 输出token数 * 0.60) / 1,000,000
# 本次运行成本极低,约0.001美元。
总结
本节课中,我们一起学习了如何利用CrewAI构建一个自动化项目规划系统。我们完成了以下步骤:
- 设置环境与模型:导入库并配置AI模型。
- 定义智能体与任务:通过YAML文件配置不同角色的智能体及其目标。
- 设计结构化输出:使用Pydantic模型确保输出格式规范,便于系统集成。
- 组装与执行团队:将智能体和任务组合,输入项目信息并运行。
- 分析结果:获得了包含任务分解、时间估算和资源分配的完整项目计划。

这个用例展示了如何将耗时数小时的人工规划流程,在几分钟内自动化完成,并能以极低的成本大规模运行。这只是多智能体协作能力的开始,在接下来的课程中,我们将探索更复杂、更强大的应用场景。
004:集成外部系统 🛠️

在本节课中,我们将学习如何为AI智能体构建集成。集成对于所有AI智能体自动化和应用程序都至关重要,因为您需要从内部或外部系统拉取或推送信息。本节课将涵盖构建这些集成的全部知识,以及如何让您的智能体能够与这些系统进行交互。
理解集成的重要性
上一节我们介绍了智能体、任务和工具的基本概念。本节中我们来看看集成的具体场景。在智能体执行过程中,有多个时刻可能需要与内部或外部系统进行通信。
有时,您可能希望在智能体开始运行之前与系统通信,以便获取可以传递给智能体的数据。其他时候,您可能希望在智能体处理完成后调用系统。这两种情况相对简单,因为它们本质上只是常规代码。但核心问题是,有时您希望您的工具能够调用外部或内部系统。
工具如何与系统交互


以下是工具可以调用的系统类型示例:
- 其他应用程序或云服务:例如,一个可以搜索互联网、查看日历或回复邮件的工具。
- 数据库或内部应用程序:例如,在现有向量数据库上进行相似性搜索、执行SQL查询,甚至触发某些副作用。
关键在于,您需要谨慎地允许您的智能体使用这些系统。有时,您可能希望智能体能够执行一些自定义操作,例如编写代码。我们将在后续课程中学习如何允许智能体这样做,以及具体实现方式。
实时反应与自我修复能力

现在,让我们谈谈集成内部和外部系统的一个巨大优势:实时反应和自我修复能力。我的意思是,当您的智能体调用这些工具时,如果工具因任何原因(无论是外部还是内部系统的变更)而失败,您的智能体将能够察觉到这种变化,并以不同的方式再次尝试。
让我们通过一个例子来说明。假设我们有一个执行分析任务的智能体,它试图利用外部和内部数据来完成工作。
构建一个集成示例

我们将构建一个具体的集成示例。这个智能体工作流程如下:
- 初始任务:一个智能体尝试从公司数据中提取数据源。它围绕公司、其行业及相关信息进行研究。
- 交叉验证:然后,它将外部研究结果与该公司的内部数据进行交叉验证,例如您可能已有的关于同一公司的现有报告。
- 整合记录:接着,它将尝试根据所学到的关于特定公司的所有信息,整合出完整的公司记录。
- 处理缺失信息:有时信息可能会缺失。如果发现信息缺失,它将尝试通过使用RAG工具进行向量搜索来查找缺失的数据点。
通过这个例子,您可以看到这些智能体如何超越常规的简单RAG搜索或数据增强流程。它们能够接入众多不同的数据源,包括外部的、内部的,并使用向量嵌入等技术。这为许多新的应用场景解锁了巨大潜力。
动手实践
现在,让我们进入Jupyter Notebook,亲自构建这个智能体。让我们开始动手,集成外部工具。这将非常有趣,请继续关注,我们马上进入下一步。


本节课总结:本节课我们一起学习了AI智能体集成的核心概念。我们了解了为什么集成至关重要,探讨了工具如何与外部及内部系统交互,并认识了集成带来的实时反应和自我修复能力。最后,我们概述了一个结合外部研究、内部数据验证和RAG工具进行数据补全的智能体分析流程示例,为接下来的动手实践奠定了基础。
005:L2 外部集成项目进度报告
概述
在本节课中,我们将学习如何构建一个自动化项目进度报告系统。与上一节的新闻简报案例不同,本项目聚焦于日常工作中常见的项目进度汇报场景。我们将使用两个AI智能体,通过集成外部项目管理工具(Trello),自动收集数据、分析进度并生成一份全面的Markdown报告。
项目背景与目标
上一节我们介绍了如何使用智能体生成新闻简报。本节中,我们来看看一个更贴近日常工作的用例:自动化生成项目进度报告。

在软件公司或任何项目中,定期撰写进度报告是常见需求,目的是让相关人员清晰了解项目进展和已完成的工作。本案例的目标是自动化这一流程,消除主观情绪影响,确保报告客观反映项目真实状况。
为实现此目标,我们将使用两个智能体:数据收集员和项目分析师。它们将协作完成三项任务:理解项目、分析进度、编译报告。

这些智能体需要能与外部系统(本例为Trello看板)进行交互。这是一个展示外部集成如何解锁新用例的绝佳示例。若没有此集成,此功能将无法实现。我们将展示这种集成是多么简单。
一旦智能体能够获取数据,它们将生成一份Markdown报告。报告内容包括:迭代概览、任务摘要、识别出的问题与阻碍、进度与延误情况。此外,报告还会包含团队绩效评估、行动项与建议,以及其他任何与项目相关的信息。
这个用例对任何公司的日常运营都极具价值。人们正使用类似方法获取项目更新,而无需亲自追踪每个工单及其评论。
现在,让我们深入代码,亲自动手构建。
代码实现:初始设置

首先,我们需要导入必要的库并加载环境变量,确保一切设置就绪。
我们使用的库与上一课相同:json、yaml以及crewAI的三个主要类。以下是具体代码:
import json
import yaml
from crewai import Agent, Task, Crew
import os
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
接着,我们加载OpenAI模型。本次我们将使用GPT-4o-mini。我偏爱使用这个模型,因为它体积小、成本低,但能力依然强大。让我们看看在运行智能体时它的表现如何。
然后,加载智能体和任务的YAML配置文件。这段代码与上一课使用的片段相同,非常直接:加载YAML文件,并将其分配给agents_config和tasks_config变量。
# 加载代理和任务配置
with open(‘agents_config.yaml‘, ‘r‘) as file:
agents_config = yaml.safe_load(file)
with open(‘tasks_config.yaml‘, ‘r‘) as file:
tasks_config = yaml.safe_load(file)
完成这些后,我们就有了构建智能体所需的一切。但现在,我们将首次为智能体构建外部集成工具。

构建外部集成工具
对于本案例,我们将与Trello集成,并为此创建两个工具。

查看这两个工具,它们的构建相当简单。
你可以从crewAI的tools包中导入BaseTool基类。然后,你可以创建任何你喜欢的类,只要它继承自这个基类。
你的类需要包含name、description和一个_run方法。集成逻辑就存在于这个_run方法中。你所有的代码都将放在这个单一方法内。只要你返回一个对象或字符串,就可以了。

现在,让我们快速看一下这两个工具。
第一个是看板数据获取工具。它的功能是从单个看板获取卡片数据、评论和活动记录。我们将使用一个公开看板(稍后会展示)。在代码中,你可以看到我们基本上是通过调用API来获取关于此看板在不同维度上的信息。获取响应后,我们将其返回给智能体。


你还可以看到,我们在此处添加了一个后备方案,以防出现超时等问题:我们硬编码了一个响应。

第二个工具是卡片数据获取工具。这也非常直接,它主要获取特定卡片的信息。同样,我们所有的代码逻辑都位于_run函数内部。
这就是集成任何外部工具的方式。你可以进行API调用、建立数据库连接、进行gRPC调用,或任何你需要的操作。这是常规的Python代码,你的智能体将能够选择是否执行它,以完成其任务。
这就是构建任何集成(无论是内部还是外部)的方法,而且相当简单直接。现在,让我们将这两个工具投入使用,看看我们的智能体将如何使用它们。观察智能体如何利用这些工具来完成我们构建的自动化流程,会非常有趣。



查看示例看板

在启动智能体之前,让我们先查看一下这个看板。

这就是我们的看板。你可以看到有几个不同的任务,其中一个有评论并且实际上已经逾期(超过了截止日期)。通过这些信息,我们对项目有了一些了解。但如果这是数百个工单,我们很难对其进行合理的跟踪。


组装智能体、任务与工作组
现在,让我们组装我们的工作组、智能体和任务。

这与我们在上一课中所做的非常相似,我们引用了来自YAML文件的配置。最大的区别在于,现在的智能体拥有一组工具。我们为它提供了两个工具:一个允许它从Trello看板获取数据(Trello是我们的项目管理工具),另一个允许它从Trello的特定卡片获取数据。因此,无论我们的项目管理工具有什么任务,这个智能体都能够读取它们,理解它们的评论、上下文以及与之相关的每个数据点。
在crewAI中,你可以在智能体或任务上设置工具。如果设置在智能体上,该智能体将能够使用这些工具来执行分配给它的任何任务。但如果你将工具设置在任务上,那么当智能体执行该任务时,它将只能使用该任务中指定的工具。
在实际运行这个工作组之前,让我们看看YAML文件中的这些智能体和任务是什么样子的。
在这里,你可以看到我们有两个智能体:一个数据收集员和一个分析师。它们都有角色、目标和背景故事。你还可以看到,两者都不允许委托,并且我们设置了以详细模式运行,以确保这些智能体不会将工作委托给对方,从而以流线型方式运行,并且我们可以看到它们如何尝试完成任务的方方面面。
让我们看看任务本身。我们有三个任务:数据收集任务、数据分析任务和报告生成任务。对于每个任务,我们都有描述和预期输出。
运行此笔记本后,你可以随意修改描述和预期输出,观察它们如何影响工作组的输出结果,这会很有趣。现在,让我们保持原样,执行这个工作组。
执行与过程观察
这个工作组不需要输入,因此启动它就像调用kickoff方法一样简单。一旦我们这样做,我们就可以跟随它的执行过程,观察这些智能体如何完成我们期望它们做的工作。

在这里,我们可以看到第一个智能体——数据收集专家——开始创建对项目的初步理解。它决定做的第一件事就是调用TrelloBoardDataFetcher,这是我们自定义的外部集成工具之一。你可以看到,我们取回了整个JSON对象,包含了关于我们项目的所有信息。


在理解了Trello看板之后,它会分析某些卡片的个体信息。你可以看到它正在使用我们的第二个工具——TrelloCardDataFetcher。请记住,Trello是一个项目管理工具,允许我们跟踪项目进度。因此,通过查看这个看板和卡片,这些智能体将对项目中发生的事情有相当深入的了解。让我们继续跟踪更进一步的执行过程。





如果我们向下滚动,第一个智能体的最终答案实际上是这个项目的概览。所以它现在已经完全理解了项目,并将其能找到的所有信息都反馈给了我们的第二个智能体。我们可以看到所有任务、评论、一些团队成员以及我们需要知道的一切。





现在,项目分析专家开始工作,它将利用来自第一个智能体的先前信息来构建一份完整的报告。在这里,我们可以看到报告被输出。现在让我们看看运行这个花了多少钱,然后仔细看看这份全面的报告。

成本分析与报告解读


为了检查使用指标和成本,我们将使用与上一课相同的计算方法。因为我们仍然使用GPT-4o-mini,我们知道它的成本是每百万令牌0.15美元。我们可以利用工作组的用量指标进行一些简单的计算。
你可以看到,这花费了我们0.0053美分,相当便宜。这次的令牌数量超过了35,000个。
现在,让我们看看这份报告实际上是什么样子的。我们将使用Markdown来呈现它,因为我们期望工作组输出一个Markdown文件。






报告出来了。这是我们的迭代报告。你可以看到有一个迭代概览,讨论了一些关键问题。有一个待办事项摘要,列出了需要完成的事项、正在进行的事项和正在审查的事项。
然后报告进入了已识别的问题与阻碍。它识别出缺乏详细描述,以及一些延迟的任务。有一个任务已经超过了截止日期。并且只有一名团队成员(我自己)在处理这个项目。


如果我们进一步滚动,可以看到更多关于进度与延误的评论,甚至还有一个团队绩效概览,指出我是这个看板上唯一活跃的参与者。














报告还为我们提供了一些行动项与建议,告诉我们如何改进这个项目并确保其按计划进行。最后,甚至给出了一个结论段落,解释了如何实施其中一些建议以及这样做的价值。


这是一个非常有趣的项目。你肯定能看到这不仅对管理者,而且对团队来说是多么有价值。他们无需深入研究每个具体的卡片和阅读每条具体的评论,就能理解项目的进展状况。这是一个相当好的自动化流程,能让你深入了解项目,并让智能体为你完成所有工作,速度非常快。
总结
本节课中,我们一起学习了如何构建一个自动化项目进度报告系统。我们使用两个AI智能体(数据收集员和项目分析师),通过创建自定义工具与Trello外部API集成,自动获取项目数据。智能体协作完成了数据收集、进度分析和报告生成三项任务,最终输出了一份包含迭代概览、任务摘要、问题识别、团队绩效和行动建议的全面Markdown报告。整个过程成本极低,展示了利用AI智能体进行外部集成以实现日常办公自动化的强大能力与实用性。

在下一课中,我们将进一步深入,学习新功能并构建一个更复杂的工作组。
006:复杂工作流设置 🚀

在本节课中,我们将学习如何构建复杂的CrewAI工作流。我们将探讨如何不仅在一个Crew内部连接多个智能体,还能将多个Crew连接在一起,并使用条件逻辑来控制它们的执行顺序和信息传递。这为许多以前无法实现的高级用例打开了大门。
工作流控制基础
上一节我们介绍了智能体执行任务的多种方式。智能体可以按顺序、分层、混合模式,甚至并行或异步地执行任务。关键在于,你可以在这些不同选项之间进行混合和匹配,从而精细地控制工作的完成方式。
让我们快速看一个例子。假设你的Crew可以并行启动两个任务,例如,这两个都是研究任务。一个任务可能是研究一家公司,另一个可能是研究一个行业或一个人。这些任务彼此不依赖,这意味着它们可以同时开始。
# 设置任务并行执行
task1.async_execution = True
task2.async_execution = True
任务间的依赖与上下文传递
但是,在这之后,假设你想进行一些分析,但你需要先获取所有那些不同任务的结果才能开始。这时,我们可以使用一个名为 context 的属性。这个属性允许你将前两个任务的输出结果,作为输入传递给第三个任务。
现在,我们想进行一个总结任务,这是一个更直接的任务。我们可以确保将分析任务的输出结果传递给这个任务,以便撰写一份漂亮的总结。
然而,对于最终的报告任务,我们希望进行全面的撰写。为此,我们需要获取分析和总结的结果,以确保在将最终报告推送到外部系统之前,能够审查这份完整的最终报告。
那么,如果你必须用CrewAI构建这个流程,你会怎么做呢?让我来展示给你看。

使用Flows实现复杂编排
为了实现任务的并行执行,你可以将属性 async_execution 设置为 true。这意味着你的任务将被并行执行。对于我们的第三个任务,你可以设置另一个名为 context 的属性,它允许你指定一个或多个其他任务,当前任务会等待这些任务完成后才开始执行。
# 设置任务依赖关系
task3.context = [task1, task2]
通过这种方式,你可以对任务的执行顺序拥有很大的控制权。我们讨论的所有不同任务都使用了这些属性的不同组合。但是,你还可以通过使用 Flows 来实现更复杂的编排。
Flows是CrewAI的一个全新功能,它之所以如此特别,是因为它不仅允许你运行Crew,还能执行常规的Python代码。你可以在Crew执行之前、期间或之后执行这些代码。

这意味着你可以混合搭配,不仅连接多个Crew,还可以在它们之间使用常规Python代码。例如,当你需要获取文件、抓取数据或发送数据,而又不希望将这些工作留给智能体处理时,这将非常强大。
我们非常兴奋地看到,已经有人在生产用例中使用Flows构建应用了。现在,让我们深入代码,谈谈如何自己构建Flows。
总结


本节课中,我们一起学习了如何构建复杂的CrewAI工作流。我们探讨了通过设置 async_execution 和 context 属性来控制任务的并行执行与依赖关系。更重要的是,我们介绍了强大的 Flows 功能,它允许你将多个Crew与常规Python代码无缝结合,从而解锁了高度灵活和强大的自动化编排能力,为构建复杂的多智能体应用提供了坚实的基础。
007:L3 智能销售管道 🚀
在本节课中,我们将学习如何使用 crewAI 的新功能 Flows 来构建一个智能销售管道。我们将从加载潜在客户信息开始,对其进行丰富和评分,最后为高评分客户撰写邮件。整个过程将展示如何将多个 AI 智能体(Crew)与常规 Python 代码结合,实现复杂的自动化工作流。
概述:销售管道流程
在开始构建之前,我们先了解整个销售管道的设计思路。
我们将从加载潜在客户数据开始,这可以是常规的 Python 代码,例如从数据库读取。然后,数据将被发送给一个我们即将构建的“潜在客户评分智能体组”。该智能体组将搜索关于该客户的信息,评估其与我们产品和业务的匹配度,并给出评分。
接下来,评分结果将被保存回数据库(同样可以是常规 Python 代码)。我们需要过滤掉评分不高的客户,只保留高评分客户,以便发送给下一个智能体组。
第二个智能体组将利用我们找到的客户信息,撰写一封旨在提高参与度的邮件。

我们将把所有这些步骤封装到一个 Flow 中。Flow 通过事件来确保我们按顺序执行所有步骤,并且它拥有一个 状态(State),用于在流程执行期间或之后存储和访问信息。
现在,让我们深入了解这两个智能体组。
智能体组设计

第一个是“潜在客户评分智能体组”。它将执行以下任务:
- 分析客户数据。
- 研究该公司的文化背景。
- 进行最终的客户评分。

如果评分足够高,第二个“邮件撰写智能体组”将接手,执行以下任务:
- 起草初始邮件。
- 优化邮件以提高参与度。

需要指出的是,潜在客户评分智能体组将输出结构化数据。我们将利用这些数据,并将其传递给邮件撰写智能体组。这展示了如何从智能体和智能体组中获取复杂的结构化输出,非常实用。

什么是智能销售管道?


智能销售管道本质上会:
- 研究潜在客户。
- 根据个人、公司及所有能找到的信息对其进行评分。
- 如果销售线索合格,则撰写一封合适的初始联系邮件。
这非常令人兴奋,因为你可以使用完全相同的模式,为公司自动化整个销售管道,然后针对你的具体用例训练和微调智能体。
现在,让我们动手构建它。



代码实现:构建智能体组
首先,导入我们需要的类。这包括常规的 Agent、Task 和 Crew 类。
from crewai import Agent, Task, Crew
接下来,设置我们将要使用的 OpenAI 模型。我们将使用 gpt-4o-mini。请注意,这已经是 crewAI 的默认设置,但为了明确起见,我们在这里进行设置。


from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini")

然后,我们需要加载所有智能体和任务的 YAML 配置文件,方式与过去类似。不同之处在于,我们现在使用两个智能体组,因此需要加载两组 YAML 文件:一组用于专注于客户评分和研究的“潜在客户智能体”,另一组用于专注于撰写邮件的“邮件智能体”。



加载方式很直接,我们将它们分别存入四个变量中以便后续使用。
import yaml
with open('lead_agents.yaml') as file:
lead_agents_config = yaml.safe_load(file)
with open('lead_tasks.yaml') as file:
lead_tasks_config = yaml.safe_load(file)


with open('email_agents.yaml') as file:
email_agents_config = yaml.safe_load(file)
with open('email_tasks.yaml') as file:
email_tasks_config = yaml.safe_load(file)



创建结构化数据模型
现在,创建我们将要使用的 Pydantic 模型,用于将客户信息和数据构造成可用的形式。

我们将使用四个不同的模型:
LeadPersonalInfo:保存客户个人信息。CompanyInfo:保存公司信息,如公司名称、行业、收入等。LeadScore:存储智能体将给出的具体评分信息。LeadScoringResult:将上述所有信息整合到一个模型对象中。
from pydantic import BaseModel
from typing import Optional
class LeadPersonalInfo(BaseModel):
name: str
job_title: str
role_relevance: str
professional_background: Optional[str] = None
class CompanyInfo(BaseModel):
company_name: str
industry: str
revenue: Optional[str] = None
market_presence: Optional[str] = None
class LeadScore(BaseModel):
score: int
scoring_criteria: str
validation_notes: Optional[str] = None
class LeadScoringResult(BaseModel):
personal_info: LeadPersonalInfo
company_info: CompanyInfo
lead_score: LeadScore
导入工具
创建好模型后,导入智能体组将使用的工具。




对于这些智能体组,我们将只使用两个工具:SerperDevTool 和 ScrapeWebsiteTool。这些工具允许我们的智能体使用谷歌搜索互联网,并抓取遇到的任何 URL,以便了解更多关于特定版本或网站的信息。
from crewai_tools import SerperDevTool, ScrapeWebsiteTool
search_tool = SerperDevTool()
scrape_tool = ScrapeWebsiteTool()
构建第一个智能体组:潜在客户评分
现在,让我们实际加载 YAML 配置来创建我们的第一个智能体组:潜在客户资格评定智能体组。
这个智能体组非常明确。我们将有三个智能体和三个任务:LeadDataAgent、CulturalFitAgent、ScoringValidationAgent。每个都专注于获取客户的特定信息。
LeadDataAgent:尝试丰富客户信息,评估其在公司的角色,判断其是否是我们产品的潜在优质买家。CulturalFitAgent:确保该公司符合我们的理想客户画像。ScoringValidationAgent:整合所有信息,给出最终评分,并说明评分依据。

我们稍后可以在 YAML 中查看这些任务,但现在,我们将它们全部整合到这个单一的智能体组中。
# 从YAML配置创建智能体
lead_data_agent = Agent(**lead_agents_config['lead_data_agent'], llm=llm, tools=[search_tool, scrape_tool])
cultural_fit_agent = Agent(**lead_agents_config['cultural_fit_agent'], llm=llm, tools=[search_tool, scrape_tool])
scoring_agent = Agent(**lead_agents_config['scoring_validation_agent'], llm=llm)
# 从YAML配置创建任务
analyze_task = Task(**lead_tasks_config['analyze_lead_data'])
research_task = Task(**lead_tasks_config['research_cultural_fit'])
score_task = Task(**lead_tasks_config['final_lead_scoring'])





# 创建智能体组
lead_qualification_crew = Crew(
agents=[lead_data_agent, cultural_fit_agent, scoring_agent],
tasks=[analyze_task, research_task, score_task],
verbose=True
)




现在,让我们快速看一下智能体的定义。你可以看到它们的角色、目标和背景故事。这些智能体的定义非常直接,其核心目标是找到关于该客户的信息,以便就是否为优质客户做出明智决策。

如果我们查看任务,可以看到我们试图为每个客户提取的信息类型。包括姓名、职位、角色、专业背景等个人信息,以及行业、公司规模、收入、市场存在感等公司信息。






你可以看到,我们在任务定义中预设了要销售的公司和产品(本例中是 crewAI,一个多智能体编排平台)。我们告诉智能体我们的理想客户画像以及如何推销这个平台,然后将客户数据插入到任务定义中。当然,我们也可以将公司和产品信息作为变量插入,但为了示例简单,我们直接将其定义在任务中。

其他任务则继续寻找关于文化、价值观、战略契合度以及客户质量的定性评分等信息。


了解了智能体和任务后,让我们回到代码。



构建第二个智能体组:邮件撰写


现在创建我们的第二个智能体组:邮件参与度智能体组。该智能体组将在客户被评分和分类后,为其撰写邮件。

这个智能体组非常直接。我们有两个智能体:EmailContentSpecialist 和 EngagementStrategist。它们将执行起草初始邮件和优化邮件以确保其吸引力的步骤。该智能体组只关注我们获得的高评分客户,以确保能与他们有效互动。
# 从YAML配置创建邮件智能体
email_content_agent = Agent(**email_agents_config['email_content_specialist'], llm=llm)
engagement_agent = Agent(**email_agents_config['engagement_strategist'], llm=llm)
# 从YAML配置创建邮件任务
draft_task = Task(**email_tasks_config['draft_initial_email'])
optimize_task = Task(**email_tasks_config['optimize_for_engagement'])
# 创建邮件智能体组
email_engagement_crew = Crew(
agents=[email_content_agent, engagement_agent],
tasks=[draft_task, optimize_task],
verbose=True
)





创建 Flow



现在两个智能体组都已创建,我们准备开始创建 Flow。Flow 是 crewAI 的一个全新功能,它允许你在智能体组执行之前、期间或之后执行常规 Python 代码。
这让你拥有更多控制权,能够构建更完整、更复杂的自动化流程,既利用了智能体带来的自主性,又保留了在需要时执行常规 Python 代码的能力。


首先,导入我们将要使用的类和函数。你可以看到我导入了 Flow 类以及两个函数装饰器:listen 和 start。这将是一个非常直接的 Flow,但能让我们理解其强大之处。
创建 Flow 的基本方法是创建一个继承自 crewAI Flow 类的类。你可以使用 @start 装饰器来定义将要执行的初始函数。
在本例中,fetch_leads 函数将是我们的初始函数,因为我们用 @start 装饰了它。这个函数可以从数据库获取客户,或执行其他操作。本例中,我使用一些关于我自己和我之前在一家名为 Clibit 公司的职位的模拟数据。
获取客户后,我们需要对这些客户进行评分。为此,我们可以创建一个名为 score_leads 的新函数。你可以看到我们在这个函数上使用了不同的装饰器 @listen,并引用了 fetch_leads 函数。这意味着 score_leads 函数将在 fetch_leads 完成后执行。


fetch_leads 函数返回的内容(本例中是一个客户数组)将被传递给 score_leads 函数,我们可以用它来为每个客户启动评分智能体组。
需要指出的另一点是,每个 Flow 都有一个状态,可以通过 self.state 访问。在本例中,我们将评分存入 self.state,以便稍后对收集的信息、成本等进行分析。
评分完成后,我们想做两件事:将结果存储到数据库,并筛选出评分非常高(例如高于70分)的客户。为此,我们创建两个新函数:store_leads_score 和 filter_leads。这两个函数都监听 score_leads。因此,一旦 score_leads 执行完成,这两个函数将并行执行。


store_leads 函数可以将信息存回数据库。filter_leads 函数则过滤掉评分低于70的客户。现在,filter_leads 函数的返回值将只包含我们获得的高评分客户。
对于这些高评分客户,我们可以添加一个新函数,使用第二个智能体组来撰写邮件。我们添加一个名为 write_email 的新函数,它监听 filter_leads。因此,一旦 filter_leads 完成,write_email 将只获得评分高于70的客户,然后为每一个调用邮件撰写智能体组。这将返回一个邮件列表,这些邮件就可以准备发送了。
如果我们想立即发送,可以添加一个监听 write_email 的新函数 send_email 来发送所有邮件。这是 Flow 的最终函数,它的返回值将是 Flow 本身的最终返回值。为了简单起见,我们只返回邮件。
这就是一个 Flow,设置起来非常直接。要执行它,你可以先创建一个 Flow 实例。

from crewai.flow import Flow, start, listen
class SalesPipelineFlow(Flow):
@start
def fetch_leads(self):
# 模拟从数据库获取数据
leads = [
{"name": "Andrew Ng", "company": "Clibit", "title": "CTO"},
# ... 更多模拟数据
]
return leads
@listen(fetch_leads)
def score_leads(self, leads):
scored_leads = []
for lead in leads:
# 调用潜在客户评分智能体组
result = lead_qualification_crew.kickoff(inputs=lead)
# 将结果转换为 Pydantic 模型并存储到状态
scoring_result = LeadScoringResult(**result)
self.state.scored_leads.append(scoring_result)
scored_leads.append(scoring_result)
return scored_leads
@listen(score_leads)
def store_leads_score(self, scored_leads):
# 模拟存储到数据库
print(f"Storing {len(scored_leads)} leads to database.")
# 实际数据库操作代码...
return True
@listen(score_leads)
def filter_leads(self, scored_leads):
high_score_leads = [lead for lead in scored_leads if lead.lead_score.score > 70]
return high_score_leads
@listen(filter_leads)
def write_email(self, high_score_leads):
emails = []
for lead in high_score_leads:
# 调用邮件撰写智能体组
email_result = email_engagement_crew.kickoff(inputs=lead.dict())
emails.append(email_result)
return emails
# 可选:发送邮件函数
# @listen(write_email)
# def send_email(self, emails):
# for email in emails:
# # 发送邮件代码...
# pass
# return "Emails sent."
# 创建 Flow 实例
flow = SalesPipelineFlow()




可视化 Flow
在执行 Flow 之前,我们可以将其绘制出来,以便查看其结构。绘制 Flow 非常简单,只需在 Flow 实例上调用 plot 函数,它会自动生成一个包含整个 Flow 的 HTML 文件。
flow.plot('sales_pipeline_flow.html')

现在,我们加载这个 HTML 文件来看看它的样子。

在这里,你可以看到整个 Flow。它从 fetch_leads 函数开始,然后调用 score_leads。在 score_leads 之后,它并行执行两件事:将评分存储到数据库,以及筛选评分高于70的客户。之后,它撰写邮件并发送。图中还有一个图例,教你如何阅读整个图表,理解 Flow 中发生的一切。这对于导出流程图、附加到 GitHub 仓库或向他人解释流程执行情况非常有用。









运行 Flow 并查看指标
现在,让我们看看实际运行这个 Flow,并检查其后的一些指标。
启动 Flow 与启动智能体组非常相似。只需在 Flow 变量上调用 kickoff 函数。我们使用 await 来确保等待 Flow 执行完成,因为许多函数可以异步执行。我们将最终结果赋值给 emails 变量,以便检查一些运行数据。
emails = await flow.kickoff()





008:性能优化 🚀
在本节课中,我们将学习如何优化AI智能体及其团队的性能。性能优化是部署生产系统的关键环节,它涉及到在速度与质量之间做出权衡,并确保结果的一致性。我们将深入探讨如何测量和改进智能体与团队的表现。
速度与质量:核心权衡 ⚖️
上一节我们介绍了性能优化的目标,本节中我们来看看其核心权衡:速度与质量。
在AI自动化中,两个主要考量因素是速度和质量。
- 速度通常源于使用较小的模型。这些模型可以在较小的设备上运行,即使在云端运行也相当快。
- 质量通常与较大的模型相关,例如GPT-4等。这些模型擅长提供复杂的结果,但生成结果所需时间更长。
无论你优化的是哪个方面,有些任务可能需要速度,而另一些任务可能需要质量。但有一点必须确保,那就是一致性。
一致性是关键,因为你需要确保即使这是一个模糊的自动化过程,每次运行都能获得相同的速度或质量水平。
理解模型性能分布 📊
当我们思考较小和较大模型之间的分布时,会发现速度与模型大小接近线性关系:模型越大,速度越慢。
但质量与模型大小的关系则不一定如此线性。质量很大程度上取决于你试图完成的任务类型。如果智能体要完成的任务并不复杂,那么较小的模型可能已经能提供足够好的质量。
其美妙之处在于,当考虑生产用例和复杂用例时,你实际上可以在这个分布中选择不同的点。你可以让智能体在一个任务中使用一个模型,在另一个任务中使用另一个模型。关键在于,无论选择什么,都要保持一致性。因此,无论你为每个任务单独优化什么,都要确保这种优化是稳定一致的。
如何测量性能? 📏
我们知道速度和质量是两个变量,并且我们希望保持一致性。但我们如何测量呢?

这就是测试智能体性能的意义所在。我们将讨论crewAI中的一个特定功能:crewai task。
利用 crewai task 进行测试 🧪
当你思考一个任务时,它基本上包含描述、预期输出和执行智能体。
有趣的是,通过比较描述和预期输出,你可以判断结果是否接近预期。这使我们能够对任务进行评分,并衡量其输出的好坏。
这是crewAI从一开始就做出的设计选择,旨在让你能够大规模地测试任务。
你可以在终端中使用 crewai task 命令来运行此测试。当你这样做时,你的团队会执行所有指定的任务,然后将这些信息传递给你可以设置的任意大语言模型作为“法官”。最终,你会得到一份报告,其中可以看到团队中的任务以及每次运行中每个任务的输出。
在报告中,你可能会看到很高的分数,但这并非总是如此。这是一种简单的方法,可以让你衡量智能体和任务输出的一致性和质量,以便采取行动。
例如,我们可能发现任务一的输出质量评分为7。


如何改进性能? 🔧
我们如何改进这个任务、智能体乃至整个团队,使其能够持续地提升输出质量呢?
通常问题出在一些小细节上。可能是不遵循特定格式、未应用特定风格,或者缺少某些信息(例如信息来源的原始搜索记录)。
如果你能帮助智能体理解它们缺失了这些小细节,它们就能严格遵守要求,从而使你的输出质量更高,团队结果更好。
利用 crewai train 进行高效训练 🏋️
那么,如何在不花费大量时间改进描述和预期输出的情况下做到这一点呢?这就是 crewai train 功能的用武之地。
这个功能非常强大,可以对你团队的性能产生重大影响。你可以通过在终端运行 crewai train 命令轻松执行它。
当你执行此命令时,会发生以下几件事:
- 你的团队会照常运行。
- 但现在,每当它完成一个任务时,它会暂停,并针对团队中的每个任务向你征求反馈。
- 你将能够告诉它缺失了什么。例如,对于任务一,可能缺少研究的原始搜索记录;对于任务二,可能缺少你希望遵循的特定格式。
关键在于,现在你可以为每个任务提供非常具体的反馈。一旦反馈完成,这些信息会自动推送给一个新的法官大语言模型。这个法官模型将提取该特定任务的每一个学习点,并将其推送到你的团队记忆中。

其运作方式是:从现在开始,每当你的团队再次运行时,对于每个任务,它都会记住你给它的反馈,并确保遵守这些反馈。这非常强大,因为它允许你构建非常复杂的用例,并在多次运行中获得相当一致的结果。
我强烈建议你尝试一下这个功能。
总结 📝


本节课中,我们一起学习了AI智能体团队的性能优化。我们探讨了速度与质量的核心权衡,以及保持结果一致性的重要性。我们介绍了如何使用 crewai task 命令来测量和评估任务性能,以及如何利用强大的 crewai train 功能,通过提供具体反馈来高效地训练和提升智能体,确保它们在后续执行中能持续改进并产出更高质量、更一致的结果。
009:支持数据分析洞察 📊

在本节课中,我们将学习如何利用AI智能体来分析支持数据,生成洞察、建议和可视化图表。我们将看到智能体如何加载数据、理解客户问题、分析团队表现,并最终生成一份包含表格、图表和建议的综合报告。
概述
支持数据分析用例将执行一系列操作:处理支持数据、生成改进建议、将数据组织成有意义的表格、绘制可视化图表以展示趋势,并最终将所有内容整合成一份完整的分析报告。这个用例特别之处在于,我们将首次使用能够编写并执行代码来生成图表的智能体。

构建用例
上一节我们介绍了用例的目标,本节中我们来看看如何具体构建它。
首先,我们需要导入必要的库和类。这个用例的初始设置与其他用例类似。
# 导入必要的库和CrewAI类
import ...
from crewai import Agent, Task, Crew
为了处理复杂的代码生成任务,我们将为智能体使用GPT-4模型。接下来,我们通过加载YAML配置文件来创建智能体和任务。
以下是本用例涉及的三个智能体:
- 建议引擎智能体:分析问题报告并提出改进建议。
- 报告生成器智能体:将数据组织成表格视图,总结关键指标和趋势。
- 图表专家智能体:编写并执行代码,绘制关于问题分布、优先级、解决时间和满意度的图表。
以下是本用例涉及的四个任务:
- 建议生成任务:分析所有问题类型、历史数据、客户认证和反馈。
- 表格生成任务:总结关键指标和趋势,查看问题分类结果和代理性能。
- 图表生成任务:绘制关于问题分布、优先级、解决时间和满意度的图表。
- 最终报告汇编任务:将前三个任务的所有结果整合成一份Markdown格式的最终报告。
创建智能体与任务


现在我们已经了解了智能体和任务,让我们深入代码,实际构建这个Crew。


这个Crew将从本地的CSV文件读取支持数据。我们使用CrewAI工具包中的文件读取工具来加载support_tickets_data.csv文件。


# 使用工具读取CSV文件
from crewai_tools import FileReadTool
csv_tool = FileReadTool(file_path='./support_tickets_data.csv')


数据文件包含票证ID、客户ID、问题类型等信息。我们的智能体将解析这些信息。



在创建智能体时,我们为建议生成和报告生成智能体提供了访问CSV数据的工具。对于图表生成智能体,我们设置了一个新属性allow_code_execution=True,这允许它在受Docker保护的沙箱环境中编写和执行代码,确保与本地机器隔离。



# 创建智能体
suggestion_agent = Agent(
role='建议引擎',
goal='分析支持数据并提出改进建议',
tools=[csv_tool],
...
)
chart_agent = Agent(
role='图表专家',
goal='创建数据可视化图表',
allow_code_execution=True, # 允许执行代码
...
)

接下来,我们创建四个任务。注意,在最终报告任务中,我们使用了context属性,以便它能获取其他三个任务的结果来生成最终报告。
# 创建任务
final_report_task = Task(
description='汇编包含所有洞察、图表和建议的最终报告',
agent=report_agent,
context=[suggestion_task, table_task, chart_task], # 依赖其他任务的结果
...
)
最后,我们将所有智能体和任务组合成一个Crew。


# 创建Crew
analysis_crew = Crew(
agents=[suggestion_agent, report_agent, chart_agent],
tasks=[suggestion_task, table_task, chart_task, final_report_task],
verbose=2
)

测试与训练智能体
在正式运行Crew之前,我们可以先对其进行测试,以评估智能体的表现。我们使用crew.test()方法,并可以指定测试迭代次数和作为评判的LLM模型。
# 测试Crew
test_results = analysis_crew.test(
n_iterations=3,
llm_as_judge='gpt-4'
)
测试完成后,我们可以训练智能体以提升其表现。训练过程允许我们为每个任务的结果提供反馈,智能体会根据反馈调整其输出并学习,以便在未来做得更好。
# 训练Crew
analysis_crew.train(
n_iterations=2,
save_file_path='./trained_crew.pkl'
)

在训练过程中,每个任务完成后,系统会请求反馈。例如,我们可以要求建议更深入,或要求报告包含特定的比较表格。智能体将根据这些反馈重新执行任务并更新其输出逻辑。
训练完成后,再次运行测试,可以比较训练前后的性能得分,以验证训练效果。
运行与分析结果
经过测试和训练后,我们正式运行Crew来生成最终的报告。
# 运行Crew
final_result = analysis_crew.kickoff()
运行完成后,我们将得到一份Markdown格式的综合报告。报告内容可能包括:
- 问题类型与频率表格:列出各种问题及其出现次数。
- 可视化图表:例如问题分布图、优先级水平图、解决时间趋势图、客户满意度月度趋势图以及代理绩效对比图。
- 代理绩效分析:通过表格和图表展示不同支持人员处理的票证数量、解决时间和客户满意度评分。
- ** actionable 改进建议**:基于数据分析,提出具体的产品功能或支持流程优化建议。



这份报告生动地展示了如何利用多智能体协作,将原始支持数据转化为易于理解、可指导行动的深度业务洞察。


总结

本节课中,我们一起学习了如何构建一个用于支持数据分析的多AI智能体系统。我们了解了如何配置能执行代码的智能体来生成图表,如何通过测试评估智能体性能,以及如何通过提供反馈来训练智能体,使其输出更符合我们的要求。这个用例展示了AI智能体在自动化数据分析、生成可视化报告方面的强大潜力,此模式可扩展应用于人力资源、代码审查等多种公司内部场景。
010:多模型智能体系统


在本节课中,我们将要学习如何构建一个由不同大语言模型驱动的多智能体系统。我们将探讨如何为不同的智能体分配不同规模或不同供应商的模型,以实现速度、成本、质量或专业性的优化。
🧠 多模型智能体系统概述
上一节我们介绍了智能体的基本概念,本节中我们来看看如何让多个智能体协同工作,并且每个智能体可以选用不同的大语言模型。
这意味着你可以让一些智能体由较小的模型驱动,而另一些智能体由较大的模型驱动。你甚至可以选择不同的模型供应商。你还可以探索使用特定的微调模型,从而构建完全由多模型组成的智能体团队。这可以针对不同目标进行优化,并解锁许多以前无法实现的新用例,让你能够创建非常专业的智能体。
接下来,让我们看看如何在智能体系统中使用多模型。
⚙️ 多模型实现原理与优势
现在,让我们谈谈多模型实现在CrewAI中是如何工作的,以及你能从中获得哪些好处。
我们已经了解到,较小的模型和较大的模型针对不同目标进行了优化。在某些用例中,你可能选择优化速度,而在其他用例中则优化质量。关键在于,使用CrewAI,你可以利用任何主流供应商的模型。
以下是你可以使用的模型供应商示例:
- 你可以使用AWS Bedrock和Anthropic的模型。
- 你可以使用Azure上的任何模型。
- 你可以使用Gemini。
- 你可以使用OpenAI、Anthropic或Hugging Face以及其他任何供应商的模型。


这意味着你拥有大量模型可供选择。其美妙之处在于,你可以为每个单独的智能体挑选和选择模型。
例如,你可以让智能体一号使用一个较小的模型,而智能体二号使用一个较大的模型。


这有助于针对不同目标进行优化。例如,你可以设定智能体一号是研究员,智能体二号是报告撰写员。它们协同工作能够产生比单独工作更大、更好的成果。
除了根据模型规模优化智能体之外,你还可以针对不同的供应商进行优化。例如,你可以让智能体一号使用Azure的模型,而智能体二号使用Anthropic的模型。
这为你提供了更大的灵活性,并可以应对诸如速率限制、以及你是否能访问特定供应商等问题。
除此之外,你还可以定制智能体以使用微调模型。你可以让一个智能体使用来自任何供应商的通用模型,而另一个智能体使用微调模型。这个微调模型可以是专门训练用于模仿你公司的写作风格、某个人的风格,或者具备关于你公司特定业务案例的非常专业的知识。

通过这种为单个智能体选择单个模型的能力,你可以在非常细致的层面上控制你希望智能体如何行为。这让你在想要构建何种用例以及希望智能体如何表现方面拥有很大的权力。
🛠️ 动手实践:构建多模型智能体
这非常有趣,但让我们动手构建一些东西。让我们深入其中,学习如何利用一些供应商的模型来为我们服务。
接下来,让我们进入Jupyter Notebook,亲自构建一些东西。我们稍后见。




本节课中我们一起学习了多模型智能体系统的核心概念与优势。我们了解到,通过为不同角色和任务的智能体分配合适的模型(如小模型优化速度,大模型或专业微调模型优化质量与专业性),可以构建出更高效、灵活且强大的智能体协作系统。这为开发复杂的AI应用提供了新的可能性。
011:大规模内容创作 🚀
在本节课中,我们将学习如何构建一个能够大规模创建内容的智能体团队。你将了解如何让智能体不仅监控网络,还能理解搜索目标,甚至利用RAG技术即时生成出色的博客文章。
概述

这是一个强大的应用案例。我们将构建一个能够大规模进行内容创作的智能体团队。这个团队将学习如何监控网络、理解搜索主题,并利用RAG技术即时生成高质量的博客文章。我们看到一些客户已经在实际部署此类应用。他们的做法是监控特定主题的新闻,确保能及时创建出能带来实际效果的内容,以此进行内容营销。
为了实现这个用例,我们首先要确保我们的智能体团队能够与互联网交互,并能够搜索相关内容和新闻。接下来,我们将配置多个智能体和任务。

为了能够解析这些信息,我们将从市场分析师智能体开始。然后,我们将依次配置数据分析师智能体、内容创作者和首席内容官。这四个智能体将执行四项不同的任务:解析最新新闻、搜索市场趋势、撰写博客和社交媒体内容,最后审查所有内容以确保其质量。
这些智能体通过顺序处理数据,能够为我们生成关于当前热门话题的精彩博客文章和社交媒体内容。
一个有趣的地方是,我们可以优化其中一些智能体和任务,使其运行得更快。为此,我们将使用一个主要的提供商来驱动这些智能体,即Groq。Groq是目前最快的推理提供商之一,其模型运行速度极快,使得这些智能体能够迅速处理大量新闻和市场趋势。因此,我们将确保这些智能体使用Groq运行。
对于这个团队,我们使用了之前未使用过的工具组合,这非常有趣。我们使用Serper进行网络搜索,同时将RAG作为一种工具使用。这意味着我们不仅能抓取整个网页,还能使用网站搜索工具。



这个网站工具将使我们的智能体能够自动下载内容、即时嵌入内容、将其推送到向量数据库,然后对其进行搜索。这样,你的智能体就能够独立进行数据库操作和搜索,这解锁了许多潜在的应用场景。

最终,我们将得到一个内容创作团队,它将执行以下几项工作:搜索金融主题的最新新闻;搜索并分析相关的市场数据;基于这些信息创建社交媒体内容;根据所学知识撰写一篇完整的博客文章;最后,确保审查博客文章,使其内容通顺。
如果结合我们在其他课程中学到的训练和测试方法,这些内容的质量会非常高。现在,让我们深入代码,亲自构建这个团队。
代码实现
我们将从导入所需的类和模块开始。确保设置好所有环境变量,并从CrewAI导入主要类,就像我们在其他课程中做的那样。
现在,我们将创建一个结构化输出,以确保从团队获得的数据能够被使用并推送到其他系统中。这个结构化输出非常简单直接。
我们将创建一个ContentOutput模型,它包含文章本身和社交媒体帖子。社交媒体帖子是一个SocialMediaPost模型的列表,该模型基本上包含平台和内容。因此,在这个团队执行过程中,它不仅会撰写文章,还会生成配套的社交媒体帖子,以便我们可以在LinkedIn、Twitter等平台发布。
现在,让我们加载智能体和任务的YAML文件。加载智能体和任务的YAML文件非常简单,与我们之前的方法相同。
让我们看看我们的智能体和任务。这里有四个智能体:首席市场分析师、首席数据策略师、创意内容总监和首席内容官。你可以根据需要自由调整这些智能体的角色、目标和背景故事,看看是否能得到不同的结果。
现在,让我们检查一下任务。我们也有四个任务:第一个任务是监控和分析最新新闻;第二个任务是分析给定主题的市场数据和趋势。在这里,你可以看到我们再次在任务中插入了变量,就像在其他课程中一样。这意味着当我们启动团队时,需要确保传递这个输入。
你还可以看到,我们有一个内容创建任务,它基于洞察力尝试不仅撰写博客文章,还生成配套的社交媒体更新。然后,我们有一个质量保证任务,负责审查和优化关于该主题的所有内容,确保博客文章和社交媒体帖子都符合要求。

现在,让我们回到代码并继续构建。

现在,让我们导入我们将要使用的CrewAI工具。这些工具非常简单:我们使用通常的Serper Dev工具进行谷歌搜索,以及我们的网站抓取工具来抓取整个网站的内容。但这次我们引入了一个新工具:网站搜索工具。这是一个RAG即工具。
它的作用是,当我们的智能体搜索互联网并找到包含有趣信息的网站时,它会自动下载这些网站,将其分解成更小的块并进行批处理,然后保存到本地嵌入数据库中,以便你可以实时进行向量搜索。你的智能体会自行完成所有这些操作,你无需担心任何细节。它们将生成嵌入,并选择搜索什么以及何时搜索。
既然我们知道了将要使用的一个工具,接下来让我们导入并设置本课将要使用的LLM。请注意,我们在这个例子中使用了多个模型,以展示其强大功能以及如何针对特定任务优化某些方面。
首先,让我们设置OpenAI模型。我们将设置OPENAI_MODEL_NAME环境变量,并将其值设为gpt-4o-mini,这是CrewAI的默认设置,但我们仍然进行设置,以便更明确和直接。
我们还将使用一个Groq模型,具体是Llama-3.1-70b。我们可以通过设置一个变量来实现,稍后在创建智能体时会引用这个变量。它是一个Groq模型,模型名称是llama-3.1-70b-versatile。
现在,让我们创建我们的智能体、任务和团队。首先创建智能体。对于智能体,我们将使用智能体配置的YAML文件。你可以看到,市场新闻监控智能体拥有与数据分析师和内容创作者不同的工具集。
市场新闻智能体可以访问Serper Dev工具进行互联网搜索,还可以访问网站抓取工具来从整个网站提取信息。这对于该智能体很有用,因为它试图广泛地寻找我们关心主题的尽可能多的信息。
然后,我们的数据分析师智能体和内容创作者可以进行谷歌搜索,但现在它们也会对找到的任何内容进行RAG搜索。这样,它们就不需要解析整个网站及其所有信息,而是搜索它们关心的特定主题。
最后,我们的质量保证智能体没有任何工具,负责确保内容看起来和听起来都很棒。
创建好智能体后,让我们创建任务。我们也将有四个不同的任务,每个智能体一个。第一个任务只是监控新闻,第二个任务是分析市场,第三个任务是创建内容。如果你仔细观察,可以看到我们传递了一个context属性,将监控金融新闻和分析市场任务的结果都带入这个任务中。这样,当它撰写内容和社交媒体帖子时,就拥有了完成这项工作所需的所有信息。
在我们的最终智能体——质量保证智能体中,将执行质量保证任务,并确保无论我们得到什么输出,都会使用上面声明的模型,这样我们不仅得到实际的文章,还得到所有不同社交网络的社交帖子。
创建好任务后,让我们将它们整合到我们的团队中。对于我们的团队,我们只需要将智能体和任务组合到这个单一对象中,这个团队就准备就绪了。让我们启动它,看看它是如何工作的。
现在,我们将启动这个团队,这将非常有趣,因为想想这里发生的一切:我们有智能体在研究网络,抓取网页;然后有智能体下载内容、分解成块、生成嵌入、存储到向量数据库,并自动搜索以找到撰写最精彩文章所需的每一段信息。这是一个非常棒的设置,允许你创建许多不同的内容。
让我们启动这个团队。别忘了你需要传递输入,因为我们需要告诉它我们希望内容是关于什么主题的。在这个例子中,我们选择了一个复杂的主题:我们希望找到关于2024年美国通胀及其对股市影响的具体信息。你可以看到这是一个非常困难的任务,但这些智能体可以处理它。让我们运行它们。
😊,看看我们得到了什么?让我们从监控第一个智能体——首席市场分析师开始。它的第一个任务非常直接:监控和分析金融市场的最新新闻和更新。在这个例子中,它开始搜索2024年美国通胀及其对股市影响的最新新闻。我们可以看到它找到了很好的信息来源,比如德勤、华尔街日报、今日美国等,它找到了一堆可以使用的信息。


从这一点开始,你可以看到它通过查看其中的所有内容来帮助抓取网站内容,确保我们找到学习此事所需的所有信息。
现在,我们的首席市场分析师完成了工作,并为我们提供了一份完整的报告和摘要,涵盖了所学到的关于美国通胀率对股市潜在影响的一切,包括消费者价格指数等等。

第一个智能体完成工作后,让我们看看接下来会发生什么。




在这里,我们可以看到我们的第二个智能体——首席数据策略师,开始分析市场数据,以更好地理解美国通胀对实际股市的影响。你可以看到它从简单的搜索开始。



现在,我们的首席数据策略师完成了工作。你可以看到它提供了一个相当长的摘要,包括当前状态、通胀率、股市影响,甚至关键趋势、机会和风险。

现在,我们的内容创作者将开始围绕我们撰写博客材料和社交媒体帖子。




在这里,你可以看到我们的创意内容总监开始工作,基于洞察力撰写博客文章的初稿。让我们看看结果如何。在这里,你可以看到我们的智能体搜索了2024年美国通胀趋势及其对市场分析的影响,并在整个网络上找到了大量数据。



😊。


但它并没有就此停止,而是决定深入研究德勤的特定网页,以了解通胀对美国的影响。这不仅仅是抓取网站,这是使用RAG即工具。它会自动下载该网页的内容,然后即时嵌入并将其推送到ChromaDB中,以便你实际进行搜索。在这里,你可以看到返回的内容仅针对该智能体实际关心的特定内容。这非常有趣,因为你的智能体基本上是在进行RAG并即时构建向量数据库。


让我们继续,看看这个智能体是如何工作的。


在这里,我们可以看到我们的最终智能体——首席内容官,完成了内容审查,并返回了一个遵循我们在本课早期创建的ContentOutput模型的对象。现在让我们进一步检查它,以便更好地了解这篇文章的实际内容。
首先,让我们检查该智能体为我们创建的社交媒体内容。在这里,你可以看到它为Twitter、LinkedIn和Instagram创建了帖子。你可以看到Twitter和Instagram有表情符号,但LinkedIn没有。这是一个非常有趣的概念,这些模型实际上能够理解LinkedIn可能不像其他社交网络那样接受表情符号。
现在,让我们看看博客文章。另一个值得强调的地方是,你可以看到LinkedIn帖子的语气比Instagram上的要专业得多,甚至在Instagram帖子中,它提到了“向上滑动阅读专家分析”。这非常理解在Instagram上,人们使用该产品的方式与LinkedIn等平台存在某些动态差异。
现在,让我们看看博客文章的实际内容。好的,我将首先以Markdown格式打印这篇博客文章,以便我们真正阅读并理解其中的一些影响。
就是这样,这就是关于2024年美国通胀及其对股市影响的博客文章。它有引言、通胀现状、通胀驱动因素、未来通胀预测、影响和股市影响,甚至涉及短期和长期考虑,并为投资者提供了一些建议。
这就是我们最终由这些智能体撰写的博客文章,从一个非常复杂的单一主题开始,然后四处研究网络以获取对该主题的更好理解,接着在特定网页上使用RAG即工具以收集其中最重要和最相关的信息,然后确保它们写出精彩的内容,并审查这些内容以确保其坚实可靠。






在这里,你有一个很好的用例,我们看到一些CrewAI的客户和用户实际上已经部署了这些用例来进行大规模的内容营销。这解锁了许多关于如何使用它来不仅生产内容,还使用这些不同的工具和模型来自行构建有趣事物的用例。


请记住,这四个智能体中有两个使用Groq运行Llama 3.1 70B,速度非常快。因此,你可以有一些针对速度进行优化的智能体,它们将使用像这样的模型和像Groq这样的提供商,而其他智能体将使用更大的模型,比如内容撰写智能体使用ChatGPT的情况。




这是一节非常有趣的课程,希望你和我一样乐在其中。现在,让我们进入下一课,开始讨论更多的用例。我们稍后见。
😊。

总结

在本节课中,我们一起学习了如何构建一个能够大规模创建内容的智能体团队。我们了解了如何配置多个具有不同角色和工具的智能体,使其能够监控新闻、分析市场趋势、撰写内容并进行质量审查。通过结合使用Serper、网站抓取和RAG即工具,我们实现了智能体自主搜索、处理信息并生成高质量博客文章和社交媒体内容的能力。我们还看到了如何通过使用不同的LLM提供商(如OpenAI和Groq)来优化任务执行速度和质量。这个强大的框架为自动化内容营销和许多其他应用场景打开了大门。
012:生产环境部署与价值实现 🚀

在本节课中,我们将探讨如何将AI智能体工作流部署到生产环境,并了解其带来的监控需求与商业价值。我们特别邀请了来自普华永道的行业专家Jacob,分享他们在企业级环境中应用CrewAI平台的经验与洞见。
上一节我们探讨了智能体的构建与协作。本节中,我们来看看如何将智能体系统投入实际生产,并衡量其成效。

企业为何探索AI智能体方案?
普华永道在约两年前开始其生成式AI转型。当时,可用的智能体框架很少,技术也处于早期阶段。因此,他们最初开发了自己的专有框架来启动项目。随着技术演进和用例复杂度的增加,团队需要重新评估方案,以优化解决方案的准确性和整体用户体验。
采用AI智能体的关键驱动因素
决定采用AI智能体的核心因素,正是上文提到的准确性与用户体验。例如,在软件开发生命周期转型和生成长篇复杂文档(如功能规格说明书)的初期方案中,顾问们反馈需要更实时的反馈。这促使团队意识到,是时候引入智能体来提供实时反馈,并将反馈整合到解决方案中,通过多轮验证来达成正确的结果。
CrewAI平台如何助力?
对于并非天生就是智能体专家的广大开发者而言,使用智能体框架处理复杂用例存在一定的入门门槛。CrewAI的优势在于其低门槛,能让任何人快速上手并开始创建智能体。同时,对于更资深的开发者或数据科学家,它也提供了深入底层API的灵活性,以便按需进行深度定制。
部署AI智能体的间接收益
除了直接目标外,部署AI智能体带来了一个重要的间接收益:流程透明度。在推动业务转型时,企业需要分析和监控众多方面,以衡量效率提升和投资回报。CrewAI与智能体监控工具的原生集成,提供了直接的可见性。团队可以查看智能体完成任务所需时间、在此过程中选择了哪些工具,并能详细分析数据,比较智能体与顾问完成同一流程的时间,从而清晰地解释投资回报率。
以下是监控可提供的关键洞察维度:
- 任务耗时:智能体完成特定任务所需的时间。
- 工具使用:智能体在执行过程中调用哪些工具或API。
- 效率对比:智能体与人工执行相同任务的效率差异。
早期成果与影响
在代码生成这一主要用例中,效果提升显著。普华永道为客户实施的大型系统涉及许多专有开发语言。在采用智能体工作流之前,代码生成的准确率波动很大,有时低至10%。引入智能体后,通过实时代码验证、在真实运行时环境中执行代码并分析日志输出以生成更好的代码,准确率提升至70% 以上。
规模化实施的主要挑战
实施AI智能体规模化应用时,除了通用的技术和GenAI解决方案的扩展性问题(如令牌限制、速率限制)外,更大的挑战在于开发模式的标准化。如何为创建的智能体制定标准?如何让为代码生成用例创建的智能体在不同专有语言间复用?这更多是关于优化智能体创建模式、实现跨用例复用的工作。
从测试到生产的过渡
从测试环境过渡到生产环境,技术上的基础设施挑战依然存在。但更困难的部分在于变革管理和人力因素。如何推动变革与采纳,让人们习惯于在日常工作流程和业务流程中与智能体协同工作,这是团队近期投入大量精力的领域。
成功的最关键因素
回顾普华永道的智能体应用之旅,最关键的成功因素始终是准确性和用户体验。如果无法驱动正确的准确性和体验,用户的信任会迅速丧失,而一旦在初期失去信任,要重新赢回将困难得多。
给其他企业的建议
对于考虑采用AI智能体技术的企业开发者,建议是:从简单开始,逐步增加复杂度。遵循“爬、走、跑”的古老格言。可以从一些基础的提示工程、检索增强生成管道应用开始,识别需要解决的缺口。面对更大的缺口和更高的复杂性时,像CrewAI这样的智能体框架和工具就能介入,帮助填补这些缺口,确保驱动更高的准确性和更好的用户体验。
本节课中,我们一起学习了将AI智能体工作流部署到生产环境的核心考量,包括其驱动因素、关键收益、面临的挑战以及成功要素。通过普华永道的实际案例,我们看到了智能体技术如何显著提升特定任务(如代码生成)的准确性,并强调了变革管理与用户体验在成功落地中的重要性。
013:部署与监控
在本节课中,我们将学习如何将构建好的AI智能体团队(Crew)部署到生产环境,并探讨其监控方法以及能为团队和公司带来的价值。
🚀 从零开始创建Crew项目
到目前为止,我们一直在Jupyter Notebook中运行和测试Crew。现在,我们将学习如何从头开始创建一个全新的Crew项目。
crewAI提供了一个非常简单的命令行工具,只需一行命令即可创建包含所有必要文件夹结构的新项目。

以下是创建新项目的命令:
crewai create {项目名称}
执行此命令后,系统会自动生成项目所需的所有文件和目录结构。
📁 项目结构解析
让我们了解一下自动生成的项目文件。
README.md: 此文件包含了项目的所有说明。你可以在这里找到如何安装依赖、运行代码、设置环境变量等所有必要信息。
agents.yaml 和 tasks.yaml: 这两个文件与我们之前在Jupyter Notebook中构建的完全一样。你可以在这里定义特定的智能体和任务。
tools/ 文件夹: 此文件夹用于存放自定义工具。如果你需要集成内部或外部API、连接数据库或其他系统,可以在这里编写和放置你的代码。

crew.py 文件: 这是将你的智能体和任务组合在一起的核心文件。你可以通过加载 agents.yaml 和 tasks.yaml 文件来创建智能体,这与我们在Jupyter Notebook中的做法非常相似。在这里,你还可以导入自定义或内置的工具,并将其分配给相应的智能体。
main.py 文件: 此文件用于在本地运行你的Crew。通过执行这个文件,你可以运行、训练和测试你的Crew,以及使用我们之前介绍过的所有功能。
⚙️ 安装依赖与本地运行
在开始修改和运行代码之前,你需要首先安装项目依赖。

运行以下命令来安装所有依赖项,并自动创建一个虚拟环境:
crewai install

安装好依赖后,你可能会问如何在本地运行Crew以进行开发和迭代测试。
我们之前提到的 main.py 文件是关键。这个文件包含几个重要的函数:
- run 函数: 当你执行
crewai run命令时,实际运行的就是这个函数。这个函数通常是一个样板,你无需做太多修改,主要可能需要调整传递给Crew的输入参数。 - 其他函数: 类似地,还有用于训练、重放和单个任务测试的函数。
你可以通过命令行工具来调用这些功能:
crewai run- 执行你的Crew。crewai train- 运行训练。crewai replay- 重放执行过程。crewai task- 执行单个任务测试。
最常用的命令是 crewai run,它负责执行你的Crew。

☁️ 部署到生产环境

现在你可以在本地运行和修改Crew了,那么如何将其部署到生产环境,以便与其他服务集成和使用呢?
这就是我们需要讨论的Crew部署环节。
crewAI 提供了 crewAI+ 功能,你可以免费使用。只需运行以下命令,即可将你的智能体部署到云端:
crewai deploy
这个过程非常神奇。你的Crew(包含智能体、任务和工具)以及一系列输入参数,会被自动转换成一个API。现在,你可以通过向这个API端点发送POST请求并传递输入参数,来调用你的Crew。

🔗 集成与共享
拥有一个可作为API调用的生产级Crew后,你就可以将其与任何外部系统集成。
你可以从 Slack、HubSpot、Zapier 或任何其他系统中调用这个API。更有趣的是,你的Crew也可以通过轮询功能或Webhook回调任何你指定的URL或应用程序。
当你部署API后,主要会调用一个“启动”端点。你可以向它发送详细信息,包括:
- Crew期望的输入: 例如,在我们的用例中,我们传递了一个名为
topic的输入参数,它将在智能体和任务中被使用。 - 元数据: 你也可以传递任何需要的元数据信息。
- Webhook设置: 你可以为任务完成、步骤完成或整个Crew完成等事件设置特定的Webhook。这为你提供了极大的灵活性,允许你将Crew的执行进度与时间线或其他UI界面集成,并展示给用户。

此外,你还可以使用其他端点,如 inputs 端点获取输入信息,status 端点轮询Crew的执行状态。这解锁了无数可能性,让你不仅能本地运行Crew,还能将其与公司现有系统、数据或消息平台集成,从而最大化智能体的价值。
🎯 课程总结

在本节课中,我们一起学习了如何将AI智能体团队(Crew)从开发环境带入生产环境。我们涵盖了从使用 crewai create 命令创建新项目,到理解项目结构、安装依赖、在本地运行和测试,再到使用 crewai deploy 命令将Crew部署为云端API的完整流程。最后,我们还探讨了如何通过API和Webhook将部署好的Crew与外部系统(如Slack、HubSpot等)进行集成,从而实现价值的最大化。现在,你已经掌握了将AI智能体应用落地的关键部署与集成技能。
014:14.L6 为生产环境构建你的Crew

在本节课中,我们将学习如何从零开始构建一个可用于生产环境的Crew。我们将使用命令行工具创建项目、安装依赖并执行Crew,了解其完整的文件结构和工作流程。
概述
在之前的课程中,我们主要在Jupyter Notebook环境中构建和运行Crew。本节内容将有所不同,我们将学习如何从零开始,使用命令行工具创建一个独立的、可用于生产环境的Crew项目。这将涉及项目初始化、依赖管理、环境变量配置以及最终的执行。

创建新项目
首先,我们需要创建一个新的Crew项目。这可以通过一个简单的命令行指令完成。
以下是创建新项目的步骤:
- 打开你的终端或命令行界面。
- 运行命令
crewai create crew <项目名称>。例如,我们可以将项目命名为new_project。 - 执行该命令后,系统会自动生成一个包含所有必要文件的初始项目文件夹。
运行命令后,你将看到初始文件夹已创建,其中包含了运行Crew所需的所有文件。这些文件包括:
pyproject.toml:用于管理项目依赖。main.py:Crew的主执行文件。agents.yaml和tasks.yaml:用于定义智能体和任务的配置文件。- 其他配置文件,如
.gitignore。
至此,我们的项目框架已经准备就绪。

安装项目依赖

项目创建完成后,下一步是安装运行Crew所需的所有依赖包。



安装依赖的过程非常简单直接。你只需要在项目根目录下运行一个命令。
以下是安装依赖的步骤:
- 确保你的终端当前路径位于新创建的项目文件夹内。
- 运行命令
crewai install。 - 该命令会自动读取
pyproject.toml文件,并安装所有列出的依赖项。
运行 crewai install 后,你可以看到所有依赖项正在被安装。这个过程可能需要一些时间,具体取决于网络速度和依赖包的数量。安装完成后,所有必要的软件包都已就位,Crew的执行环境已准备就绪。
通常,我们还需要注意环境变量的配置。项目中会有一个 .env 文件,你需要在此处设置API密钥等敏感信息。如果你在Jupyter Notebook中运行,环境变量可能已自动注入;但若在本地终端或服务器上运行,则必须手动配置这些密钥,以确保能正确调用不同的模型提供商。

执行Crew
依赖安装完毕且环境变量配置完成后,我们就可以运行这个新创建的Crew了。
执行Crew只需要一个命令。让我们来看看如何操作。



以下是执行Crew的步骤:
- 在项目根目录下,运行命令
crewai run。 - 执行后,你将在终端中看到Crew的运行日志,智能体会按顺序执行定义好的任务。
首次执行Crew时可能会花费一些时间,因为它需要在虚拟环境中启动。在日志中,你可以看到智能体们逐个完成任务。这个示例项目是一个简单的博客创作Crew:首先由一名高级数据研究员负责研究内容,然后将结果传递给博客内容撰写员来撰写最终的报告。
通过这个过程,你就能体会到如何从零开始构建自己的Crew。你可以在终端中自由地创建、修改和分享Crew项目,并将其推送到GitHub。这非常强大,因为你不再局限于Jupyter Notebook环境,使得开发和部署变得更加便捷。


扩展:创建Flow项目
除了创建Crew,命令行工具同样支持创建更复杂的Flow项目。
创建Flow的流程与创建Crew非常相似。这为你构建多Crew协作的工作流提供了便利。
以下是创建Flow的步骤:
- 运行命令
crewai create flow <Flow名称>。 - 该命令会为你设置好Flow的初始架构,包括文件夹和所有必需的文件。
让我们看一下为Flow创建的文件结构。初始结构虽然与Crew项目相似,但如果你查看Flow文件夹内部,会发现:
crews/文件夹:允许你在其中放置任意多个Crew。main.py:这是Flow的主执行代码。tools/文件夹:你可以在此处放置任何自定义工具。
这展示了如何使用相同的策略来创建更高级的Flow,以满足复杂场景的需求。
总结
本节课中,我们一起学习了如何为生产环境构建Crew。我们从使用 crewai create crew 命令创建新项目开始,然后通过 crewai install 安装依赖,最后使用 crewai run 执行Crew并观察其运行。我们还了解到,可以使用 crewai create flow 以类似方式创建更复杂的Flow项目。

这种方法的强大之处在于,你现在不仅可以完全从零开始构建Crew,理解其内部运作,还能轻松地部署它。将Crew部署为API后,你可以通过其端点和Webhook与任何现有应用程序(如Slack或其他业务系统)集成,从而在实际生产环境中引入多智能体系统的强大能力。希望你在本节课中有所收获,并能开始构建属于自己的智能体应用。
015:结论


概述
在本节课中,我们将对《多AI智能体实践与高级应用课程》的全部内容进行总结,回顾所学到的核心知识与技能。
课程内容回顾
恭喜你完成了这门课程。你学到了许多不同的知识。
以下是你在本课程中学到的核心内容列表:
- 你学习了AI智能体系统的基本构成模块。
- 你学习了如何创建智能体。
- 你学习了如何创建任务。
- 你学习了如何创建智能体团队。
- 你学习了如何将智能体系统与内部及外部系统进行集成。
- 你学习了如何让多个智能体协同运行。
- 你学习了如何让多个智能体团队协同工作。
- 我们讨论了如何部署智能体系统。
- 我们讨论了如何监控、训练和测试智能体系统。
总结
这门课程内容丰富,涵盖了大量知识。我们期待看到你能够运用所学,独立构建出优秀的AI智能体应用。现在,请务必行动起来,将你掌握的AI智能体构建知识传播出去。


浙公网安备 33010602011771号