当前位置: 首页 > news >正文

langgraph tool如何获取上下文和RunableConfig

在构造langraph工具函数时,常需要使用到运行时的配置RunableConfig以及对话的上下文数据(常命名为State)。文章记录下在工具函数中该如何获取上述配置

获取运行时配置RunableConfig

获取运行时配置,比较简单,只需要将RunableConfig作为函数的一个入参即可,一些确定的元数据常常用RunableConfig进行传递。

from langchain_core.runnables.config import RunnableConfig
from langchain_core.tools import tool@tool
def get_fligh_info(config: RunnableConfig):"""获取乘客的航班信息"""configuration = config.get("configurable", {})passenger_id = configuration.get("passenger_id")print(f"传入的passenger_id:{passenger_id}")return {"name":"老谢", "flight": "AX123"}

传入的passenger_id是123

获取对话上下文

tools中获取对话上下文(state),需要使用InjectedState来注解。使用该注解后,函数的入参将对模型调用隐藏,意味着该参数不会有大模型的funcation calling生成,而是由state直接注入。可选注入整个state或者state中的某个字段,改写上面的函数

from typing import List
from typing_extensions import Annotated, TypedDictfrom langgraph.graph.message import AnyMessage, add_messages
from langgraph.prebuilt import InjectedState
from langchain_core.runnables import RunnableConfig
from langchain_core.tools import toolclass State(TypedDict):messages: Annotated[list[AnyMessage], add_messages]foo: str@tool
def get_fligh_info(config: RunnableConfig,state: Annotated[dict, InjectedState],foo: Annotated[str, InjectedState("foo")]):"""获取乘客的航班信息"""configuration = config.get("configurable", {})passenger_id = configuration.get("passenger_id")print(f"传入的passenger_id:{passenger_id}")print(f"传入的state:{state}")print(f"传入的foo:{foo}")return {"name":"老谢", "flight": "AX123"}

测试代码

  • graph定义

定义一个工具用于获取乘客的航班信息,定义一个助手Agent用于工具的调用,同时创建graph如下图

from typing_extensions import Annotated, TypedDictfrom langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import Runnable, RunnableConfig
from langchain_core.tools import tool
from langgraph.graph.message import AnyMessage, add_messages
from langgraph.graph import StateGraph, START
from langgraph.prebuilt import ToolNode, InjectedState, tools_condition
from langgraph.checkpoint.memory import MemorySaverclass State(TypedDict):messages: Annotated[list[AnyMessage], add_messages]foo: str@tool
def get_fligh_info(config: RunnableConfig,state: Annotated[dict, InjectedState],foo: Annotated[str, InjectedState("foo")]):"""获取乘客的航班信息"""configuration = config.get("configurable", {})passenger_id = configuration.get("passenger_id")print(f"传入的passenger_id:{passenger_id}")print(f"传入的state:{state}")print(f"传入的foo:{foo}")return {"name":"老谢", "flight": "AX123"}class Assistant:def __init__(self, runnable: Runnable):self.runnable = runnabledef __call__(self, state: State, config: RunnableConfig):result = self.runnable.invoke(state)return {"messages": result, "foo": "bar"}assistant_system_prompt = "你是航空公司的专业助手,你需要协助用户完成查询操作并解答相关问题"
assistant_prompt = ChatPromptTemplate.from_messages([("system",assistant_system_prompt,),("placeholder", "{messages}"),],
)
assistant_tool = [get_fligh_info]
assistant_runnable = assistant_prompt | llm.bind_tools(assistant_tool)
assistant = Assistant(assistant_runnable)# node定义
builder = StateGraph(State)
builder.add_node("assistant", assistant)
builder.add_node("tools", ToolNode(assistant_tool))# edge定义
builder.add_edge(START, "assistant")
builder.add_conditional_edges("assistant", tools_condition)
builder.add_edge("tools", "assistant")
memory = MemorySaver()
graph = builder.compile(checkpointer=memory)
  • graph调用
import uuid
thread_id = str(uuid.uuid4())
config = {"configurable": {"thread_id": thread_id, "passenger_id": 1234}}
events= graph.stream({"messages": ("user", "帮我查询一下航班信息")}, config, stream_mode="updates")
for event in events:continue
传入的passenger_id:1234
传入的state:{'messages': [HumanMessage(content='帮我查询一下航班信息', id='ceaf9e61-0141-4a4a-af93-2973c4a6f6ec'), AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_dMELZC2UM7gWMatoPwTZQwpx', 'function': {'arguments': '{}', 'name': 'get_fligh_info'}, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 29, 'prompt_tokens': 86, 'total_tokens': 115}, 'model_name': 'gpt-4', 'system_fingerprint': 'fp_e49e4201a9', 'finish_reason': 'tool_calls', 'logprobs': None, 'content_filter_results': {}}, id='run-d68e4eaa-cd94-49fa-9200-2360a786a4fe-0', tool_calls=[{'name': 'get_fligh_info', 'args': {}, 'id': 'call_dMELZC2UM7gWMatoPwTZQwpx', 'type': 'tool_call'}], usage_metadata={'input_tokens': 86, 'output_tokens': 29, 'total_tokens': 115})], 'foo': 'bar'}
传入的foo:bar

参考文档

https://github.com/webup/notebooks/blob/main/langgraph-tool-node.ipynb

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C语言从头学58——学习头文件math.h(一)
  • 基于深度学习的蛋白质结构预测
  • 【spring】 Jackson :@JsonIgnore 注解
  • 校园二手数码交易系统小程序的设计
  • nnunetv2系列:torch转onnx
  • AI学习指南深度学习篇-带动量的随机梯度下降法Python实践
  • 技术美术一百问(01)
  • 基于CNN-BiGUR的恶意域名检测方法
  • IDC基础学习笔记
  • Pycharm Remote Development 报错解决
  • HTTP 协议和 APACHE 服务
  • TikTok运营需要的独立IP如何获取?
  • Redis 入门 - 五大基础类型及其指令学习
  • 代码随想录冲冲冲 Day41 动态规划Part9
  • Mysql | 知识 | 事务隔离级别
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 3.7、@ResponseBody 和 @RestController
  • learning koa2.x
  • Meteor的表单提交:Form
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • React-Native - 收藏集 - 掘金
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 从setTimeout-setInterval看JS线程
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 工程优化暨babel升级小记
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 你不可错过的前端面试题(一)
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 微信小程序设置上一页数据
  • 我建了一个叫Hello World的项目
  • 小程序01:wepy框架整合iview webapp UI
  • 小李飞刀:SQL题目刷起来!
  • 学习JavaScript数据结构与算法 — 树
  • ###C语言程序设计-----C语言学习(6)#
  • #QT(一种朴素的计算器实现方法)
  • #每天一道面试题# 什么是MySQL的回表查询
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (3)选择元素——(17)练习(Exercises)
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (C语言)逆序输出字符串
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (windows2012共享文件夹和防火墙设置
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (一) 初入MySQL 【认识和部署】
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET DataGridView数据绑定说明
  • .NET Framework 3.5安装教程
  • .NET 的程序集加载上下文