LangGraph实战
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大数据挖掘从入门到进阶实战》,喜欢的朋友或同学, 可以在公告栏那里点击购买链接购买博主的书进行学习,在此感谢大家的支持。关注下面公众号,根据提示,可免费获取书籍的教学视频。
LangGraph实战的更多相关文章
- SSH实战 · 唯唯乐购项目(上)
前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...
- GitHub实战系列汇总篇
基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...
- MySQL 系列(四)主从复制、备份恢复方案生产环境实战
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- 给缺少Python项目实战经验的人
我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...
- asp.net core 实战之 redis 负载均衡和"高可用"实现
1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...
- Linux实战教学笔记08:Linux 文件的属性(上半部分)
第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...
- Linux实战教学笔记07:Linux系统目录结构介绍
第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...
- Linux实战教学笔记06:Linux系统基础优化
第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...
- Linux实战教学笔记05:远程SSH连接服务与基本排错(新手扫盲篇)
第五节 远程SSH连接服务与基本排错 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 远程连接LInux系统管理 1.1 为什么要远程连接Linux系统 在实际的工作场景中,虚拟机界面或物理 ...
随机推荐
- 第五章-WAF 绕过
WAF 绕过 1.WAF分类 1.1.软件 WAF 一般被安装到 Web 服务器中直接对其进行防护,能够接触到服务器上的文件,直接检测服务器上是否有不安全的文件和操作等. 常见的软件:安全狗.云盾.云 ...
- 04 Xpath_[实例]爬取maoyan
目录 Xpath lxml库的安装和使用 提取的内容 代码 生成的csv 下载的图片 参考文档 Xpath lxml库的安装和使用 提取的内容 随意选取的一段 节点包含的影片信息,如下所示: < ...
- vue3.0 yarn启动项目
linux 系统 在root账号下 yarn install yarn run serve 启动服务 ctrl+c //暂停服务 yarn build 打包服务 在公共目录里添加配置文件 优点:这样就 ...
- MySQL如何快速获取binlog的开始时间和结束时间
之前写过一篇文章MySQL如何获取binlog的开始时间和结束时间[1],文章里面介绍了如何获取MySQL数据库二进制日志(binlog)的开始时间与结束时间的一些方法.实际应用当中,我们可能还会遇到 ...
- Linux系统修改命令提示符格式及颜色
放到全局环境变量.注意自己是放全局还是自己家目录下环境的 echo "export PS1='[\[\e[35;1m\]\u\[\e[31;1m\]@\[\e[34;1m\]\h \[\e[ ...
- rabbit 的下载与安装
因为RabbitMQ是用erlang语言开发的,所以我们在安装RabbitMQ前必须要安装erlang支持. erlang的下载地址:https://www.erlang.org/downloads ...
- CSS——透明度
CSS 中提供了一个 opacity 属性用来设置元素的透明度,它不仅对颜色有效,对图像或者页面中其它的元素也有效. 其语法格式如下: opacity: number; 其中 number 为一个 0 ...
- Web 网页性能及性能优化
Web 网页性能及性能优化 一.Web 性能 Web 性能是 Web 开发的一个重要方面,侧重于网页加载速度以及对用户输入的响应速度 通过优化网站来改善性能,可以在为用户提供更好的体验 网页性能既广泛 ...
- Math Record
T1.P3327 知识点:莫比乌斯反演,数论分块 我们知道 \(d(ij) = \sum_{x | i}\sum_{y | j}[\gcd(x,y) == 1]\). 所以我们就要求 \(\sum^n ...
- 设置双击ps1脚本直接用Powershell打开
设置双击ps1脚本直接用Powershell打开. 默认.ps1 文件双击是不能打开的,只能右键运行. 解决方法: 1.按windows+R打开运行,输入regedit,打开注册表 2.找到HKEY_ ...