LangGraph 教程:初学者综合指南(2)

工具集成

将工具集成到 LangGraph 聊天机器人中可以显着增强其功能,使其能够按照您喜欢的方式访问和处理信息。

让我们修改上一节中创建的基本聊天机器人,以包含一个可以在网络上搜索信息的工具。我们将使用langchain_community.tools TavilySearchResults工具,对于此示例,您将需要Tavily API 密钥。

在这里插入图片描述
以下代码结合了 LangChainLangGraphTavily 搜索工具,创建了一个聊天机器人(chatbot)。代码实现了一个包含多个组件(如模型调用、工具调用、图计算等)的流式聊天框架,涉及到从用户输入到最终响应的完整过程。下面我将详细解释每个部分的作用。

1. 安装依赖:

pip install -U tavily-python langchain_community
  • 这行命令安装了两个 Python 库:
    • tavily-python:一个用于 Tavily 搜索引擎的工具包,提供搜索功能。
    • langchain_community:一个开源的 LangChain 扩展库,提供了与多个工具和平台的集成。

2. 导入必要的库:

from typing import Annotated
from langchain_community.tools.tavily_search import TavilySearchResults
from typing_extensions import TypedDict

from langgraph.graph import StateGraph
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_condition
from langchain_openai import ChatOpenAI
from langgraph.checkpoint.memory import MemorySaver
  • AnnotatedTypedDict:用于定义类型。
  • TavilySearchResults:来自 langchain_community,提供 Tavily 搜索工具的接口。
  • StateGraphToolNodetools_condition:来自 LangGraph,用于创建图和添加节点以及条件逻辑。
  • ChatOpenAI:来自 LangChain,用于调用 OpenAI GPT 模型。
  • MemorySaver:来自 LangGraph,用于保存和管理聊天过程中的状态。

3. 定义聊天状态 (State):

class State(TypedDict):
    messages: Annotated[list, add_messages]
  • State 是一个继承自 TypedDict 的类,定义了聊天状态结构。它包含一个键 messages,存储聊天历史记录。add_messages 装饰器用于确保新的消息会被追加到历史记录中。

4. 初始化工具和模型:

tool = TavilySearchResults(max_results=2)
tools = [tool]

llm = ChatOpenAI(temperature=0)
  • TavilySearchResults 是一个搜索工具实例,设置了 max_results=2,表示每次搜索返回最多 2 个结果。
  • llm 是一个 ChatOpenAI 模型实例,设置了 temperature=0,使得模型输出更加确定,不太随机。

5. 将工具绑定到模型:

llm_with_tools = llm.bind_tools(tools)
  • bind_tools 方法将工具绑定到 LLM(语言模型)上。这样,模型就知道可以使用哪些工具。这里的工具是 TavilySearchResults,可以在生成的响应中触发搜索操作。

6. 定义 chatbot 函数:

def chatbot(state: State):
    return {"messages": [llm_with_tools.invoke(state["messages"])]}
  • chatbot 函数接受一个 State 类型的参数,并通过 llm_with_tools.invoke() 使用模型生成响应。生成的响应会被返回,并更新 messages 字段。

7. 构建 LangGraph:

graph_builder = StateGraph(State)
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_node("tools", tool_node)
  • StateGraph 创建一个状态图,表示不同的状态(节点)和它们之间的过渡(边)。图的每个节点都是一个函数或工具的调用。
  • add_node 方法将 chatbottools 节点添加到图中。

8. 设置条件边:

graph_builder.add_conditional_edges("chatbot", tools_condition)

条件路由:利用 graph_builder.add_conditional_edges() 根据LLM是否决定调用工具来设置路由逻辑。 tools_condition函数检查LLM的响应是否包含工具调用指令。

  • add_conditional_edges 用于根据某些条件(如工具调用)在节点之间建立边。在这里,tools_condition 函数会检查是否需要调用工具。如果是,它会触发从 chatbottools 节点的过渡。

9. 图的入口点和边的设置:

graph_builder.add_edge("tools", "chatbot")
graph_builder.set_entry_point("chatbot")
  • add_edge 设置从 tools 节点到 chatbot 节点的边,表示一旦工具被调用,图会回到 chatbot 节点,以便模型决定下一步操作。执行该工具后,使用graph_builder.add_edge()将流程引导回chatbot节点,从而允许对话继续。
  • set_entry_point 设置图的入口点为 chatbot,表示聊天的起点。

10. 设置 MemorySaver:

memory = MemorySaver()
graph = graph_builder.compile(checkpointer=memory)
  • MemorySaver 用作图的检查点,保存和恢复聊天状态。通过将 MemorySaver 传递给 compile 方法,图的状态将在整个对话过程中保存。

11. 聊天主循环:

config = {"configurable": {"thread_id": "1"}}

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)]}, config):
        for value in event.values():
            print("Assistant:", value["messages"][-1].content)
  • while True 是聊天的主循环,持续接收用户输入直到用户输入 quitexitq
  • graph.stream(...) 用于将用户输入流入图中并触发处理。传递给图的状态是 {"messages": [("user", user_input)]},即用户的输入。
  • event.values() 提取事件的实际数据(如聊天记录),并打印出最后一个消息的内容。

总结:

  1. 这段代码实现了一个 LangGraph 驱动的聊天机器人,其中整合了 Tavily 搜索工具和 OpenAI 的语言模型(LLM)。
  2. 使用 LangGraph 定义了图结构,在图中加入了处理聊天逻辑的 chatbot 节点和处理工具调用的 tools 节点。
  3. 工具调用 是由模型的响应控制的,图根据模型的输出判断是否需要调用搜索工具。
  4. MemorySaver 用于保存对话状态,使得对话可以持续进行并追踪历史。

这种结构提供了一种可扩展的框架,可以在图中添加更多工具或自定义逻辑,灵活应对各种复杂的对话场景。

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

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

相关文章

项目练习:若依管理系统字典功能-Vue前端部分

文章目录 一、情景说明二、若依Vue相关代码及配置1、utils代码2、components组件3、api接口代码4、main.js配置 三、使用方法1、html部分2、js部分 一、情景说明 我们在做web系统的时候,肯定会遇到一些常量选择场景。 比如,性别:男女。 状态…

oracle闪回表

文章目录 闪回表案例1:(未清理回收站时的闪回表--成功)案例2(清理回收站时的闪回表--失败)案例3:彻底删除表(不经过回收站--失败)案例4:闪回表之后重新命名新表总结1、删…

TensorFlow Quantum快速编程(基本篇)

一、TensorFlow Quantum 概述 1.1 简介 TensorFlow Quantum(TFQ)是由 Google 开发的一款具有开创性意义的开源库,它宛如一座桥梁,巧妙地将量子计算与 TensorFlow 强大的机器学习功能紧密融合。在当今科技飞速发展的时代,传统机器学习虽已取得诸多瞩目成就,然而面对日益…

K8s数据存储之详解(Detailed Explanation of K8s Data Storage)

K8s数据存储相关概念详解(临时存储,节点存储,网络存储,PV/PVC) 本篇文章分享一下存储卷和数据持久化的相关概念: 存储卷概述 临时存储卷(Ephemeral Volumes) 节点存储卷&#xff…

java求职学习day12

1 泛型机制(熟悉) 1.1 基本概念 (1)通常情况下集合中可以存放不同类型的元素,是因为将所有对象都看作Object类型放入,因此从集合中取出元素时,也是Object类型,为了表达该元素真实的…

相加交互效应函数发布—适用于逻辑回归、cox回归、glmm模型、gee模型

在统计分析中交互作用是指某因素的作用随其他因素水平变化而变化,两因素共同作用不等于两因素单独作用之和(相加交互作用)或之积(相乘交互作用)。相互作用的评估是尺度相关的:乘法或加法。乘法尺度上的相互作用意味着两次暴露的综合效应大于(…

Spring Boot 2 学习全攻略

Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今快速发展的 Java 后端开发领域,Spring Boot 2 已然成为一股不可忽视的强大力量。它简化了 Spring 应用的初始搭建以及开发过程,让开发者能够更加专注于业务逻辑的实现&am…

【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法

工作经验一年以上程序员必问问题 面试题概述 问题为在负责项目时遇到的棘手问题及解决方法,主要考察开发经验与技术水平,回答不佳会影响面试印象。提供四个回答方向,准备其中一个方向即可。 1、设计模式应用方向 以登录为例,未…

30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <1> 5分钟快速创建一个springboot web项目

快速导航 <1> 5分钟快速创建一个springboot web项目 <2> 5分钟集成好最新版本的开源swagger ui&#xff0c;并使用ui操作调用接口 <3> 5分钟集成好druid并使用druid自带监控工具监控sql请求 <4> 5分钟集成好mybatisplus并使用mybatisplus generator自…

【Rust自学】11.10. 集成测试

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.10.1. 什么是集成测试 在Rust里&#xff0c;集成测试完全位于被测试库的外部。集成测试调用库的方式和其他代码一样&#xff0c;这也…

JAVA实现2048小游戏(附源码)

文章目录 一、设计来源2048小游戏讲解1.1 主界面1.2 4*4难度界面1.3 5*5难度界面1.4 6*6难度界面1.5 挑战失败提示界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载更多优质源码分享 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/a…

【自动化测试】—— Appium安装配置保姆教程(图文详解)

目录 一. 环境准备 二. JDK安装 1. 下载JDK 2. 安装JDK 3. 配置环境 4. 验证安装 三. Android SDK安装 1. 下载Android SDK 2. 安装Android SDK 3. 安装工具 4. 配置环境 5. 验证安装 四. NodeJS安装 1. 下载NodeJS 2. 安装NodeJS 3. 验证安装 4. 安装淘宝镜像…

vs2022+QT6.7.3打包程序流程

1、新建目录test 2、将项目配置为Release X64&#xff0c;生成XXX.exe 3、将XXX.exe放到test目录 4、管理员方式打开Qt 6.7.3 (MSVC 2022 64-bit)&#xff0c;进入test目录&#xff0c;执行&#xff1a;windeployqt6.exe XXX.exe 5、管理员方式打开x64 Native Tools Command…

RabbitMQ---消息确认和持久化

&#xff08;一&#xff09;消息确认 1.概念 生产者发送消息后&#xff0c;到达消费端会有以下情况&#xff1a; 1.消息处理成功 2.消息处理异常 如果RabbitMQ把消息发送给消费者后就把消息删除&#xff0c;那么就可能会导致&#xff0c;消息处理异常想要再获取这条消息的时…

【C++】反向迭代器

反向迭代器 一.源码及框架分析二.反向迭代器实现代码1.ReverseIterator.h2.Vector.h3.List.h4.Test.cpp 一.源码及框架分析 SGI-STL30版本源代码&#xff0c;反向迭代器实现的核心源码在stl_iterator.h中&#xff0c;反向迭代器是一个适配器&#xff0c;各个容器中再适配出自己…

浅谈云计算02 | 云计算模式的演进

云计算计算模式的演进 一、云计算计算模式的起源追溯1.2 个人计算机与桌面计算 二、云计算计算模式的发展阶段2.1 效用计算的出现2.2 客户机/服务器模式2.3 集群计算2.4 服务计算2.5 分布式计算2.6 网格计算 三、云计算计算模式的成熟与多元化3.1 主流云计算服务模式的确立3.1.…

WEB 攻防-通用漏-XSS 跨站脚本攻击-反射型/存储型/DOMBEEF-XSS

XSS跨站脚本攻击技术&#xff08;一&#xff09; XSS的定义 XSS攻击&#xff0c;全称为跨站脚本攻击&#xff0c;是指攻击者通过在网页中插入恶意脚本代码&#xff0c;当用户浏览该网页时&#xff0c;恶意脚本会被执行&#xff0c;从而达到攻击目的的一种安全漏洞。这些恶意脚…

Vue3组件设计模式:高可复用性组件开发实战

Vue3组件设计模式:高可复用性组件开发实战 一、前言 在Vue3中&#xff0c;组件设计和开发是非常重要的&#xff0c;它直接影响到应用的可维护性和可复用性。本文将介绍如何利用Vue3组件设计模式来开发高可复用性的组件&#xff0c;让你的组件更加灵活和易于维护。 二、单一职责…

深度剖析RabbitMQ:从基础组件到管理页面详解

文章目录 一、简介二、Overview2.1 Overview->Totals2.2 Overview->Nodesbroker的属性2.3 Overview->Churn statistics2.4 Overview->Ports and contexts2.5 Overview->Export definitions2.6 Overview->Import definitions 三、Connections连接的属性 四、C…

Unity 语音转文字 Vosk 离线库

市场有很多语音库&#xff0c;这里介绍Vosk SDK 除了支持untiy外还有原生开发服务器等 目录 安装unity示例demo下载语音训练文件运行demo结尾一键三联 注意事项 有可能debug出来的文本是空的&#xff0c;&#xff08;确保麦克风正常&#xff0c;且索引正确&#xff09;分大…