@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-MethodMcp-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/

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