20分鐘上手DeepSeek開發:SpringBoot + Vue2快速構建AI對話系統

20分鐘上手DeepSeek開發:SpringBoot + Vue2快速構建AI對話系統

前言

在生成式AI技術蓬勃發展的今天,大語言模型已成為企業智能化轉型和個人效率提升的核心驅動力。作為國產大模型的優秀代表,DeepSeek憑借其卓越的中文語義理解能力和開發者友好的API生態,正在成為構建本土化AI應用的首選平臺。本文將以Spring Boot3+Vue2全棧技術為基礎,手把手帶你打造一個具備以下特性的AI對話系統:

  • 實時流式對話交互體驗;
  • 支持Markdown代碼塊/表格的專業級內容渲染;
  • 前端安全防護與響應式界面設計;
  • 高擴展性的API接入架構。

為什么選擇DeepSeek

  • 中文語境專家:針對中文語法特點優化,歧義識別準確率提升40%;
  • 極速響應:國內服務器部署,平均API延遲<800ms;
  • 成本可控:免費試用+階梯定價模式,個人項目月均成本低至5元;
  • 流式輸出:支持chunked數據傳輸,避免用戶長時間等待。

技術架構解析

后端技術棧

  • SpringBoot 3.x:快速構建RESTful API;
  • WebFlux:響應式流處理框架,QPS可達3000+;
  • Lombok:通過注解簡化POJO模型。

前端技術棧

  • Vue2.x
  • WebSocket:雙向實時通信支持;
  • XSS防御:DOMPurify過濾惡意腳本。

環境準備

  • JDK 17+;
  • Node.js 12+;
  • Maven 3.9+;
  • Ollama。

后端項目初始化

pom依賴

<?xml version="1.0" encoding="UTF-8"?>
<modelVersion>4.0.0</modelVersion>
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.8</version><relativePath/><!-- lookup parent from repository -->
</parent>
<groupId>cn.com.codingce</groupId>
<artifactId>deepseek</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>deepseek</name>
<url/>
<licenses><license/>
</licenses>
<developers><developer/>
</developers>
<scm><connection/><developerConnection/><tag/><url/>
</scm>
<properties><java.version>17</java.version><spring-ai.version>1.0.0-M5</spring-ai.version>
</properties>
<dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency>
</dependencies>
<build><plugins><plugin><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
</project>

yml配置文件

server:port: 8080
spring:ai:ollama:base-url: http://localhost:11434chat:model: deepseek-r1:8bapplication:name: codingce-deepspeekwebflux:base-path: /codec:max-in-memory-size: 10MB
logging:level:cn.com.codingce.deepseek: DEBUGorg.springframework.web: INFO

核心服務實現

DeepSeekService 是一個核心服務類,主要負責處理與 Ollama 的通信和數據處理。整個服務采用響應式編程模式(Flux),實現非阻塞式處理,提高系統性能。同時通過日志記錄,確保服務的可靠性和穩定性。

package cn.com.codingce.deepseek.service;import cn.com.codingce.deepseek.model.Message;
import cn.com.codingce.deepseek.model.MessageType;
import cn.com.codingce.deepseek.model.OllamaResponse;
import cn.com.codingce.deepseek.model.StreamResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.ollama.OllamaClient;
import org.springframework.ai.ollama.OllamaException;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;@Service
@AllArgsConstructor
@Slf4j
public class DeepSeekService {private final OllamaClient ollamaClient;private final ObjectMapper objectMapper;public Flux<Message> generateResponse(String prompt) {return Flux.create(sink -> {List<String> messages = new ArrayList<>();messages.add(prompt);try {ollamaClient.chat("deepseek-r1:8b", messages, response -> {try {OllamaResponse ollamaResponse = objectMapper.readValue(response, OllamaResponse.class);String content = ollamaResponse.getContent();if (content != null && !content.isEmpty()) {sink.next(new Message(MessageType.ASSISTANT, content));}} catch (IOException e) {log.error("Error processing Ollama response", e);sink.error(e);}}, error -> {log.error("Error from Ollama", error);sink.error(new RuntimeException("Error from Ollama", error));}, () -> {log.info("Ollama chat completed");sink.complete();});} catch (OllamaException e) {log.error("Error initiating Ollama chat", e);sink.error(e);}});}
}

WebSocket控制器

WebSocketController 是一個 WebSocket 控制器,用于處理前端與后端之間的實時通信。它支持消息的接收和發送,并將用戶的消息傳遞給 DeepSeekService,然后將 AI 的響應實時推送給前端。

package cn.com.codingce.deepseek.controller;import cn.com.codingce.deepseek.model.Message;
import cn.com.codingce.deepseek.service.DeepSeekService;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
import reactor.core.publisher.FluxSink;import java.util.concurrent.ConcurrentHashMap;@Controller
public class WebSocketController {private final DeepSeekService deepSeekService;private final ConcurrentHashMap<String, FluxSink<Message>> sinks = new ConcurrentHashMap<>();public WebSocketController(DeepSeekService deepSeekService) {this.deepSeekService = deepSeekService;}@MessageMapping("/chat")public void receiveMessage(String sessionId, String message) {sinks.putIfAbsent(sessionId, Flux.sink());FluxSink<Message> sink = sinks.get(sessionId);deepSeekService.generateResponse(message).subscribe(sink::next, sink::error, sink::complete);}@SendTo("/topic/messages/{sessionId}")public Flux<Message> sendMessage(String sessionId) {return Flux.create(sinks.get(sessionId));}
}

前端項目初始化

項目結構

前端項目基于 Vue2 構建,主要包含以下目錄結構:

src/
├── assets/
├── components/
│   └── ChatWindow.vue
├── App.vue
├── main.js

安裝依賴

在項目根目錄下運行以下命令安裝依賴:

npm install

主組件

App.vue 是主組件,用于加載聊天窗口組件。

<template><div id="app"><ChatWindow /></div>
</template><script>
import ChatWindow from './components/ChatWindow.vue';export default {name: 'App',components: {ChatWindow}
};
</script><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;
}
</style>

聊天窗口組件

ChatWindow.vue 是聊天窗口組件,負責顯示消息和處理用戶輸入。

<template><div class="chat-window"><div class="messages"><div v-for="message in messages" :key="message.id" class="message"><div :class="['message-content', { 'assistant': message.type === 'assistant' }]"><div v-html="message.content"></div></div></div></div><input v-model="inputMessage" @keyup.enter="sendMessage" placeholder="Type a message..." /></div>
</template><script>
import { WebSocketSubject } from 'rxjs/webSocket';
import DOMPurify from 'dompurify';export default {name: 'ChatWindow',data() {return {messages: [],inputMessage: '',sessionId: Date.now().toString(),ws: null};},mounted() {this.connectWebSocket();},methods: {connectWebSocket() {this.ws = new WebSocketSubject(`ws://localhost:8080/ws/chat/${this.sessionId}`);this.ws.subscribe((message) => {const sanitizedMessage = DOMPurify.sanitize(message.content);this.messages.push({ ...message, content: sanitizedMessage });},(error) => console.error('WebSocket error:', error),() => console.log('WebSocket closed'));},sendMessage() {if (this.inputMessage.trim()) {this.ws.next(this.inputMessage);this.messages.push({ id: Date.now(), type: 'user', content: this.inputMessage });this.inputMessage = '';}}},beforeDestroy() {if (this.ws) {this.ws.complete();}}
};
</script><style scoped>
.chat-window {width: 100%;max-width: 600px;margin: 0 auto;border: 1px solid #ccc;padding: 10px;border-radius: 5px;
}.messages {height: 400px;overflow-y: scroll;margin-bottom: 10px;
}.message {margin-bottom: 10px;
}.message-content {padding: 5px;border-radius: 5px;
}.message-content.assistant {background-color: #f0f0f0;
}input {width: 100%;padding: 10px;box-sizing: border-box;
}
</style>

運行項目

啟動后端

在后端項目啟動 Spring Boot 應用

啟動前端

在前端項目根目錄下運行以下命令啟動 Vue 項目:

npm run serve

打開瀏覽器,訪問 http://localhost:8080,即可看到聊天窗口。輸入消息后,即可與 AI 進行實時對話。

希望這篇文章能幫助你快速上手 DeepSeek 開發,開啟你的 AI 應用構建之旅!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898433.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898433.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898433.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

神經網絡中層與層之間的關聯

目錄 1. 層與層之間的核心關聯&#xff1a;數據流動與參數傳遞 1.1 數據流動&#xff08;Forward Propagation&#xff09; 1.2 參數傳遞&#xff08;Backward Propagation&#xff09; 2. 常見層與層之間的關聯模式 2.1 典型全連接網絡&#xff08;如手寫數字分類&#xf…

本地部署deepseek-r1建立向量知識庫和知識庫檢索實踐【代碼】

目錄 一、本地部署DS 二、建立本地知識庫 1.安裝python和必要的庫 2.設置主目錄工作區 3.編寫文檔解析腳本 4.構建向量數據庫 三、基于DS,使用本地知識庫檢索 本地部署DS,其實非常簡單,我寫了一篇操作記錄,我終于本地部署了DeepSeek-R1(圖文全過程)-CSDN博客 安裝…

String、StringBuffer、StringBuiler的區別

可變性 String是不可變的&#xff0c;這是因為String內部用于存儲數據的char[]數組用了final關鍵字修飾&#xff0c;而且是private的&#xff0c;并且沒有對外提供修改數組的方法。 StringBuffer和StringBuilder是可變的&#xff0c;它們內部的char數組沒有用final關鍵字修飾。…

Certd自動化申請和部署SSL證書并配置https

服務器使用的華為云&#xff0c;之前SSL證書通過配置Cloudflare的DNS實現的&#xff0c;最近華為云備案提示需修改解析至境內華為云IP&#xff0c;若解析境外IP&#xff0c;域名無需備案&#xff0c;需注銷或取消接入備案信息&#xff0c;改為使用Certd自搭建證書管理工具&…

git tag以及git

git tag 以及git 一、先說收獲吧 1. git bash 在windows上 類似于linux的bash提供的shell命令行窗口&#xff0c;可以執行很多linux命令&#xff0c;cd pwd ls vim cat touch mkdir&#xff0c;還可以用正則匹配查看標簽。相當于在windows上裝了一個小的linux。git init myproj…

ESP8266通過AT指令配置雙向透傳

一、固件燒錄 IO0接地后上電&#xff0c;進入燒錄模式&#xff0c;燒錄完成后去掉即可 二、參數配置 1、服務器端 ATCWMODE_DEF2 ATCWSAP_DEF"ESP8266","12345678",5,3 ATSAVETRANSLINK1,"192.168.4.2",9090,"UDP",8080 2、客戶端…

【3D模型】【游戲開發】【Blender】Blender模型分享-獅頭木雕附導入方法

導入方法&#xff1a; [Blender] 如何導入包含紋理的 .blend 模型文件 在 3D 建模和渲染工作中&#xff0c;Blender 是一款功能強大的免費開源軟件。很多時候&#xff0c;我們需要導入 .blend 后綴的模型文件&#xff0c;同時確保紋理&#xff08;textures&#xff09;文件夾…

C# | 超簡單CSV表格讀寫操作(輕松將數據保存到CSV,并支持讀取還原)

C# | 超簡單CSV表格讀寫操作&#xff08;輕松將數據保存到CSV&#xff0c;并支持讀取還原&#xff09; 文章目錄 C# | 超簡單CSV表格讀寫操作&#xff08;輕松將數據保存到CSV&#xff0c;并支持讀取還原&#xff09;一、上位機開發中的CSV應用背景二、CSV讀寫實戰教學1. 基本對…

Git push后撤銷提交

一、介紹 當某次更改完工程后&#xff0c;push了本地倉庫到云端&#xff0c;但是發現有地方改錯了&#xff0c;想撤銷這次推送&#xff0c;或者某次提交就更改了很小一部分&#xff0c;想和本地這次修改的合并為一次推送&#xff0c;省的在云端顯示特別多次提交&#xff0c;顯得…

Unity導出WebGL,無法顯示中文

問題&#xff1a;中文無法顯示 默認字體無法顯示中文 在編輯器中設置了中文和英文的按鈕&#xff0c;中文按鈕無法顯示 導出后無法顯示中文 解決辦法&#xff1a; 自己添加字體&#xff0c;導入項目&#xff0c;并引用 示例 下載一個字體文件&#xff0c;這里使用的阿里…

閱讀《Vue.js設計與實現》 -- 02

接上一篇文章&#xff1a;閱讀《Vue.js設計與實現》 – 01 文章目錄 第二章提升用戶的開發體驗tips 控制框架代碼的體積Tree-Shaking副作用 框架應該輸出怎樣的構建產物&#xff1f;注意這兩個文件有什么區別&#xff1f; 特性開關如何實現&#xff1f; 處理錯誤TS支持 第二章 …

Mac:Ant 下載+安裝+環境配置(詳細講解)

&#x1f4cc; 下載 Ant 下載地址&#xff1a;https://ant.apache.org/bindownload.cgi &#x1f4cc; 無需安裝 Apache官網下載 Ant 壓縮包&#xff0c;無需安裝&#xff0c;下載解壓后放到自己指定目錄下即可。 按我自己的習慣&#xff0c;我會在用戶 jane 目錄下新建了個…

qt圖表背景問題

從代碼來看&#xff0c;這段代碼涉及到設置背景透明度和背景可見性的操作&#xff0c;主要是在一個基于Qt框架的圖形界面程序中對某個圖表控件&#xff08;fontChart&#xff09;和視圖控件&#xff08;fontChartView&#xff09;進行操作。以下是每行代碼的作用以及它們之間的…

藍橋杯國賽子串2023動態規劃,暴力

#include <bits/stdc.h> using namespace std; // string ss; #define int long long string s; //該方法通過動態規劃&#xff0c;找到2023字串&#xff0c;而2023等于202加3&#xff0c;202等于202&#xff0c;20等于20&#xff1b; int f2() {int dp[4]{0};//dp[0]代表…

uni-app——網絡API

uni-app 網絡API 在 uni-app 開發中&#xff0c;網絡請求是獲取數據與和服務器交互的重要手段。以下介紹 uni-app 中常見的網絡 API&#xff0c;包括發起請求、上傳和下載以及 WebSocket、UDP 通信等方面。 發起請求 在 uni-app 里&#xff0c;使用uni.request(OBJECT)來發起…

計算機網絡筆記再戰——理解幾個經典的協議HTTP章3

理解幾個經典協議——HTTP章3 返回結果的HTTP狀態碼 ? 我們知道&#xff0c;ICMP可以傳遞IP通信時候的狀態如何。HTTP雖然沒有輔助的解析&#xff0c;但是它可以使用狀態碼來表達我們的HTTP請求的結果&#xff0c;標記服務器端的處理是否正常、通知出現的錯誤等工作。這就是…

國產編輯器EverEdit - Hex Dump插件:看到文本的另一面!

1 Hex Dump插件 1.1 應用場景 有時可能需要顯示字母的ASCII編碼&#xff0c;或其他文字的字節編碼&#xff0c;可以使用Hex Dump插件來完成 1.2 使用方法 安裝Hex Dump插件&#xff0c;安裝插件方法參考&#xff1a;擴展管理 在編輯器中選中文本&#xff0c;選擇擴展 -> …

《駕馭MXNet:深度剖析分布式深度學習訓練的高效之道》

在深度學習的迅猛發展進程中&#xff0c;模型的規模和復雜性持續攀升&#xff0c;對計算資源的需求也愈發苛刻。單機訓練在面對大規模數據集和復雜模型結構時&#xff0c;常常顯得力不從心。分布式深度學習訓練成為解決這一困境的關鍵途徑&#xff0c;而MXNet作為一款強大的開源…

Vue3項目開發:狀態管理實踐指南

# Vue3項目開發&#xff1a;狀態管理實踐指南 一、引言 背景介紹 在Vue項目中&#xff0c;狀態管理是一個非常重要的話題。合理的狀態管理能夠幫助我們更好地組織和管理數據&#xff0c;提升項目的可維護性和可擴展性。本文將深入探討Vue3項目中狀態管理的最佳實踐&#xff0c;…

網絡安全漏洞與修復 網絡安全軟件漏洞

文章目錄 一、軟件漏洞的概念 1、信息安全漏洞簡述2、軟件漏洞3、軟件漏洞概念4、軟件漏洞的成因分析 二、軟件漏洞標準化管理 1、軟件漏洞分類2、軟件漏洞分級3、安全漏洞管理規范 一、軟件漏洞的概念 1、信息安全漏洞簡述 信息安全漏洞是信息安風險的主要根源之一&…