赞
踩
随着人工智能和自然语言处理技术的不断发展,构建更复杂和动态的计算模型变得越来越重要。LangGraph应运而生,通过扩展LangChain的功能,为大型语言模型(LLM)应用添加了循环计算能力。即大模型不再只是端到端的推理,而是能根据业务逻辑以及上一次推理的反馈,决策下一次推理。
本节教程代码仓库:https://github.com/tangyipeng100/LangGraph_tutorial/blob/master/LangGraph_Tutorial_lesson_1.ipynb
完整教程代码:https://github.com/tangyipeng100/LangGraph_tutorial/tree/master
首先一句话概括LangGraph:可以实现基于LLM智能助手(LLM Agent)的神仙框架!
LangGraph是在LLM和LangChain的基础之上发展而来,LangGraph库本身基于LangChain库,如下图所示。如果仅使用LLM,一般用于实现无外部工具、无反馈的问答任务;基于LangChain,则可实现依赖外部工具或外部数据库的问答任务;基于LangGraph,则可以实现可实现依赖外部工具或外部数据库且有反馈的问答任务。如下图的例子,用户希望撰写一个文案,如果只用LLM,则给出LLM一个指令,让其反馈写好的文案;如果基于LangChain,则可在调用搜索引擎获得检索知识的基础上,撰写文案;如果基于LangGraph,则可以实现在LangChain的基础上,对检索的知识和撰写的文案内容进行筛选、判别、修正,最后输出需要的文案。理论上,用户可以通过程序设计,在已有LLM的基础上实现类似LangGraph提供的功能,但这样每个功能都需要重新设计一套架构。LangGraph则将这样的功能做了模块化和集成,可加速基于LLM项目的落地。
完全可以。使用LangGraph开发的LLM项目,无需对LLM进行训练、微调等,可以完全将LLM看作一个黑盒,开发过程中一般只是调用LLM进行文本输入输出,大多数通过API实现,对本地算力基本无任何要求(能跑通一个python for循环的电脑即可,也可使用云代码编辑器实现,后面的课程会逐步提供)。
至于LangChain,实际就是LangGraph的一部分,因此在学习LangGraph的过程中会逐步学习LangChain的使用。并且LangGraph是比LangChain更强大的工具,是完全可以向下兼容的!
LangGraph的核心是状态图。图中的每个节点代表计算的一个步骤,整个图维护一个状态,随着计算的进行不断传递和更新。这样的状态图使得计算模型更具动态性和灵活性。
节点是LangGraph的基本构建块,每个节点代表一个特定的功能或计算步骤,如处理输入、做出决策或与外部API交互。通过定义不同任务的节点,可以创建模块化和可重用的图。
边连接图中的节点,定义计算的流程。LangGraph支持条件边,允许根据图的当前状态动态决定下一个执行的节点。这种条件边为构建复杂应用提供了必要的灵活性和适应性。
本小节从框架架构的角度进一步介绍LangGraph与LangChain的区别。
LangChain适用于创建线性无环图,适合简单应用。而LangGraph引入了循环计算,允许节点根据图的状态被多次访问,这对需要迭代处理、反馈循环和复杂决策的应用至关重要。
LangChain的计算流程通常是无状态的,各步骤相互独立。LangGraph的状态执行模型则不断更新和传递状态,使计算更加上下文感知和适应性强,特别适合需要持续上下文的任务,如对话管理和多轮交互。
LangChain支持线性链,而LangGraph通过条件边增强了这一功能。条件边允许图根据当前状态改变执行路径,实现复杂的分支逻辑和动态决策,这对于实时响应不同输入和状态的应用尤为重要。
为了初步上手 LangGraph,此处创建一个简单的基于LangGraph的应用。这个并逐步分析每一行代码。
配置环境(python环境建议大于3.8)
pip install dashscope langchain langgraph
pip install langchain-community langchain-core
pip install httpx
初始化模型和 MessageGraph
from langchain_community.llms import Tongyi
from langchain_core.messages import HumanMessage
from langgraph.graph import END, MessageGraph
import os
os.environ["DASHSCOPE_API_KEY"] = 'sk-2c6b041cb04c44f9a0787015c7a472e8'#为了便于调试,这儿提供了通义千问模型的API key,大家可以替换成自己的key
model = Tongyi()
graph = MessageGraph()
首先,我们导入必要的库和模块,并设置 API 密钥。为方便调试,此处调用阿里dashscope提供的qwen-plus模型,获取qwen-plus api-key可访问此(支付宝扫码获得上述代码格式key即可)。然后,初始化了 Tongyi
模型和一个 MessageGraph
实例。MessageGraph
是我们将要构建的计算图。
添加节点
graph.add_node("oracle", model)
接下来,我们向图中添加一个名为 "oracle"
的节点,这个节点会调用模型处理给定的输入。add_node
方法的第一个参数是节点的名称,第二个参数是该节点执行的具体操作,这里是调用 Tongyi
模型。
添加边
graph.add_edge("oracle", END)
我们添加了一条从 "oracle"
节点到特殊字符串 END
("__end__"
) 的边。这意味着在 "oracle"
节点执行完毕后,计算将结束。
设置入口点
graph.set_entry_point("oracle")
我们将 "oracle"
节点设置为图的入口点,这意味着计算将从这个节点开始。
编译图并输出
runnable = graph.compile()
print(runnable.invoke(HumanMessage("What is 1 + 1?")))#输出:[HumanMessage(content='What is 1 + 1?', id='3adc686d-dac0-43cb-9022-4c8644e61866'), HumanMessage(content='1 + 1 is equal to 2.', id='1d2affcc-b157-48f7-a621-eabd3bf97270')]
当我们执行LangGraph程序时:
"oracle"
。"oracle"
节点执行,调用聊天模型。AIMessage
。LangGraph 将其添加到状态中。END
值并输出最终状态。以下是完整的代码:
from langchain_community.llms import Tongyi from langchain_core.messages import HumanMessage from langgraph.graph import END, MessageGraph import os os.environ["DASHSCOPE_API_KEY"] = 'sk-2c6b041cb04c44f9a0787015c7a472e8' model = Tongyi() graph = MessageGraph() graph.add_node("oracle", model) graph.add_edge("oracle", END) graph.set_entry_point("oracle") runnable = graph.compile() print(runnable.invoke(HumanMessage("What is 1 + 1?"))) #输出:[HumanMessage(content='What is 1 + 1?', id='3adc686d-dac0-43cb-9022-4c8644e61866'), HumanMessage(content='1 + 1 is equal to 2.', id='1d2affcc-b157-48f7-a621-eabd3bf97270')]
执行上述代码后,我们将获得两个聊天消息的输出列表。这个LangGraph应用看起来实现的功能和一个简单的LLM没什么区别,但不要着急,本节只是让大家先把LangGraph跑起来,想体验它的强大功能,在后续的章节我们会提供更多LangGraph项目例子,一起体验LangGraph的强大吧!
LangGraph通过扩展LangChain的功能,引入循环计算和状态执行,显著提升了LLM应用的能力。无论是开发交互式代理、复杂决策系统还是迭代处理模型,LangGraph都提供了所需的工具和灵活性,使您能够创造更智能和响应更迅速的应用。LangGraph以其循环计算、状态执行和条件逻辑,成为开发者探索LLM应用新可能的关键工具。
最后,欢迎各位转发、订阅、点赞。代码中有任何问题欢迎评论交流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。