@Tool、ToolCallback、MCP工具和ToolSearchToolCallingAdvisor怎么选?Spring AI工具架构指南

文章摘要

Spring AI 2.0提供多种工具接入方式:@Tool适合本地Java方法快速暴露;ToolCallback适合动态注册、明确Schema和基础设施封装;MCP工具适合跨语言、跨服务和独立团队共享;ToolSearchToolCallingAdvisor则解决几十到数百个工具全部注入Prompt造成的Token浪费和选择准确率下降。本文从部署边界、权限、版本、性能、工具数量和团队协作等方面,给出企业项目的分层选型方法。

一、四种能力解决的问题不同

@Tool
→ 如何快速把Java方法变成工具

ToolCallback
→ 如何以编程方式定义和管理工具

MCP工具
→ 如何跨进程、跨语言、跨团队共享工具

ToolSearchToolCallingAdvisor
→ 工具太多时如何按需发现

它们不是简单互相替代。

一个企业Agent可以同时使用:

本地@Tool
+远程MCP工具
+ToolSearch按需检索

二、@Tool适合什么场景

示例:

public class InventoryTools {

    @Tool(
        description = "根据商品编码查询当前可用库存"
    )
    public InventoryResult queryInventory(
            @ToolParam(
                description = "企业内部商品编码"
            )
            String sku
    ) {
        return inventoryService.query(sku);
    }
}

优点:

  • 上手快;
  • Java类型自动生成Schema;
  • 与Spring服务调用自然;
  • 本地方法延迟低;
  • 适合少量稳定工具;
  • 易于单元测试。

适合:

  • 同一个Spring Boot应用;
  • 工具与业务服务紧密耦合;
  • 工具数量较少;
  • 不需要跨语言;
  • 同一团队维护。

不适合:

  • 多个应用都要复用;
  • 工具需要独立扩缩容;
  • 不同语言客户端;
  • 需要独立发布版本;
  • 高风险工具需要专门网关。

三、ToolCallback适合什么场景

编程式定义:

@Bean
ToolCallback queryInventoryTool(
        InventoryService inventoryService
) {
    return FunctionToolCallback
            .builder(
                    "query_inventory",
                    inventoryService::query
            )
            .description(
                    "根据SKU查询实时库存"
            )
            .inputType(
                    InventoryRequest.class
            )
            .build();
}

ToolCallback适合:

  • 动态创建工具;
  • 从配置中心加载;
  • 封装第三方API;
  • 统一增加重试与指标;
  • 明确工具名称和Schema;
  • 按租户选择工具;
  • 将工具放进注册表。

例如:

public interface EnterpriseToolRegistry {

    List getTools(
            String tenantId,
            String userId,
            String scenario
    );
}

调用前根据权限返回工具集合。

四、为什么Spring AI 2.0更强调显式ToolCallback

旧版可以依赖:

Spring Bean名称
+toolNames()

隐式找到函数。

这种方式存在:

  • 名称重构后运行时才失败;
  • 不清楚哪些Bean会暴露给模型;
  • 权限边界模糊;
  • 工具Schema难以统一治理;
  • 多租户选择困难。

Spring AI 2.0改为显式传递:

.tools(queryInventoryTool)

让工具暴露成为清晰的安全决策。

五、MCP工具适合什么场景

MCP Server把工具作为独立服务暴露。

架构:

Spring AI应用
→ MCP Client
→ MCP Server
→ 企业系统

适合:

  • 跨语言;
  • 多个Agent复用;
  • 独立团队维护;
  • 工具独立扩缩容;
  • SaaS连接器;
  • 数据平台;
  • 浏览器、文件、数据库等通用能力;
  • 企业统一工具市场。

例如:

Java客服Agent
Python研究Agent
Node.js办公Agent

都可以调用同一个订单MCP Server。

六、MCP的代价

  • 网络延迟;
  • 远程鉴权;
  • 协议版本兼容;
  • 服务发现;
  • 超时和熔断;
  • 网关配置;
  • 工具列表缓存;
  • 独立运维;
  • 数据跨边界;
  • 供应链风险。

如果工具只被一个Spring Boot应用使用,把它拆成MCP Server可能是过度设计。

七、MCP 2026-07-28正式版带来的影响

新规范无状态化后,MCP Server更容易:

普通负载均衡
+水平扩展
+无Sticky Session

Mcp-Method和Mcp-Name让网关可以按工具方法和名称路由。

工具平台可以形成:

MCP Gateway
→ 低风险查询集群
→ 高风险交易集群
→ 文件处理集群
→ 长任务集群

但业务状态仍需外置。

八、工具数量少时,不需要ToolSearch

如果只有:

5—15个工具

直接传给模型通常最简单。

标准ToolCallingAdvisor会把工具定义注入模型上下文,模型根据描述选择。

优点:

  • 行为直接;
  • 调试简单;
  • 没有工具搜索误差;
  • 调用步骤更少。

九、工具数量多时为什么会出问题

假设有100个工具,每个Schema平均500 Token:

100 × 500
= 50000 Token

每次请求都发送工具定义,会造成:

  • 输入成本上升;
  • 首次响应变慢;
  • 模型选择准确率下降;
  • 相似工具互相干扰;
  • 上下文留给业务数据的空间减少。

这时适合:

ToolSearchToolCallingAdvisor

十、ToolSearchToolCallingAdvisor如何工作

传统方式:

全部工具Schema
→ 一次性发送给模型

ToolSearch方式:

先只暴露工具搜索能力
→ 模型描述需要什么工具
→ 从工具索引找相关工具
→ 只注入少量工具
→ 再执行调用

可以使用:

  • Regex;
  • Lucene;
  • Vector;

三种索引策略。

配置:

spring.ai.chat.client.tool-search-advisor.enabled=true
spring.ai.chat.client.tool-search-advisor.tool-index-type=vector

向量模式需要VectorStore。

十一、ToolSearch为什么需要Session ID

工具索引与发现结果按会话隔离。

请求应传:

.advisors(spec -> spec.param(
        ChatMemory.CONVERSATION_ID,
        conversationId
))

多租户项目不能复用同一个Session ID,否则可能出现:

  • 工具集合串用;
  • 发现结果污染;
  • 权限泄露;
  • 会话A使用会话B已发现的工具。

十二、四种方案对比

维度 @Tool ToolCallback MCP工具 ToolSearch
部署位置 本地 本地或适配层 远程服务 工具发现层
上手成本 低 中 高 中
跨语言 否 否 是 取决于底层工具
网络开销 无 通常无 有 增加一次发现
动态工具 一般 强 强 强
独立版本 弱 中 强 不负责版本
工具数量 少量 少到中量 中到大量 大量
权限治理 应用内 可集中封装 服务与网关 必须按会话隔离
团队复用 弱 中 强 强化大工具集

十三、如何按业务边界选择

同一进程的领域能力

@Tool

例如:

  • 查询当前用户信息;
  • 读取本地配置;
  • 调用同进程Service。

需要统一封装的本地工具

ToolCallback

例如:

  • 动态REST API工具;
  • 配置化工具;
  • 按租户注册;
  • 加统一审计。

跨服务和跨语言共享

MCP

例如:

  • 企业订单平台;
  • 数据平台;
  • Git仓库;
  • 文档服务;
  • 浏览器自动化。

工具超过30个

评估ToolSearch

不要只按数字决定,还应测试:

  • Token;
  • 选择准确率;
  • 延迟;
  • 发现失败率;
  • 额外轮次。

十四、高风险工具应该放在哪里

高风险工具包括:

  • 付款;
  • 退款;
  • 删除;
  • 权限修改;
  • 发布;
  • 合同发送;
  • 数据导出。

推荐:

独立服务或MCP Server
+专用网关
+细粒度OAuth Scope
+用户确认
+幂等
+审计

不要把高风险逻辑直接写成一个无保护的本地@Tool。

模型只能生成“执行建议”,最终决策由业务策略层完成。

十五、工具版本如何管理

工具Schema变化可能导致旧客户端或Prompt失效。

建议记录:

tool_name
tool_version
input_schema_version
output_schema_version
owner
risk_level
deprecated_at

兼容升级:

create_order_v1
create_order_v2

或保持工具名不变,通过兼容Schema演进。

MCP正式版的功能生命周期规则也可以作为工具治理参考:

Active
→ Deprecated
→ Removed

十六、一个推荐的企业架构

Spring AI ChatClient
→ ToolCallingAdvisor
→ EnterpriseToolRegistry
├─ 本地@Tool
├─ ToolCallback适配器
└─ MCP ToolCallbackProvider
        ↓
  Tool Policy Engine
        ↓
  参数校验、权限、审批、幂等、审计

工具搜索层位于工具注册表与模型之间,只负责发现,不负责授权。

十七、不要让模型决定工具权限

错误做法:

把所有工具给模型
→ 在Prompt中告诉它不要乱用

正确做法:

认证用户
→ 计算允许工具集合
→ 只把允许工具交给模型

工具是否可见本身就是权限控制的一部分。

十八、选型决策树

是否只在一个Java应用内使用?
→ 是:@Tool或ToolCallback

是否需要动态注册和统一封装?
→ 是:ToolCallback

是否跨语言、跨服务、跨团队?
→ 是:MCP

可用工具是否很多?
→ 是:ToolSearchToolCallingAdvisor

是否高风险动作?
→ 独立策略、审批和审计,不论使用哪种工具形式

总结

四种能力的分工可以概括为:

@Tool
→ 最快暴露本地方法

ToolCallback
→ 最灵活定义和治理工具

MCP
→ 最适合跨边界共享工具

ToolSearch
→ 最适合大规模工具按需发现

企业项目通常不是四选一,而是根据部署边界和风险组合使用。

延伸阅读

如果你正在关注企业级 AI 应用、Spring AI、RAG、Agent 与 MCP 工程化落地,欢迎访问 智元界:

https://www.zyentor.com/

智元界将持续分享可运行的技术实战、架构设计、问题排查与企业应用案例。