发布时间:2026/8/19 18:25:39
服务框架源码分析,上下文和工具如何分工 服务框架源码分析上下文和工具如何分工RAG 服务把检索结果、上下文和工具调用放进一次请求前先要厘清数据由谁负责、在哪一层限额、失败时怎样表达。本文以 Spring Boot 的接口边界为线索不把演练现象当作生产结论。拆开日志记录的 JSON 请求体一看里面包含了整套系统 32 个 Tool Calling 的 JSON Schema 定义加上前 15 轮没有过期的完整对话历史。大模型光是首字 Prefill 阶段就耗费了 4.8 秒。在 Spring Boot 中集成大模型能力时很多开发团队习惯把上下文Context和工具Tool/Function混在一起一股脑往 Prompt 里塞。上下文是给模型提供“状态与事实”的而工具是给模型提供“动作与能力”的。一旦两者的分工界限模糊不仅会让 Token 开销呈指数级暴涨更会导致模型因工具过多产生 Hallucination幻觉调用。# 过滤日志中单次 Tool Calling 相关的 Token 消耗量与耗时数据 grep -E TOKEN_USAGE|TOOL_INVOKE_TIME /var/log/spring-boot-ai.log | tail -n 20 # 使用 curl 测试 Agent 路由接口打印出响应头部与 HTTP 状态码 curl -i -X POST http://localhost:8080/v1/ai/context-orchestrate \ -H Content-Type: application/json \ -d {session_id:sess_99381,user_input:查询用户 10086 的未支付订单并发送催缴短信}动态上下文编排与工具分发流图要在 Spring Boot 内部优雅实现上下文与工具的分工必须在 Controller / Service 层之前增加一道上下文与工具编排器Orchestration Layer。整体流转的核心逻辑上下文Context做减法通过滑动窗口与滚动摘要机制将膨胀的对话历史严格压制在 Token 预算限制线以内。工具Tools做按需加载绝不注册全局全量 Tools而是通过意图路由Intent Matcher扫描当前 Request 依赖的最小工具子集实现毫秒级的工具注入。生产级上下文编排与工具分工器源码实现下面基于 Spring Boot 实现一套带 Token 预算控制与 Tool 按需过滤的编排器。package com.company.ai.boot.orchestrator; import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; Service public class AgentContextOrchestrator { private static final Logger log LoggerFactory.getLogger(AgentContextOrchestrator.class); private static final int MAX_CONTEXT_TOKENS 3000; private final MapString, ToolDefinition globalToolRegistry new ConcurrentHashMap(); private final ObjectMapper objectMapper; public AgentContextOrchestrator(ObjectMapper objectMapper) { this.objectMapper objectMapper; registerDefaultTools(); } private void registerDefaultTools() { globalToolRegistry.put(queryOrder, new ToolDefinition(queryOrder, 查询用户订单, {\type\:\object\,\properties\:{\user_id\:{\type\:\string\}}})); globalToolRegistry.put(sendSms, new ToolDefinition(sendSms, 发送短信通知, {\type\:\object\,\properties\:{\phone\:{\type\:\string\},\msg\:{\type\:\string\}}})); globalToolRegistry.put(queryStock, new ToolDefinition(queryStock, 查询商品库存, {\type\:\object\,\properties\:{\sku_id\:{\type\:\string\}}})); } public ExecutionPayload orchestrate(String userInput, ListChatMessage historyMessages) { log.info(开始编排上下文与工具当前历史消息条数: {}, historyMessages.size()); // 1. 上下文按 Token 预算从后往前截断Pruning ListChatMessage prunedHistory pruneContext(historyMessages, MAX_CONTEXT_TOKENS); // 2. 根据用户输入做工具意图路由Scoped Tools Loading ListToolDefinition matchedTools resolveRelevantTools(userInput); log.info(编排完成: 保留历史消息 {} 条, 注入工具 {} 个, prunedHistory.size(), matchedTools.size()); return new ExecutionPayload(userInput, prunedHistory, matchedTools); } private ListChatMessage pruneContext(ListChatMessage history, int maxTokenBudget) { ListChatMessage result new ArrayList(); int accumulatedTokens 0; // 从最近的消息开始倒序累加 for (int i history.size() - 1; i 0; i--) { ChatMessage msg history.get(i); int estimatedToken estimateToken(msg.content()); if (accumulatedTokens estimatedToken maxTokenBudget) { log.warn(触发 Token 预算墙截断第 0 到第 {} 条早期历史, i); break; } accumulatedTokens estimatedToken; result.add(0, msg); // 保持时间正序 } return result; } private ListToolDefinition resolveRelevantTools(String userInput) { ListToolDefinition selected new ArrayList(); // 简单意图路由规则生产环境可换为 Fast Embeddings 相似度匹配 if (userInput.contains(订单) || userInput.contains(买)) { selected.add(globalToolRegistry.get(queryOrder)); } if (userInput.contains(短信) || userInput.contains(通知)) { selected.add(globalToolRegistry.get(sendSms)); } if (userInput.contains(库存) || userInput.contains(货)) { selected.add(globalToolRegistry.get(queryStock)); } // 如果均未匹配只给默认查询类工具决不全量注入 if (selected.isEmpty()) { selected.add(globalToolRegistry.get(queryOrder)); } return selected; } private int estimateToken(String text) { if (text null || text.isBlank()) return 0; // 中文按 1 字符 ≈ 0.6 Token 粗略换算 return (int) (text.length() * 0.6); } public record ChatMessage(String role, String content) {} public record ToolDefinition(String name, String description, String jsonSchema) {} public record ExecutionPayload(String prompt, ListChatMessage history, ListToolDefinition tools) {} }上下文与工具接口契约设计规范在 Spring Boot Controller 提供给前端或下游微服务时错误语义与契约必须极其清晰。1. 明确区别“业务逻辑失败”与“Tool Calling 失败”模型调用工具失败时如queryOrder返回用户不存在这属于Tool Business Failure应当将错误信息原样作为 Tool Message 返回给 LLM 重新生成回答而不是在 HTTP 层直接抛出500 Internal Server Error。2. 状态隔离与错误语义定义在 RESTful API 返回时建议采用三级状态码区分问题属性{ code: TOOL_EXECUTION_TIMEOUT, message: 下游订单微服务响应超时1500ms, error_type: ENGINEERING_RETRYABLE, detail: { target_tool: queryOrder, elapsed_ms: 1502 } }MODEL_SCHEMA_INVALID模型生成的工具参数无法通过 JSON Validation网关可自动重试一次。ENGINEERING_RETRYABLE工具执行抛出网络超时重试闸门接管。CONTEXT_WINDOW_EXCEEDED对话历史超长强行触发压缩。分清了上下文的“记忆”角色与工具的“手脚”角色Spring Boot 应用在大模型交互中才能保持高吞吐和低耗时。

相关新闻

2026/8/19 18:20:33

用系统语言重写服务前的评审方法

用系统语言重写服务前的评审方法 评审先追不变量 Rust 重写服务的评审不该停在“能否编译”。先把 FFI 边界、异步取消与错误码映射写成可检查的约束:什么情况下允许、失败时由谁释放资源、调用方能依赖什么。随后沿真实调用链检查这些约束有没有被绕开。 逐项检查 …

2026/8/19 19:31:07

微调大模型时误吞用户隐私数据?我用生成式AI课程补上的合规检查清单

微调大模型时误吞用户隐私数据?我用生成式AI课程补上的合规检查清单 法务的紧急会议通知:从数据泄露到合规觉醒 上周四下午,我刚部署完微调后的客服助手模型,法务部的邮件就来了--有用户投诉生成的回复中包含了其他客户的订单信息。在紧急会议上,法务总监拍着桌子问:「你们微…

2026/8/19 19:31:07

特征存储方案选了三个月,CTO 最后拍板时我只用了这张对比表

特征存储方案选了三个月,CTO 最后拍板时我只用了这张对比表 特征存储:AI工程化路上最容易被低估的基础设施 去年我们团队决定引入生成式AI能力时,原本以为最难的是模型选型,没想到卡在特征存储这个基础设施环节整整三个月。这三个月里,我们从技术选型、架构设计到生产部署,踩遍…

2026/8/19 19:31:06

AIGC工具试了十几个,为什么我回头先学了机器学习入门?

AIGC工具试了十几个,为什么我回头先学了机器学习入门? 从AIGC狂欢到基础缺失:一名转行开发者的觉醒之路 上个月在GitHub Trending看到第5个AutoGPT变种项目时,我终于按捺不住,用Stable DiffusionLangChain拼了个自动生成电商文案的流水线。这个过程中我遇到了三个典型的技术卡…

2026/8/19 19:26:06

智能体协作灰度发布的检查项

智能体协作灰度发布的检查项 先把边界说清楚 本文讨论「AI Agent 系统设计与多 Agent 协作架构:灰度发布、回滚与版本兼容方案」的设计与验证方法。文中的场景用于说明排查和决策过程,不对应某次线上事故,也不代表任何项目的性能数据。 灰度的…

2026/8/19 4:14:28

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/19 15:09:57

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/19 0:00:35

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/19 0:00:35

AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

1. 项目概述:当AI开始“猜”数学定理 最近在AI研究圈里,一个名为“Moonshine”的项目引起了不小的讨论。这名字本身就挺有意思,直译是“月光”,但在数学史上,它特指一个神秘而美丽的联系——魔群月光猜想,连…

2026/8/19 0:00:36

Agentic Web:构建智能体原生网络的基础设施挑战与四大支柱

1. 从“被动网络”到“能动网络”:一个正在发生的范式转移 如果你最近关注AI和Web技术的前沿动态,可能会频繁听到“Agentic Web”这个词。它不像“Web3”那样带着浓厚的金融色彩,也不像“元宇宙”那样充满科幻感,但它所描绘的未来…

2026/8/18 18:23:10

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/19 4:14:38

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/19 16:39:34

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…