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

一、被 Python"绑架"的 Java 程序员,终于等来了救兵

兄弟们,有没有遇到过这种糟心事儿?你在 Java 项目里想接个大模型,结果网上一搜教程,清一色的 Python 代码。你硬着头皮搭了个 Python 中间层,结果维护起来比写业务代码还痛苦——环境配置三天两头崩,依赖包版本冲突像俄罗斯套娃,部署上线还得搞两个服务,监控日志两头看,出问题跟破案似的两边排查。

这就好比你想吃顿火锅,非得当个"二道贩子":先把食材交给隔壁 Python 厨子加工,再端回 Java 餐桌上。食材凉不凉另说,万一隔壁厨子撂挑子(Python 服务挂了),你的 Java 服务也得跟着吃瘪。

直到 2025 年 5 月,Spring AI 1.0 GA 正式发布,这事儿才有了转机。简单来说,Spring AI 就是给 Java 程序员发了一套"直通大模型"的 VIP 卡,让你用纯 Java 就能直接调用 OpenAI、DeepSeek、Llama 等各种模型,彻底告别 Python 中间层这个"中间商"。

二、Spring AI 1.0:Java 生态的"AI 万能适配器"

2.1 这玩意儿到底能干啥?

Spring AI 1.0 最牛的地方,是它搞了个统一的 ChatClient 接口。这就像是手机充电口的 Type-C 标准,不管你插的是苹果、安卓还是充电宝,接口都一样。你用 ChatClient 写的代码,今天接 OpenAI 的 GPT-4,明天切到本地部署的 Llama 3,只需要改配置文件,业务代码一行不用动。

它支持 20 多种模型,包括咱们熟悉的 DeepSeek、智谱、MiniMax,还有 Claude、Mistral 这些洋货。更狠的是,它把 RAG(检索增强生成)、向量数据库、对话记忆管理、函数调用这些高级玩法都封装成了 Spring 风格的 API,说白了就是让你用 Spring 的套路(依赖注入、自动配置)来玩 AI。

2.2 版本号别搞错

这里得敲个黑板:Spring AI 现在的正式版是 1.0 GA(2025 年 5 月 20 日发布),不是啥 3.x。如果你看到有人说 Spring AI 3.x,那是把 Spring Boot 3.x 和 Spring AI 搞混了。Spring Boot 3.2 以上版本能跑 Spring AI 1.0,但 Spring AI 本身还是 1.0 版本。

三、Ollama:零成本本地跑大模型的"神器"

要玩本地大模型,首先得把模型跑起来。这里推荐 Ollama,这工具堪称"本地大模型界的 Docker"。你只需要一条命令,就能把 Llama 3、DeepSeek、Mistral 这些模型拉到本地跑,完全免费,不需要显卡也能玩(就是慢点)。

3.1 安装 Ollama

去官网下载对应系统的安装包,Windows、macOS、Linux 都支持。装完后命令行输入:

ollama --version

能看到版本号就说明装好了。默认情况下,Ollama 会在本地开启一个 HTTP 服务,端口是 11434,这就是咱们 Java 程序要对接的入口。

3.2 拉取模型

假设咱们要跑 DeepSeek-R1 的 7B 版本(个人电脑能带动的尺寸):

ollama pull deepseek-r1:7b

等进度条跑完,模型就下载到本地了。你可以先测试一下:

ollama run deepseek-r1:7b

这时候会进入交互模式,你可以直接跟模型聊天。按 Ctrl+D 退出。

四、Spring Boot 集成实战:30 分钟跑通第一个 AI 接口

4.1 项目初始化

打开 Spring Initializr https://start.spring.io/,选择:

  • Project: Maven
  • Language: Java
  • Spring Boot: 3.2.x 或 3.3.x(必须 3.2 以上)
  • Dependencies: 添加 Spring Web 和 Spring AI

或者直接用命令行:

spring init --dependencies=web,ai my-ai-app

4.2 Maven 依赖配置

在 pom.xml 里引入 Spring AI 的 BOM 管理,这样版本号不用一个个敲:


  
    
      org.springframework.ai
      spring-ai-bom
      1.0.0
      pom
      import
    
  

注意这里的 version 是 1.0.0,对应 2025 年 5 月的 GA 版本。

4.3 配置文件

在 application.yml 里写上:

server:
  port: 8080
spring:
  ai:
    ollama:
      base-url: http://localhost:11434  # Ollama 默认地址
    chat:
      model: deepseek-r1:7b          # 刚才下载的模型名
      options:
        temperature: 0.7             # 创造性参数,0.0-1.0
        num-ctx: 4096                # 上下文窗口大小

这里的 temperature 参数得解释一下:它控制模型回答的"脑洞大小"。设成 0.1,模型就像个严谨的老教授,一板一眼;设成 0.9,模型就像喝了假酒的诗人,回答可能天马行空。一般业务场景设 0.7 比较 balanced。

4.4 编写第一个 AI 服务

Spring AI 1.0 推荐使用 ChatClient 模式,这是现在的主流写法:

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.stereotype.Service;

@Service
public class AiChatService {

    private final ChatClient chatClient;

    // 构造器注入,Spring 会自动装配
    public AiChatService(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder.build();
    }

    /**
     * 同步调用,适合短回答场景
     */
    public String chat(String message) {
        return chatClient.prompt()
                .user(message)           // 用户输入
                .call()                  // 发起调用
                .content();              // 获取文本内容
    }

    /**
     * 流式调用,适合长文本生成(打字机效果)
     */
    public Flux chatStream(String message) {
        return chatClient.prompt()
                .user(message)
                .stream()                // 开启流式
                .content();
    }

}

看到没?代码简洁得令人发指。没有 Python 中间层,没有 HTTP 客户端手动拼请求,就像调用本地方法一样自然。

4.5 控制器层暴露接口

import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;

@RestController
@RequestMapping("/api/ai")
public class ChatController {

    private final AiChatService chatService;

    public ChatController(AiChatService chatService) {
        this.chatService = chatService;
    }

    @GetMapping("/chat")
    public String chat(@RequestParam String msg) {
        return chatService.chat(msg);
    }

    @GetMapping(value = "/chat/stream", produces = "text/stream;charset=UTF-8")
    public Flux chatStream(@RequestParam String msg) {
        return chatService.chatStream(msg);
    }

}

4.6 跑起来测试

启动 Spring Boot 应用,打开浏览器或者 Postman:

GET http://localhost:8080/api/ai/chat?msg=你好,请介绍一下Spring AI

如果一切顺利,你会看到模型返回的问候和介绍。这时候打开你的 IDEA 控制台,观察日志,你会发现请求直接发到了本地的 11434 端口,没有经过任何中间商。

五、进阶玩法:让本地模型"长出三头六臂"

5.1 函数调用:让 AI 能查数据库、调接口

大模型虽然聪明,但它不知道你家数据库里有啥数据。Spring AI 支持函数调用(Function Calling),你可以把 Java 方法"注册"给模型,让模型自己决定什么时候调用。

比如咱们写个查天气的工具:

import org.springframework.ai.tool.annotation.Tool;
import org.springframework.stereotype.Service;

@Service
public class WeatherService {

    @Tool(name = "getWeather", description = "查询指定城市的当前天气")
    public String getWeather(String city) {
        // 这里可以对接第三方天气 API
        return city + "今天晴天,25度,适合写代码";
    }

}

然后在服务层启用工具:

public String chatWithTools(String message) {
    return chatClient.prompt()
        .user(message)
        .tools(new WeatherService())  // 注入工具
        .call()
        .content();
}

这时候如果你问模型"北京今天天气怎么样",模型会自动识别需要调用 getWeather 方法,并把"北京"作为参数传进去。这就像是给 AI 装上了"手",能实际操作你的业务系统。

5.2 对话记忆:让 AI 记得你们聊过啥

默认情况下,大模型是"金鱼记忆",每次请求都是独立的。要实现连续对话,得手动把历史记录带过去。Spring AI 提供了 ChatMemory 接口:

import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AiConfig {

    @Bean
    public ChatMemory chatMemory() {
        // 内存存储,生产环境建议换成 JDBC 或 Redis
        return new InMemoryChatMemory();
    }

}

然后在对话时指定会话 ID:

public String chatWithMemory(String sessionId, String message) {
    return chatClient.prompt()
        .user(message)
        .advisors(new MessageChatMemoryAdvisor(chatMemory, sessionId, 10)) // 保留最近10轮
        .call()
        .content();
}

这样 AI 就能记得"刚才我说了什么",实现真正的对话流。

5.3 RAG 简易实现:让 AI 读你的私有文档

RAG(检索增强生成)简单来说就是:先把你的 PDF、Word 切分成小块,转成向量存进向量数据库。问问题时,先搜出相关的片段,再把这些片段塞给大模型当"参考资料"。

Spring AI 1.0 内置了 ETL 框架,能自动处理文档分块和向量化。配合 QuestionAnswerAdvisor,实现 RAG 只需要几行代码:

public String ragQuery(String query) {
    return chatClient.prompt()
        .user(query)
        .advisors(new QuestionAnswerAdvisor(vectorStore))  // 自动检索相关文档
        .call()
        .content();
}

这里 vectorStore 可以是 Redis、PostgreSQL、Milvus 等 20 多种向量数据库。

六、生产环境踩坑指南

6.1 超时问题

本地模型生成速度比云 API 慢得多,尤其是 CPU 跑大模型时。Spring Boot 默认的 HTTP 超时可能不够用,得在配置里调大:

spring:
  ai:
    ollama:
      client:
        connect-timeout: 5000    # 连接超时 5 秒
        read-timeout: 120000     # 读取超时 2 分钟

如果是流式输出,超时设置可以适当放宽,因为数据是慢慢吐出来的。

6.2 显存与内存管理

Ollama 默认会把模型一直 loaded 在内存里,这样响应快,但占资源。如果你服务器内存紧张,可以设置 keep-alive 时间:

spring:
  ai:
    ollama:
      chat:
        options:
          keep-alive: "5m"  # 5分钟没请求就卸载模型

这样虽然下次请求会有几秒的加载延迟,但能省不少内存。

6.3 模型选择建议

  • 开发测试:用 deepseek-r1:1.5b 或 llama3.2:3b,体积小、速度快,虽然笨点但省资源
  • 生产环境:如果机器够劲,用 qwen2.5:14b 或 deepseek-r1:7b,中文能力和推理能力都更强
  • GPU 加速:如果有 NVIDIA 显卡,Ollama 会自动调用 CUDA 加速,生成速度能快 5-10 倍

七、写在最后

Spring AI 1.0 的出现,标志着 Java 生态正式"入局"大模型赛道。以前咱们 Java 程序员想玩 AI,总得被 Python"卡脖子",现在终于可以用最熟悉的 Spring Boot 套路,纯 Java 搞定从开发到部署的全流程。

本地部署 + Spring AI 的组合,特别适合那些数据敏感(不想把数据发到公网)、成本敏感(不想按 Token 付费)、或者网络受限(内网环境)的场景。虽然本地模型的能力暂时还追不上 GPT-4o,但像 DeepSeek-R1、Qwen2.5 这些开源模型,处理日常业务问答、代码辅助、文档总结已经绰绰有余。

更重要的是,你再也不用在 Java 和 Python 之间来回横跳,维护两套技术栈了。一个 ChatClient,几行配置,就能让你的 Spring Boot 应用插上 AI 的翅膀。这就像是给老伙计配了把新钥匙,开门的方式没变,但能进的房间更多了。

赶紧找个闲置的笔记本,装上 Ollama,搭个 Spring Boot 项目试试吧。记住,2025 年的 Java 程序员,玩 AI 不需要会 Python,只需要会 Spring。

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

在这里插入图片描述

更多推荐