基于 LangGraph 构建多代理应用程序详解
简述
LangChain 推出了 LangGraph,这是一个新的库,基于图形框架和运行时循环的概念,用于管理多代理应用程序。它允许开发者创建具有循环的链,解决了 LangChain 之前缺乏的在运行时进行循环推理的能力。
摘要
LangChain 是当前主流的人工智能框架之一。LangGraph 作为其新推出的库,利用图框架和运行时循环的概念,允许创建具有循环的链。该库使用图形这一数学对象来表示构建由大型语言模型(LLM)驱动的应用程序所需的典型组件,其中节点代表代理,边代表连接和关系。本文将介绍如何使用 LangGraph 设计多代理图的示例,并演示其在多代理应用程序中创建动态工作流的潜力。
LangGraph 入门
近年来,LangChain 已成为市场上最受欢迎的人工智能框架之一。这个轻量级的框架帮助开发人员使用向量数据库、内存、提示、工具和代理等所有相关组件,构建由大语言模型(LLM)支持的应用程序。LangChain 的主要特点是能够轻松创建所谓的'链'。链是一系列组件,使用 LLM 处理用户的输入和输出。一条链可以由不同类型的组件组成,例如提示、检索器、处理器和工具。一条链也可以嵌套在另一个链中以创建更复杂的应用程序。
然而,这些传统的链缺乏将循环引入其运行时的能力。这意味着没有现成的框架使 LLM 能够在类似 for 循环的场景中推理出下一个最佳操作。随着多智能体应用程序概念的兴起——展示不同智能体的应用程序,每个智能体都有特定的个性和访问工具——变得越来越现实和主流(参见 AutoGen 等库项目的兴起),LangChain 的开发人员引入了一个新的库,使管理这类代理应用程序变得更加容易。这个新库于 2024 年 1 月推出,名为 LangGraph,它基于图形这一数学对象,作为 LLM 驱动应用程序的代表性框架。
在动手实践之前,首先介绍一下图的数学概念以及为什么它是一个非常适合循环链的框架。
图表简介
每当需要模拟和分析复杂系统时,使用能够捕获代理之间关系的模型就至关重要。这些关系——以及它们的相对权重和分布——可以用图表的数学表示来建模。
图是一组对象的表示,其中一些对象对通过链接连接。这些链接通常称为边或弧,它们连接的对象称为顶点或节点。图形用于对对象之间的关系进行建模,例如社交网络、道路网络或化学中分子之间的连接。
一般来说,只要一个系统可以用图来建模,就可以说这个系统是一个网络。网络科学是一门学科,其目标是理解其底层结构是图的现象。也就是说,在流行病学领域,网络被用来模拟疾病的传播,其中节点是个体,链接代表个体之间的联系。
在 LangGraph 中,图形框架用于表示构建 LLM 支持的应用程序所需的典型组件:
- 节点:类似于游戏中的'演员'或代理。每个人都可以从事不同的活动。例如,可以有一个包含 3 个节点的图表,代表心理学家、社会学家和经济学家正在进行一项关于社交媒体对心理健康影响的大规模调查(还可以添加第四个节点,代表这三个专家的监督者)。
- 边:代表节点之间的连接和关系。它们可以是在节点之间承载信息的连接,也可以是确定激活节点的条件及其执行顺序的条件边。
构建多智能体图
在这一部分,我们将构建一个涉及 3 个角色的多代理应用程序,以及他们的个性(使用 LLMs 的术语表、系统消息):
- 心理学家:'一位心理学家专家,将神经科学理论无缝地融入对话中,揭示了人类行为和情感的复杂性。'
- 社会学家:'一位目光敏锐的社会学家,擅长剖析社会模式,研究社交媒体与集体心理之间的相互作用。'
- 经济学家:'一位务实的经济学家,量化无形资产,精确地将社交媒体趋势与经济影响联系起来。'
接下来将探究社交媒体与心理健康之间的相关性。为了构建该图,使用了 LangGraph 存储库中的示例代码,并对其进行调整以设计上述三个代理的个性。在本文中,将介绍修改后的脚本。
如上一节中提到的,为了构建图,需要两个主要成分:节点和边。接下来介绍背后的逻辑。
节点
节点可以是具有特定任务或个性的代理,也可以是应用程序可以使用给定工具执行的动作。在本文的示例中,已经设置了 3 个代理——心理学家、社会学家和经济学家——以及一个工具——搜索引擎 Tavily。
为了初始化图表,首先设置模型的基本结构(这里利用 Azure OpenAI GPT-4)和工具,代码如下:
# 导入 langchain.schema 模块中的 HumanMessage 和 AIMessage 类
from langchain.schema import HumanMessage, AIMessage
langchain_openai AzureChatOpenAI
dotenv load_dotenv
os
load_dotenv()
os.environ[] =
os.environ[] =
os.environ[] =
llm = AzureChatOpenAI(
openai_api_version=,
azure_deployment=,
)
langchain_community.tools.tavily_search TavilySearchResults
tavily_tool = TavilySearchResults(max_results=)
tools = [tavily_tool]
langchain.agents ToolExecutor
tool_executor = ToolExecutor(tools)


