Spring AI与DeepSeek实战一:快速打造智能对话应用
一、概述
在 AI 技术蓬勃发展的今天,国产大模型 DeepSeek
凭借其 低成本 、高性能 的特点,成为企业智能化转型的热门选择。而 Spring AI
作为 Java 生态的 AI 集成框架,通过统一API、简化配置等特性,让开发者无需深入底层即可快速调用各类 AI 服务。本文将手把手教你通过 spring-ai
集成 DeepSeek
接口实现普通对话与流式对话功能,助力你的 Java
应用轻松接入 AI 能力!
二、申请DeepSeek的API-KEY
相较于直接调用 DeepSeek 官方的 API,阿里云百炼基于阿里云强大的云计算基础设施,提供了高可用性和稳定性的服务,并且支持程序运行时动态切换 模型广场 中的任意大模型。
登录阿里云,进入 阿里云百炼
的页面:
https://bailian.console.aliyun.com/?apiKey=1#/api-key
创建自己的 API-KEY
三、项目搭建
3.1. 开发环境要求
- JDK 17+
- Spring Boot 3.2.x及以上
3.2. maven配置
在 Spring Boot
项目的 pom.xml
中添加 spring-ai
依赖
<dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-starter</artifactId> </dependency>
增加仓库的配置
<repositories> <repository> <id>alimaven</id> <url>https://maven.aliyun.com/repository/public</url> </repository> <repository> <id>spring-milestones</id> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>spring-snapshots</id> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
3.3. 配置 API-KEY
在 application.yml
中添加以下配置:
spring: ai: dashscope: api-key: sk-xxxxxx
api-key
配置在阿里云百炼里申请的api-key
3.4. 创建ChatClient对象
private final ChatClient chatClient; public ChatController(ChatClient.Builder builder) { String sysPrompt = """ 你是一个博学的智能聊天助手,请根据用户提问回答。 请讲中文。 今天的日期是 {current_date}。 """; this.chatClient = builder .defaultSystem(sysPrompt) .defaultOptions( DashScopeChatOptions.builder() /** * 值范围:[0, 2),系统默认值0.85。不建议取值为0,无意义 */ .withTemperature(1.3) .withModel("deepseek-v3") .build() ) .build(); }
- defaultSystem 指定系统 prompt 来约束大模型的行为或者提供一些上下文信息,如这里告诉大模型今天的日期是多少,支持占位符;
- defaultOptions 配置模型的参数
- withTemperature 用于控制随机性和多样性的程度,值越高大模型回复的内容越丰富越天马行空
- withModel 配置模型广场中的模型名称,这里填写
deepseek-v3
模型广场的模型名称清单:https://help.aliyun.com/zh/model-studio/getting-started/models
3.5. 创建对话接口
@GetMapping(value = "/chat") public String chat(@RequestParam String input, HttpServletResponse response) { // 设置字符编码,避免乱码 response.setCharacterEncoding("UTF-8"); return chatClient.prompt().user(input) .system(s -> s.param("current_date", LocalDate.now().toString())) .call() .content(); }
每次调用接口时,通过 system 来给 current_date 占位符动态赋值。
调用示例:
-
问身份
-
问日期
3.6. 切换模型
@GetMapping(value = "/chat") public String chat(@RequestParam String input, @RequestParam(required = false) String model, HttpServletResponse response) { response.setCharacterEncoding("UTF-8"); if (StrUtil.isEmpty(model)) { model = "deepseek-v3"; } return chatClient.prompt().user(input) .system(s -> s.param("current_date", LocalDate.now().toString())) .options(DashScopeChatOptions.builder().withModel(model).build()) .call() .content(); }
使用 withModel 来配置模型名称
调用示例:
-
切换deepseek-r1模型
-
切换通义千问模型
3.7. 使用prompt模板
通过 PromptTemplate
可以编辑复杂的提示词,并且也支持占位符
@GetMapping(value = "/chatTemp") public String chatTemp(@RequestParam String input, HttpServletResponse response) { response.setCharacterEncoding("UTF-8"); // 使用PromptTemplate定义提示词模板 PromptTemplate promptTemplate = new PromptTemplate("请逐步解释你的思考过程: {input}"); Prompt prompt = promptTemplate.create(Map.of("input", input)); return chatClient.prompt(prompt) .system(s -> s.param("current_date", LocalDate.now().toString())) .call() .content(); }
这里提出让 deepseek-v3 进行逐步拆分思考,并把思考过程返回。
调用示例 :
可以看到大模型会拆分多步来进行推论结果。
3.8. 使用流式对话
当前接口需等待大模型完全生成回复内容才能返回,这用户体验并不好。为实现类似 ChatGPT 的逐句实时输出效果,可采用流式传输技术(Streaming Response)。
@GetMapping(value = "/streamChat", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> streamChat(@RequestParam String input, HttpServletResponse response) { response.setCharacterEncoding("UTF-8"); // 使用PromptTemplate定义提示词模板 PromptTemplate promptTemplate = new PromptTemplate("请逐步解释你的思考过程: {input}"); Prompt prompt = promptTemplate.create(Map.of("input", input)); return chatClient.prompt(prompt) .system(s -> s.param("current_date", LocalDate.now().toString())) .stream() .content() .concatWith(Flux.just("[DONE]")) .onErrorResume(e -> Flux.just("ERROR: " + e.getMessage(), "[DONE]")); }
- 调用时把 call() 改成 stream()
- 并且遵循SSE协议最后发送
[DONE]
终止标识
调用示例:
- data: xxx 这种是
Server-Sent Events
的格式要求;- 需要前端搭配 EventSource 或 WebSocket 等方式来接收流式数据,并结合 marked.js 来正确显示 markdown 语法。
四、总结
虽然通过 Spring AI
能够快速完成 DeepSeek
大模型与 Spring Boot
项目的对接,实现基础的对话接口开发,但这仅是智能化转型的初级阶段。要将大模型能力真正落地为生产级应用,还是需实现以下技术:
- 能力扩展层 :通过
智能体
实现意图理解与任务调度,结合FunctionCall
实现结构化数据交互,实现AI与业务系统的无缝对接; - 知识增强层 :应用
RAG
(检索增强生成)技术构建领域知识库,解决大模型幻觉问题,支撑专业场景的精准问答; - 流程编排层 :设计
Agent
工作流实现复杂业务逻辑拆解,支持多步骤推理与自动化决策; - 模型优化层 :基于业务数据实施模型微调
Fine-tuning
提升垂直场景的响应质量和可控性。
五、完整代码
- Gitee地址:
https://gitee.com/zlt2000/zlt-spring-ai-app
- Github地址:
https://github.com/zlt2000/zlt-spring-ai-app
扫码关注有惊喜!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
阿里云Milvus 2.5:支持全文检索,1次查询实现文本+向量双精度匹配
随着大模型时代带来的各种新型应用探索,结合传统基于文本匹配的精确检索与语义检索所带来的增益日益显著,尤其在一些深度依赖关键字词匹配的场景中,这种需求变得尤为关键。目前,阿里云向量检索服务 Milvus 版(简称阿里云 Milvus)集成开源 Milvus2.5版本内核,在支持向量检索的基础上,新增支持原生全文检索、基于特定词汇的精准文本匹配等功能,在 RAG、多模态搜索等场景下搜索精度明显提升,使用体验大幅优化。 阿里云 Milvus 是一款全托管向量检索引擎,100%兼容开源 Milvus,提供大规模AI向量数据的相似性检索服务。凭借其开箱即用的特性、灵活的扩展能力和全链路监控告警,成为多样化 AI 应用场景的理想选择。本次2.5版本的上线,使得阿里云 Milvus 能够实现从文本输入到向量检索的端到端流程,在电商、法律、新闻等多行业搜索场景中发挥多模态融合和场景化增强的价值。 全文检索(Full Text Search) 全文检索能力基于内置的 Sparse-BM25 算法,首次实现原生全文检索功能,与现有的语义搜索能力形成完美互补。 核心能力: 内置分词器,无需额外预处理:通过...
- 下一篇
从湖仓分离到湖仓一体,四川航空基于 SelectDB 的多源数据联邦分析实践
导读:随着川航大规模数据导入需求增长,数据响应频繁出现卡顿,原 Hadoop + Apache Doris 的数据架构存在着涉及组件多、并发性不足、数据导入受限的痛点。经过综合选型对比,川航选择引入 SelectDB 建设湖仓一体大数据分析引擎,取得了数据导入效率提升 3-6 倍,查询分析性能提升 10-18 倍、实时性提升至 5 秒内等收益。 本文转录自吴乐(四川航空 信息技术部 大数据架构师)在 Doris Summit Asia 2024 上的演讲,经编辑整理。 业务背景 四川航空股份有限公司(以下简称:川航),自开航至今持续安全飞行 36 年,现运营全空客机队超过 200 架飞机,年运送旅客量超过 3000 万,航线覆盖亚洲、欧洲、北美洲、大洋洲和非洲,品牌价值超过 900 亿。 航空公司的业务具有业务系统繁多、数据交互复杂、实时性要求高三大特点。 业务系统繁多:航空公司业务覆盖航班调度、票务销售、旅客服务、机组管理、机务维修、财务结算等多个领域,运营跨国航班还需满足不同国家法规与合规要求,这就使得涉及的基础架构与数据库种类繁多。 数据交互复杂:多业务系统间数据交互具有复杂性,...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS8编译安装MySQL8.0.19
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker使用Oracle官方镜像安装(12C,18C,19C)