大家都在谈论 CrewAI,所以让我澄清一些事情。
市面上有许多框架和库可以抽象出编排 AI 代理的复杂性,其中每个代理都是自己领域的专家,共同解决复杂问题。
CrewAI 是最新的一个框架,它利用 LangChain 代理并通过角色扮演和记忆机制进行增强。
加入我们的下一个班级:4 周内全栈 GenAI SaaS 产品!
由于 LangChain 的易用性,它打开了一个应用的世界。一旦你深入其中,你不仅可以利用现有的 LangChain 工具的威力,还可以通过定制工具来满足你的特定需求,为生态系统做出贡献。我一直是飞轮效应的支持者——一旦你开始,它只会变得更容易和更强大。
img
模型多样化在这里也非常重要。通过集成云端和本地模型的混合,甚至为特定代理微调自己的模型,你可以显著增强你的团队的能力。
而且,“顺序”流程只是个开始。"共识"和"层次"流程的概念打开了一个协作执行的世界,我迫不及待地想要探索。很快,代理将能够动态委派子任务,模拟真实的工作环境,使我们更高效、更智能。
在本文中,我将带你了解:
让我们开始吧!
img
开始使用 CrewAI
首先,你需要设置一个环境并安装 CrewAI。
打开你的命令行界面——可以是命令提示符、终端或其他你熟悉的命令行工具。确保你已经安装了 Python,因为我们将使用 pip,Python 的包安装工具。现在,输入以下命令:
# 创建一个虚拟环境 mkdir crewai-orchestration && cd crewai-orchestration python3 -m venv crewai-orchestration-envsource crewai-orchestration-env/bin/activate# 安装依赖 pip3 install ipykernel jupyter pip3 install python-dotenv pip3 install crewai pip3 install -U duckduckgo-search# 可选:启动 VSCode 或你喜欢的 IDE,让我们开始吧! code .
好了,我们设置好了环境,检查了 Python 包索引,找到了一些包并安装了它们以及所有必要的依赖项。
接下来,在你的根目录下创建一个 .env 文件,并添加你的 OpenAI API 密钥:
OPENAI_API_KEY=
像对待通往超级安全建筑的通行证一样对待你的 API 密钥——它应该保密,不要公开分享。
接下来,你可以创建一个
.py
文件或
.ipynb
文件(笔记本)。我将继续使用 Jupyter 笔记本,以便分块运行代码并交互式地检查结果。
一旦你设置好了环境,就可以组建一个代理团队了。
创建一个代理团队
我们现在将组建一个代理团队。在这个过程中,把这些代理看作是模块化的组件,每个组件在一个更大的系统中扮演着特定的角色。
让我们从导入所需的模块开始。
import os from crewai import Agent, Task, Process, Crew from dotenv import load_dotenv # 加载环境变量 load_dotenv()# 设置日志记录 import logging logging.basicConfig(level=logging.INFO)
在这个例子中,我们将使用 DuckDuckGo 来搜索网络。然而,CrewAI 是灵活的,你可以从各种工具中进行选择。
from langchain.tools import DuckDuckGoSearchRun search_tool = DuckDuckGoSearchRun()
现在,代理们已经具备了浏览互联网和收集信息的一切所需。
引入代理
是时候介绍代理和他们的具体角色和目标了。
下面是如何定义它们:
researcher = Agent( role='高级研究分析师' , goal='找出有关梯度下降的详细信息' , backstory="" "你是深度学习的专家。 你热衷于教育。 你可以将复杂的概念解释成简单的术语。" "" , verbose=True, allow_delegation=False, tools=[search_tool] # 你可以传递一个可选的 llm 属性,指定你想要使用的模式。 # 它可以是通过 Ollama / LM Studio 定义的本地模型,也可以是 OpenAI、Mistral、Antrophic 等的远程模型(https://python.langchain.com/docs/integrations/llms/) # # 示例: # llm=ollama_llm # 在文件中上面已经定义了 # llm=ChatOpenAI(model_name="gpt-3.5", temperature=0.7) ) writer = Agent( role='技术作家' , goal='撰写关于梯度下降的引人入胜的内容' , backstory="" "你是一位著名的技术作家,以 你富有信息和洞察力的文章而闻名。 你将复杂的概念转化为引人入胜的叙述。" "" , verbose=True, allow_delegation=True, # (可选)llm=ollama_llm )
根据需要创建尽可能多的代理,每个代理都有自己独特的角色、目标和背景故事。
分配任务
有了准备好的代理,现在你可以定义他们的任务了。
每个任务都应该清晰明了:
# 为你的代理创建任务 task1 = Task( description="" "对梯度下降进行全面分析。 确定关键定义和潜在用例。 你的最终答案必须是一份完整的分析" "" , agent=researcher ) task2 = Task( description="" "根据提供的见解,撰写一篇技术博客 文章,重点介绍梯度下降的最重要方面。 你的文章应该既具有信息性又适合技术精通的读者。 你的最终答案必须是至少 4 段的完整博客文章。" "" , agent=writer )
组建团队
现在,将你的代理们聚集到一个团队中,并设置流程类型,确定他们将如何协同工作:
# 用顺序流程实例化你的团队 crew = Crew( agents=[researcher, writer], tasks=[task1, task2], verbose=2, # 你可以将其设置为 1 或 2 来选择不同的日志级别 )
开始
最后,是表演时间!运行团队并等待结果:
result = crew.kickoff()print (result) [DEBUG]: 正在工作的代理:高级研究分析师 [INFO]: 开始任务:对梯度下降进行全面分析。 确定关键定义和潜在用例。 你的最终答案必须是一份完整的分析 [1m> 进入新的 CrewAgentExecutor 链...[0m INFO:httpx:HTTP 请求:POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" [32;1m[1;3m思考:我需要使用工具吗?不需要 最终答案:梯度下降是一种一阶优化算法,主要用于在机器学习和人工智能模型中最小化成本函数。它是找到函数的最小值的一种方法。 让我们进一步解释一下: - 梯度:简单来说,梯度测量函数在每个点的输出变化速率。它是一个指向函数增长最快的方向的矢量,其大小是增长速率。 - 下降:这意味着我们试图“下降”到函数的底部,即找到它达到最小值的位置。 工作原理: 1. 我们从函数上的一个随机点开始,并沿着函数梯度的负方向移动,以达到局部/全局最小值。 2. 学习率用于限制我们沿着梯度方向移动的量。这很重要,因为更新规则涉及从函数的当前权重(参数)中减去学习率和梯度的乘积。如果学习率太高,我们可能会超过最优点。如果学习率太低,算法将变得过慢。 3. 该过程重复迭代,直到算法收敛到最小点。 用例: 梯度下降在训练几乎所有的机器学习模型中都有应用,包括但不限于: - 线性回归 - 逻辑回归 - 神经网络 - 支持向量机 梯度下降算法有三种类型: 1. 批量梯度下降:它对每次更新使用训练集中的所有数据点。对于大型数据集,这可能计算成本很高。 2. 随机梯度下降(SGD):它只使用单个数据点或训练集中的一个随机数据点进行每次更新,这使得它更快速并能处理更大的数据集。 3. 小批量梯度下降:它是批量梯度下降和随机梯度下降之间的折中,它使用 n 个数据点的小批量进行每次更新,可以在计算效率和收敛速度之间提供平衡。 局限性: - 在非凸误差曲面的情况下,可能会陷入局部最小值。 - 它可能对初始点或学习率敏感。 - 当特征尺度不同时,它的效果不好。 尽管存在这些局限性,梯度下降是机器学习中的一个基本概念,用于训练许多类型的模型。它也是理解更复杂的优化算法的基石。[0m [1m> 完成链条。[0m INFO:httpx:HTTP 请求:POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" [DEBUG]: [高级研究分析师] 任务输出:梯度下降是一种一阶优化算法,主要用于在机器学习和人工智能模型中最小化成本函数。它是找到函数的最小值的一种方法。 让我们进一步解释一下: - 梯度:简单来说,梯度测量函数在每个点的输出变化速率。它是一个指向函数增长最快的方向的矢量,其大小是增长速率。 - 下降:这意味着我们试图“下降”到函数的底部,即找到它达到最小值的位置。 工作原理: 1. 我们从函数上的一个随机点开始,并沿着函数梯度的负方向移动,以达到局部/全局最小值。 2. 学习率用于限制我们沿着梯度方向移动的量。这很重要,因为更新规则涉及从函数的当前权重(参数)中减去学习率和梯度的乘积。如果学习率太高,我们可能会超过最优点。如果学习率太低,算法将变得过慢。 3. 该过程重复迭代,直到算法收敛到最小点。 用例: 梯度下降在训练几乎所有的机器学习模型中都有应用,包括但不限于: - 线性回归 - 逻辑回归 - 神经网络 - 支持向量机 梯度下降算法有三种类型: 1. 批量梯度下降:它对每次更新使用训练集中的所有数据点。对于大型数据集,这可能计算成本很高。 2. 随机梯度下降(SGD):它只使用单个数据点或训练集中的一个随机数据点进行每次更新,这使得它更快速并能处理更大的数据集。 3. 小批量梯度下降:它是批量梯度下降和随机梯度下降之间的折中,它使用 n 个数据点的小批量进行每次更新,可以在计算效率和收敛速度之间提供平衡。 局限性: - 在非凸误差曲面的情况下,可能会陷入局部最小值。 - 它可能对初始点或学习率敏感。 - 当特征尺度不同时,它的效果不好。 尽管存在这些局限性,梯度下降是机器学习中的一个基本概念,用于训练许多类型的模型。它也是理解更复杂的优化算法的基石。 [DEBUG]: 正在工作的代理:技术作家 [INFO]: 开始任务:根据提供的见解,撰写一篇技术博客 文章,重点介绍梯度下降的最重要方面。 你的文章应该既具有信息性又适合技术精通的读者。 你的最终答案必须是至少 4 段的完整博客文章。 [1m> 进入新的 CrewAgentExecutor 链...[0m INFO:httpx:HTTP 请求:POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" [32;1m[1;3m思考:我需要使用工具吗?不需要 最终答案: 标题:“征服复杂性:深入梯度下降的动力学” 在机器学习和人工智能的领域中,有一个算法因其无处不在的实用性和优雅的简单性而脱颖而出:梯度下降。作为一种一阶优化算法,梯度下降是我们模型中最小化成本函数的基石。但它到底是什么,为什么如此重要呢? 让我们从解剖名称开始。‘梯度’,简单来说,测量函数在每个点的输出变化速率。它就像我们算法的指南针,指向增长速率最大的方向。然后是‘下降’,表示我们要达到函数的最小值。想象一下站在山上,想要到达山脚——梯度下降就是引导我们到达那里的 GPS! 那么,这个 GPS 是如何引导我们的呢?这个过程从函数上的一个随机点开始。然后,我们沿着梯度的相反方向移动,使我们更接近局部或全局最小值。这时就要用到‘学习率’——它是我们朝最小值迈出的步长。把它想象成我们下降的速度。速度太快,我们可能会超过目的地。速度太慢,我们的旅程会变得非常漫长。算法会继续这些步骤,直到收敛到最小点。 梯度下降的美妙之处在于它的广泛应用。从线性回归和逻辑回归到神经网络和支持向量机,这个多功能算法是训练各种机器学习模型的核心。此外,它有三种变体:批量梯度下降(使用所有数据点进行每次更新),随机梯度下降(使用单个随机数据点进行每次更新)和小批量梯度下降(使用一小批 n 个数据点进行每次更新)。因此,根据数据集的大小和计算效率,我们可以选择最合适的变体。 然而,每个英雄都有其致命弱点。梯度下降有时可能会陷入非凸误差曲面的局部最小值,或者对初始点或学习率敏感。当特征尺度不同时,它可能会遇到困难。但不要担心!尽管存在这些局限性,梯度下降在机器学习中的重要性是毋庸置疑的。它继续是我们工具库中的重要工具,也是理解更复杂的优化算法的基石。 总之,理解梯度下降就像揭开机器学习宇宙中的一个基本秘密。它不仅为我们提供了一个强大的优化工具,还为我们在这个迷人领域中理解更高级的概念奠定了坚实的基础。[0m [1m> 完成链条。[0m INFO:httpx:HTTP 请求:POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" [DEBUG]: [技术作家] 任务输出:标题:“征服复杂性:深入梯度下降的动力学” 在机器学习和人工智能的领域中,有一个算法因其无处不在的实用性和优雅的简单性而脱颖而出:梯度下降。作为一种一阶优化算法,梯度下降是我们模型中最小化成本函数的基石。但它到底是什么,为什么如此重要呢? 让我们从解剖名称开始。‘梯度’,简单来说,测量函数在每个点的输出变化速率。它就像我们算法的指南针,指向增长速率最大的方向。然后是‘下降’,表示我们要达到函数的最小值。想象一下站在山上,想要到达山脚——梯度下降就是引导我们到达那里的 GPS! 那么,这个 GPS 是如何引导我们的呢?这个过程从函数上的一个随机点开始。然后,我们沿着梯度的相反方向移动,使我们更接近局部或全局最小值。这时就要用到‘学习率’——它是我们朝最小值迈出的步长。把它想象成我们下降的速度。速度太快,我们可能会超过目的地。速度太慢,我们的旅程会变得非常漫长。算法会继续这些步骤,直到收敛到最小点。 梯度下降的美妙之处在于它的广泛应用。从线性回归和逻辑回归到神经网络和支持向量机,这个多功能算法是训练各种机器学习模型的核心。此外,它有三种变体:批量梯度下降(使用所有数据点进行每次更新),随机梯度下降(使用单个随机数据点进行每次更新)和小批量梯度下降(使用一小批 n 个数据点进行每次更新)。因此,根据数据集的大小和计算效率,我们可以选择最合适的变体。 然而,每个英雄都有其致命弱点。梯度下降有时可能会陷入非凸误差曲面的局部最小值,或者对初始点或学习率敏感。当特征尺度不同时,它可能会遇到困难。但不要担心!尽管存在这些局限性,梯度下降在机器学习中的重要性是毋庸置疑的。它继续是我们工具库中的重要工具,也是理解更复杂的优化算法的基石。 总之,理解梯度下降就像揭开机器学习宇宙中的一个基本秘密。它不仅为我们提供了一个强大的优化工具,还为我们在这个迷人领域中理解更高级的概念奠定了坚实的基础。 这对于第一次尝试来说并不是一个坏结果,你可以很容易地看到它的潜力!# 使用本地代理与 CrewAI 对于那些不喜欢云依赖或者想要降低成本的人来说,本地运行模型是一个不错的选择。你可以尝试使用像 Mistral 这样的小型模型来尝试不同的任务,并看看它们在输出质量方面与 GPT-4 或 Claude 相比如何。 你只需要在你的环境中设置 [Ollama](https://ollama.ai/) 并创建一个 Ollama 模型的实例。然后,你可以像下面的示例中所示,将其作为 Agent 的 `llm` 参数使用: ```python from langchain.llms import Ollama ollama_openhermes = Ollama(model="openhermes" )# Pass Ollama Model to Agents: When creating your agents within the CrewAI framework, you can pass the Ollama model as an argument to the Agent constructor. For instance: local_expert = Agent( role='本地专家' , goal='为所选城市提供最佳见解' , backstory="" "一个对城市、景点和风俗习惯有着丰富信息的知识渊博的当地导游" "" , tools=[ SearchTools.search_internet, BrowserTools.scrape_and_summarize_website, ], llm=ollama_openhermes, # 在这里传递 Ollama 模型 verbose=True )
评估要考虑的要点
在进行过多技术性评估之前,有很简单的方法来评估输出的质量。
首先,你需要建立明确的标准,以反映你的预期用例。你是否希望 CrewAI 根据当前研究趋势生成信息丰富且引人入胜的内容?那么你的测试用例应该围绕准确性、相关性和可读性展开。
你应该将 CrewAI 代理收集和综合的信息与你熟悉的可靠测试用例进行比较。例如,验证代理通过爬取和整合的数据在内容中的事实正确性是至关重要的。