【Spring Boot 4】Spring Boot 4.0 AI Agent实战:Skills Agent + MCP协议集成
Java开发者如何用Spring Boot 4.0构建企业级AI Agent?本文从ChatClient核心API、Skills Agent渐进式披露设计、MCP协议标准化工具集成三个维度,带你完成一个完整的AI Agent工程化方案。
前言
2026年6月,Spring Boot 4.1.0 GA正式发布,基于Spring Framework 7.0全面重构。与此同时,Spring AI 2.0.0 GA同步发布,标志着Java生态中AI Agent开发正式进入"生产级"时代。
作为一名在LLM工程化领域持续深耕的技术博主,我的付费专栏**"大模型工程师修炼手记"**(30篇系列)已经覆盖了大模型从微调、部署、推理优化到RAG系统的全链路工程化知识。而本文,是专栏在AI Agent工程化实战方向的重要补充------将Spring生态的工程化基因与大模型的智能决策能力结合,为Java开发者打开Agent开发的新范式。
本文你将学到:
- Spring Boot 4.0 + Spring AI 2.0的Agent全景架构设计
- ChatClient作为AI交互统一入口的核心API与三种调用模式
- Skills Agent渐进式披露(Progressive Disclosure)设计模式的原理与实践
- Function Calling、MCP协议、Skills Agent三种工具调用模式的深度对比与选型
- 基于Spring Boot 4.0的MCP协议完整集成实战
- 生产环境下的性能优化策略
一、Spring Boot 4.0 + AI Agent全景架构
1.1 Spring Boot 4.1.0 GA核心变化
Spring Boot 4.1.0 GA是一次里程碑式的升级,其核心变化体现在以下几个方面:
底层架构重构: 基于Spring Framework 7.0构建,最低要求Java 17,推荐Java 21+。全面拥抱虚拟线程(Virtual Threads),对AI Agent场景下的大量IO密集型调用(如流式推理、工具链编排)提供了天然的性能优势。Spring Framework 7.0引入的RouterFunction增强和反应式编程模型升级,也为Agent的异步编排奠定了基础。
自动配置增强: Spring Boot 4.0重构了自动配置引擎,引入了条件化配置的优先级排序机制。对于AI Agent场景,这意味着多模型供应商(OpenAI、Anthropic、Ollama等)的自动配置可以更优雅地共存与切换。
启动性能优化: 通过AOT(Ahead-of-Time)编译和GraalVM原生镜像的深度整合,Spring Boot 4.0应用的启动时间进一步缩短,这对需要快速扩缩容的Agent服务尤为重要。
1.2 Spring AI 2.0.0 GA的Agent能力矩阵
Spring AI 2.0.0 GA是Spring生态在AI领域的集大成之作,其Agent能力矩阵涵盖以下关键维度:
| 能力域 | 核心组件 | 说明 |
|---|---|---|
| 模型接入 | ChatModel / EmbeddingModel |
统一的模型抽象层,支持OpenAI、Anthropic、Ollama、通义千问等20+模型 |
| 交互入口 | ChatClient |
Fluent API设计的统一交互入口,支持同步、流式、工具调用三种模式 |
| 工具调用 | @Tool / @McpTool |
声明式工具定义,支持Function Calling和MCP两种协议 |
| Agent编排 | SkillsAgent |
渐进式披露设计模式,按需加载工具能力 |
| 记忆管理 | ChatMemory |
对话上下文管理,支持多种存储后端 |
| 结构化输出 | BeanOutputConverter |
将模型输出直接映射为Java对象 |

上图展示了Spring Boot 4.0 AI Agent的完整架构分层。从底层的模型适配层,到中间的工具协议层(Function Calling + MCP),再到上层的Agent编排层(Skills Agent),每一层都保持了Spring生态一贯的抽象一致性和可扩展性。
二、ChatClient:AI交互的统一入口
2.1 ChatClient核心API设计理念
在Spring AI 2.0之前,开发者直接与ChatModel交互,需要手动处理Prompt拼接、参数注入、响应解析等底层细节。Spring AI 2.0引入的ChatClient是对这些底层操作的高层抽象 ,其设计理念借鉴了Spring Data的Repository抽象和Spring Web的WebClient设计------用Fluent API屏蔽复杂性,用默认约定减少配置量。
ChatClient的核心设计原则有三条:
- Fluent链式调用: 所有配置通过方法链完成,代码即文档
- 默认值合理: 开箱即用的配置能满足80%的场景
- 可组合可覆盖: 全局默认配置 + 请求级覆盖,灵活而不混乱
2.2 同步/流式/工具调用三种模式
ChatClient支持三种调用模式,覆盖了从简单对话到复杂Agent编排的全部场景:
同步模式: 最基础的调用方式,适用于单轮对话或简单的问答场景。调用call()方法,阻塞等待模型响应完成。
java
// 同步调用 - 最简单的形式
String response = chatClient.prompt()
.user("请用Java写一个快速排序算法")
.call()
.content();
流式模式: 适用于需要实时展示生成过程的场景,如聊天界面、实时翻译等。调用stream()方法,返回Flux<String>响应式流。
java
// 流式调用 - 实时输出
Flux<String> stream = chatClient.prompt()
.user("请详细解释Spring Boot自动配置原理")
.stream()
.content();
// 在WebFlux环境中直接返回SSE
@GetMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.stream()
.content();
}
工具调用模式: Agent能力的核心,允许模型自主决定调用外部工具。通过tools()方法注入工具函数,模型根据用户意图自动选择和执行。
java
// 工具调用模式
String response = chatClient.prompt()
.user("查询北京今天的天气并给出出行建议")
.tools(weatherService.getWeatherFunction(), mapService.getRouteFunction())
.call()
.content();
2.3 ChatClient配置与基础用法
以下是一个完整的ChatClient配置示例,展示了如何在Spring Boot 4.0中进行生产级配置:
java
@Configuration
public class ChatClientConfig {
@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
return builder
// 全局系统提示词
.defaultSystem("""
你是一个专业的Java技术助手,精通Spring生态全家桶。
回答时请结合代码示例,确保技术准确性。
如果问题超出你的知识范围,请诚实告知。
""")
// 全局默认工具
.defaultTools(codeSearchTool, documentationTool)
// 启用结构化输出
.defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory))
// 默认温度参数
.defaultOptions(ChatOptions.builder()
.temperature(0.7)
.topP(0.9)
.build())
.build();
}
}

上图展示了ChatClient从请求构建到响应返回的完整调用链路。用户请求经过System Prompt注入、工具注册、Advisor链处理、模型调用、工具执行循环、响应解析等多个阶段,最终返回结构化结果。其中Advisor链的设计借鉴了Servlet Filter的理念,可以在调用链中插入记忆管理、日志审计、Token计量等横切关注点。
三、Skills Agent:渐进式披露的Agent设计模式
3.1 Skills Agent核心概念
Skills Agent是Spring AI 2.0中引入的一种Agent设计模式,其核心思想源自UI/UX设计领域的**渐进式披露(Progressive Disclosure)**原则。
传统Function Calling的做法是将所有可用工具的描述一次性注入到模型的上下文中。当工具数量较少(10个以内)时,这种方式工作良好。但在企业级Agent场景中,工具数量往往达到数十甚至上百个------数据库查询工具、API调用工具、文件操作工具、消息通知工具......一次性注入所有工具描述会带来两个严重问题:
- Token浪费: 每个工具的描述占用数百Token,100个工具就是数万Token的固定开销
- 选择噪声: 过多的工具选项会降低模型的选择准确率,类似于"选择的悖论"
Skills Agent的解决方案是:不一次性暴露所有工具,而是根据用户意图分层级、按需加载工具。就像手机App不会把所有功能都堆在首屏,而是通过分类、搜索、层级导航来逐步引导用户找到所需功能。
具体来说,Skills Agent将工具组织为两层结构:
- 技能层(Skills): 高层能力描述,每个Skill是一组相关工具的"入口"。Skill的描述简洁精炼,Token开销小
- 工具层(Tools): 具体的执行函数,隶属于某个Skill。只有在模型选择了某个Skill后,该Skill下的具体工具才会被加载到上下文中
3.2 与传统Function Calling的区别
为了更清晰地理解Skills Agent的价值,我们对比一下传统Function Calling和Skills Agent的差异:
传统Function Calling流程:
用户提问 → [注入全部100个工具描述] → 模型选择工具 → 执行工具 → 返回结果
Skills Agent流程:
用户提问 → [注入10个Skill描述] → 模型选择Skill → [注入该Skill下的5个工具描述] → 模型选择工具 → 执行工具 → 返回结果
在工具数量较多的场景中,Skills Agent的优势尤为明显:初始上下文中的Token开销从"100个工具的完整描述"降为"10个Skill的简短描述",减少了约80%的Token消耗。同时,模型每次只需要在较小的工具集中做选择,准确率显著提升。
3.3 Skills Agent配置
以下是一个Skills Agent的配置示例,展示了如何定义技能层级和工具注册:
java
@Configuration
public class SkillsAgentConfig {
@Bean
public SkillsAgent skillsAgent(ChatClient.Builder builder) {
return SkillsAgent.builder(builder)
// 定义技能组 - 数据查询技能
.skill("database_query", "数据库查询能力,支持SQL查询、表结构查询、数据统计")
.tool("executeSql", this::executeSql,
"执行SQL查询语句,返回查询结果")
.tool("describeTable", this::describeTable,
"查询数据库表的字段结构和索引信息")
.tool("getDataStats", this::getDataStats,
"获取表的数据量统计和分布信息")
// 定义技能组 - API集成技能
.skill("api_integration", "外部API集成能力,支持REST API调用和数据转换")
.tool("callRestApi", this::callRestApi,
"调用外部REST API并返回结构化响应")
.tool("transformData", this::transformData,
"对API响应数据进行格式转换和字段映射")
// 定义技能组 - 文件操作技能
.skill("file_operations", "文件处理能力,支持读写、搜索、格式转换")
.tool("readFile", this::readFile,
"读取文件内容,支持txt、csv、json等格式")
.tool("searchFiles", this::searchFiles,
"在指定目录中搜索匹配的文件")
.build();
}
// 调用Skills Agent
public String chat(String userMessage) {
return skillsAgent.chat(userMessage);
}
}

上图展示了Skills Agent的两阶段工具加载过程。第一阶段,模型基于用户意图从技能列表中选择合适的Skill(相当于"选择进入哪个功能模块");第二阶段,被选中的Skill下的具体工具被加载,模型再从中选择需要执行的工具函数。这种两阶段设计既减少了Token开销,又提高了工具选择的精确度。
四、三种工具调用模式对比:Function Calling vs MCP vs Skills
在Spring AI 2.0中,开发者有三种方式让Agent调用外部工具。理解它们的差异和适用场景,是做好技术选型的关键。
4.1 九维度对比
| 维度 | Function Calling | MCP协议 | Skills Agent |
|---|---|---|---|
| 工具定义方式 | Java方法 + @Tool注解 |
@McpTool注解 + MCP协议 |
分层Skill + Tool结构 |
| 协议类型 | HTTP直连模型API | 标准化MCP协议(HTTP/SSE) | 基于Function Calling上层封装 |
| 工具发现 | 编译时静态注册 | 运行时动态发现 | 两阶段渐进式发现 |
| 跨语言支持 | 不支持(绑定Java) | 天然支持(JSON协议) | 不支持(绑定Java) |
| Token效率 | 低(全量注入) | 中(按Server分组) | 高(按需加载) |
| 工具数量上限 | 20-30个为宜 | 100+(按Server拆分) | 100+(按Skill拆分) |
| 部署独立性 | 工具与Agent同进程 | 工具可独立部署为Server | 工具与Agent同进程 |
| 适合场景 | 工具少、快速原型 | 多团队协作、跨服务 | 复杂Agent、多技能场景 |
| 生产就绪度 | 成熟稳定 | 快速成熟中 | 较新,持续演进 |

4.2 选型建议
基于实战经验,我给出以下选型建议:
选Function Calling的场景:
- 工具数量在10个以内,无需复杂的工具管理
- 快速原型验证或个人项目
- 团队纯Java技术栈,不涉及跨语言协作
选MCP协议的场景:
- 多个团队分别维护不同的工具服务,需要标准化接口
- 工具服务需要独立部署、独立扩缩容
- 存在跨语言工具实现(Python算法服务、Go高性能服务等)
- 需要工具的运行时动态发现和热更新
选Skills Agent的场景:
- 工具数量多(30+),需要精细化的工具组织
- 对Token消耗敏感,需要优化上下文长度
- Agent能力需要分层管理(基础能力 + 高级能力 + 专家能力)
- 需要动态调整Agent的能力边界
生产环境的最佳实践是组合使用: 用MCP协议解决跨服务的工具标准化问题,用Skills Agent解决单Agent内的工具组织与Token优化问题。在下一节的实战中,我们将展示这种组合方案的具体实现。
五、实战:Spring Boot 4.0 + MCP协议集成
5.1 MCP依赖配置
MCP(Model Context Protocol)是Anthropic提出的开放式协议,用于标准化AI模型与外部工具之间的通信。Spring AI 2.0通过spring-ai-starter-mcp-client提供了第一公民级别的MCP支持。
首先,在pom.xml中添加MCP相关依赖:
xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.1.0</version>
</parent>
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring AI OpenAI Starter -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
<!-- Spring AI MCP Client -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client</artifactId>
</dependency>
<!-- Spring AI MCP Server (SSE传输) -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>2.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
5.2 MCP Client端配置
application.yml配置:
yaml
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
chat:
options:
model: gpt-4o
temperature: 0.7
mcp:
client:
# 配置MCP Server连接
servers-configuration: classpath:mcp-servers.json
mcp-servers.json配置:
json
{
"mcpServers": {
"database-tools": {
"transport": "sse",
"url": "http://localhost:8081/mcp"
},
"weather-tools": {
"transport": "sse",
"url": "http://localhost:8082/mcp"
},
"document-tools": {
"transport": "sse",
"url": "http://localhost:8083/mcp"
}
}
}
Java配置类:
java
@Configuration
public class McpClientConfig {
@Bean
public ChatClient agentChatClient(
ChatClient.Builder builder,
List<McpToolCallbackProvider> mcpToolProviders) {
// 收集所有MCP Server的工具
List<ToolCallback> allMcpTools = mcpToolProviders.stream()
.flatMap(provider -> provider.getToolCallbacks().stream())
.toList();
return builder
.defaultSystem("""
你是一个智能助手,可以查询数据库、获取天气信息、
搜索和分析文档。请根据用户需求选择合适的工具来完成任务。
""")
.defaultTools(allMcpTools.toArray(new ToolCallback[0]))
.defaultAdvisors(
new MessageChatMemoryAdvisor(chatMemory),
new SimpleLoggerAdvisor()
)
.build();
}
}
5.3 MCP Server端实现
MCP Server使用@McpTool注解声明式定义工具,Spring AI会自动将其暴露为标准的MCP协议端点:
java
@RestController
public class DatabaseMcpServer {
private final JdbcTemplate jdbcTemplate;
public DatabaseMcpServer(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@McpTool(description = "执行SQL查询并返回结果集。支持SELECT语句,自动限制返回1000行。")
public QueryResult executeQuery(
@ToolParam(description = "要执行的SQL查询语句") String sql) {
// 安全校验:仅允许SELECT语句
if (!sql.trim().toUpperCase().startsWith("SELECT")) {
throw new IllegalArgumentException("仅支持SELECT查询语句");
}
List<Map<String, Object>> results = jdbcTemplate.queryForList(sql);
return new QueryResult(results.size(), results);
}
@McpTool(description = "获取指定数据库表的 schema 信息,包括字段名、类型和注释。")
public TableSchema describeTable(
@ToolParam(description = "数据库名称") String database,
@ToolParam(description = "表名称") String tableName) {
String sql = """
SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
ORDER BY ORDINAL_POSITION
""";
List<Map<String, Object>> columns = jdbcTemplate.queryForList(
sql, database, tableName);
return new TableSchema(tableName, columns);
}
@McpTool(description = "列出指定数据库中的所有表,返回表名和行数。")
public List<TableInfo> listTables(
@ToolParam(description = "数据库名称") String database) {
String sql = """
SELECT TABLE_NAME, TABLE_ROWS, CREATE_TIME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = ?
ORDER BY TABLE_NAME
""";
return jdbcTemplate.queryForList(sql, database).stream()
.map(row -> new TableInfo(
(String) row.get("TABLE_NAME"),
((Number) row.get("TABLE_ROWS")).longValue(),
(String) row.get("CREATE_TIME")
))
.toList();
}
// DTO定义
record QueryResult(int rowCount, List<Map<String, Object>> data) {}
record TableSchema(String tableName, List<Map<String, Object>> columns) {}
record TableInfo(String name, long rows, String createTime) {}
}
5.4 完整的Agent调用链路代码示例
下面是一个完整的Controller,展示了从用户请求到Agent执行的完整链路:
java
@RestController
@RequestMapping("/api/agent")
public class AgentController {
private final ChatClient chatClient;
public AgentController(ChatClient chatClient) {
this.chatClient = chatClient;
}
@PostMapping("/chat")
public AgentResponse chat(@RequestBody ChatRequest request) {
long startTime = System.currentTimeMillis();
String response = chatClient.prompt()
.user(request.getMessage())
.call()
.content();
long duration = System.currentTimeMillis() - startTime;
return new AgentResponse(
response,
duration,
"success"
);
}
@PostMapping("/chat/stream")
public SseEmitter streamChat(@RequestBody ChatRequest request) {
SseEmitter emitter = new SseEmitter(60_000L);
chatClient.prompt()
.user(request.getMessage())
.stream()
.content()
.subscribe(
chunk -> {
try {
emitter.send(SseEmitter.event()
.data(chunk));
} catch (IOException e) {
emitter.completeWithError(e);
}
},
error -> emitter.completeWithError(error),
emitter::complete
);
return emitter;
}
}
record ChatRequest(String message) {}
record AgentResponse(String content, long durationMs, String status) {}
当用户发送"查询order表中最近7天的订单总额"这样的请求时,完整的执行链路如下:
- 请求接入: Controller接收用户请求,调用ChatClient
- Prompt构建: 注入系统提示词 + 用户消息 + MCP工具描述
- 模型推理: 模型分析意图,决定调用
executeQuery工具 - MCP调用: 通过MCP Client向Database MCP Server发送工具调用请求
- 工具执行: MCP Server执行SQL查询,返回结果
- 结果回传: 模型基于查询结果生成自然语言回答
- 响应返回: 将最终回答返回给用户
整个过程中,开发者只需要关注业务逻辑(工具的实现),而不需要处理协议适配、重试机制、错误处理等基础设施问题------这些都由Spring AI的MCP Client和ChatClient框架自动处理。
六、性能优化与生产实践
6.1 并发调度(Overlap Scheduler)
Agent调用链路中存在大量IO等待时间:模型推理需要等待API响应,工具执行需要等待数据库查询,多个工具之间可能是串行依赖关系。Overlap Scheduler的核心思想是在这些等待时间内启动可以并行的任务,最大化资源利用率。
Spring AI 2.0引入了OverlapScheduler,可以自动分析Agent调用链路中的依赖关系,将无依赖的工具调用并行化执行:
java
@Configuration
public class OverlapConfig {
@Bean
public OverlapScheduler overlapScheduler() {
return OverlapScheduler.builder()
.maxConcurrentToolCalls(5) // 最大并行工具调用数
.timeout(Duration.ofSeconds(30)) // 单次调度超时
.build();
}
}
当Agent需要同时调用多个独立工具时(例如同时查询天气、汇率和新闻),Overlap Scheduler可以将原本串行耗时10秒的操作压缩到3-4秒完成。
6.2 Token优化策略
Token消耗是Agent应用的主要成本来源。以下是在Spring Boot 4.0中的几项关键优化策略:
策略一:Skills Agent减少工具Token。 如前文所述,通过渐进式披露将初始工具描述Token减少80%以上。
策略二:对话窗口裁剪。 通过ChatMemory的窗口策略,控制注入上下文的对话轮数:
java
@Bean
public ChatMemory chatMemory() {
return InMemoryChatMemory.builder()
.maxMessages(20) // 保留最近20轮对话
.build();
}
策略三:System Prompt精简。 系统提示词应该精炼到核心指令,避免冗长的背景描述。一个好的System Prompt应该在200个Token以内。
策略四:工具描述优化。 每个工具的description字段是最容易被忽视的Token消耗点。用简洁的祈使句描述工具功能,避免重复语义:
java
// 差:冗余描述,浪费Token
@Tool(description = "这个工具可以用来执行SQL查询语句,"
+ "你可以在需要查询数据库数据的时候使用这个工具,"
+ "支持各种SELECT查询")
public String query(String sql) { ... }
// 好:简洁精准
@Tool(description = "执行SELECT查询语句,返回数据库查询结果")
public String query(String sql) { ... }
6.3 错误处理与重试
生产环境中,模型API限流、工具调用超时、网络抖动等问题是常态。Spring AI 2.0通过Advisor机制提供了优雅的错误处理和重试策略:
java
@Configuration
public class ResilienceConfig {
@Bean
public ChatClient resilientChatClient(ChatClient.Builder builder) {
return builder
.defaultAdvisors(
// 重试Advisor:模型调用失败时自动重试
new RetryAdvisor(
RetrySettings.builder()
.maxAttempts(3)
.backoff(BackoffSettings.builder()
.initialInterval(Duration.ofMillis(500))
.multiplier(2.0)
.maxInterval(Duration.ofSeconds(5))
.build())
.retryableExceptions(
RateLimitException.class,
TimeoutException.class
)
.build()
),
// 降级Advisor:所有重试失败后的兜底策略
new FallbackAdvisor("当前服务繁忙,请稍后重试。")
)
.build();
}
}
对于MCP工具调用的错误处理,Spring AI的MCP Client内置了以下机制:
- 连接超时自动重连: 与MCP Server的SSE连接断开时,自动尝试重新建立连接
- 工具调用超时: 单个工具调用超过配置的超时时间后自动中断,避免阻塞整个Agent链路
- 熔断保护: 当某个MCP Server连续失败超过阈值时,暂时熔断该Server的工具调用,快速返回错误而非无限等待

上图展示了Overlap Scheduler在Agent调用链路中的应用。深色区块表示实际的计算/IO操作,浅色区块表示等待时间。通过Overlap调度,原本串行的工具调用被重新编排为并行执行,总耗时从T1+T2+T3降低到max(T1, T2, T3),在有大量独立工具调用的Agent场景中,性能提升可达3-5倍。
总结
Spring Boot 4.1.0 GA + Spring AI 2.0.0 GA的组合,标志着Java开发者在AI Agent领域不再是"追赶者"。ChatClient提供了优雅的统一交互入口,Skills Agent创新性地将渐进式披露设计模式引入Agent工具管理,而MCP协议的集成则让Java Agent具备了与多语言工具生态互通的能力。
对于Java开发者而言,这意味着:
- 无需切换技术栈: 用熟悉的Spring Boot构建AI Agent,复用现有的Java生态
- 工程化能力完整: 从配置管理、依赖注入到监控运维,Spring Boot的工程化基因天然适配Agent的生产部署
- 生态开放性: MCP协议打破了语言边界,Java Agent可以调用Python的算法工具、Go的高性能服务等
**"大模型工程师修炼手记"**付费专栏持续更新中,已覆盖大模型微调、推理优化、RAG系统、向量数据库、Agent编排等全链路工程化主题。如果你正在或即将踏入大模型工程化领域,欢迎关注专栏,一起构建属于Java开发者的AI工程化知识体系。
作者: Tom·Ge | 专栏: 大模型工程师修炼手记 | 原文首发: CSDN