Spring AI

1.大模型应用开发

2.spring AI

快速入门

1.对话机器人

用流式的话要指定字符编码,不然要乱码

在@Bean中加一个default的配置来加环绕通知来加输出日志,要自己在配置中配置输出日志的级别,不然也看不到

2.提示词工程-哄哄模拟器(prompt)

3.智能客服

4.ChatPDF-RAG

向量数据库

使用springAI自带的simpleVectorStore来实现向量数据库,这个不需要下载,所以不用占很多的存,用来示例,但实际开发中不要使用这个。用simple这个也不用引入依赖但是要配置,配置一个Bean,然后注入使用就可以

如果你也听说,有没有像过我,对流言会附和,还是你知道我还是我,跌跌撞撞才明白了许多,懂我的人就我一个我,想到你想起我,胸口依然温热

有了前提的知识,那么怎么把这些知识(JSON,Test,PDF...(引入对应相关的依赖))转化为document的文档呢,用spring提供的DocumentReader可以帮我们完成这件事

将docment加入向量库后也不用自己去将文件向量化了,向量数据库会自己将传入的文件向量化

一、为什么Java开发者需要关注Spring AI?

1.1 AI时代的Java机遇

2022年11月,OpenAI发布ChatGPT,AI一夜之间进入普通人的生活。2025年1月,DeepSeek-R1的发布更是彻底震惊了全球科技界------训练成本仅560万美元,性能却比肩OpenAI o1,这让中小型企业也有了参与AI开发的资格。

面对这场技术变革,Java开发者难免焦虑:AI开发似乎是Python的天下,我们这些深耕Spring生态的程序员该怎么办?

答案是:Spring AI

要知道,全球有**25亿+**的Java应用正在运行,超过90%的服务端应用采用Java语言。传统应用要AI化,最好的方式就是用Java自己的方案。而Spring AI正是Spring官方在2024年推出的AI框架,它的核心思想很简单:

让Java开发者像使用Spring Boot一样方便地调用AI模型。

1.2 Spring AI是什么?

打个比方,如果把各种AI模型(OpenAI、DeepSeek、通义千问等)比作不同品牌的电器,那Spring AI就是一个万能转换插头------你只需要学会一套接口,就能调用所有主流模型。

Spring AI的架构分为两层:

  • Spring AI:Spring官方定义的AI标准规范(接口层)

  • Spring AI Alibaba / OpenAI Starter:各厂商的具体实现

1.3 核心概念速览

在学习具体代码之前,先理解几个核心概念:

概念 大白话解释
ChatModel 智能对话机器人,你发消息,它回答案
ChatClient ChatModel的升级版,带链式调用等高级功能
Prompt 你给AI的指令,包含系统设定和用户问题
SystemMessage 设置AI的"人格"和规则
UserMessage 你实际想问的问题

二、零基础实战:三步集成Spring AI

理论说再多,不如动手跑起来。下面我们用三步完成Spring AI的集成,目标是实现一个简单的聊天接口。

2.1 第一步:添加依赖

pom.xml中添加以下配置:

xml

复制代码
<!-- Spring Boot 父项目 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.5.0</version>
</parent>

<!-- Spring AI 版本管理 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-bom</artifactId>
            <version>1.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- Spring AI OpenAI Starter(兼容DeepSeek) -->
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-model-openai</artifactId>
    </dependency>
</dependencies>

💡 小提示 :虽然我们用的是DeepSeek模型,但因为它兼容OpenAI的API规范,所以引入spring-ai-starter-model-openai即可。

2.2 第二步:配置API密钥

src/main/resources/application.yml中添加配置:

yaml

复制代码
spring:
  ai:
    openai:
      api-key: your-deepseek-api-key   # 换成你自己的
      base-url: https://api.deepseek.com
      chat:
        options:
          model: deepseek-chat          # 模型名称
          temperature: 0.7              # 控制回答的随机性(0-1)
          max-tokens: 500               # 最大输出长度

⚠️ 安全提醒:生产环境请使用环境变量管理API Key,不要硬编码在配置文件中!

2.3 第三步:编写Controller

java

复制代码
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/ai")
public class AIController {

    private final ChatClient chatClient;

    // 构造器注入ChatClient
    public AIController(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder.build();
    }

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

2.4 测试运行

启动Spring Boot应用,访问:

text

复制代码
http://localhost:8080/ai/chat?message=用Java写一个Hello World

你会看到AI返回的代码示例:

java

复制代码
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

🎉 恭喜!你已经完成了第一个Spring AI应用!


三、进阶玩法:让AI更聪明

基础调用只是开始,Spring AI提供了丰富的功能来提升AI应用的智能水平。

3.1 使用PromptTemplate实现提示词模板

java

复制代码
import org.springframework.ai.chat.prompt.PromptTemplate;

@PostMapping("/translate")
public String translate(@RequestBody TranslateRequest request) {
    PromptTemplate promptTemplate = new PromptTemplate("""
        将以下{sourceLang}文本翻译成{targetLang}:
        {text}
        """);
    
    promptTemplate.add("sourceLang", request.sourceLang());
    promptTemplate.add("targetLang", request.targetLang());
    promptTemplate.add("text", request.text());
    
    return chatClient.call(promptTemplate.render());
}

record TranslateRequest(String sourceLang, String targetLang, String text) {}

3.2 系统消息:给AI设定"人格"

系统消息(SystemMessage)是让AI扮演特定角色的关键:

java

复制代码
@GetMapping("/chat-with-role")
public Flux<String> chatWithRole(String question) {
    return chatClient.prompt()
        .system("""
            你是一个专业的Java技术博主。
            1. 回答时优先使用代码示例
            2. 用通俗易懂的语言解释概念
            3. 每次回答控制在500字以内
            4. 使用Markdown格式输出代码块
            """)
        .user(question)
        .stream()
        .content();
}

优秀的系统消息包含四个要素:

要素 说明 示例
角色设定 AI是什么身份 "你是一个法律顾问"
能力边界 能回答什么 "只回答法律相关问题"
输出格式 要求如何返回 "用HTML格式返回"
风格要求 语气、措辞要求 "用通俗易懂的语言"

3.3 流式响应:实现打字机效果

传统接口需要等待AI完全生成答案才能看到结果,体验不够好。流式响应可以实现逐字输出:

java

复制代码
@GetMapping(value = "/chat-stream", produces = "text/event-stream")
public Flux<String> chatStream(@RequestParam String message) {
    return chatClient.prompt()
            .user(message)
            .stream()
            .content();
}

前端通过EventSource接收数据,就能实现ChatGPT那样的打字机效果。

3.4 多模型支持:一个项目调用多个AI

Spring AI支持同时配置多个模型:

java

复制代码
@Configuration
public class MultiModelConfig {
    
    @Bean("deepseek")
    public ChatModel deepseekChatModel() {
        return new OpenAiChatModel(/* DeepSeek配置 */);
    }
    
    @Bean("qwen")
    public ChatModel qwenChatModel() {
        return new DashScopeChatModel(/* 通义千问配置 */);
    }
    
    @Bean("deepseekChatClient")
    public ChatClient deepseekChatClient(@Qualifier("deepseek") ChatModel model) {
        return ChatClient.builder(model).build();
    }
    
    @Bean("qwenChatClient")
    public ChatClient qwenChatClient(@Qualifier("qwen") ChatModel model) {
        return ChatClient.builder(model).build();
    }
}

使用时根据场景选择不同模型:

java

复制代码
@RestController
public class MultiModelController {
    
    @Resource(name = "deepseekChatClient")
    private ChatClient deepseekClient;
    
    @Resource(name = "qwenChatClient")
    private ChatClient qwenClient;
    
    @GetMapping("/chat/deepseek")
    public String chatWithDeepSeek(String msg) {
        return deepseekClient.prompt().user(msg).call().content();
    }
    
    @GetMapping("/chat/qwen")
    public String chatWithQwen(String msg) {
        return qwenClient.prompt().user(msg).call().content();
    }
}

四、避坑指南与最佳实践

4.1 常见错误处理

java

复制代码
import org.springframework.ai.openai.api.OpenAiApiException;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(OpenAiApiException.class)
    public ResponseEntity<String> handleOpenAiError(OpenAiApiException ex) {
        // API Key无效、余额不足等情况
        return ResponseEntity.status(ex.getStatusCode())
                .body("AI服务错误: " + ex.getMessage());
    }
}

4.2 超长文本处理

如果输入文本过长,可能超过模型的token限制,需要在配置中调整:

yaml

复制代码
spring:
  ai:
    openai:
      chat:
        options:
          max-tokens: 2000   # 增加最大输出长度

4.3 生产环境配置建议

yaml

复制代码
# 使用环境变量管理密钥
spring:
  ai:
    openai:
      api-key: ${AI_API_KEY}  # 从环境变量读取
      base-url: ${AI_BASE_URL:https://api.openai.com/v1}
      chat:
        options:
          temperature: 0.7
          max-tokens: 500
          timeout: 30s        # 设置超时时间

4.4 切换模型提供商

Spring AI的核心优势是面向接口编程------切换模型提供商只需三步:

  1. 换依赖 :将spring-ai-starter-model-openai换成spring-ai-alibaba-starter-dashscope

  2. 改配置 :将spring.ai.openai.api-key改成spring.ai.dashscope.api-key

  3. Controller代码完全不用改!


五、Spring AI能做什么?------应用场景

场景 说明 典型案例
智能客服 7x24小时自动解答客户问题 梅奥诊所的智能医疗咨询客服
代码生成 根据需求自动生成代码片段 辅助开发、代码审查
内容创作 生成文章、故事、文案初稿 新闻报道草稿生成
数据分析 从大量数据中提取洞察 金融数据分析辅助决策
教育辅导 个性化学习推荐、题目解析 智能教育平台
翻译服务 多语言实时翻译 跨国业务沟通

六、总结与展望

6.1 核心知识点回顾

  • Spring AI是Spring官方AI框架,让Java开发者用熟悉的方式调用AI模型

  • ChatClient是日常开发的首选,90%的场景用它就够了

  • Prompt工程是提升AI输出质量的关键,系统消息+用户消息的组合很重要

  • 流式响应能大幅提升用户体验,实现打字机效果

  • 多模型支持让你可以根据场景灵活选择最合适的模型

6.2 未来趋势

Spring AI正在快速演进,值得关注的几个方向:

  • 多模态支持:从文本扩展到图像、语音、视频

  • 本地模型集成:优化对Ollama等本地运行模型的支持,降低云端依赖

  • 企业级能力:与Spring Security、Spring Cloud深度集成,提供鉴权、限流、熔断能力

  • RAG(检索增强生成):让AI能访问企业私有数据,生成更精准的回答

相关推荐
海兰5 分钟前
【实战】HiMarket本地化部署指南
人工智能·ubuntu·架构·银行系统
zhangshuang-peta7 分钟前
MCP:把不确定性变成工程能力
人工智能·ai agent·mcp·peta
高梦轩16 分钟前
MySQL 故障排查与优化
数据库·mysql
m0_5648768418 分钟前
提示词工程手册学习
人工智能·python·深度学习·学习
吴声子夜歌31 分钟前
Node.js——操作MySQL数据库
数据库·mysql·node.js
爱丽_32 分钟前
MySQL 锁等待与死锁进阶:怎么看等待、怎么降冲突(工程化套路)
数据库·mysql
心有—林夕42 分钟前
MySQL 误操作恢复完全指南
android·数据库·mysql
AI精钢42 分钟前
谷歌时隔一年发布“更加开源“的 Gemma 4,意图何为?
人工智能·云原生·开源·aigc
夕除44 分钟前
Mysql--15
java·数据库·mysql
洞见新研社1 小时前
从算力到电力,谁在搭建AI时代的“能源基座”?
人工智能·能源