无意间发现了一个CSDN大神的人工智能教程,忍不住分享一下给大家。很通俗易懂,重点是还非常风趣幽默,像看小说一样。床送门放这了👉 http://blog.csdn.net/jiangjunshow

前言

如果你是个Java老炮,过去几年看着Python那帮兄弟在大模型领域呼风唤雨,心里肯定不是滋味。人家用几行Python代码就能调GPT、搭知识库,咱们Java这边还在吭哧吭哧写HTTP客户端,感觉就像别人都在开特斯拉了,我们还在手摇启动拖拉机。

好消息是,Spring AI 2.0来了。这玩意儿简直就是给Java程序员发了一张"AI头等舱机票"——不用换语言、不用学Python,靠着咱们熟悉的Spring Boot那一套,几行配置就能让Java应用用上大模型,还能搭企业级的RAG知识库。

2025年12月11日,Spring AI 2.0.0 M1正式发布,今年1月又发布了M2版本。这次更新可不是小打小闹,而是直接基于Spring Boot 4和Java 21重构,把AI能力彻底整合进了Spring生态。本文就带你用最新的Spring AI 2.0,从零开始搭建一个能直接上线的大模型应用。

一、Spring AI 2.0到底牛在哪?

1.1 告别"二等公民"身份

之前的Java AI库,说白了都是对着OpenAI的API做HTTP包装,感觉像个外包翻译官。Spring AI 2.0不一样,它直接提供了原生的模型抽象层,支持OpenAI、Anthropic、Google Gemini、AWS Bedrock、Ollama本地模型等十几种后端。

打个比方,以前咱们调用大模型像是给外国朋友写信,得自己找翻译。现在Spring AI 2.0相当于给你配了个联合国同声传译,你说中文(Java代码),它自动帮你转换成各个模型听得懂的语言,而且切换模型就像换数据库连接池一样简单。

1.2 企业级功能开箱即用

M2版本带来的新特性简直是为企业量身定做:

  • 向量存储大扩容:除了之前的PGVector、Redis,现在还支持Amazon S3、Infinispan、Amazon Bedrock Knowledge Base
  • 语义缓存:用Redis做语义级缓存,相同意思的问题不会重复调用模型,省下一大笔API费用
  • 结构化输出:Mistral AI和Ollama都支持JSON Schema验证,让模型输出从"开盲盒"变成"对答案"
  • 工具调用增强:支持动态修改工具定义,还能开启对话历史记录

最爽的是模块化自动配置——你引入哪个模型的starter,它就自动配置哪个,不会一股脑全加载,启动速度快了不少。

二、环境准备:工欲善其事

2.1 硬指标检查

Spring AI 2.0对环境有硬性要求:

  • Java 21+:必须支持虚拟线程(Virtual Threads)和模式匹配
  • Spring Boot 4.0+:基于Spring Framework 7.0构建
  • Maven/Gradle:能连上Spring的里程碑仓库(Milestone Repository)

如果你还在用Java 8,兄弟,该升级了。Java 21的虚拟线程对AI应用特别重要——大模型API调用都是IO密集型操作,虚拟线程能让你的服务用少量线程处理大量并发请求。

2.2 项目初始化

去Spring Initializr https://start.spring.io/创建项目,选Spring Boot 4.0(目前可能是快照版),依赖里勾上"Spring AI"。或者直接抄我这份pom.xml:


4.0.0

    org.springframework.boot
    spring-boot-starter-parent
    4.0.0-SNAPSHOT
    



    21
    2.0.0-M2



    
        org.springframework.boot
        spring-boot-starter-web
    
    
        org.springframework.ai
        spring-ai-starter-model-openai
    
    
    
        org.springframework.ai
        spring-ai-pgvector-store
    



    
        
            org.springframework.ai
            spring-ai-bom
            ${spring-ai.version}
            pom
            import
        
    

注意:因为还是里程碑版本,你需要在pom.xml里加上Spring的里程碑仓库地址(具体配置查一下Spring官方文档,这里不展开)。

三、零代码接入:ChatClient API

Spring AI 2.0最核心的API就是ChatClient,它的设计理念跟RestClient(Spring 6.1引入)保持一致,流畅API写起来特别顺手。

3.1 基础配置

在application.yml里配好你的API密钥:

spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
      chat:
        options:
          model: gpt-4o-mini
          temperature: 0.7

如果你用Ollama本地模型(强烈推荐开发环境用这个,省接口费):

spring:
  ai:
    ollama:
      base-url: http://localhost:11434
      chat:
        model: qwen2.5:7b
      init:
        pull-model-strategy: when-missing  # 自动拉模型,懒人福音

3.2 第一个AI接口

写个Controller,五分钟搞定:

@RestController
@RequestMapping("/api/ai")
public class ChatController {
    private final ChatClient chatClient;

    // 构造器注入,Spring会自动装配
    public ChatController(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder
            .defaultSystem("你是个经验丰富的Java技术专家,回答问题简洁明了")
            .build();
    }

    @GetMapping("/chat")
    public String chat(@RequestParam String message) {
        return chatClient.prompt()
            .user(message)
            .call()  // 同步调用
            .content();
    }

    @GetMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux chatStream(@RequestParam String message) {
        return chatClient.prompt()
            .user(message)
            .stream()  // 流式输出,打字机效果
            .content();
    }
}

看到没?全程没出现RestTemplate、WebClient那些样板代码,也没有JSON解析的繁琐步骤。ChatClient把模型调用、错误处理、重试机制全包圆了,这就是Spring的"约定大于配置"哲学。

3.3 结构化输出实战

之前让模型输出JSON得像哄小孩一样写提示词,现在Spring AI 2.0支持结构化输出。定义个Java记录类:

public record TechArticle(String title, String summary, List tags) {}

然后这样调:

@GetMapping("/generate-article")
public TechArticle generateArticle(@RequestParam String topic) {
    return chatClient.prompt()
        .user("请写一篇关于" + topic + "的技术文章大纲")
        .call()
        .entity(TechArticle.class);  // 自动映射到Java对象
}

Spring AI会自动生成JSON Schema约束模型输出,再也不用担心模型给你返回"差不多长这样"的野路子JSON了。

四、RAG知识库:让企业数据"活"起来

光有聊天功能不够香,企业真正想要的是让自己的文档开口说话。RAG(检索增强生成)就是干这个的——把公司内部的PDF、Word、数据库内容塞进向量库,AI回答问题时先查资料再张嘴。

4.1 架构原理(说人话版)

想象你是个新入职的客服,客户问个复杂问题,你咋办?肯定是先翻公司的知识库(检索),找到相关资料后组织语言回答(生成)。RAG就是让AI扮演这个聪明客服:

  1. 文档切片:把长文档切成小段(好比把厚书拆成便签纸)
  2. 向量化:用嵌入模型把文字转成数学向量(好比给每个便签纸编个独一无二的条形码)
  3. 语义检索:用户提问时,把问题也转成向量,去库里找最相近的文档片段
  4. 增强生成:把检索到的资料塞进提示词,让模型基于这些资料回答

Spring AI 2.0用Advisor机制实现RAG,比1.x版本优雅多了。

4.2 向量存储配置

这里用PGVector(PostgreSQL的向量扩展),生产环境最稳的选择:

spring:
  ai:
    vectorstore:
      pgvector:
        dimensions: 1536  # OpenAI embedding维度
        index-type: hnsw  # 高速索引算法
        initialize-schema: true  # 自动建表

如果用Ollama的本地嵌入模型(比如nomic-embed-text),记得改维度:

spring:
  ai:
    ollama:
      embedding:
        model: nomic-embed-text
        dimensions: 768

4.3 文档入库

假设你有一批技术文档要入库:

@Service
public class DocumentService {
    private final VectorStore vectorStore;

    public DocumentService(VectorStore vectorStore) {
        this.vectorStore = vectorStore;
    }

    public void ingestDocuments() {
        // 1. 读取文档(支持PDF、Word、TXT)
        var reader = new PagePdfDocumentReader("classpath:docs/spring-boot-reference.pdf");
        List documents = reader.read();
        
        // 2. 切片策略:每500字符一段,重叠100字符保持连贯性
        var splitter = new TokenTextSplitter(500, 100, 50, 50, true);
        List chunks = splitter.apply(documents);
        
        // 3. 写入向量库(自动做embedding)
        vectorStore.add(chunks);
    }
}

这里TokenTextSplitter是个智能切片器,不会傻傻地按字符切,而是尽量保持句子完整,就像切蛋糕时尽量不切到水果块。

4.4 RAG查询实现

关键来了——怎么让AI回答时自动查库?Spring AI 2.0的RetrievalAugmentationAdvisor帮你搞定:

@RestController
@RequestMapping("/api/knowledge")
public class KnowledgeController {
    private final ChatClient chatClient;

    public KnowledgeController(ChatClient.Builder builder, VectorStore vectorStore) {
        // 配置文档检索器
        DocumentRetriever retriever = VectorStoreDocumentRetriever.builder()
            .vectorStore(vectorStore)
            .similarityThreshold(0.7)  // 相似度阈值,过滤无关内容
            .topK(3)  // 取最相关的3段
            .build();
        
        // 组装RAG Advisor
        RetrievalAugmentationAdvisor ragAdvisor = RetrievalAugmentationAdvisor.builder()
            .documentRetriever(retriever)
            .build();
        
        // 把Advisor注入ChatClient
        this.chatClient = builder
            .defaultAdvisors(ragAdvisor)
            .build();
    }

    @GetMapping("/ask")
    public String ask(@RequestParam String question) {
        return chatClient.prompt()
            .user(question)
            .call()
            .content();
    }
}

当用户问"Spring Boot怎么配置数据源?"时,RetrievalAugmentationAdvisor会自动:

  1. 把问题转成向量
  2. 去PGVector里搜相关文档片段
  3. 把搜到的内容塞进系统提示词里
  4. 让模型基于这些资料回答

整个过程对用户透明,但回答质量直接从"通用废话"升级为"专业解答"。

五、多模型切换:东方不亮西方亮

企业级应用不能吊死在一棵树上,今天OpenAI限流,明天Gemini降价,得能灵活切换。Spring AI 2.0的抽象层让这事儿变得简单。

5.1 配置多个模型

spring:
  ai:
    openai:
      api-key: ${OPENAI_KEY}
    ollama:
      base-url: http://localhost:11434
    anthropic:
      api-key: ${CLAUDE_KEY}

5.2 动态选择模型

@Service
public class MultiModelService {
    private final ChatClient openaiClient;
    private final ChatClient ollamaClient;

    public MultiModelService(ChatClient.Builder builder) {
        this.openaiClient = builder
            .defaultOptions(OpenAiChatOptions.builder().model("gpt-4o").build())
            .build();
            
        this.ollamaClient = builder
            .defaultOptions(OllamaOptions.builder().model("qwen2.5:14b").build())
            .build();
    }

    public String smartChat(String message, String complexity) {
        // 简单问题用本地模型,复杂问题调GPT-4
        if ("low".equals(complexity)) {
            return ollamaClient.prompt().user(message).call().content();
        } else {
            return openaiClient.prompt().user(message).call().content();
        }
    }
}

5.3 本地模型生产力

Ollama现在支持工具调用(Function Calling)了,这意味着本地模型也能操作你的Java方法。比如让模型查数据库:

@Bean
public FunctionCallback stockPriceFunction() {
    return FunctionCallback.builder()
        .function("getStockPrice", (StockRequest request) -> {
            // 查数据库逻辑
            return new StockResponse("AAPL", 150.0);
        })
        .description("获取股票实时价格")
        .inputType(StockRequest.class)
        .build();
}

// 使用
chatClient.prompt()
    .user("苹果股票现在多少钱?")
    .functions("getStockPrice")
    .call();

六、企业级上线的"避坑指南"

6.1 性能调优

连接池配置:大模型API调用是IO密集型,Spring AI 2.0基于Java 21虚拟线程,记得配置:

spring:
  threads:
    virtual:
      enabled: true

语义缓存:启用Redis缓存避免重复提问烧接口费:

spring:
  ai:
    chat:
      advisors:
        semantic-cache:
          enabled: true
      redis:
        ttl: 3600  # 缓存1小时

6.2 监控与熔断

AI服务不稳定是常态,必须加熔断器。用Spring Cloud CircuitBreaker包装你的AI调用:

@CircuitBreaker(name = "aiService", fallbackMethod = "fallbackAnswer")
public String askAI(String question) {
    return chatClient.prompt().user(question).call().content();
}

public String fallbackAnswer(String question, Exception ex) {
    return "AI服务暂时繁忙,请稍后再试";
}

6.3 成本控制

生产环境记得设限流:

spring:
  ai:
    chat:
      rate-limit:
        requests-per-minute: 100  # 每分钟最多100次

七、总结:Java AI开发的"安卓时刻"

Spring AI 2.0的出现,标志着Java在AI领域从"看客"变成了"玩家"。它没打算让Java取代Python在算法研究中的地位,而是瞄准了企业级AI应用这块蛋糕——这正是Java的主场。

几行配置就能接入多模型、半小时搭好RAG知识库、原生支持函数调用和结构化输出,这些特性让Java开发者不用再羡慕Python的生态。加上Spring Boot成熟的微服务体系,AI能力可以无缝集成进现有的企业架构。

2026年的AI开发,不再是单一语言的独角戏。Python做算法、Java做工程、前端做界面,各司其职才是正道。如果你是个Java程序员,现在就是上车的最佳时机——毕竟,看着别人吃肉自己喝汤的滋味,不好受吧?

赶紧把Spring AI 2.0用起来,让你的Java应用也长出"AI大脑"。


参考链接:

  • Spring AI 2.0.0 M2 Release Notes
  • Spring AI 2.0 + Spring Boot 4 Guide
  • RAG with Docling and Spring AI
  • Using RAG and Vector Store with Spring AI
  • Spring AI Ollama Tool Support
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐