1.概述
前段时间LangChain发布了LangGraph,它引起了很多关注。LangGraph 的主要优势在于它能够实现循环工作流,这对于在 LLM 应用程序中模拟类似代理的行为至关重要。本篇博客,笔者将从介绍 LangGraph 的功能和用例,强调它与典型的有向无环图 (DAG)工作流的区别,并讨论如何构建更具交互性和迭代性的基于 LLM 的系统。换句话说,就是更好的 AI 代理实现。
2.内容
LangGraph是一个功能强大的库,用于构建基于大型语言模型(LLM)的有状态、多参与者应用程序。它旨在创建代理和多代理工作流,以实现复杂的任务和交互。
2.1 LangGraph的核心优势
LangGraph在设计上具有三个核心优势,使其成为构建代理应用程序的首选框架之一。
- 循环支持:LangGraph允许用户定义涉及循环的流程,这对于大多数代理架构来说是必不可少的。这种能力使LangGraph有别于基于有向无环图(DAG)的解决方案,后者不直接支持循环。
- 细粒度控制:作为一个非常低级的框架,LangGraph为用户提供了对应用程序的流程和状态的细粒度控制。这对于创建可靠、可预测的代理至关重要,因为代理需要在复杂的环境中做出明智的决策。
- 内置持久性:LangGraph还包括内置的持久性功能,使代理能够记住过去的交互并使用这些信息来指导未来的决策。这种持久性还支持高级的人机循环,使代理能够与人类用户进行更自然、更有效的交互。
2.2 LangGraph的灵感来源
LangGraph的灵感来自两个著名的数据处理框架:Pregel和Apache Beam。Pregel是一个用于大规模图处理的系统,它使用一种称为"Pregel模型"的编程模型,该模型基于图的遍历和消息传递。Apache Beam是一个用于构建可扩展数据处理管道的统一编程模型,它支持多种执行引擎和数据源。
LangGraph的公共接口还从NetworkX中汲取了灵感,NetworkX是一个用于复杂网络分析的Python库。NetworkX提供了一组丰富的工具和算法,用于分析和操作图数据,LangGraph的公共接口旨在提供类似的灵活性和功能。
2.3 LangGraph与LangChain的关系
LangGraph由LangChain的创建者LangChain Inc构建,但它可以独立于LangChain使用。LangChain是一个用于构建基于LLM的应用程序的框架,它提供了一组工具和服务,用于简化与LLM的交互和管理。虽然LangGraph可以与LangChain一起使用以提供额外的功能和集成,但它也可以作为独立框架使用,以利用其独特的优势和功能。
2.4 LangGraph有哪些应用场景?
LangGraph 作为一个使用 LLM 构建有状态、多参与者应用程序的库,具有广泛的应用场景。以下是一些可能的应用领域:
1. 对话代理和聊天机器人
LangGraph 可以用于构建复杂的对话代理和聊天机器人,能够处理多轮对话、上下文理解和个性化交互。通过使用循环和分支,LangGraph 使代理能够根据用户的输入和对话历史做出明智的决策。
2. 推荐系统
LangGraph 可以用于构建个性化的推荐系统,根据用户的兴趣、历史行为和上下文信息提供相关的建议。通过使用持久性,LangGraph 使推荐系统能够记住用户的偏好并随着时间的推移进行改进。
3. 游戏开发
LangGraph 可以用于构建具有智能对手和复杂游戏逻辑的视频游戏。通过使用循环和分支,LangGraph 使游戏 AI 能够做出战略性的决策,并根据游戏状态做出实时响应。
4. 自然语言处理
LangGraph 可以用于构建自然语言处理应用程序,如文本分类、实体识别和语义分析。通过使用 LLM 和持久性,LangGraph 使这些应用程序能够理解和生成自然语言,并随着时间的推移进行学习和改进。
5. 智能助理
LangGraph 可以用于构建智能助理应用程序,如日程安排、任务管理或购物助手。通过使用循环和分支,LangGraph 使智能助理能够根据用户的需求和偏好提供个性化的建议和帮助。
6. 人机交互
LangGraph 可以用于构建人机交互应用程序,如虚拟助手或客户支持聊天机器人。通过使用人在环功能,LangGraph 使这些应用程序能够与人类用户进行自然、直观的交互。
7. 数据分析
LangGraph 可以用于构建数据分析应用程序,如欺诈检测、异常检测或模式识别。通过使用流式处理支持,LangGraph 使这些应用程序能够实时处理和分析数据,并根据需要进行扩展。
3.LangGraph 中的核心概念和状态管理
LangGraph 的关键要素之一是其良好的状态管理系统。在 LangGraph 中,每次执行图都会启动一个状态,图内的节点会在处理过程中传递和修改该状态。此状态不仅仅是一组静态数据,而是由每个节点的输出动态更新的,然后影响循环内的后续操作。
为了简化实现,LangGraph 提供了预定义类,例如MessageGraph,它是为涉及聊天模型的应用程序量身定制的。此设置允许状态由聊天消息列表组成,直接利用 LangChain 聊天模型的输出来促进自然而连贯的对话。
3.1 思路链、表链和 LangGraph
LangGraph 的多功能性使其成为简单聊天机器人之外的一系列应用程序的理想选择。它能够处理非线性、循环的工作流程,非常适合需要持续反馈的场景,例如自适应学习系统、复杂的决策工具或动态模拟环境. LangGraph 允许开发人员构建应用程序,其中 LLM 可以根据新信息重新评估和修改其策略或响应,模仿更像人类的交互模式。
通过阅读论文《CHAIN-OF-TABLE: EVOLVING TABLES IN THE REASONING CHAIN FOR TABLE UNDERSTANDING》,我们可以知道该论文中介绍了一种使用一系列类似 SQL 的操作(包括选择、分组、排序等)来优化从结构不良的表格中提取数据的技术。通过将提取的数据插入到新列中,该方法显著增强了表格与 SQL、人工解释以及 LLM 处理的兼容性。
上图中的对比突出了三种使用复杂表格进行推理的方法:
- a. 通用推理在复杂表格中进行多步推理时遇到困难,因为骑车人的国籍和姓名组合在一个单元格中,无法提供正确答案。
- b. 程序辅助推理试图通过生成和执行类似 SQL 的程序来解决这个问题,但仍然无法准确地解析姓名和国籍。
- c. 链表方法迭代地应用一系列表格操作,将表格转换为更适合查询的格式,使 LLM 能够准确地得出正确答案。
3.2 持久性、人机交互和图形可视化
LangGraph 支持不同的功能,例如内置持久性、人机交互、可视化以及一项称为"时间旅行"的功能。下表提供了每个功能的高级概述。
示例代码如下所示:[ 示例入口 ]
1.持久性
LangGraph 具有内置的持久性机制,可以在图执行过程中保存和恢复状态。这对于长时间运行的应用程序或需要跨多个会话维护状态的应用程序特别有用。
要启用持久性,你可以在创建图时设置一个检查点(checkpoint)。检查点是一个保存图当前状态的点,可以在需要时恢复。以下是如何在 LangGraph 中设置检查点的示例:
import langgraph as lg
# 创建一个图
G = lg.Graph
# 添加一些节点和边
# ...
# 设置检查点
G.set_checkpoint('my_checkpoint')
一旦设置了检查点,您就可以在图执行过程中的任何时间点保存或恢复状态。例如,要保存当前状态,您可以使用以下代码:
G.save_checkpoint('my_checkpoint')
要恢复先前保存的状态,您可以使用以下代码:
G.load_checkpoint('my_checkpoint')
通过这种方式,您可以确保在发生错误或需要停止执行时不会丢失状态。
2.人机交互
LangGraph 还支持人机交互(Human-in-the-loop,HITL),允许您在图执行过程中进行人工干预。这对于需要人类输入或批准的应用程序特别有用。
要启用 HITL,您可以在图中添加一个特殊的节点,该节点将等待人类输入。以下是如何在 LangGraph 中添加 HITL 节点的示例:
import langgraph as lg
# 创建一个图
G = lg.Graph
# 添加一些节点和边
# ...
# 添加一个 HITL 节点
hitl_node = G.add_node(lg.HitlNode)
# 将 HITL 节点连接到其他节点
# ...
当图执行到达 HITL 节点时,它将暂停并等待人类输入。您可以使用以下代码提供输入:
G.provide_input(hitl_node, 'my_input')
一旦提供了输入,图将继续执行。
3.图形可视化
LangGraph 提供了一些工具来可视化图的结构。这对于调试或理解复杂图的逻辑特别有用。
要可视化图,您可以使用 LangGraph 的 draw 方法。以下是如何使用 draw 方法可视化图的示例:
import langgraph as lg
# 创建一个图
G = lg.Graph
# 添加一些节点和边
# ...
# 绘制图
G.draw('my_graph.png')
这将在名为 my_graph.png 的文件中生成图的可视化表示。您可以使用任何支持的图像格式,如 PNG、JPEG 或 SVG。
4.如何使用LangGraph来开发一个应用程序
1. 安装 LangGraph
首先,您需要在您的开发环境中安装 LangGraph。您可以使用 pip 来安装 LangGraph:
pip install langgraph
2. 定义应用程序的流程
LangGraph 允许您使用图来表示应用程序的流程。图中的每个节点表示一个操作或决策点,边表示节点之间的连接。您可以使用 Python 代码来定义图的结构。
例如,以下是一个简单的图定义,其中包含两个节点(A 和 B)和一个边(从 A 到 B):
import langgraph as lg
# 创建一个空图
G = lg.Graph
# 添加节点 A
A = G.add_node('A')
# 添加节点 B
B = G.add_node('B')
# 添加从 A 到 B 的边
G.add_edge(A, B)
3. 实现节点功能
一旦您定义了图的结构,您需要实现节点的功能。每个节点可以执行任意的 Python 代码,包括与 LLM 或其他外部服务的交互。
例如,以下是一个简单的节点实现,它使用 Hugging Face 的 transformers 库来执行文本分类任务:
from transformers import pipeline
# 加载一个预训练的文本分类器
classifier = pipeline('text-classification')
def classify_text(node, inputs):
# 对输入文本进行分类
result = classifier(inputs['text'])
# 返回分类结果
return result['label']
# 将节点功能附加到图中的节点 A
G.nodes['A'].set_function(classify_text)
4. 运行应用程序
最后,您可以运行应用程序以查看其执行情况。您可以使用 LangGraph 的 run 方法来执行图中的节点,并根据需要提供输入数据。
例如,以下是如何运行上述示例应用程序的代码:
# 提供输入数据
inputs = {'text': '我喜欢吃披萨'}
# 运行应用程序
result = G.run(inputs)
# 打印结果
print(result)
5.总结
LangGraph 为开发者提供了构建更智能化应用的工具,这些应用能够更好地反映人类思维过程和交互的动态性。随着我们不断探索和尝试 LLM(大型语言模型)的功能,LangGraph 等工具成为从静态、一次性交互转向连续、上下文感知对话和流程的理想选择。
6.结束语
这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!
另外,博主出书了《Kafka并不难学》和《Hadoop大数据挖掘从入门到进阶实战》,喜欢的朋友或同学, 可以在公告栏那里点击购买链接购买博主的书进行学习,在此感谢大家的支持。关注下面公众号,根据提示,可免费获取书籍的教学视频。