Spring AI與DeepSeek實(shí)戰(zhàn)一之快速打造智能對(duì)話應(yīng)用
一、概述
在 AI 技術(shù)蓬勃發(fā)展的今天,國(guó)產(chǎn)大模型 DeepSeek
憑借其 低成本、高性能 的特點(diǎn),成為企業(yè)智能化轉(zhuǎn)型的熱門(mén)選擇。而 Spring AI
作為 Java 生態(tài)的 AI 集成框架,通過(guò)統(tǒng)一API、簡(jiǎn)化配置等特性,讓開(kāi)發(fā)者無(wú)需深入底層即可快速調(diào)用各類(lèi) AI 服務(wù)。本文將手把手教你通過(guò) spring-ai
集成 DeepSeek
接口實(shí)現(xiàn)普通對(duì)話與流式對(duì)話功能,助力你的 Java
應(yīng)用輕松接入 AI 能力!
二、申請(qǐng)DeepSeek的API-KEY
相較于直接調(diào)用 DeepSeek 官方的 API,阿里云百煉基于阿里云強(qiáng)大的云計(jì)算基礎(chǔ)設(shè)施,提供了高可用性和穩(wěn)定性的服務(wù),并且支持程序運(yùn)行時(shí)動(dòng)態(tài)切換 模型廣場(chǎng) 中的任意大模型。
登錄阿里云,進(jìn)入 阿里云百煉
的頁(yè)面:
https://bailian.console.aliyun.com/?apiKey=1#/api-key
創(chuàng)建自己的 API-KEY
三、項(xiàng)目搭建
3.1. 開(kāi)發(fā)環(huán)境要求
- JDK 17+
- Spring Boot 3.2.x及以上
3.2. maven配置
在 Spring Boot
項(xiàng)目的 pom.xml
中添加 spring-ai
依賴(lài)
<dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-starter</artifactId> </dependency>
增加倉(cāng)庫(kù)的配置
<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
配置在阿里云百煉里申請(qǐng)的api-key 3.4. 創(chuàng)建ChatClient對(duì)象
private final ChatClient chatClient; public ChatController(ChatClient.Builder builder) { String sysPrompt = """ 你是一個(gè)博學(xué)的智能聊天助手,請(qǐng)根據(jù)用戶(hù)提問(wèn)回答。 請(qǐng)講中文。 今天的日期是 {current_date}。 """; this.chatClient = builder .defaultSystem(sysPrompt) .defaultOptions( DashScopeChatOptions.builder() /** * 值范圍:[0, 2),系統(tǒng)默認(rèn)值0.85。不建議取值為0,無(wú)意義 */ .withTemperature(1.3) .withModel("deepseek-v3") .build() ) .build(); }
- defaultSystem 指定系統(tǒng) prompt 來(lái)約束大模型的行為或者提供一些上下文信息,如這里告訴大模型今天的日期是多少,支持占位符;
- defaultOptions 配置模型的參數(shù)
- withTemperature 用于控制隨機(jī)性和多樣性的程度,值越高大模型回復(fù)的內(nèi)容越豐富越天馬行空
- withModel 配置模型廣場(chǎng)中的模型名稱(chēng),這里填寫(xiě) deepseek-v3
模型廣場(chǎng)的模型名稱(chēng)清單:https://help.aliyun.com/zh/model-studio/getting-started/models
3.5. 創(chuàng)建對(duì)話接口
@GetMapping(value = "/chat") public String chat(@RequestParam String input, HttpServletResponse response) { // 設(shè)置字符編碼,避免亂碼 response.setCharacterEncoding("UTF-8"); return chatClient.prompt().user(input) .system(s -> s.param("current_date", LocalDate.now().toString())) .call() .content(); }
每次調(diào)用接口時(shí),通過(guò) system 來(lái)給 current_date 占位符動(dòng)態(tài)賦值。
調(diào)用示例:
問(wèn)身份
問(wèn)日期
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 來(lái)配置模型名稱(chēng)
調(diào)用示例:
切換deepseek-r1模型
切換通義千問(wèn)模型
3.7. 使用prompt模板
通過(guò) PromptTemplate
可以編輯復(fù)雜的提示詞,并且也支持占位符
@GetMapping(value = "/chatTemp") public String chatTemp(@RequestParam String input, HttpServletResponse response) { response.setCharacterEncoding("UTF-8"); // 使用PromptTemplate定義提示詞模板 PromptTemplate promptTemplate = new PromptTemplate("請(qǐng)逐步解釋你的思考過(guò)程: {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 進(jìn)行逐步拆分思考,并把思考過(guò)程返回。
調(diào)用示例:
可以看到大模型會(huì)拆分多步來(lái)進(jìn)行推論結(jié)果。
3.8. 使用流式對(duì)話
當(dāng)前接口需等待大模型完全生成回復(fù)內(nèi)容才能返回,這用戶(hù)體驗(yàn)并不好。為實(shí)現(xiàn)類(lèi)似 ChatGPT 的逐句實(shí)時(shí)輸出效果,可采用流式傳輸技術(shù)(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("請(qǐng)逐步解釋你的思考過(guò)程: {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]")); }
- 調(diào)用時(shí)把 call() 改成 stream()
- 并且遵循SSE協(xié)議最后發(fā)送
[DONE]
終止標(biāo)識(shí)
調(diào)用示例:
- data: xxx 這種是
Server-Sent Events
的格式要求; - 需要前端搭配 EventSource 或 WebSocket 等方式來(lái)接收流式數(shù)據(jù),并結(jié)合 marked.js 來(lái)正確顯示 markdown 語(yǔ)法。
四、總結(jié)
雖然通過(guò) Spring AI
能夠快速完成 DeepSeek
大模型與 Spring Boot
項(xiàng)目的對(duì)接,實(shí)現(xiàn)基礎(chǔ)的對(duì)話接口開(kāi)發(fā),但這僅是智能化轉(zhuǎn)型的初級(jí)階段。要將大模型能力真正落地為生產(chǎn)級(jí)應(yīng)用,還是需實(shí)現(xiàn)以下技術(shù):
- 能力擴(kuò)展層:通過(guò)
智能體
實(shí)現(xiàn)意圖理解與任務(wù)調(diào)度,結(jié)合FunctionCall
實(shí)現(xiàn)結(jié)構(gòu)化數(shù)據(jù)交互,實(shí)現(xiàn)AI與業(yè)務(wù)系統(tǒng)的無(wú)縫對(duì)接; - 知識(shí)增強(qiáng)層:應(yīng)用
RAG
(檢索增強(qiáng)生成)技術(shù)構(gòu)建領(lǐng)域知識(shí)庫(kù),解決大模型幻覺(jué)問(wèn)題,支撐專(zhuān)業(yè)場(chǎng)景的精準(zhǔn)問(wèn)答; - 流程編排層:設(shè)計(jì)
Agent
工作流實(shí)現(xiàn)復(fù)雜業(yè)務(wù)邏輯拆解,支持多步驟推理與自動(dòng)化決策; - 模型優(yōu)化層:基于業(yè)務(wù)數(shù)據(jù)實(shí)施模型微調(diào)
Fine-tuning
提升垂直場(chǎng)景的響應(yīng)質(zhì)量和可控性。
五、完整代碼
Gitee地址:
https://gitee.com/zlt2000/zlt-spring-ai-app
Github地址:
https://github.com/zlt2000/zlt-spring-ai-app
到此這篇關(guān)于Spring AI與DeepSeek實(shí)戰(zhàn)一:快速打造智能對(duì)話應(yīng)用的文章就介紹到這了,更多相關(guān)Spring AI DeepSeek智能對(duì)話內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring AI集成DeepSeek三步搞定Java智能應(yīng)用的詳細(xì)過(guò)程
- Spring AI集成DeepSeek的詳細(xì)步驟
- Deepseek整合SpringAI詳細(xì)流程
- 基于SpringAI+DeepSeek實(shí)現(xiàn)流式對(duì)話功能
- SpringBoot或SpringAI對(duì)接DeepSeek大模型的詳細(xì)步驟
- Spring AI內(nèi)置DeepSeek的詳細(xì)步驟
- SpringBoot整合DeepSeek實(shí)現(xiàn)AI對(duì)話功能
- Spring?AI集成DeepSeek實(shí)現(xiàn)流式輸出的操作方法
相關(guān)文章
Java 添加數(shù)字簽名到excel及檢測(cè),刪除簽名
這篇文章主要介紹了Java 添加數(shù)字簽名到excel及檢測(cè),刪除簽名的方法,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-04-04Spring Boot整合elasticsearch的詳細(xì)步驟
這篇文章主要介紹了Spring Boot整合elasticsearch的詳細(xì)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Java中常見(jiàn)的編碼集問(wèn)題總結(jié)
這篇文章主要為大家整理了一些Java中常見(jiàn)的編碼集問(wèn)題,文中的示例代碼講解詳細(xì),對(duì)我們深入理解Java有一定的幫助,感興趣的小伙伴可以了解一下2023-02-02SpringBoot開(kāi)發(fā)實(shí)戰(zhàn)之自動(dòng)配置
SpringBoot的核心就是自動(dòng)配置,自動(dòng)配置又是基于條件判斷來(lái)配置Bean,下面這篇文章主要給大家介紹了關(guān)于SpringBoot開(kāi)發(fā)實(shí)戰(zhàn)之自動(dòng)配置的相關(guān)資料,需要的朋友可以參考下2021-08-08基于Java中對(duì)域和靜態(tài)方法的訪問(wèn)不具有多態(tài)性(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇基于Java中對(duì)域和靜態(tài)方法的訪問(wèn)不具有多態(tài)性(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10Java實(shí)現(xiàn)五子棋(附詳細(xì)源碼)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03Java中StringUtils與CollectionUtils和ObjectUtil概念講解
這篇文章主要介紹了Java中StringUtils與CollectionUtils和ObjectUtil概念,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12