LangGraph官方文档笔记——1.构建一个基础聊天机器人
在本节,我们会先跑通官方的demo,即创建一个简单的聊天机器人,这个聊天机器人将直接响应用户的消息。通过这种方式来快速掌握langgraph基本流程,同时介绍关键的 LangGraph 概念。在之后的章节会逐步添加更复杂的功能,让我们开始吧!
LangGraph介绍
LangGraph是基于LangChain的智能体编排框架,它将 Agent 系统建模设计为(有向图)流程图,每个节点表示一个计算步骤进行状态的更新,每条边表示状态转移路径,适合处理复杂流程或多Agent 协作系统。
官方资料
本节对应的链接:
环境配置
首先,安装依赖包:
pip install -U langgraph langsmith "langchain[anthropic]"
如果实践过程中遇到了一些模块缺失,基本pip install都能解决,在环境依赖上我实践下来并没有遇到坑。
看官方的示例
无论如何,先把这一章节的完整官方代码copy下来,看看做了什么事情:
import getpass
import os
def _set_env(var: str):
if not os.environ.get(var):
os.environ[var] = getpass.getpass(f"{var}: ")
_set_env("ANTHROPIC_API_KEY")
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
class State(TypedDict):
# Messages have the type "list". The `add_messages` function
# in the annotation defines how this state key should be updated
# (in this case, it appends messages to the list, rather than overwriting them)
messages: Annotated[list, add_messages]
graph_builder = StateGraph(State)
from langchain_anthropic import ChatAnthropic
llm = ChatAnthropic(model="claude-3-5-sonnet-20240620")
def chatbot(state: State):
return {"messages": [llm.invoke(state["messages"])]}
# The first argument is the unique node name
# The second argument is the function or object that will be called whenever
# the node is used.
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)
graph = graph_builder.compile()
from IPython.display import Image, display
try:
display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:
# This requires some extra dependencies and is optional
pass
def stream_graph_updates(user_input: str):
for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):
for value in event.values():
print("Assistant:", value["messages"][-1].content)
while True:
try:
user_input = input("User: ")
if user_input.lower() in ["quit", "exit", "q"]:
print("Goodbye!")
break
stream_graph_updates(user_input)
except:
# fallback if input() is not available
user_input = "What do you know about LangGraph?"
print("User: " + user_input)
stream_graph_updates(user_input)
break
可以看到,这段代码做了以下事情:
- 设置环境变量:(环境变量名为ANTHROPIC_API_KEY)
- 创建State类,即状态(继承自TypedDict,定义为字典类型)
- 创建langgraph的图(StateGraph根据用户定义的 State构建图)
- 创建大语言模型LLM和聊天chatbot函数(chatbot函数接受状态State返回更新后的状态)
- 向图添加节点和边,然后编译(START表示将用户输入发送到图的节点,END是终止节点)
- 使用Image, display可视化编译的图(不影响功能)
- 创建stream_graph_updates方法用于连续聊天流
- while实现多轮对话
如果没有完全看懂也没关系,了解基本流程即可,接下来的实践中会把以上步骤进行拆解。
快速开始demo——基础聊天机器人
1.设置环境变量
国外的教程和文档里使用的大语言模型API KEY因为各种原因很难获取,对国内开发者不太友好。但好在咱们国内的云服务商在云端已部署好大模型服务,并且很多都兼容OPENAI接口,还提供了一定的免费额度,足够咱们学习使用。这里我使用的是火山方舟的"doubao-1-5-pro-32k-250115"模型。
import os
#设置为你的API_KEY
os.environ['ARK_API_KEY'] = 'YOUR_API_KEY'
这里我选择直接os.environ设置环境变量,并且之后的文章也是这样直接设置。你也可以选择用官方的,这样需要在运行时输入你的API_KEY即可。
2.创建State类
在定义一个图时,第一步是定义其状态。在示例中,状态是一个字典,字典的键为messages,值是一个装有对话消息的列表(习惯叫消息列表)。使用了add_messages函数来追加新消息到列表中,而不是覆盖它。
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
class State(TypedDict):
# Messages have the type "list". The `add_messages` function
# in the annotation defines how this state key should be updated
# (in this case, it appends messages to the list, rather than overwriting them)
messages: Annotated[list, add_messages]
Annotated:允许为类型添加元数据(如验证函数、处理逻辑)。
TypedDict:创建带有类型注解的字典,允许你定义字典的键及其对应值的类。
add_messages:将 LLM 的响应消息附加到状态中已有的任何消息之后。参考add_messages文档
3.创建langgraph图
graph_builder = StateGraph(State)
我们根据定义的State创建了langgraph的图,这个图之后会添加节点和有向边,来流程性地处理任务。
StateGraph文档
4.创建LLM和聊天chatbot函数
接下来,添加一个“聊天机器人”节点。节点代表工作单元,它们通常是常规的 Python 函数,接受状态,更新状态,返回状态。
注意这里我用的是兼容openai接口的豆包大模型,你需要去官网获取你专属的API_KEY。
from langchain_openai import ChatOpenAI
# 实际请以官方文档为准
llm = ChatOpenAI(
base_url="https://ark.cn-beijing.volces.com/api/v3",
api_key=os.environ.get("ARK_API_KEY"),
model="doubao-1-5-pro-32k-250115" # 根据实际模型名称修改
)
def chatbot(state: State):
return {"messages": [llm.invoke(state["messages"])]}
我们定义的 State 中的 add_messages 函数会将大语言模型(LLM)的响应消息追加到状态中已有的消息列表后面(即更新后的状态)。
5.向图添加节点和边,然后编译
接下来,先把我们的节点添加进去,然后添加边。START是入口点,这告诉我们的图在每次运行时"从哪里开始工作"。END是终止点,这指示图"每次运行此节点时,都可以退出"。
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)
graph = graph_builder.compile()
最后,我们需要能够运行我们的图。为此,调用图构建器上的"compile()"方法。这会创建一个我们可以用来调用状态的"CompiledGraph"。
6.可视化编译的图
你可以使用get_graph方法和其中一种“绘制”方法(如draw_ascii或draw_png)来可视化图形。每种draw方法都需要额外的依赖项。
from IPython.display import Image, display
try:
display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:
# This requires some extra dependencies and is optional
pass
这部分我没能可视化成功,感觉是网络问题。报错如下:
ValueError: Failed to reach https://mermaid.ink/ API while trying to render your graph after 1 retries.
7.创建连续聊天流
def stream_graph_updates(user_input: str):
for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):
for value in event.values():
print("Assistant:", value["messages"][-1].content)
graph.stream 方法用于将用户的输入流过图,在图中处理并返回生成的事件。事件包含了聊天历史更新后的状态。value["messages"][-1].content即聊天机器人最新的回复。
8.实现多轮对话
while True:
try:
user_input = input("User: ")
if user_input.lower() in ["quit", "exit", "q"]:#输入"quit"、"exit"或"q"来退出聊天循环。
print("Goodbye!")
break
stream_graph_updates(user_input)
except:
# fallback if input() is not available
user_input = "一句话介绍langchain和LangGraph"
print("User: " + user_input)
stream_graph_updates(user_input)
break
恭喜! 您已经使用LangGraph构建了自己的第一个聊天机器人。此机器人可以通过接收用户输入并利用LLM生成响应来参与基本对话。
完整代码
import os
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langchain_openai import ChatOpenAI
from IPython.display import Image, display
os.environ['ARK_API_KEY'] = 'YOUR_API_KEY'
class State(TypedDict):
# Messages have the type "list". The `add_messages` function
# in the annotation defines how this state key should be updated
# (in this case, it appends messages to the list, rather than overwriting them)
messages: Annotated[list, add_messages]
graph_builder = StateGraph(State)
# 实际请以官方文档为准
llm = ChatOpenAI(
base_url="https://ark.cn-beijing.volces.com/api/v3",
api_key=os.environ.get("ARK_API_KEY"), # 替换为你的API密钥
model="doubao-1-5-pro-32k-250115" # 根据实际模型名称修改
)
def chatbot(state: State):
return {"messages": [llm.invoke(state["messages"])]}
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)
graph = graph_builder.compile()
try:
display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:
# This requires some extra dependencies and is optional
pass
def stream_graph_updates(user_input: str):
for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):
for value in event.values():
print("Assistant:", value["messages"][-1].content)
while True:
try:
user_input = input("User: ")
if user_input.lower() in ["quit", "exit", "q"]:
print("Goodbye!")
break
stream_graph_updates(user_input)
except:
# fallback if input() is not available
user_input = "一句话介绍langchain和LangGraph"
print("User: " + user_input)
stream_graph_updates(user_input)
break
LangGraph官方文档笔记——1.构建一个基础聊天机器人的更多相关文章
- Django官方文档学习1——第一个helloworld页面
Django 1.10官方文档:https://docs.djangoproject.com/en/1.10/intro/tutorial01/ 1.查看django版本 python -m djan ...
- 跟着官方文档学Maven构建生命周期
在IntelliJ IDEA中,显示了Maven的Lifecycle: 只需要学习这些命令,就能构建一个Maven项目. 三个内置生命周期 Maven内置了三个生命周期:clean.default和s ...
- docker官方文档笔记
Docker在 CentOS7.X上运行.Docker可能在其他EL7的兼容版本中成功安装,但是官方并未进行测试,因此也不提供任何支持. 系统环境要求 docker必须运行在64-bit的系统上,对于 ...
- Vue官方文档笔记(二)
23.$refs是什么东东? 通过在标签上设置ref属性,然后在Vue实例方法中可以通过$refs拿到这些标签,如: <input ref="input"> metho ...
- React官方文档笔记之快速入门
快速开始 JSFiddle 我们建议在 React 中使用 CommonJS 模块系统,比如 browserify 或 webpack. 要用 webpack 安装 React DOM 和构建你的包: ...
- Vue官方文档笔记
1.如何创建一个Vue实例对象? var vm = new Vue({ el: "#app", //标签id 或 标签类名 data:{ //双向绑定的数据 message: &q ...
- Spring 官方文档笔记---Bean
In Spring, the objects that form the backbone of your application and that are managed by the Spring ...
- hbase官方文档(转)
FROM:http://www.just4e.com/hbase.html Apache HBase™ 参考指南 HBase 官方文档中文版 Copyright © 2012 Apache Soft ...
- Android 触摸手势基础 官方文档概览
Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: Moti ...
- Android 触摸手势基础 官方文档概览2
Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: Moti ...
随机推荐
- 互联网的前世今生:Web 1.0、2.0、3.0
101链视界:区块链.隐私计算与金融科技领域的专业知识分享者. ▲ 点击上方第二个"101链视界"关注公众号 2021年,元宇宙成为一个爆火的概念,而Web 3.0也悄悄在海外科技 ...
- WPF 使用CompositionTarget.Rendering实现平滑流畅滚动的ScrollViewer,支持滚轮、触控板、触摸屏和笔
之前的文章中用WPF自带的动画库实现了一个简陋的平滑滚动ScrollViewer,它在只使用鼠标滚轮的情况下表现良好,但仍然有明显的设计缺陷和不足: 没有实现真正的动画衔接,只是单纯结束掉上一个动画, ...
- MinHook 如何对.NET底层的 Win32函数 进行拦截(上)
一:背景 1. 讲故事 在前面的系列中,我们聊过.NET外挂 harmony,他可以对.NET SDK方法进行拦截,这在.NET高级调试领域中非常重要,但这里也有一些遗憾,就是不能对SDK领域之外的函 ...
- 性能优化:JPPD(连接谓词下推)在哪些情况下生效
我们的文章会在微信公众号Oracle恢复实录和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览 ...
- pg 批量更改拥有者
记录一下. 为什么会有这个问题的原因是因为执行用的是管理员用户,pg默认拥有者是执行sql的用户也就是管理员,这样会导致创建的用户会没有这个表的权限 查询出sql语句复制直接执行就行 SELECT ' ...
- tgt源码阅读
读懂一个开源项目源码之前,需要先了解该项目的背景知识.背景知识熟悉了,代码只是具体实现手段而已. 源码地址:https://github.com/fujita/tgt 对于tgt来说,背景知识是块设备 ...
- QQ号码价值评估系统html代码-丢塔网
由于前面刷视频经常刷到有人直播QQ号码价值评估,想着也搞一个玩玩,找了一圈接口好像很多都用不来,下面提供一个自己随便搞得页面,有兴趣的大佬可以完善下 ` QQ号码价值评估系统-在线工具-丢塔网(www ...
- MongoDB入门实战教程(1)
对于后端开发工程师,NoSQL是一个需要掌握的技术点,而NoSQL中比较火热的技术当属MongoDB.欢迎入门MongoDB,进入无模式的文档数据库世界. 1 关于MongoDB 通过下面几个问题,我 ...
- java--servelt编程
Servlet的映射路径 <servlet-mapping> <!-- servlet的内部名称,一定要和上面的内部名称保持一致!! --> <servlet-name& ...
- Box与Formatting Context
一直对css都不够重视,觉得简单,其实也是有些知识的.所以抽空做了些总结 参考文献:mdn的css文档.w3c css规范 w3c是制定标准的,而mdn的目标是做开发者服务的开发文档. 但实际上,大家 ...