一、概述
在 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
到此这篇关于spring ai与deepseek实战一:快速打造智能对话应用的文章就介绍到这了,更多相关spring ai deepseek智能对话内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论