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 os

def _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_messages

class State(TypedDict):
    messages: Annotated[list, add_messages]

graph_builder = StateGraph(State)

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

  • 增加节点

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

from langchain_anthropic import ChatAnthropic

llm = 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, display

try:
    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!")
        break
    for 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密钥,以及理解增强聊天机器人功能所必需的基本概念。通过理解这些方面,你可以创建有效的聊天机器人来维护会话流并处理用户输入。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【hot100】刷题记录(7)-除自身数组以外的乘积

题目描述: 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#x…

OpenCV边沿检测(Python版)

边缘检测是图像处理中的一项重要任务,用于找到图像中的边界或边缘。它在计算机视觉、图像处理和模式识别等领域中具有广泛的应用。 边缘可以被定义为图像亮度、颜色或纹理的突变区域。边缘检测算法旨在识别这些变化并将其标记为边缘。边缘检测可以用于分割图像、检测…

推荐七节来自NVIDIA、Google、斯坦福的AI课程

英伟达 (1)在 10 分钟内构建大脑 • 探索神经网络如何使用数据进行学习。 • 了解神经元背后的数学原理。 链接:https://learn.nvidia.com/courses/course-detail?course_idcourse-v1:DLIT-FX-01V1 (2)构建视频 A…

《从因果关系的角度学习失真不变表示以用于图像恢复》学习笔记

paper:2303.06859 GitHub:lixinustc/Causal-IR-DIL: Distortion invariant feature learning for image restoration from a causality perspective 2023 CVPR 摘要 近年来,我们见证了深度神经网络(DNNs)在图像恢复…

亚博microros小车-原生ubuntu支持系列:16 机器人状态估计

本来想测试下gmapping建图,但是底层依赖了yahboomcar_bringup做底层的数据处理,所以先把依赖的工程导入。 程序启动后,会订阅imu和odom数据,过滤掉一部分的imu数据后,然后与odom数据进行融合,最后输出一个…

不背单词快捷键(不背单词键盘快捷键)

文章目录 不背单词快捷键 不背单词快捷键 ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ    …

VPR概述、资源

SOTA网站: Visual Place Recognition | Papers With Code VPR(Visual Place Recognition) 是计算机视觉领域的一项关键任务,旨在通过图像匹配和分析来识别场景或位置。它的目标是根据视觉信息判断某个场景是否与数据库中的场景匹…

MYSQL 商城系统设计 商品数据表的设计 商品 商品类别 商品选项卡 多表查询

介绍 在开发商品模块时,通常使用分表的方式进行查询以及关联。在通过表连接的方式进行查询。每个商品都有不同的分类,每个不同分类下面都有商品规格可以选择,每个商品分类对应商品规格都有自己的价格和库存。在实际的开发中应该给这些表进行…

代理模式 -- 学习笔记

代理模式学习笔记 什么是代理? 代理是一种设计模式,用户可以通过代理操作,而真正去进行处理的是我们的目标对象,代理可以在方法增强(如:记录日志,添加事务,监控等) 拿一…

Flutter使用Flavor实现切换环境和多渠道打包

在Android开发中通常我们使用flavor进行多渠道打包,flutter开发中同样有这种方式,不过需要在原生中配置 具体方案其实flutter官网个了相关示例(https://docs.flutter.dev/deployment/flavors),我这里记录一下自己的操作 Android …

WinDBG查找C++句柄泄露

C代码(频繁点击About按钮导致Mutex句柄泄露) HANDLE _mutexHandle;LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {switch (message){case WM_COMMAND:{int wmId LOWORD(wParam);// 分析菜单选择:switch (wmId){c…

Web3 如何赋能元宇宙,实现虚实融合的无缝对接

随着技术的飞速发展,元宇宙作为一个未来数字世界的概念,正在吸引全球范围内的关注。而 Web3 技术的兴起,为元宇宙的实现提供了强大的支撑。Web3 是基于区块链技术的去中心化网络,它在改变互联网的同时,也推动着虚拟世界…

可以称之为“yyds”的物联网开源框架有哪几个?

有了物联网的发展,我们的生活似乎也变得更加“鲜活”、有趣、便捷,包具有科技感的。在物联网(IoT)领域中,也有许多优秀的开源框架支持设备连接、数据处理、云服务等,成为被用户们广泛认可的存在。以下给大家…

FreeRTOS从入门到精通 第十四章(队列集)

参考教程:【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili 一、队列集简介 1、队列集概述 (1)一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以…

Python Matplotlib库:从入门到精通

Python Matplotlib库:从入门到精通 在数据分析和科学计算领域,可视化是一项至关重要的技能。Matplotlib作为Python中最流行的绘图库之一,为我们提供了强大的绘图功能。本文将带你从Matplotlib的基础开始,逐步掌握其高级用法&…

xclode版本

直接搜xcode https://developer.apple.com/download/all/?qCommand%20Line%20Tools https://developer.apple.com/download/all/?qXcode https://xcodereleases.com/?q10.15 下载可能慢 catalina 支持 11.3.1xcode

Formality:时序变换(二)(不可读寄存器移除)

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 一、引言 时序变换在Design Compiler的首次综合和增量综合中都可能发生,它们包括:时钟门控(Clock Gating)、寄存器合并(Register Merging)、…

AI作画提示词:Prompts工程技巧与最佳实践

成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于物联网智能项目之——智能家居项目…

Python动量策略实战:大幅跑赢市场的底层逻辑

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话:最近我深入研究了一种基于动量策略的量化投资方法,并用Python实现了它。动量策略的核心是“追涨杀跌”,通过历史数据预测未来趋势。在这篇文章中&#…

【Proteus仿真】【51单片机】多功能计算器系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键​ 3、加减乘除,开方运算 4、带符号运算 5、最大 999*999 二、使用步骤 基于51单片机多功能计算器 包含:程序&…