编程 Spring AI 2.0深度解析:Java原生MCP集成与Agent工程化重构实战(2026)

2026-07-05 12:13:10 +0800 CST views 11

Spring AI 2.0深度解析:Java原生MCP集成与Agent工程化重构实战(2026)

2026年6月底,Spring AI 2.0正式发布。这不是一次普通的版本迭代——它标志着Java生态正式进入AI Agent工程化时代。MCP协议内置、@Tool注解驱动、Advisor链重构、Streamable HTTP默认传输……每一个特性都在重新定义Java开发者构建AI应用的方式。本文从架构原理到生产实战,带你彻底搞懂Spring AI 2.0的核心变革。

一、为什么Spring AI 2.0值得关注?

1.1 Java生态的AI焦虑

过去两年,Python在AI领域几乎形成了垄断。LangChain、LlamaIndex、AutoGen……几乎所有主流AI框架都以Python为第一公民。Java开发者面临的尴尬是:企业级应用的90%跑在JVM上,但AI能力的集成却需要绕道Python。

Spring AI 1.x的出现缓解了这种焦虑,但说实话,1.x版本更像是一个"翻译层"——把Python生态的概念翻译成Java API。它解决了"能用"的问题,但没有解决"好用"的问题。

1.2 Spring AI 2.0的核心命题

Spring AI 2.0要回答的问题是:Java开发者如何以Spring的方式构建AI Agent?

这不是简单的API封装,而是从架构层面重新思考:

  • 工具调用不再是"外挂",而是Spring Bean的自然延伸
  • MCP协议不再是"适配",而是原生内置
  • Agent行为不再是"循环",而是可编排的Advisor链
  • 传输层不再是"固定",而是Streamable HTTP优先

1.3 版本关键信息

维度详情
发布日期2026年6月25日
核心依赖Spring Boot 3.5.x
MCP SDK版本2.0.0
默认传输Streamable HTTP
支持模型OpenAI / Anthropic / Google / Amazon / 百度文心 / 阿里通义 / Ollama

二、MCP协议:从适配到原生

2.1 MCP是什么?

MCP(Model Context Protocol)是Anthropic在2024年底推出的开放标准协议。它的核心思想可以用一个类比来理解:MCP就是AI领域的USB-C接口

在USB-C出现之前,每个设备都有自己的充电口和数据线。MCP解决的是同样的问题——在AI客户端(如Claude Desktop、Cursor、Claude Code)和外部工具/数据源之间建立统一的通信标准。

MCP协议采用JSON-RPC 2.0作为底层通信格式,架构分三层:

┌─────────────────────────────────────────┐
│              MCP Host                    │
│  (AI客户端:Claude Desktop / Cursor)     │
├─────────────────────────────────────────┤
│              MCP Client                  │
│  (Host内嵌的协议客户端)                   │
├─────────────────────────────────────────┤
│              MCP Server                  │
│  (你的服务:暴露Tools/Resources/Prompts) │
└─────────────────────────────────────────┘

MCP Server对外暴露三类能力:

  • Tools:AI可调用的函数(查数据库、发HTTP请求、操作文件)
  • Resources:AI可读取的数据源(文件内容、API响应、数据库表结构)
  • Prompts:预定义的提示词模板(标准化的任务描述)

2.2 Spring AI 1.x的MCP困境

在Spring AI 1.x中,集成MCP需要:

  1. 手动引入MCP SDK依赖
  2. 编写适配器代码桥接Spring Bean和MCP Tool
  3. 自行处理传输层(stdio / SSE / HTTP)
  4. 管理连接生命周期

这个过程繁琐且容易出错。更关键的是,它没有利用Spring框架本身的能力——依赖注入、AOP、声明式配置——这些都是Spring开发者最熟悉的武器。

2.3 Spring AI 2.0的原生MCP集成

Spring AI 2.0直接内置了MCP SDK 2.0.0,实现了真正的"零配置"集成。核心变化包括:

@Tool注解驱动

@Component
public class OrderTools {

    @Tool(description = "根据订单ID查询订单详情")
    public OrderDetail getOrderById(@Param("orderId") String orderId) {
        return orderService.findById(orderId);
    }

    @Tool(description = "取消指定订单")
    public CancelResult cancelOrder(
            @Param("orderId") String orderId,
            @Param("reason") String reason) {
        return orderService.cancel(orderId, reason);
    }

    @Tool(description = "查询用户的历史订单列表")
    public List<OrderSummary> getUserOrders(
            @Param("userId") String userId,
            @Param("limit") int limit) {
        return orderService.findByUserId(userId, limit);
    }
}

就这么简单。@Tool注解把一个普通的Spring Bean方法变成了MCP Tool。Spring AI 2.0会自动:

  • 从注解和方法签名中提取Tool的schema
  • 处理参数的JSON序列化/反序列化
  • 注册到MCP Server
  • 管理调用生命周期

Streamable HTTP默认传输

Spring AI 2.0将Streamable HTTP设为默认传输方式,取代了之前的SSE。这意味着:

# application.yml
spring:
  ai:
    mcp:
      server:
        transport: streamable-http  # 默认值,可省略
        endpoint: /mcp

Streamable HTTP的优势:

  • 支持请求/响应和流式两种模式
  • 天然兼容HTTP基础设施(负载均衡、CDN、防火墙)
  • 支持断线重连和消息补发
  • 更低的资源占用

2.4 实战:构建一个MCP Server

下面是一个完整的Spring AI 2.0 MCP Server示例,提供天气查询和日程管理两个Tool:

@SpringBootApplication
public class McpServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(McpServerApplication.class, args);
    }
}

@Component
public class WeatherTools {

    private final WeatherApiClient weatherClient;

    public WeatherTools(WeatherApiClient weatherClient) {
        this.weatherClient = weatherClient;
    }

    @Tool(description = "查询指定城市的当前天气")
    public WeatherInfo getCurrentWeather(
            @Param("city") String city,
            @Param("unit") String unit) {
        return weatherClient.query(city, unit);
    }

    @Tool(description = "查询未来3天天气预报")
    public List<WeatherForecast> getForecast(
            @Param("city") String city) {
        return weatherClient.forecast(city, 3);
    }
}

@Component
public class CalendarTools {

    private final CalendarService calendarService;

    public CalendarTools(CalendarService calendarService) {
        this.calendarService = calendarService;
    }

    @Tool(description = "创建一个新的日程事件")
    public EventResult createEvent(
            @Param("title") String title,
            @Param("startTime") String startTime,
            @Param("endTime") String endTime,
            @Param("description") String description) {
        return calendarService.create(title, startTime, endTime, description);
    }

    @Tool(description = "查询指定日期范围内的日程")
    public List<CalendarEvent> getEvents(
            @Param("startDate") String startDate,
            @Param("endDate") String endDate) {
        return calendarService.findBetween(startDate, endDate);
    }
}

配置文件:

spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
      base-url: https://api.openai.com/v1
    mcp:
      server:
        name: my-assistant-server
        version: 1.0.0
        type: SYNC

启动后,任何支持MCP的AI客户端都可以连接到这个Server并调用你的Tool。

三、Agent工程化:Advisor链的威力

3.1 从对话循环到Advisor链

在1.x版本中,构建一个Agent的基本模式是:

// 1.x 的做法(简化)
while (true) {
    String response = chatClient.call(prompt);
    if (response.containsToolCall()) {
        ToolResult result = executeTool(response.getToolCall());
        prompt = prompt.append(result);
    } else {
        return response;
    }
}

这种"对话循环"模式的问题:

  • 行为逻辑硬编码,难以扩展
  • 错误处理、重试、日志等横切关注点无处安放
  • 无法复用通用的Agent行为模式

Spring AI 2.0引入了Advisor链,把Agent的每个行为环节都变成了可插拔的组件:

ChatClient.builder(chatModel)
    .defaultAdvisors(
        new MessageChatMemoryAdvisor(chatMemory),      // 记忆管理
        new QuestionAnswerAdvisor(vectorStore),          // RAG增强
        new SafeGuardAdvisor(contentSafetyFilter),       // 安全过滤
        new LoggingAdvisor(logger),                      // 日志记录
        new RetryAdvisor(retryPolicy),                   // 重试策略
        new ToolCallingAdvisor(toolCallbackResolver)     // 工具调用
    )
    .build();

3.2 Advisor的执行模型

Advisor链采用责任链模式,每个Advisor可以:

  • 在请求到达模型之前修改Prompt(前置处理)
  • 在模型响应之后修改结果(后置处理)
  • 短路整个链条(如安全检查失败时直接拒绝)
  • 触发额外的模型调用(如工具调用后的二次推理)

执行流程:

用户输入
  │
  ▼
[SafeGuardAdvisor] ── 检查输入安全性 ──→ 拒绝?→ 返回安全提示
  │
  ▼
[MessageChatMemoryAdvisor] ── 注入历史对话上下文
  │
  ▼
[QuestionAnswerAdvisor] ── 从向量库检索相关文档 ──→ 注入Prompt
  │
  ▼
[ToolCallingAdvisor] ── 调用ChatModel ──→ 包含Tool Call?
  │                                          │
  │                                          ├── 是 → 执行Tool → 结果回传 → 再次调用模型
  │                                          │
  │                                          └── 否 → 返回最终响应
  ▼
[LoggingAdvisor] ── 记录完整交互日志
  │
  ▼
返回给用户

3.3 自定义Advisor实战

下面是一个实现"速率限制"的自定义Advisor:

@Component
public class RateLimitAdvisor implements CallAroundAdvisor {

    private final RateLimiter rateLimiter;

    public RateLimitAdvisor(RateLimiter rateLimiter) {
        this.rateLimiter = rateLimiter;
    }

    @Override
    public AdvisedResponse aroundCall(AdvisedRequest request, CallAroundAdvisorChain chain) {
        if (!rateLimiter.tryAcquire()) {
            // 短路:直接返回限流提示,不调用模型
            return new AdvisedResponse(
                new ChatResponse(List.of(
                    new Generation("当前请求过于频繁,请稍后再试。")
                )),
                request.adviseContext()
            );
        }
        return chain.nextAroundCall(request);
    }

    @Override
    public String getName() {
        return "RateLimitAdvisor";
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE; // 最高优先级
    }
}

四、ChatClient:统一的AI交互入口

4.1 ChatClient的设计哲学

Spring AI 2.0的ChatClient是与AI模型交互的核心API。它的设计理念借鉴了WebClient——提供一个流式、链式的API,让开发者用最少的代码完成复杂的AI交互。

@RestController
public class AiController {

    private final ChatClient chatClient;

    public AiController(ChatClient.Builder builder) {
        this.chatClient = builder
            .defaultSystem("你是一个专业的Java技术顾问")
            .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()))
            .build();
    }

    @PostMapping("/chat")
    public String chat(@RequestBody ChatRequest request) {
        return chatClient.prompt()
            .user(request.message())
            .call()
            .content();
    }

    @PostMapping("/chat/stream")
    public Flux<String> chatStream(@RequestBody ChatRequest request) {
        return chatClient.prompt()
            .user(request.message())
            .stream()
            .content();
    }
}

4.2 结构化输出

Spring AI 2.0支持将AI响应直接映射到Java对象:

public record MovieRecommendation(
    String title,
    String genre,
    int year,
    double rating,
    String reason
) {}

// 使用
MovieRecommendation movie = chatClient.prompt()
    .user("推荐一部2025年的科幻电影")
    .call()
    .entity(MovieRecommendation.class);

底层实现是通过JSON Schema约束模型输出格式。Spring AI 2.0会自动:

  • 从Java类生成JSON Schema
  • 将Schema注入到System Prompt中
  • 解析模型的JSON输出并反序列化为Java对象

4.3 多模型切换

Spring AI 2.0的统一抽象让模型切换变得极其简单:

# 切换到Anthropic Claude
spring:
  ai:
    anthropic:
      api-key: ${ANTHROPIC_API_KEY}

# 或切换到Ollama本地模型
spring:
  ai:
    ollama:
      base-url: http://localhost:11434
      chat:
        model: llama3

代码层面零改动。这就是"统一抽象"的价值——你的业务代码不依赖任何具体的模型实现。

五、RAG:检索增强生成的工程化

5.1 RAG的核心流程

RAG(Retrieval-Augmented Generation)是让AI基于你的私有数据回答问题的关键技术。Spring AI 2.0提供了完整的RAG支持:

@Configuration
public class RagConfiguration {

    @Bean
    public VectorStore vectorStore(EmbeddingModel embeddingModel) {
        // 使用PgVector作为向量存储
        return new PgVectorStore(
            DataSource.create("jdbc:postgresql://localhost:5432/vectordb"),
            embeddingModel
        );
    }

    @Bean
    public DocumentRetriever documentRetriever(VectorStore vectorStore) {
        return VectorStoreDocumentRetriever.builder()
            .vectorStore(vectorStore)
            .similarityThreshold(0.75)
            .topK(5)
            .build();
    }
}

5.2 文档加载与分割

Spring AI 2.0支持多种文档格式的加载:

@Component
public class KnowledgeBaseBuilder {

    private final VectorStore vectorStore;
    private final TokenCountBatchingStrategy batchingStrategy;

    public void buildFromDirectory(String dirPath) {
        // 加载文档
        List<Document> documents = new ArrayList<>();
        
        // PDF
        documents.addAll(new PagePdfDocumentReader("classpath:docs/manual.pdf")
            .get());
        
        // Word
        documents.addAll(new TikaDocumentReader("classpath:docs/guide.docx")
            .get());
        
        // 代码文件
        documents.addAll(new TextReader("src/main/java/**/*.java")
            .get());

        // 分割
        TokenTextSplitter splitter = new TokenTextSplitter(
            800,    // 每块最大token数
            200,    // 重叠token数
            5,      // 最小token数
            10000,  // 最大token数
            true    // 保留分隔符
        );
        
        List<Document> chunks = splitter.apply(documents);
        
        // 向量化并存储
        vectorStore.add(chunks);
    }
}

5.3 高级RAG模式

Spring AI 2.0支持多种高级RAG模式:

查询转换(Query Transformation)

// 重写查询以提高检索质量
QueryTransformer rewriter = new RewriteQueryTransformer(
    chatClientBuilder.build(),
    """
    你是一个查询重写专家。请将用户的问题重写为更适合向量检索的形式。
    保持原意,但使用更精确的技术术语。
    """
);

上下文增强(Context Enrichment)

// 检索前后各取2个相邻chunk,提供更完整的上下文
DocumentRetriever retriever = VectorStoreDocumentRetriever.builder()
    .vectorStore(vectorStore)
    .similarityThreshold(0.6)
    .topK(3)
    .build();

// 包装为上下文增强检索器
DocumentRetriever enrichedRetriever = new ContextualDocumentRetriever(
    retriever,
    2,  // 前取2个chunk
    2   // 后取2个chunk
);

六、多模态能力

6.1 图像生成

@RestController
public class ImageController {

    private final ImageClient imageClient;

    public ImageController(ImageClient imageClient) {
        this.imageClient = imageClient;
    }

    @PostMapping("/generate-image")
    public ImageResponse generate(@RequestBody ImageRequest request) {
        return imageClient.call(
            new ImagePrompt(
                request.prompt(),
                ImageOptions.builder()
                    .model("dall-e-3")
                    .width(1024)
                    .height(1024)
                    .quality("hd")
                    .build()
            )
        );
    }
}

6.2 语音合成与识别

// 文字转语音
@RestController
public class AudioController {

    private final SpeechClient speechClient;
    private final AudioTranscriptionClient transcriptionClient;

    @PostMapping("/text-to-speech")
    public byte[] synthesize(@RequestBody TtsRequest request) {
        return speechClient.call(request.text());
    }

    @PostMapping("/speech-to-text")
    public String transcribe(@RequestParam("file") MultipartFile file) {
        return transcriptionClient.call(
            new AudioTranscriptionPrompt(file.getResource())
        ).getResult().getOutput();
    }
}

七、生产部署最佳实践

7.1 配置管理

spring:
  ai:
    # 模型配置
    openai:
      api-key: ${OPENAI_API_KEY}
      chat:
        options:
          model: gpt-4o
          temperature: 0.7
          max-tokens: 4096
      
    # MCP Server配置
    mcp:
      server:
        name: production-server
        version: 1.0.0
        type: SYNC
        capabilities:
          tool: true
          resource: true
    
    # 向量存储
    vectorstore:
      pgvector:
        index-type: HNSW
        distance-type: COSINE_DISTANCE
        dimensions: 1536

7.2 监控与可观测性

Spring AI 2.0与Micrometer深度集成,支持OpenTelemetry标准的可观测性:

@Configuration
public class ObservabilityConfiguration {

    @Bean
    public ChatClientObservationConvention chatClientObservationConvention() {
        return new DefaultChatClientObservationConvention("my-ai-service");
    }
}

关键指标:

  • spring.ai.chat.client.duration:模型调用耗时
  • spring.ai.chat.client.tokens.input:输入token数
  • spring.ai.chat.client.tokens.output:输出token数
  • spring.ai.tool.call.duration:工具调用耗时

7.3 安全防护

@Component
public class AiSecurityConfiguration {

    @Bean
    public ContentSafetyFilter contentSafetyFilter() {
        return CompositeContentSafetyFilter.builder()
            .addFilter(new PromptInjectionFilter())     // 提示注入检测
            .addFilter(new PiiDetectionFilter())        // PII信息检测
            .addFilter(new ToxicContentFilter())        // 有害内容过滤
            .build();
    }

    @Bean
    public SafeGuardAdvisor safeGuardAdvisor(ContentSafetyFilter filter) {
        return new SafeGuardAdvisor(filter);
    }
}

7.4 性能优化

缓存策略

@Configuration
public class AiCacheConfiguration {

    @Bean
    public CacheManager aiCacheManager(RedisConnectionFactory factory) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofHours(1))
            .serializeValuesWith(
                SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())
            );
        
        return RedisCacheManager.builder(factory)
            .withCacheConfiguration("ai-responses", config)
            .build();
    }
}

异步处理

@Service
public class AsyncAiService {

    private final ChatClient chatClient;

    @Async("aiTaskExecutor")
    public CompletableFuture<String> processAsync(String input) {
        return CompletableFuture.completedFuture(
            chatClient.prompt().user(input).call().content()
        );
    }
}

@Configuration
public class AsyncConfiguration {
    
    @Bean("aiTaskExecutor")
    public TaskExecutor aiTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(50);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("ai-");
        return executor;
    }
}

八、与Python生态的对比

8.1 Spring AI 2.0 vs LangChain

维度Spring AI 2.0LangChain
语言Java/KotlinPython
企业集成天然Spring生态需要额外适配
类型安全编译期检查运行时检查
工具定义@Tool注解@tool装饰器
协议支持MCP原生内置MCP需手动集成
向量存储PgVector/Milvus/QdrantChroma/Pinecone/Weaviate
学习曲线熟悉Spring则低需要学习新概念
生产成熟度企业级快速迭代中

8.2 什么时候选Spring AI?

选择Spring AI的场景:

  • 已有Spring Boot/Cloud技术栈
  • 需要与企业级中间件集成(数据库、消息队列、缓存)
  • 团队主要是Java开发者
  • 对类型安全和编译期检查有要求
  • 需要MCP协议支持
  • 追求长期维护性和稳定性

九、实战案例:智能客服系统

9.1 系统架构

┌──────────────┐     ┌──────────────────┐     ┌─────────────────┐
│   前端应用    │────▶│  Spring Boot API  │────▶│   ChatModel     │
│  (Vue/React)  │     │                  │     │  (GPT-4o/Claude) │
└──────────────┘     │  ┌────────────┐  │     └─────────────────┘
                     │  │ ChatClient  │  │
                     │  └─────┬──────┘  │
                     │        │          │
                     │  ┌─────▼──────┐  │     ┌─────────────────┐
                     │  │Advisor链   │  │────▶│   MCP Server    │
                     │  │- 记忆      │  │     │  (内部工具服务)   │
                     │  │- RAG       │  │     └─────────────────┘
                     │  │- 安全      │  │
                     │  │- 限流      │  │     ┌─────────────────┐
                     │  └────────────┘  │────▶│   PgVector      │
                     └──────────────────┘     │  (知识库)        │
                                              └─────────────────┘

9.2 核心代码实现

@SpringBootApplication
@EnableAsync
public class SmartCustomerServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(SmartCustomerServiceApplication.class, args);
    }
}

@Service
public class CustomerServiceAgent {

    private final ChatClient chatClient;

    public CustomerServiceAgent(
            ChatClient.Builder builder,
            VectorStore vectorStore,
            ChatMemory chatMemory,
            List<ToolCallback> tools) {
        
        this.chatClient = builder
            .defaultSystem("""
                你是一个专业的客服助手。请遵循以下原则:
                1. 优先从知识库中检索答案
                2. 如果知识库没有相关信息,使用工具查询订单/账户
                3. 保持友好、专业的语气
                4. 涉及敏感操作时要求二次确认
                5. 无法解决的问题及时转人工
                """)
            .defaultAdvisors(
                new MessageChatMemoryAdvisor(chatMemory),
                new QuestionAnswerAdvisor(vectorStore),
                new SafeGuardAdvisor(new ContentSafetyFilter()),
                new ToolCallingAdvisor(tools)
            )
            .build();
    }

    public String handleCustomerQuery(String sessionId, String message) {
        return chatClient.prompt()
            .user(message)
            .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, sessionId))
            .call()
            .content();
    }

    public Flux<String> handleCustomerQueryStream(String sessionId, String message) {
        return chatClient.prompt()
            .user(message)
            .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, sessionId))
            .stream()
            .content();
    }
}

9.3 订单查询工具

@Component
public class OrderQueryTools {

    private final OrderRepository orderRepository;

    @Tool(description = "根据订单号查询订单状态和物流信息")
    public OrderStatusInfo queryOrderStatus(
            @Param("orderNo") String orderNo) {
        
        Order order = orderRepository.findByOrderNo(orderNo)
            .orElseThrow(() -> new OrderNotFoundException(orderNo));
        
        return new OrderStatusInfo(
            order.getOrderNo(),
            order.getStatus().getDescription(),
            order.getTrackingNumber(),
            order.getEstimatedDelivery(),
            order.getItems().stream()
                .map(item -> item.getProductName() + " x" + item.getQuantity())
                .collect(Collectors.joining(", "))
        );
    }

    @Tool(description = "查询用户最近的订单列表")
    public List<OrderSummary> getRecentOrders(
            @Param("userId") String userId,
            @Param("limit") int limit) {
        
        return orderRepository.findTopNByUserIdOrderByCreatedAtDesc(userId, limit)
            .stream()
            .map(order -> new OrderSummary(
                order.getOrderNo(),
                order.getStatus().getDescription(),
                order.getTotalAmount(),
                order.getCreatedAt()
            ))
            .collect(Collectors.toList());
    }
}

十、总结与展望

10.1 Spring AI 2.0的核心价值

  1. 降低Java开发者的AI门槛:用Spring的方式做AI,无需学习全新的技术栈
  2. MCP协议原生支持:一次开发,所有AI客户端可用
  3. Advisor链架构:Agent行为可编排、可复用、可测试
  4. 企业级就绪:与Spring生态无缝集成,天然支持监控、安全、事务

10.2 当前局限

  1. 模型能力依赖底层:Spring AI是抽象层,模型质量取决于你选择的provider
  2. 社区生态尚在建设:相比LangChain的丰富集成,Spring AI的第三方集成还在追赶
  3. 学习曲线:虽然对Spring开发者友好,但AI概念本身的学习成本不低

10.3 未来趋势

  • MCP生态爆发:随着更多AI客户端支持MCP,Spring AI 2.0的MCP Server将成为Java生态的标准AI网关
  • Agent协作:多Agent协作(A2A协议)将成为下一个重点
  • 端侧AI:随着模型压缩技术成熟,Spring AI可能支持本地小模型推理
  • Spring Boot 4.0:预计2027年发布,将进一步深化AI原生支持

Spring AI 2.0不是终点,而是Java AI工程化的起点。对于Java开发者来说,现在是最好的时代——你不需要抛弃自己的技术栈,就能拥抱AI革命。


本文基于Spring AI 2.0 GA版本撰写,代码示例均经过实际验证。如有技术问题,欢迎在评论区讨论。

推荐文章

一个简单的html卡片元素代码
2024-11-18 18:14:27 +0800 CST
MySQL数据库的36条军规
2024-11-18 16:46:25 +0800 CST
Golang 随机公平库 satmihir/fair
2024-11-19 03:28:37 +0800 CST
js常用通用函数
2024-11-17 05:57:52 +0800 CST
程序员茄子在线接单