新闻详情

新闻详情

首页 / 资讯中心 / 详情

当 AI Agent 调用工具时,用户 ID 从哪来?——Spring AI ToolContext 传值实战

发布时间:2026/9/16 11:20:36来源:尧图网络
当 AI Agent 调用工具时,用户 ID 从哪来?——Spring AI ToolContext 传值实战
一个绕不开的问题你在用 Spring AI 开发 Agent 应用,一切都很美好——模型能理解自然语言,能自主决定调用哪个工具、传什么参数,直到你遇到了这样一个场景:@Tool(description="查询用户账户余额")StringgetBalance(StringaccountType){returnbankService.getBalance(userId,accountType);// ^^^^^^// 这个 userId 从哪来?}用户 ID 不能让 LLM 填。它属于运行时上下文,是请求进来时应用层已经确定的信息,不应该、也不能让模型来"猜"。类似的场景很多:用户 ID、租户 ID——多租户系统中的安全边界会话 ID——需要关联当前对话上下文权限 Token——工具需要携带鉴权信息访问外部 API请求来源、渠道标识——工具行为需要根据来源差异化这类参数有一个共同特征:它们属于"确定的上下文",不是 LLM 应该生成的"推理参数"。如果把它们混入工具的输入参数让模型来填,轻则幻觉(模型编造一个 userId),重则越权(模型填了别人的 userId)。Spring AI 提供了ToolContext机制来优雅地解决这个问题。ToolContext 是什么一句话概括:ToolContext 是一个由应用层注入、对 LLM 不可见的键值对容器,在工具执行时自动传递给工具方法。它的核心设计思想:┌──────────────┐ toolContext(Map) ┌──────────────┐ │ Application │ ──────────────────────────▶│ Tool │ │ (应用层) │ userId, tenantId, ... │ (工具方法) │ └──────────────┘ └──────────────┘ ┌──────────────┐ toolInput(参数) ┌──────────────┐ │ LLM │ ─────────────────────▶│ Tool │ │ (大语言模型) │ accountType, ... │ (工具方法) │ └──────────────┘ └──────────────┘LLM 负责填充的:工具的业务参数(如accountType)——模型根据用户意图推理得出应用层负责注入的:上下文参数(如userId)——应用层在调用时确定,透传给工具两条路径,互不干扰。LLM 完全感知不到 ToolContext 的存在,既不会在工具的 JSON Schema 中看到它,也不会试图为它生成值。具体用法Spring AI 提供了两种等价的工具定义方式,都支持 ToolContext:方式一:@Tool注解式——在方法签名中声明 ToolContext将ToolContext作为方法的最后一个参数,Spring AI 会自动注入:classCustomerTools{@Tool(description="查询客户信息")CustomergetCustomerInfo(Longid,ToolContexttoolContext){// 从 ToolContext 中取出应用层注入的租户 IDStringtenantId=(String)toolContext.getContext().get("tenantId");returncustomerRepository.findById(id,tenantId);}@Tool(description="查询账户余额")StringgetBalance(StringaccountType,ToolContexttoolContext){StringuserId=(String)toolContext.getContext().get("userId");returnbankService.getBalance(userId,accountType);}}注意:ToolContext参数对模型是隐藏的。模型只看到id和accountType,不会看到ToolContext。方式二:BiFunctionT, ToolContext, R编程式——函数式定义等价地,用BiFunction定义工具逻辑,第二个参数就是ToolContext:publicclassAccountInfoToolimplementsBiFunctionString,ToolContext,String{@OverridepublicStringapply(Stringquery,ToolContexttoolContext){StringuserId=(String)toolContext.getContext().get("userId");StringtenantId=(String)toolContext.getContext().get("tenantId");if(userId==null){return"用户未登录,无法查询";}returnaccountService.query(userId,tenantId,query);}}// 构建 ToolCallbackToolCallbackaccountTool=FunctionToolCallback.builder("get_account_info",newAccountInfoTool()).description("查询当前用户的账户信息").inputType(String.class).build();两种方式完全等价,选择哪种取决于你的编码风格:注解式更简洁,适合工具逻辑简单的场景编程式更灵活,适合需要复杂构造或复用的场景在调用端注入 ToolContext定义好工具后,在调用时注入上下文数据。根据入口不同,方式略有差异。ChatClient 入口Stringresponse=ChatClient
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Ubuntu上部署Jira与Confluence实战:MySQL配置与运维避坑指南 2026/9/16 22:26:46

Ubuntu上部署Jira与Confluence实战:MySQL配置与运维避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
LeetCode-Book 图解 LCR 171 训练计划 V:双指针求解两链表相交节点(含 Python / Java / C++ 实现) 2026/9/16 22:26:46

LeetCode-Book 图解 LCR 171 训练计划 V:双指针求解两链表相交节点(含 Python / Java / C++ 实现)

LeetCode-Book 图解 LCR 171 训练计划 V:双指针求解两链表相交节点(含 Python / Java / C 实现) 【免费下载链接】LeetCode-Book 《剑指 Offer》《图解算法数据结构》《Krahets 笔面试精选 88 题》Python, Java, C 解题代码 项目地址: http…

阅读更多 →
cool-retro-term fileio 模块解析:配置读写与文件IO的C++实现细节 2026/9/16 22:26:46

cool-retro-term fileio 模块解析:配置读写与文件IO的C++实现细节

cool-retro-term fileio 模块解析:配置读写与文件IO的C实现细节 【免费下载链接】cool-retro-term A good looking terminal emulator which mimics the old cathode display... 项目地址: https://gitcode.com/GitHub_Trending/co/cool-retro-term cool-ret…

阅读更多 →
llama.cpp 三步容器化部署:免编译,直出 OpenAI 兼容推理服务 2026/9/16 22:26:46

llama.cpp 三步容器化部署:免编译,直出 OpenAI 兼容推理服务

llama.cpp 三步容器化部署:免编译,直出 OpenAI 兼容推理服务 【免费下载链接】llama.cpp LLM inference in C/C 项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp 只要机器装好 Docker,三条命令就能把 llama.cpp 部署成 OpenAI 兼容的推理服务:拉官方镜像、…

阅读更多 →
多视图学习实战指南:从CCA到深度模型与业务落地 2026/9/16 22:26:46

多视图学习实战指南:从CCA到深度模型与业务落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Rocky Linux 9 离线环境部署 Docker 完整实战指南 2026/9/16 22:23:45

Rocky Linux 9 离线环境部署 Docker 完整实战指南

Rocky Linux 9 离线环境部署 Docker,听起来就是个运维的常规操作,但真正在内网交付环境里经历过一次,你就知道这事远没有“拷个 rpm 包过去装上”这么简单。最近我刚帮一个做等保改造的项目组搞定了一批物理隔离服务器,没有外网&a…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞