
完整指南:构建高效的多智能体系统与langflow的最佳实践!
AI代理概述
AI代理在生成式AI的领域并不新鲜,但在企业层面上,它们真正开始起飞仅仅是在过去的两个月里。
什么是AI代理?
我们可以将AI代理定义为一个超专业化、目标导向和自主的AI实体,其特征由以下组件构成:
- 一个作为代理大脑的大型语言模型
- 一条设定代理使命的系统消息
- 一个使管理代理组件更容易的编排层(LangChain、语义内核、自动生成等都是编排器的例子)
- 提供对话上下文的记忆
- 提供相关信息以供检索的知识库
- 允许代理在周围生态系统中执行操作的工具。
例如,假设我们想为学生构建一个AI辅导助手。
AI代理最显著的特征之一——标志着应用开发领域的范式转变——是它们可以被视为一组模块化、可共享和可重复使用的组件。
但这并不是全部。遵循相同的逻辑,一个代理本身可以被视为一个可重复和可共享的组件,可以以不同的方式使用:
- 作为独立代理
- 作为另一个代理的工具
- 作为多代理工作流的一部分
在多代理系统中,我们需要定义的一个关键元素是工作流设计——换句话说,就是我们的代理将如何协同工作。有三种主要类型的工作流:
- 协作 → 代理可以自由地进行点对点的交流。
- 层级 → 代理由一个管理代理调用和编排,该代理将始终是用户查询的第一个接触点。
- 顺序 → 代理以“硬编码”的方式按顺序排列,使得一个代理的输出成为下一个代理的输入。
请注意,在设计工作流时,我们可以添加任何我们需要的额外逻辑,包括循环、条件分支、回退等。
在下面的例子中,我们将保持简单,采用层级工作流,利用LangFlow作为图形界面。
LangFlow
LangFlow 是一个开源图形界面,旨在使使用LangChain变得简单直观。您可以直观地设计AI工作流,快速测试想法,并在几分钟内使您的项目变为现实。
此外,当涉及到AI代理时,LangFlow变得非常方便:正如我们上面提到的,AI代理具有模块化和可重复性,这与LangFlow的设计完美契合。实际上,LangFlow配备了一组组件(可以包括工具、LLM、记忆、vectorDB,以及您可以从头编写的自定义组件),这些组件最终可以发布在商店中(您还可以在这里找到其他贡献者的组件)。
要开始使用LangFlow,您需要通过
pip install langflow
安装它,然后运行以下命令在本地主机上启动它:
## Command to run LangFlow
langflow
为了更熟悉该工具,我建议您查看官方文档 here。
构建您的电子商务多代理体验
商业场景:我们是一家攀岩电子商店的老板,我们希望通过创建一个多代理AI助手来提升客户体验。这个助手利用Azure OpenAI服务为我们的客户提供实时的智能支持,帮助他们:
- 确定完美的攀岩装备
- 获取美丽的徒步旅行灵感
- 将商品添加到购物车
我们拥有以下资产:
- 一个电子商务网站:
- 用户购物车的后端数据库:
- 产品数据库:
从用户界面,用户可以通过点击“添加到购物车”按钮将商品添加到购物车。然而,我们希望提供一个对话式用户界面,最终能够代表用户完成此操作。
当您初始化LangFlow时,您可以选择从商店中选择一个预构建的工作流开始,或者从空白画布草拟您的工作流,这正是我们要做的:
如您所见,左侧有一个可以利用的组件完整列表。在这个场景中,我们将使用预构建组件和自定义组件的混合。让我们开始吧!
步骤 1:攀岩装备代理
我们要初始化的第一个代理是我们的销售代表。该代理将能够:
- 从SQL数据库中检索产品信息
- 将商品添加到我们的电子商务网站购物车中
我们需要的第一个组件是一个代理,我们可以用我们选择的大型语言模型进行配置。然后我们需要一个SQL工具,我将使用左侧菜单中可用的LangChain预构建组件:
注意:由于我们将使用此SQL代理作为多代理系统的一部分,我们需要将其配置为“工具”,以便最终可以被我们的攀岩装备代理使用(我们也会对后者进行相同的操作,以便可以被经理代理调用)。您可以通过点击工具模式切换按钮将代理(以及许多其他组件)转换为工具:
由于SQL组件需要它,我还添加了一个Azure OpenAI大型语言模型来启用该工具。
我们需要的第二个工具将是添加到购物车工具,这将是一个自定义工具。您可以通过点击左下角的“新建自定义组件”来添加自定义工具。这是我配置我的组件的方式:
from langflow.field_typing import Data
from langflow.custom import Component
from langflow.io import MessageTextInput, Output
from langflow.schema import Data
import requests
class AddToCart(Component):
display_name = "AddToCart"
description = "Use as a template to add an item to the cart."
documentation: str = "http://docs.langflow.org/components/custom"
icon = "code"
name = "AddToCart"
inputs = [
MessageTextInput(
name="item_name",
display_name="Item Name",
info="Name of the item to add",
value="Example Item",
tool_mode=True,
),
MessageTextInput(
name="item_price",
display_name="Item Price",
info="Price of the item to add",
value="10.00",
tool_mode=True,
),
]
outputs = [
Output(display_name="Output", name="output", method="build_output"),
]
def build_output(self) -> Data:
"""Add an item to the cart."""
url = "http://localhost:3000/cart"
cart_item = {
"name": self.item_name,
"price": float(self.item_price),
}
response = requests.post(url, json=cart_item)
if response.status_code == 201:
result = f"Item '{self.item_name}' added to cart successfully."
else:
result = f"Failed to add item to cart: {response.status_code} {response.text}"
data = Data(value=result)
self.status = data
return data
这是我们第一个代理的整体配置:
步骤 2:徒步旅行专家代理
对于这个代理,我们将保持简单,仅用作徒步旅行的超专业顾问。您可能会想——如果它甚至没有工具,为什么我们还需要一个代理?有时这可能是一个可以避免的额外层,然而超专业化和对特定主题的关注(即使没有工具)仍然是对整体多代理系统的好处,使最终用户体验更加准确。
因此在这种情况下,我们只需要另一个代理组件,并用适当的系统消息进行配置。
步骤 3:经理代理
第三个代理将是经理。在这种情况下,我们只需要一个代理组件,我用以下系统消息进行了配置:
您是一位熟练的客户服务经理和信息路由器。您的主要职责是使用可用的工具准确地解决用户询问并提供详细、有帮助的响应。您可以:
- 从您的攀岩目录中检索装备名称
- 提供关于徒步旅行的清晰指导
- 将商品添加到购物车
如有必要,请使用多个工具来回答问题。
就这样!我们现在的团队准备好进行测试。
请注意,所有代理都有两个主要特性:名称和描述。这对于经理调用适当的代理至关重要(同样的推理适用于工具)。您可以通过点击代理组件中的“编辑工具”提供描述:
这是最终配置(我添加了聊天输入和输出组件以完成工作流):
请注意,您还可以将聊天记录添加到工作流中。为此,您可以利用外部记忆存储或LangFlow的表。您可以创建一个将记忆作为变量的提示,并将其连接到经理代理的系统消息中。
您是一个有帮助的助手,能够回答问题。
每当您被问及关于攀岩装备或徒步旅行的问题时,请利用您的工具。
历史:
{memory}
要测试我们的助手,我们可以使用LangFlow在右上角提供的游乐场:
如您所见,经理代理能够无缝地协调专家代理,最终,攀岩装备代理成功将我的装备添加到购物车中:
您还可以在命令行中看到代理的思考:
最后,您可以通过API消费您的工作流,并将其嵌入到任何应用程序中(在我们的案例中,即我们的电子商务网站)。
结论
多代理系统无疑是生成式AI领域的一次飞跃,它们开始在企业中找到具体应用。决定您的工作流策略,以及您的代理的“专业化”(一个代理拥有许多工具与多个代理拥有少量或没有工具)是您规划策略的关键组成部分。
尽管没有黄金配方,但开始实验和理解不同工作流配置对业务的影响是非常重要的,以充分拥抱这一范式转变。