Spring AI 极简入门:Java 开发者快速上手 AI 开发

Spring AI 是 Spring 官方推出的 AI 应用开发框架,让 Java 开发者用熟悉的 Spring Boot 方式,快速对接大模型,不用再死记不同 AI 平台的复杂 API,一套代码适配 OpenAI、通义千问、讯飞星火等主流模型。

一、核心优势(3 句话记住)

  1. 统一接口:用 ChatClient 一套 API 调用所有大模型,切换模型只改配置,不动业务代码。
  2. 零门槛集成:基于 Spring Boot 自动配置,引入依赖、配个密钥就能用。
  3. 功能齐全:支持聊天对话、上下文记忆、向量嵌入、RAG 知识库、结构化输出,满足日常 AI 需求。

二、基础快速上手(5 分钟跑通)

1. Maven 基础依赖

复制代码
<!-- OpenAI通用启动器 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
    <version>1.1.6</version>
</dependency>
<!-- 通义千问适配依赖 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-alibaba-spring-boot-starter</artifactId>
    <version>1.1.6</version>
</dependency>
<!-- 内存向量库(本地测试用) -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-chroma-store-spring-boot-starter</artifactId>
    <version>1.1.6</version>
</dependency>

2. OpenAI 基础配置 application.yml

复制代码
spring:
  ai:
    openai:
      api-key: 你的OpenAI密钥
      chat:
        options:
          model: gpt-3.5-turbo

3. 基础对话接口

复制代码
@RestController
@RequestMapping("/ai")
public class AiController {
    private final ChatClient chatClient;

    public AiController(ChatClient.Builder builder) {
        this.chatClient = builder.defaultSystem("你是友好的AI助手").build();
    }

    // 单次无记忆对话
    @GetMapping("/chat")
    public String chat(@RequestParam String msg) {
        return chatClient.prompt().user(msg).call().content();
    }
}

三、扩展 1:上下文记忆(多轮对话,AI 记住历史聊天)

默认单次对话无记忆,每次请求都是全新会话,Spring AI 自带MessageChatMemory实现会话记忆。

改造 Controller

复制代码
@RestController
@RequestMapping("/ai")
public class AiController {
    private final ChatClient chatClient;
    // 内存会话存储,生产环境可换Redis持久化
    private final ChatMemory chatMemory = new InMemoryChatMemory();

    public AiController(ChatClient.Builder builder) {
        this.chatClient = builder
                .defaultSystem("你是友好的AI助手,记住我们之前的对话")
                .build();
    }

    // 带上下文多轮对话,sessionId区分不同用户会话
    @GetMapping("/chat/memory")
    public String chatWithMemory(@RequestParam String msg, @RequestParam String sessionId) {
        String res = chatClient.prompt()
                .user(msg)
                // 绑定会话记忆
                .chatMemory(chatMemory, sessionId)
                .call()
                .content();
        return res;
    }

    // 清空指定会话历史
    @DeleteMapping("/chat/clear")
    public String clearMemory(@RequestParam String sessionId) {
        chatMemory.clear(sessionId);
        return "会话" + sessionId + "历史已清空";
    }
}

使用示例

  1. 第一次请求:/ai/chat/memory?sessionId=user001&msg=我叫小明
  2. 第二次请求:/ai/chat/memory?sessionId=user001&msg=我叫什么名字? AI 会读取历史消息,正确回答你叫小明。

四、扩展 2:向量数据库 + RAG 知识库(本地文档问答)

场景:上传本地文档,AI 只基于文档内容回答,不胡说(RAG 检索增强生成)

1. 配置 Chroma 内存向量库

复制代码
spring:
  ai:
    chroma:
      client:
        host: localhost
        port: 8000

2. 向量工具类(文档入库、检索)

复制代码
@Service
public class RagService {
    private final VectorStore vectorStore;
    private final ChatClient chatClient;

    public RagService(VectorStore vectorStore, ChatClient.Builder builder) {
        this.vectorStore = vectorStore;
        this.chatClient = builder.defaultSystem("只根据提供的文档内容回答,不知道就说没有相关信息").build();
    }

    // 加载本地txt文档写入向量库
    public void loadDoc(File file) {
        DocumentReader reader = new TextReader(file);
        List<Document> docs = reader.get();
        // 文档切片
        TokenTextSplitter splitter = new TokenTextSplitter();
        List<Document> splitDocs = splitter.split(docs);
        // 存入向量库
        vectorStore.add(splitDocs);
    }

    // RAG问答:先检索向量库再交给AI
    @GetMapping("/rag/query")
    public String ragQuery(@RequestParam String question) {
        // 相似度检索
        List<Document> similarDocs = vectorStore.similaritySearch(SearchRequest.query(question).withTopK(3));
        // 拼接检索到的文档内容
        String context = similarDocs.stream()
                .map(Document::getText)
                .collect(Collectors.joining("\n=====\n"));

        String prompt = """
                参考资料:
                {context}
                用户问题:{question}
                """;

        return chatClient.prompt()
                .user(u -> u.text(prompt).param("context", context).param("question", question))
                .call()
                .content();
    }
}

五、扩展 3:通义千问模型完整适配(阿里大模型切换)

1. application.yml 通义千问配置

复制代码
spring:
  ai:
    alibaba:
      api-key: 阿里云百炼获取的api-key
      chat:
        options:
          model: qwen-turbo # 可选 qwen-plus、qwen-max

2. 通义千问专用对话接口(自动切换模型,代码无需大改)

复制代码
@RestController
@RequestMapping("/ai/qwen")
public class QwenController {
    // 自动注入通义千问ChatClient,切换模型仅改配置
    private final ChatClient qwenChatClient;
    private final ChatMemory chatMemory = new InMemoryChatMemory();

    public QwenController(@Qualifier("alibabaChatClient") ChatClient.Builder builder) {
        this.qwenChatClient = builder.defaultSystem("你是通义千问AI助手").build();
    }

    // 通义千问多轮记忆对话
    @GetMapping("/chat")
    public String chat(@RequestParam String msg, @RequestParam String sessionId) {
        return qwenChatClient.prompt()
                .user(msg)
                .chatMemory(chatMemory, sessionId)
                .call()
                .content();
    }
}

多模型共存小技巧

项目同时引入 OpenAI 和通义千问依赖,通过@Qualifier("alibabaChatClient")区分模型客户端,一套项目同时调用多款大模型。

六、整体总结

  1. 上下文记忆 :依靠ChatMemory实现多轮对话,用 sessionId 隔离不同用户会话,生产可替换 Redis 持久化;
  2. 向量数据库 RAG:文档向量化存入向量库,提问时先检索相关文档,解决 AI 幻觉、私有知识库问答;
  3. 通义千问适配:Spring AI 阿里专用 starter,配置密钥即可切换国产大模型,业务代码几乎不用改动;

Spring AI 统一抽象层极大降低 Java 接入 AI 成本,先掌握基础对话,再拓展记忆、知识库、国产大模型,就能快速开发企业内部 AI 问答、智能客服、文档助手等业务。

补充小提示

  1. InMemoryChatMemory 仅适合测试,线上使用 RedisChatMemory 持久化会话;
  2. Chroma 适合本地开发,生产推荐 Milvus、PGVector 向量数据库;
  3. 阿里云通义千问 API Key 在「阿里云百炼」平台申请,免费额度可用于学习测试。
相关推荐
DO_Community12 分钟前
Claude Opus 5 现已上线 DigitalOcean AI 推理云
人工智能·llm·agent·claude
幸福指北15 分钟前
🚀 开源了,一个人 + AI 肝出一个 AI 终端 | AShell 技术分享
运维·人工智能·ai·终端
可以飞的话17 分钟前
一、机器学习概述
人工智能·机器学习
sunneo34 分钟前
磐石2.0发布,科学建模新突破
人工智能
煎饼学大模型35 分钟前
Agent 的“大脑-手“解耦架构:当推理层和工具执行层各自独立演进
数据库·人工智能·oracle·架构·agent
头发还在的女程序员1 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats1 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
南京码讯光电技术有限公司1 小时前
2026年4G/5G工业CPE推荐:从极端场景看硬核选型
人工智能
我命由我123452 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
企业智能研究2 小时前
企业如何落地企微私域智能客服来降本增效:从技术选型到实施落地的完整指南
大数据·人工智能·企业微信·智能客服