LangGraph官方文档笔记——4.提示聊天机器人
前言
Agent 可能不可靠,并且可能需要人工输入才能成功完成任务。因此,您可能希望在运行之前需要人工批准,以确保一切按预期运行。例如以下操作:
- 批准工具调用并继续
- 手动修改工具调用然后继续
- 给出自然语言反馈,然后将其传回给代理
我们可以使用 interrupt() 函数在 LangGraph 中实现这些功能。
LangGraph 的 持久化 层支持人在回路工作流,允许根据用户反馈暂停和恢复执行。此功能的主要接口是 interrupt 函数。
在节点内部调用 interrupt 将暂停执行。通过传入 Command,可以恢复执行,并接收来自人工的新输入。
官方资料
API 参考:interrupt
操作指南:人类在环
官方文档:提示聊天机器人
实践人工协助聊天机器人
创建可以人工协助的聊天机器人
在本节,我们在第三部分的现有代码基础上添加一个humna_assistance工具,此工具使用 interrupt 从人工接收信息。
import os
from typing import Annotated
# from langchain.chat_models import init_chat_model
from langchain_openai import ChatOpenAI
from langchain_tavily import TavilySearch
from langchain_core.tools import tool
from typing_extensions import TypedDict
from langgraph.checkpoint.memory import MemorySaver# 内存检查点,用于保存会话状态
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_condition# 预构建的工具节点和条件路由函数
from langgraph.types import Command, interrupt# 命令类型和中断函数,用于与外部交互
#环境变量设置
os.environ['TAVILY_API_KEY'] = 'TAVILY_API_KEY'
os.environ['ARK_API_KEY'] = 'API_KEY'
class State(TypedDict):
messages: Annotated[list, add_messages]
graph_builder = StateGraph(State)
# 使用@tool装饰器定义自定义工具:请求人工协助
@tool
def human_assistance(query: str) -> str:
"""Request assistance from a human."""
human_response = interrupt({"query": query})
return human_response["data"]
tool = TavilySearch(max_results=2)
tools = [tool, human_assistance]# 定义工具列表,包含Tavily搜索和人工协助工具
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" # 根据实际模型名称修改
)
llm_with_tools = llm.bind_tools(tools)
# 定义聊天机器人节点函数,处理对话逻辑
def chatbot(state: State):
message = llm_with_tools.invoke(state["messages"])
# Because we will be interrupting during tool execution,由于工具执行时可能触发中断,为避免恢复时重复调用,
# we disable parallel tool calling to avoid repeating any
# tool invocations when we resume.
assert len(message.tool_calls) <= 1# 限制每次最多生成1个工具调用请求
return {"messages": [message]}
graph_builder.add_node("chatbot", chatbot)
tool_node = ToolNode(tools=tools)
graph_builder.add_node("tools", tool_node)
graph_builder.add_conditional_edges(
"chatbot",
tools_condition,
)
graph_builder.add_edge("tools", "chatbot")
graph_builder.add_edge(START, "chatbot")
memory = MemorySaver()
graph = graph_builder.compile(checkpointer=memory)
我们开始对话尝试让聊天机器人去请求人工协助:
user_input = "I need some expert guidance for building an AI agent. Could you request assistance for me?"
config = {"configurable": {"thread_id": "1"}}
events = graph.stream(
{"messages": [{"role": "user", "content": user_input}]},
config,
stream_mode="values",
)
for event in events:
if "messages" in event:
event["messages"][-1].pretty_print()
返回结果:
================================ Human Message =================================
I need some expert guidance for building an AI agent. Could you request assistance for me?
================================== Ai Message ==================================
用户需要关于构建AI代理的专家指导,调用human_assistance函数请求人工协助。
Tool Calls:
human_assistance (call_2y67vyca6qdhn3egwq4xh5v6)
Call ID: call_2y67vyca6qdhn3egwq4xh5v6
Args:
query: 需要关于构建AI代理的专家指导
聊天机器人生成了一个工具调用,但执行被中断了!请注意,如果我们检查图状态,会发现它停在了工具节点。
snapshot = graph.get_state(config)
snapshot.next
返回的待处理节点:
('tools',)
要恢复执行,请传递一个包含工具预期数据的 Command 对象。此数据的格式可以根据需要进行自定义。在本示例中,使用一个带有键 "data" 的字典:
human_response = (
"We, the experts are here to help! We'd recommend you check out LangGraph to build your agent."
" It's much more reliable and extensible than simple autonomous agents."
)
human_command = Command(resume={"data": human_response})
events = graph.stream(human_command, config, stream_mode="values")
for event in events:
if "messages" in event:
event["messages"][-1].pretty_print()
返回结果:
================================== Ai Message ==================================
用户需要关于构建AI代理的专家指导,调用human_assistance函数请求人工协助。
Tool Calls:
human_assistance (call_2y67vyca6qdhn3egwq4xh5v6)
Call ID: call_2y67vyca6qdhn3egwq4xh5v6
Args:
query: 需要关于构建AI代理的专家指导
================================= Tool Message =================================
Name: human_assistance
We, the experts are here to help! We'd recommend you check out LangGraph to build your agent. It's much more reliable and extensible than simple autonomous agents.
================================== Ai Message ==================================
专家推荐使用LangGraph来构建AI代理,它比简单的自主代理更可靠和可扩展。如果你想了解更多关于LangGraph的信息,可以继续向我提问。
可以看到我们冒充专家人工协助建议使用LangGraph来构建AI代理,AI也根据了我们的建议给出了回答。
恭喜!您已使用 interrupt 为您的聊天机器人添加了人在回路执行功能,从而在需要时进行人工监督和干预。这为您可以使用 AI 系统创建的潜在 UI 打开了大门。由于我们已经添加了检查点,只要底层的持久化层正在运行,图就可以无限期地暂停并在任何时候恢复,就像什么都没发生一样。
LangGraph官方文档笔记——4.提示聊天机器人的更多相关文章
- 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 ...
- pm2 官方文档 学习笔记
一.安装 1.安装 npm install pm2 -g 2.更新 npm install pm2 -g && pm2 update pm2 update 是为了刷新 PM2 的守护进 ...
- vue.js 2.0 官方文档学习笔记 —— 01. vue 介绍
这是我的vue.js 2.0的学习笔记,采取了将官方文档中的代码集中到一个文件的形式.目的是保存下来,方便自己查阅. !官方文档:https://cn.vuejs.org/v2/guide/ 01. ...
- Effective Go(官方文档)笔记
Effective Go(官方文档)笔记 自己主动局部变量提升(编译期完毕?):return &...; 内置函数: new/make copy, append delete range(这是 ...
- TypeScript 学习笔记 — 看官方文档
TYPESCRITP OF GEEK NOTE 以后会更新这个完整度,和理解度,目前这个还不够 ts官方推荐使用let来替代 var ts 支持 js语法 声明变量 let temp:string = ...
- Swift -- 官方文档Swift-Guides的学习笔记
在经历的一段时间的郁闷之后,我发现感情都是虚伪的,只有代码是真实的(呸) 因为看了swift语法之后依然不会用swift,然后我非常作死的跑去看官方文档,就是xcode里自带的help>docu ...
随机推荐
- 在MySQL数据库中保存布尔型数据
在存储数据时,经常会用到"是"."否"或者"有"."无"这种数据,这种时候就要应用布尔型这种数据类型了.那如何在M ...
- redis-cli 使用lua脚本笔记
前言 众所周知,redis可以执行lua脚本,至于为什么要用lua脚本来操作redis,自行百度咯 先来讲一下最简单的方式, 关于如何在java springboot里用lua脚本,请查看我另一篇文章 ...
- 基于 A2A 协议的 LlamaIndex 文件聊天工作流
本示例展示了一个使用 LlamaIndex Workflows 构建并通过 A2A 协议公开的对话代理.它展示了文件上传和解析.支持多轮对话的对话交互.流式响应/更新以及内联引用. 源代码 a2a l ...
- Java集合源码--ArrayList的可视化操作过程
关于ArrayList的元素插入.检索.修改.删除.扩容等可视化操作过程 还有关于ArrayList的迭代器.线程安全和时间复杂度 1. 底层数据结构 基于动态数组实现,内部维护一个Object[]数 ...
- .net入行第4年
没错 我在2024-06-28发布了我的三年.net感想 时隔一年,我又来分享了 这一年的时间真的没有经过逛博客园 ,每天都在忙 首先,恭喜一下自己 -- 我现在也算是一个小老板了(虽然主业还是程序员 ...
- Typoar的使用
Typoar的使用 1.指定标题<h?>标签 ctrl+1~6 2.字体加粗:ctrl+b 3.有序序列:ctrl+shift+[ "无序是 ]" 4.插入图片:ctr ...
- 支付宝小程序IDE版本迭代异常
前情 uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验也挺棒的,公司项目就是主推uni-app 现公司今年准备新开一 ...
- 2.Java SDK源码分析系列笔记-String系列
目录 1. String 1.1. 是什么 1.2. 使用 1.3. 源码分析 1.3.1. 类的定义 1.3.2. 构造方法 1.3.2.1. 解释new String("test1&qu ...
- 安卓端-APPUI自动化实战【下】
上一篇介绍了在solopi端的二次开发内容,接下来介绍下服务端的实现原理. 框架介绍: 使用比较成熟封装度较高的开源框架,尽量减少二次开发难度:Pear Admin Boot: 基 于 Spring ...
- 学习spring cloud记录11-Feign初体验
前言 Feign英语单词,主要用作为动词,用作动词译为"装作;假装,伪装;捏造(借口.理由等);创造或虚构,假装;装作;作假;佯作" Feign是一个声明式的http客户端,起作用 ...