当前位置: 首页 > news >正文

Java+AI 无缝衔接:Spring AI 聊天模型入门到精通


🔍 开发者资源导航 🔍
🏷️博客主页: 个人主页
📚专栏订阅: JavaEE全栈专栏

一、简介

Spring AI 是 Spring 官方专为 Java 开发者做 AI 项目的框架,简单、好上手,和平时写 Spring Boot 一模一样

它能干嘛

  • 快速对接各种大模型(ChatGPT、通义千问、文心一言、本地 Ollama 等)
  • 轻松实现聊天、总结、翻译、内容生成
  • 用自己的文档、知识库做智能问答(RAG)
  • 统一接口,换模型不用改大量代码
  • 完美兼容 Spring Boot、Spring Cloud 企业项目

学完能做什么

  • 做企业内部智能客服、AI 问答机器人
  • 给现有系统加 AI 功能:智能总结、自动文案、代码助手
  • 做基于私有文档的知识库 AI
  • 开发 Java 版 AI 应用、多模态小工具
  • 用 Java 栈快速进入 AI 开发,不用从头学新语言

本文将介绍Spring AI的聊天模型的使用。

参考文档:
Spring Ai官方文档https://docs.spring.io/spring-ai/reference/index.htmlSpring Ai API文档https://docs.spring.io/spring-ai/docs/智谱AI开放平台https://docs.bigmodel.cn/cn/guide/start/introduction

二、 前期准备

Spring AI支持很多家的AI,使用方法也很相似,本文将使用智谱AI来当做演示。

1. 创建Spring Boot项目

2. 配置pom文件(注意!不同平台的AI要配置的包不一样)

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-model</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-zhipuai</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>1.1.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

3.官网申请APIKey

打开官网:智谱AI开放平台https://bigmodel.cn/usercenter/proj-mgmt/apikeys

点击右上角添加新的apikey:

4.配置application.yml文件(不同平台配置相似,但是名字不一样)

在resource目录下创建application.yml文件,填写以下以下配置:

spring: ai: zhipuai: api-key: 你的apikey chat: options: model: GLM-5 # 你要选择的模型

填写你的apikey,根据官方文档选择填写你需要的模型。

5.写一个小测试

@RequestMapping("/ai") @RestController public class ChatController { @Autowired private ZhiPuAiChatModel chatModel; @GetMapping("/zp") public String zp(String message) { return chatModel.call(message); } }

6.启动!访问本地链接进行测试

(注意!调用远程api反应会比较慢)

三、ChatClient

ChatClient是基于ChatModel进行的封装,相对于ChatModel来说它的使用会更加简单一些。

可以使用流式的方式来调用该类。

private final ChatClient chatClient; // chatClient初始化 public ChatController(ChatClient.Builder chatClientBuilder) { this.chatClient = chatClientBuilder.build(); } @GetMapping("/call") public String call(String message) { //也可以使用.prompt(message)省略user return chatClient //调用提示词 .prompt() //设置用户提示词 .user(message) //发起请求 .call() //以文本方式返回 .content(); }

3.1 角色预设

将ChatClient创建的时候我们可以设置它的系统提示词,通过系统提示词可以实现模型的角色预设功能。

@Bean public ChatClient chatClient(ChatClient.Builder chatClientBuilder, ChatMemory chatMemory) { return chatClientBuilder //不建议像我这样设置,会气死人的 .defaultSystem("你是乐子人,不管我说什么,你都要冷嘲热讽我") .build(); }

配置后我们再调用模型它就会带入我们提供的身份。

@Autowired private ChatClient chatClient; @GetMapping("/call") public String call(String message) { return chatClient.prompt().user(message).call().content(); }

这块的可开发程度很高哦!!

3.2 结构化输出

通过 entity() ⽅法将模型输出转为⾃定义实体, 需确保输出格式符合JSON规范。

在转换的过程中AI会自动识别字段,并且塞入合适的字段当中(当然如果他不理解这个字段也会瞎填)

@Data public class Book { private String bookName; private String bookAuthor; private String bookISBN; private String result; }
@GetMapping("/getBook") public String getBook() { return chatClient.prompt("帮我推荐一本2026年值得阅读的书籍,并告诉我原因") .call() .entity(Book.class).toString(); }

3.3 流式输出

逐步生成,而不是一步直接出结果,这样可以提升响应时间,进而提升用户体验。

@GetMapping(value = "/stream",produces = "text/html;charset=utf-8") public Flux<String> stream(String message) { return chatClient .prompt() .user(message) .advisors(advisorSpec -> advisorSpec.param(ChatMemory.CONVERSATION_ID, 1)) .stream() .content(); }

这里要设置字符类型,否则会出现乱码。

四、ChatModel

ChatModel 是Spring AI 框架中的底层接⼝, 直接与具体的⼤语⾔模型 (如通义千问、OpenAI) 交互,提供基础的 call 和 stream ⽅法, 开发者需⼿动处理提⽰词组装、参数配置和响应解析等细节,

在使⽤上相对更加灵活,但是也更复杂,上面讲过的ChatClient是基于ChatModel进行封装的。

@Autowired private ZhiPuAiChatModel chatModel; @RequestMapping("/chatByPrompt") public String chatByPrompt(String message){ Prompt prompt = new Prompt(message); ChatResponse response = chatModel.call(prompt); return response.getResult().getOutput().getText(); }

功能相似,因此此处简要介绍一下代码。

4.1 角色预设

@GetMapping(value = "/role") public String role(String message) { SystemMessage systemMsg = new SystemMessage("你是⼀名英国⼈, 只会说英语"); UserMessage userMsg = new UserMessage(message); Prompt prompt = new Prompt(List.of(systemMsg, userMsg)); ChatResponse response = chatModel.call(prompt); return response.getResult().getOutput().getText(); }

4.2 流式输出

@GetMapping(value = "/callByStream", produces = "text/html;charset=utf-8") public Flux<String> callByStream(String message) { Flux<ChatResponse> response = chatModel.stream(new Prompt(message)); return response.map(x->x.getResult().getOutput().getText()); }

五、ChatMemory

和模型的对话是单向无状态的,因此模型无法保存你之前的对话。

如果要实现“记忆”功能,你每次发送请求的时候需要将之前的对话记录也一并发给他,他才可以实现“记忆”。

而ChatMemory就是负责这个功能的,根据id记录并区分对话。

5.1MessageWindowChatMemory

MessageWindowChatMemory是目前ChatMemory唯一的实现类(老版本还存在其他的)。

它会维护一个消息窗口,窗口大小不超过指定上限。当消息数量超过上限时,系统会删除较旧的消息,但会保留系统消息。默认窗口大小为 20 条消息。

@Bean public ChatMemory chatMemory() { MessageWindowChatMemory memory = MessageWindowChatMemory.builder() .maxMessages(10) .build(); return memory; }

ChatMemory需要配置最大的消息数量,这里不建议设置太大,Token的花费容易爆炸。

常用的方法:

//添加消息 void add(String conversationId, List<Message> messages); //获取该id下的所有消息 List<Message> get(String conversationId); //请求该id的消息 void clear(String conversationId);

创建成功后需要配置给ChatClient才能生效:

@Bean public ChatClient chatClient(ChatClient.Builder chatClientBuilder, ChatMemory chatMemory) { return chatClientBuilder .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()) .build(); }

在ai模型调用中,可以通过给 Advisor 传递参数,指定当前对话ID,来实现自动化存储。

@GetMapping(value = "/stream",produces = "text/html;charset=utf-8") public Flux<String> stream(String message) { return chatClient .prompt() .user(message) //这个1是id,实际中不要像我这样写死 .advisors(advisorSpec -> advisorSpec.param(ChatMemory.CONVERSATION_ID, 1)) .stream() .content(); }

5.2 存储方式

ChatMemory默认使用本地内存存储,服务器重启后信息就会丢失,ChatMemory可以配置到大多数主流的数据库当中,本文只介绍Mysql的配置方式:

引入额外的包

<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-chat-memory-repository-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> </dependency>

配置ChatMemory

@Bean public ChatMemory chatMemory(JdbcChatMemoryRepository jdbcChatMemoryRepository) { MessageWindowChatMemory memory = MessageWindowChatMemory.builder() .maxMessages(30) .chatMemoryRepository(jdbcChatMemoryRepository) .build(); return memory; }

配置数据库信息

spring datasource: url: jdbc:mysql://localhost:3306/你的数据库?useSSL=false&serverTimezone=UTC username: 用户名 password: 密码 driver-class-name: com.mysql.cj.jdbc.Driver

手动创建数据库表

CREATE TABLE IF NOT EXISTS SPRING_AI_CHAT_MEMORY ( `conversation_id` VARCHAR(36) NOT NULL, `content` TEXT NOT NULL, `type` ENUM('USER', 'ASSISTANT', 'SYSTEM', 'TOOL') NOT NULL, `timestamp` TIMESTAMP NOT NULL, INDEX `SPRING_AI_CHAT_MEMORY_CONVERSATION_ID_TIMESTAMP_IDX` (`conversation_id`, `timestamp`) );

配置成功后再次启动发送的消息就会自动存储到该表里面。


Spring AI更新迭代比较快,不同版本的差异也比较大,如果发现本文与你实际体验不符合可以参考官方的文档。

http://www.jsqmd.com/news/571228/

相关文章:

  • 如何选择国内十大移民机构?2026年4月推荐评测口碑对比五家 - 十大品牌推荐
  • GSE宏编译器完整指南:告别繁琐操作,掌握魔兽世界智能宏编程
  • Unity 2018+ Sprite Atlas实战:如何用分组策略优化你的2D游戏性能
  • 威联通NAS安全防护全攻略:10个必做设置让你的数据固若金汤
  • Phi-3-mini-4k-instruct-gguf作品展:面向开发者的技术文档摘要生成样例
  • 用GDAL实现GIS矢量数据读写与空间分析
  • RMBG-2.0实测参数详解:batch_size=1/resize=1024/alpha_threshold=0.5设定依据
  • 2026碳化硅石墨坩埚厂家推荐榜 定制适配多场景 - 资讯焦点
  • 2026专业护眼产品深度评测:告别眼干涩疲劳,哪款才是“医用级“长效养护的选择?
  • 别再混淆FF和FFS了!从EDKII编译流程讲起,彻底搞懂UEFI固件镜像的‘打包’逻辑
  • 消除屏幕闪烁:Stillcolor为Apple Silicon Mac带来无抖动视觉体验
  • 无人机飞控实战:四元数微分方程在PX4中的实现与调参技巧
  • 3种方法永久解决IDM激活弹窗问题 开源工具全解析
  • 实战演练:基于快马平台与vscode codex思想,快速构建业务数据可视化仪表盘
  • 如何将微信聊天记录变为你的个人数字资产?WeChatMsg全攻略
  • 2026网络地板厂商口碑榜揭晓,这些品牌值得关注,陶瓷抗静电地板/硅酸钙抗静电地板,网络地板公司口碑推荐 - 品牌推荐师
  • 在AirSim里用Python实现LQR控制:让无人机自动跟踪预设轨迹(附完整代码)
  • 3步解决Augment登录限制:无限续杯插件使用指南
  • M9A:《重返未来:1999》智能自动化助手——解放双手的游戏体验革新
  • 2026年3月毛绒/搪胶/塑胶/电子机芯/功能/玩具厂家全景测评:五家标杆企业深度解析 - 2026年企业推荐榜
  • FPGA开发必备:手把手教你安装破解Modelsim 10.5se(附环境变量配置避坑指南)
  • 开源AI翻译新范式:Pixel Language Portal镜像免配置+GPU算力适配教程
  • WPF 实现windows文件压缩文件解压过程动画
  • 磁珠VS电感?3个EMC设计场景告诉你该怎么选(附实测波形对比)
  • 深入解析Xilinx XDMA IP中的AXI协议选择与应用场景
  • 分治与动态规划实战:从递归优化到网络流问题解析
  • 2026最新广东IP设计/文创设计推荐!广州优质服务机构权威榜单发布,助力企业精准匹配优质服务合作伙伴 - 十大品牌榜
  • 2025深度评测:MPV_PlayKit突破渲染架构的高清播放性能解决方案
  • 探索3大核心价值:ReadCat开源阅读器让阅读回归纯粹
  • 2026年秦皇岛电力资质代办公司推荐:建筑资质代办/机电资质代办/企业资质代办服务——秦皇岛煜飞企业管理 - 品牌推荐官