LangGraph系列-1:用LangGraph构建简单聊天机器人

在快速发展的人工智能和大型语言模型(llm)世界中,开发人员不断寻求创建更灵活、更强大、更直观的人工智能代理的方法。 虽然LangChain已经改变了这个领域的游戏规则,允许创建复杂的链和代理,但对代理运行时的更复杂控制的需求也在不断增长。
LangGraph是建立在LangChain之上的重要模块,它将彻底改变我们设计和实施人工智能工作流的方式。在这篇博客中,我们提供了一个关于构建聊天机器人和彻底改变人工智能代理工作流程的详细的LangGraph教程。

理解LangGraph

LangGraph是LangChain生态系统的扩展,引入了一种创建AI代理运行时的新方法。LangGraph的核心是允许开发人员将复杂的工作流表示为循环图形,从而提供更直观和灵活的方式来设计代理行为。

LangGraph背后的主要动机是解决传统有向无环图(dag)在表示人工智能工作流方面的局限性。虽然dag在线性过程中非常出色,但当涉及到执行高级AI代理通常需要的迭代、基于决策的流程时,它们就不够了。

LangGraph通过创建循环工作流解决了这个问题,人工智能可以重新访问之前的步骤,做出决策,并根据中间结果调整其行为。这在代理可能需要改进其方法或在继续之前收集额外信息的场景中特别有用。
在这里插入图片描述

LangGraph关键组件

为了有效地使用LangGraph,了解它的基本组成部分是至关重要的:

节点(Node)

LangGraph中的节点表示AI代理可以使用的单个功能或工具。这些可以是任何东西,从API调用到语言模型执行的复杂推理任务。每个节点都是工作流中处理输入和产生输出的离散步骤。

边缘(Edge)

边连接图中的节点,定义信息流和控制。LangGraph支持两种类型的边:

  • 简单边:这些是节点之间的直接连接,表明节点的输出应该作为输入传递给下一个节点。
  • 条件边:这些是更复杂的连接,允许基于节点输出的动态路由。这是LangGraph真正的亮点所在,它支持自适应工作流。

状态(State)

状态是可以在整个图的节点之间传递的信息。如果你想在工作流程中跟踪特定的信息,那么可以使用state。

在LangGraph中有两种类型的图形:

  • 基本图: 基本图将只传递第一个节点的输出到下一个节点,因为它不能包含状态。
  • 有状态图: 这个图可以包含状态,它将在节点之间传递,你可以在任何节点访问这个状态。

环境准备

使用LangGraph构建聊天机器人涉及几个基本步骤,包括安装所需的包、配置API密钥和理解将增强聊天机器人功能的基本概念。本指南将引导用户完成这些步骤。

步骤1:安装依赖

首先,用户需要安装开发LangGraph聊天机器人所需的必要Python包。安装过程可以使用pip命令执行。

%%capture --no-stderr
%pip install -U langgraph langsmith%pip install -U langchain_anthropic
  • Langgraph是用于构建聊天机器人的主要库。
  • langsmith是一个可选的库,它提供了对系统操作的洞察,可以帮助调试和跟踪。
  • langchain_anthropic专门用于集成Anthropic的语言模型以生成响应。

步骤2:设置API key

安装完包后,下一步是设置必要的API密钥。这一点至关重要,因为聊天机器人将需要访问外部服务,如语言模型或网络搜索工具。

import getpass
import osdef _set_env(var: str):if not os.environ.get(var):os.environ[var] = getpass.getpass(f"{var}: ")_set_env("ANTHROPIC_API_KEY")

getpass模块提供安全的方式来获取用户输入的密码或敏感信息,输入时不会在终端显示用户输入的内容,以保护信息安全。

调用 _set_env 函数,并传入参数 "ANTHROPIC_API_KEY",这意味着代码将检查环境变量中是否已经设置了 ANTHROPIC_API_KEY,如果没有设置,则会提示用户输入该 API 密钥,并将其设置为环境变量。这个 API 密钥通常用于访问 Anthropic 公司提供的相关服务。

用户应该通过相应地修改_set_env函数中的变量名,对其他所需的API密钥(如LangSmith)重复此过程。

# Encouraged to set up LangSmith API Key as well
_set_env("LANGSMITH_API_KEY")
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "LangGraph Tutorial"
  • 将LANGCHAIN_TRACING_V2设置为“true”可以启用跟踪功能,这有助于监视聊天机器人的操作。
  • 设置LANGCHAIN_PROJECT为当前项目命名,协助组织多个项目。

简单聊天机器人示例

在本节中,重点是使用LangGraph框架构建一个基本的聊天机器人。目的是创建简单而有效的聊天机器人,它可以响应用户消息,从而演示基本概念,例如状态管理和LangGraph架构中的节点功能。

上节配置好环境后,首先定义StateGraph的结构。状态将是聊天机器人消息的表示,它将使用TypedDict定义:

from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph
from langgraph.graph.message import add_messagesclass State(TypedDict):messages: Annotated[list, add_messages]graph_builder = StateGraph(State)

在此配置中,State被创建为TypedDict,其包含单个键messages。add_messages函数用于确保将新消息添加到已有list中,而不是覆盖它。这是聊天机器人的关键方面,允许它在多个交互中维护上下文。

  • 增加节点

定义了StateGraph之后,下一步是添加节点,这些节点将处理用户输入并生成响应。聊天机器人节点定义如下:

from langchain_anthropic import ChatAnthropicllm = ChatAnthropic(model="claude-3-haiku-20240307")def chatbot(state: State):return {"messages": [llm.invoke(state["messages"])]}graph_builder.add_node("chatbot", chatbot)

在此代码片段中,chatbot 函数将当前状态作为输入,并调用大型语言模型(LLM),以根据状态中呈现的消息生成响应。然后将生成的响应作为更新后的消息列表返回。

  • 增加边

为了控制statgraph的执行流,必须定义入口点和出口点:

graph_builder.add_edge(START, "chatbot") 
graph_builder.add_edge("chatbot", END)

START边表示图形开始处理的位置,END边表示图形可以结束其操作的位置。

  • 编译图

在定义节点和边之后,必须编译图形来创建CompiledGraph,它准备被调用:

graph = graph_builder.compile()

现在可以执行这个编译好的图来处理用户输入。

  • 图可视化

现在可以执行这个编译好的图来处理用户输入。

from IPython.display import Image, displaytry:display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:pass

在这里插入图片描述

这种可视化有助于理解聊天机器人中的关系和操作流程。

  • 运行ChatbotExpand

要启动与聊天机器人的对话,可以实现一个简单的交互式循环:

while True:user_input = input("User: ")if user_input.lower() in ["quit", "exit", "q"]:print("Goodbye!")breakfor event in graph.stream({"messages": ("user", user_input)}):for value in event.values():print("Assistant:", value["messages"][-1].content)

在这段代码中,聊天机器人不断提示用户输入,通过graph处理它,并输出生成的响应。可以通过输入“quit”、“exit”或“q”来终止对话。

最后总结

本文解释如何使用LangGraph构建了基本的聊天机器人,演示了状态管理和节点功能的关键概念。聊天机器人能够进行对话并根据用户输入生成响应,作为将来可以添加更复杂功能的基础。

为了让你理解示例,我们首先介绍安装所需的软件包、配置API密钥,以及理解增强聊天机器人功能所必需的基本概念。通过理解这些方面,你可以创建有效的聊天机器人来维护会话流并处理用户输入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/69577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程池的制作(linux进程间通信,匿名管道... ...)

目录 一、进程间通信的理解 1.为什么进程间要通信 2.如何进行通信 二、匿名管道 1.管道的理解 2.匿名管道的使用 3.管道的五种特性 4.管道的四种通信情况 5.管道缓冲区容量 三、进程池 1.进程池的理解 2.进程池的制作 四、源码 1.ProcessPool.hpp 2.Task.hpp 3…

Linux学习笔记——用户管理

一、用户管理命令 useradd #用户增加命令 usermod #用户修改命令 passwd #密码修改命令 userdel #用户删除命令 su #用户提权命令 1、useradd命令(加用户): 创建并设置用户信息,使用us…

怎样在PPT中启用演讲者视图功能?

怎样在PPT中启用演讲者视图功能? 如果你曾经参加过重要的会议或者演讲,你就会知道,演讲者视图(Presenter View)对PPT展示至关重要。它不仅能帮助演讲者更好地掌控演讲节奏,还能提供额外的提示和支持&#…

【Unity3D】实现2D小地图效果

目录 一、玩家脚本Player 二、Canvas组件设置 三、小地图相关 四、GameLogicMap脚本修改 基于:【Unity3D】Tilemap俯视角像素游戏案例-CSDN博客 2D玩家添加Dotween移动DOPath效果,移动完成后进行刷新小地图(小地图会顺便刷新大地图&…

四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)

四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用) 文章目录 四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)2.hash 哈希表常用指令(详细讲解说明)2.1 hset …

C#通过3E帧SLMP/MC协议读写三菱FX5U/Q系列PLC数据案例

C#通过3E帧SLMP/MC协议读写三菱FX5U/Q系列PLC数据案例,仅做数据读写报文测试。附带自己整理的SLMP/MC通讯协议表。 SLMP以太网读写PLC数据20191206/.vs/WindowsFormsApp7/v15/.suo , 73216 SLMP以太网读写PLC数据20191206/SLMP与MC协议3E帧通讯协议表.xlsx , 10382…

【算法】经典博弈论问题——威佐夫博弈 python

目录 威佐夫博弈(Wythoff Game)【模板】 威佐夫博弈(Wythoff Game) 有两堆石子,数量任意,可以不同,游戏开始由两个人轮流取石子 游戏规定,每次有两种不同的取法 1)在任意的一堆中取走任意多的石子 2)可以在两堆中同时取走相同数量…

具身智能研究报告

参考: (1)GTC大会&Figure:“具身智能”奇点已至 (2)2024中国具身智能创投报告 (3)2024年具身智能产业发展研究报告 (4)具身智能行业深度:发展…

把本地搭建的hexo博客部署到自己的服务器上

配置远程服务器的git 安装git 安装依赖工具包 yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel安装编译工具 yum install -y gcc perl-ExtUtils-MakeMaker package下载git,也可以去官网下载了传到服务器上 wget https://www.ke…

STM32 旋转编码器

旋转编码器简介 旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向 类型:机械触点式/霍尔传…

后盾人JS--闭包明明白白

延伸函数环境生命周期 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…

Python爬虫之——Cookie存储器

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;请点击——> 一晌小贪欢的博客主页求关注 &…

MFC开发,给对话框添加垂直滚动条并解决鼠标滚动响应的问题

无论在使用QT或者MFC进行界面开发时&#xff0c;都会出现在一个对话框里面存在好多的选项&#xff0c;导致对话框变得非常长或者非常大&#xff0c;就会显现的不美观&#xff0c;在这种情况下通常是添加一个页面的滚动条来解决这个问题&#xff0c;下面我们就来介绍给MFC的对话…

(undone) MIT6.S081 2023 学习笔记 (Day6: LAB5 COW Fork)

网页&#xff1a;https://pdos.csail.mit.edu/6.S081/2023/labs/cow.html 任务1&#xff1a;Implement copy-on-write fork(hard) (doing) 现实中的问题如下&#xff1a; xv6中的fork()系统调用会将父进程的用户空间内存全部复制到子进程中。如果父进程很大&#xff0c;复制过…

分享| RL-GPT 框架通过慢agent和快agent结合提高AI解决复杂任务的能力-Arxiv

结论 “RL-GPT: Integrating Reinforcement Learning and Code-as-policy” RL-GPT 框架为解决大语言模型在复杂任务处理中的难题提供了创新有效的途径&#xff0c; 旨在将强化学习&#xff08;RL&#xff09;和代码即策略相结合&#xff0c; 以解决大语言模型&#xff08…

【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

一个简单的自适应html5导航模板

一个简单的 HTML 导航模板示例&#xff0c;它包含基本的导航栏结构&#xff0c;同时使用了 CSS 进行样式美化&#xff0c;让导航栏看起来更美观。另外&#xff0c;还添加了一些 JavaScript 代码&#xff0c;用于在移动端实现导航菜单的展开和收起功能。 PHP <!DOCTYPE htm…

【算法应用】基于A*-蚁群算法求解无人机城市多任务点配送路径问题

目录 1.A星算法原理2.蚁群算法原理3.结果展示4.代码获取 1.A星算法原理 A*算法是一种基于图搜索的智能启发式算法&#xff0c;它具有高稳定性和高节点搜索效率。主要原理为&#xff1a;以起点作为初始节点&#xff0c;将其加入开放列表。从开放列表中选择具有最小总代价值 f (…

Python-基于PyQt5,json和playsound的通用闹钟

前言&#xff1a;刚刚结束2024年秋季学期的学习&#xff0c;接下来我们继续来学习PyQt5。由于之前我们已经学习了PyQt5以及PyUIC,Pyrcc和QtDesigner的安装&#xff0c;配置。所以接下来我们一起深入PyQt5&#xff0c;学习如何利用PyQt5进行实际开发-基于PyQt5&#xff0c;json和…

预测不规则离散运动的下一个结构

有一个点在19*19的平面上运动&#xff0c;运动轨迹为 一共移动了90步&#xff0c;顺序为 y x y x y x 0 17 16 30 10 8 60 15 15 1 3 6 31 10 7 61 14 15 2 12 17 32 9 9 62 16 15 3 4 12 33 10 9 63 18 15 4 3 18 34 15 12 6…