【實戰教程】零基礎搭建DeepSeek大模型聊天系統 - Spring Boot+React完整開發指南

🔥 本文詳細講解如何從零搭建一個完整的DeepSeek AI對話系統,包括Spring Boot后端和React前端,適合AI開發入門者快速上手。即使你是編程萌新,也能輕松搭建自己的AI助手!

📚博主匠心之作,強推專欄

  • JAVA集合專欄 【夜話集】
  • JVM知識專欄
  • 數據庫sql理論與實戰【博主踩坑之道】
  • 小游戲開發【博主強推 匠心之作 拿來即用無門檻】

DeepSeek AI對話系統

文章目錄

    • 項目介紹
    • 系統架構
    • 后端項目搭建
      • 1. 創建Spring Boot項目
      • 2. 創建DeepSeek客戶端
      • 3. 創建模型類
      • 4. 創建Controller層
    • 前端項目搭建
      • 1. 創建React項目
      • 2. 配置項目
      • 3. 創建API服務
      • 4. 創建聊天組件
      • 5. 支持Markdown渲染
    • 運行項目
    • 項目運行效果
      • 1. 初始界面展示
      • 2. 請求發送與等待響應
      • 3. AI響應后界面效果
      • 4. 長文本Markdown渲染展示
      • 5. 一鍵復制功能展示
    • 項目優化
    • 踩坑與解決方案
    • 項目拓展方向
    • 源碼下載
    • 寫在最后

項目介紹

在AI大模型時代,擁有一個自己的AI助手已不再是高不可攀的夢想。本文將帶你從零開始,搭建一個完整的DeepSeek AI對話系統,包括Spring Boot后端和React前端,讓你無需深厚的技術背景,也能輕松構建專屬AI應用。

這個項目的核心功能是:

  • 🚀 通過Spring Boot構建穩定的后端服務
  • 🔌 對接DeepSeek AI API實現智能對話
  • 💻 使用React打造美觀的前端界面
  • 🎨 支持Markdown格式的AI回復展示

源碼已附文章末尾,有需要的朋友自行獲取

系統架構

整個系統采用前后端分離架構,主要包含兩個部分:

  1. 后端服務 (DeepSeekExtProject)

    • 基于Spring Boot框架
    • 提供RESTful API接口
    • 封裝DeepSeek API調用邏輯
    • 處理請求/響應數據轉換
  2. 前端應用 (DeepSeekExtWeb)

    • 基于React + TypeScript
    • 美觀的聊天界面
    • 實時消息交互
    • Markdown格式渲染支持

后端項目搭建

1. 創建Spring Boot項目

首先,我們需要創建一個Spring Boot項目。可以通過Spring Initializr網站或IDE插件完成:

// 項目關鍵依賴
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.3</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.23</version></dependency>
</dependencies>

2. 創建DeepSeek客戶端

接下來,創建一個客戶端類來調用DeepSeek API:

public class DeepSeekClient {private static final String API_URL = "https://api.deepseek.com/v1/chat/completions";public static String API_KEY = "你的DeepSeek API Key";  // 替換為你的API密鑰private static final String MODEL_CHAT = "deepseek-chat";private final OkHttpClient client = new OkHttpClient();public String getResponse(String apiKey, String prompt) throws IOException {// 構建請求體DeepSeekRequestModel requestBody = DeepSeekRequestModel.builder().model(MODEL_CHAT).messages(Arrays.asList(DeepSeekRequestModel.Message.builder().role("user").content(prompt).build())).build();String jsonBody = JSON.toJSONString(requestBody);Request request = new Request.Builder().url(API_URL).post(RequestBody.create(jsonBody, MediaType.get("application/json"))).addHeader("Authorization", "Bearer " + apiKey).build();try (Response response = client.newCall(request).execute()) {if (response.isSuccessful() && response.body() != null) {return response.body().string();}throw new IOException("Unexpected code " + response);}}
}

3. 創建模型類

我們需要幾個模型類來處理請求和響應:

// 請求模型
@Data
@Builder
public class DeepSeekRequestModel {private String model;private List<Message> messages;@Data@Builderpublic static class Message {private String role;private String content;}
}// 響應模型
@Data
public class DeepSeeekResponse {private String id;private String object;private long created;private String model;private List<Choice> choices;@Datapublic static class Choice {private Message message;private String finish_reason;private int index;}@Datapublic static class Message {private String role;private String content;}
}

4. 創建Controller層

最后,創建一個控制器來處理HTTP請求:

@Controller
@RequestMapping("/deepseek")
@ResponseBody
public class DeepSeekController {@RequestMapping(value = "/ask", method = RequestMethod.POST)public R<String> ask(@RequestBody AskParam askParam) {try {String responsestr = new DeepSeekClient().getResponse(DeepSeekClient.API_KEY, askParam.getAskInfo());DeepSeeekResponse response = JSONObject.parseObject(responsestr, DeepSeeekResponse.class);for (DeepSeeekResponse.Choice choice : response.getChoices()) {if ("stop".equals(choice.getFinish_reason())) {// 成功String content = choice.getMessage().getContent();return R.ok(content);}}return R.error("請求失敗");} catch (IOException e) {return R.error("異常:" + e.getMessage());}}
}

前端項目搭建

1. 創建React項目

首先,創建一個新的React項目:

# 創建新項目
mkdir DeepSeekExtWeb
cd DeepSeekExtWeb# 初始化package.json
npm init -y# 安裝核心依賴
npm install react react-dom react-scripts typescript @types/react @types/react-dom axios antd @ant-design/icons styled-components react-markdown remark-gfm rehype-highlight rehype-raw

2. 配置項目

創建必要的配置文件:

// package.json 配置啟動腳本
"scripts": {"start": "set PORT=8889 && react-scripts start","build": "react-scripts build"
}// tsconfig.json
{"compilerOptions": {"target": "es5","lib": ["dom", "dom.iterable", "esnext"],"allowJs": true,"skipLibCheck": true,"esModuleInterop": true,"allowSyntheticDefaultImports": true,"strict": true,"forceConsistentCasingInFileNames": true,"noFallthroughCasesInSwitch": true,"module": "esnext","moduleResolution": "node","resolveJsonModule": true,"isolatedModules": true,"noEmit": true,"jsx": "react-jsx"},"include": ["src"]
}

3. 創建API服務

創建一個service文件處理API調用:

// src/services/deepSeekService.ts
import axios from 'axios';const API_BASE_URL = 'http://localhost:8888';export interface ApiResponse<T> {code: number;msg: string;data: T;
}export const deepSeekService = {askQuestion: async (question: string): Promise<string> => {try {const response = await axios.post<ApiResponse<string>>(`${API_BASE_URL}/deepseek/ask`, {askInfo: question});if (response.data.code === 0) {return response.data.data;} else {throw new Error(response.data.msg || '請求失敗');}} catch (error) {console.error('API請求錯誤:', error);throw error;}}
};

4. 創建聊天組件

構建核心的聊天界面組件:

// src/components/ChatPage.tsx (部分核心代碼)
const ChatPage: React.FC = () => {const [inputValue, setInputValue] = useState('');const [messages, setMessages] = useState<MessageType[]>([{id: '1',content: '歡迎使用DeepSeek聊天助手,請輸入您的問題!',sender: 'bot',timestamp: new Date().toISOString(),},]);const [loading, setLoading] = useState(false);const handleSendMessage = async () => {if (!inputValue.trim()) {return;}const userMessage = {id: Date.now().toString(),content: inputValue,sender: 'user',timestamp: new Date().toISOString(),};setMessages((prev) => [...prev, userMessage]);setInputValue('');setLoading(true);try {const response = await deepSeekService.askQuestion(inputValue);const botMessage = {id: (Date.now() + 1).toString(),content: response,sender: 'bot',timestamp: new Date().toISOString(),};setTimeout(() => {setMessages((prev) => [...prev, botMessage]);setLoading(false);}, 500);} catch (error) {console.error('發送消息失敗:', error);setLoading(false);}};return (<ChatContainer><MessagesContainer>{messages.map((msg) => (<ChatMessage key={msg.id} message={msg} />))}{loading && (<TypingIndicator>DeepSeek正在思考...</TypingIndicator>)}</MessagesContainer><InputContainer><TextAreavalue={inputValue}onChange={(e) => setInputValue(e.target.value)}placeholder="輸入您的問題..."disabled={loading}/><Buttontype="primary"onClick={handleSendMessage}loading={loading}>發送</Button></InputContainer></ChatContainer>);
};

5. 支持Markdown渲染

為了優雅地顯示AI回復,我們添加了Markdown渲染支持:

// src/components/ChatMessage.tsx (部分代碼)
import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm';
import rehypeHighlight from 'rehype-highlight';const ChatMessage: React.FC<ChatMessageProps> = ({ message }) => {const isUser = message.sender === 'user';const handleCopy = () => {navigator.clipboard.writeText(message.content);message.antd.message.success('已復制到剪貼板');};return (<MessageContainer isUser={isUser}><MessageContent isUser={isUser}>{!isUser && (<CopyButton onClick={handleCopy}><CopyOutlined /></CopyButton>)}<MessageBubble isUser={isUser}>{isUser ? (message.content) : (<MarkdownContent isUser={isUser}><ReactMarkdownremarkPlugins={[remarkGfm]} rehypePlugins={[rehypeHighlight]}>{message.content}</ReactMarkdown></MarkdownContent>)}</MessageBubble></MessageContent></MessageContainer>);
};

運行項目

完成以上代碼開發后,你可以按以下步驟運行項目:

  1. 啟動后端服務

    cd DeepSeekExtProject
    mvn spring-boot:run
    

    后端服務將在8888端口啟動。

  2. 啟動前端應用

    cd DeepSeekExtWeb
    npm start
    

    前端應用將在8889端口啟動。

  3. 開始對話

    • 在瀏覽器訪問 http://localhost:8889
    • 在輸入框中輸入問題并發送
    • 等待DeepSeek AI的回復(支持Markdown格式展示)

項目運行效果

完成所有代碼后,成功運行項目,下面是實際效果展示:

1. 初始界面展示

項目啟動后的初始聊天界面,等待用戶輸入問題

圖1:項目啟動后的初始聊天界面,等待用戶輸入問題

2. 請求發送與等待響應

用戶發送問題后,顯示加載動畫提示AI正在思考

圖2:用戶發送問題后,顯示加載動畫提示AI正在思考

3. AI響應后界面效果

DeepSeek AI回答完成后的界面效果

圖3:DeepSeek AI回答完成后的界面效果

4. 長文本Markdown渲染展示

查詢"Java垃圾回收"等專業問題后,長文本響應的Markdown渲染效果

圖4:查詢"Java垃圾回收"等專業問題后,長文本響應的Markdown渲染效果

5. 一鍵復制功能展示

用戶可以通過點擊復制按鈕,一鍵復制AI回復內容,方便在其他地方使用

圖5:用戶可以通過點擊復制按鈕,一鍵復制AI回復內容,方便在其他地方使用

從上面的截圖中可以看到,我們的聊天界面具有以下特點:

  • 美觀的UI設計:采用簡潔現代的卡片式設計,聊天氣泡明確區分用戶和AI
  • 加載狀態提示:用戶等待AI思考時有動態加載提示,增強交互體驗
  • Markdown完美渲染:支持代碼塊、標題、列表、表格等Markdown元素的精確渲染
  • 左對齊文本展示:所有AI回復內容均左對齊,提高可讀性,方便用戶閱讀長文本

這種設計不僅美觀,還極大提高了用戶體驗,特別是對于長篇技術解答,格式化展示讓內容更易理解。

項目優化

我們對項目進行了多項優化,提升用戶體驗:

  1. UI美化

    • 精心設計的聊天氣泡
    • 加載狀態動畫
    • 響應式布局適配多種設備
  2. 功能增強

    • 支持Markdown格式渲染
    • 代碼高亮顯示
    • 一鍵復制AI回復內容:每條AI回復右上角配有復制按鈕,方便用戶快速復制所需內容
  3. 性能優化

    • 消息自動滾動到底部
    • 防抖處理避免重復請求
    • 錯誤處理與提示

踩坑與解決方案

在開發過程中,我們遇到的主要問題及解決方案:

  1. 跨域問題

    • 解決方案:在Spring Boot后端添加CORS配置
  2. Markdown渲染

    • 問題:AI返回的Markdown內容無法正常顯示
    • 解決方案:引入react-markdown等庫進行處理
  3. 響應內容居中問題

    • 問題:Markdown內容默認居中顯示
    • 解決方案:添加text-align:left樣式強制左對齊

項目拓展方向

這個基礎項目可以進一步拓展為:

  1. 添加會話歷史:保存對話歷史,實現多輪對話
  2. 用戶管理:添加登錄注冊功能
  3. 多模型支持:集成更多AI模型,如GPT系列
  4. 自定義參數:允許用戶調整溫度、最大長度等參數
  5. 語音交互:添加語音輸入和輸出功能

源碼下載

為方便讀者快速上手,我已將完整項目源碼打包上傳,包含以下內容:

  • DeepSeekExtProject(Java后端項目)

    • 完整的Spring Boot項目結構
    • DeepSeek API調用封裝
    • 請求/響應處理邏輯
  • DeepSeekExtWeb(React前端項目)

    • 完整的React+TypeScript項目結構
    • 聊天界面組件
    • Markdown渲染功能
    • 一鍵復制實現

源碼下載地址:DeepSeek AI對話系統完整源碼

使用說明:

  1. 下載并解壓源碼包
  2. 按照上述運行步驟分別啟動前后端項目
  3. 修改后端DeepSeekClient.java中的API_KEY為您自己的密鑰

注意:使用前請確保已安裝Java 8+、Maven、Node.js 14+環境。

寫在最后

🎉 通過本文的指導,即使是編程萌新也能輕松搭建一個完整的DeepSeek AI對話系統。希望這個項目能幫助你開啟AI開發之旅!

📚 推薦幾篇很有趣的文章

  • DeepSeek詳解:探索下一代語言模型
  • 算法模型從入門到起飛系列——遞歸(探索自我重復的奇妙之旅)

📚博主匠心之作,強推專欄

  • JAVA集合專欄 【夜話集】
  • JVM知識專欄
  • 數據庫sql理論與實戰【博主踩坑之道】
  • 小游戲開發【博主強推 匠心之作 拿來即用無門檻】

如果覺得有幫助的話,別忘了點個贊 👍 收藏 ? 關注 🔖 哦!


🎯 我是果凍~,一個熱愛技術、樂于分享的開發者
📚 更多精彩內容,請關注我的博客
🌟 我們下期再見!

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

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

相關文章

Linux系統基本指令和知識指南

一、Linux系統簡介 Linux是一種自由和開放源代碼的類UNIX操作系統&#xff0c;由林納斯托瓦茲在1991年首次發布。它以穩定性、安全性和靈活性著稱&#xff0c;廣泛應用于服務器、嵌入式系統和個人計算機。 Linux主要特點&#xff1a; 開源免費 多用戶、多任務 良好的安全性…

【計算機視覺】OpenCV實戰項目:Long-Exposure:基于深度學習的長時間曝光合成技術

Long-Exposure&#xff1a;基于深度學習的長時間曝光合成技術 項目概述與技術背景項目核心功能技術原理 環境配置與安裝硬件要求建議詳細安裝步驟可選組件安裝 實戰應用指南1. 基礎使用&#xff1a;視頻轉長曝光2. 高級模式&#xff1a;自定義光軌合成3. 批量處理模式 技術實現…

TikTok 矩陣賬號運營實操細節:打造爆款矩陣

在 TikTok 的流量版圖里&#xff0c;打造 TikTok 矩陣賬號能顯著提升影響力與吸粉能力。而借助 AI 工具&#xff0c;更可為 TikTok 矩陣運營效率的提升賦能&#xff0c;讓運營如虎添翼。下面就為大家詳細講講其中的實操細節&#xff0c;并結合一些偽代碼示例輔助理解。 一、矩…

互聯網大廠Java求職面試:分布式系統中向量數據庫與AI應用的融合探索

互聯網大廠Java求職面試&#xff1a;分布式系統中向量數據庫與AI應用的融合探索 面試開場&#xff1a;技術總監與鄭薪苦的“較量” 技術總監&#xff08;以下簡稱T&#xff09;&#xff1a;鄭薪苦先生&#xff0c;請簡單介紹一下你在分布式系統設計方面的經驗。 鄭薪苦&…

【每日八股】學習 RocketMQ Day2:進階(一)

文章目錄 復習昨日內容為什么要使用消息隊列為什么選擇 RocketMQRocketMQ 的優缺點&#xff1f;談談你對 RocketMQ 的理解&#xff1f;消息隊列有哪些類型&#xff1f;RocketMQ 采用哪種消息隊列模型&#xff1f;消息的消費模式了解嗎&#xff1f;了解 RocketMQ 的基本架構嗎&a…

探索智能體開發新邊界:Cangjie Magic開源平臺體驗與解析

文章目錄 每日一句正能量前言一、Cangjie Magic的核心技術&#xff08;一&#xff09;Agent DSL架構&#xff08;二&#xff09;原生支持MCP通信協議&#xff08;三&#xff09;智能規劃功能 二、實際應用場景&#xff08;一&#xff09;智能客服系統&#xff08;二&#xff09…

深入解析進程間通信與Socket原理:從理論到TypeScript實戰

文章目錄 一、進程中如何通信1.1 管道1.1.1 核心特性1.1.2 缺點1.1.3 匿名管道與命名管道的對比 1.2 信號1.2.1 核心特性1.2.2 缺點1.2.3 信號分類對比 1.3 消息隊列1.3.1 核心特性1.3.2 缺點 1.4 共享內存1.4.1 核心特性1.4.2 缺點 1.5 信號量1.5.1 核心特性1.5.2 缺點 二、So…

力扣-hot100(旋轉圖像)

48. 旋轉圖像 中等 給定一個 n n 的二維矩陣 matrix 表示一個圖像。請你將圖像順時針旋轉 90 度。 你必須在 原地 旋轉圖像&#xff0c;這意味著你需要直接修改輸入的二維矩陣。請不要 使用另一個矩陣來旋轉圖像。 示例 1&#xff1a; 輸入&#xff1a;matrix [[1,2,3],[4…

Docker編排工具---Compose的概述及使用

目錄 一、Compose工具的概述 二、Compose的常用命令 1、列出容器 2、查看訪問日志 3、輸出綁定的公共端口 4、重新構建服務 5、啟動服務 6、停止服務 7、刪除已停止服務的容器 8、創建和啟動容器 9、在運行的容器中執行命令 10、指定一個服務啟動容器的個數 11、其…

C25-數組應用及練習

第一題 題目: 代碼 #include <stdio.h> int main() {//數組及相關數據定義int arr[10];int i;//基于循環的數組數據輸入for(i0;i<10;i){arr[i]i;}//基于循環的數組數據輸出for(i9;i>0;i--){printf("%d ",arr[i]);}return 0; }結果 第二題 題目 代碼 …

網絡安全怎么入門?快速了解

網絡安全是一個快速發展的領域&#xff0c;入門需要系統化的學習和實踐。以下是適合零基礎或轉行者的分階段學習路徑&#xff0c;涵蓋必備知識、學習資源、實戰方法和職業方向&#xff1a; 一、基礎階段&#xff08;1-3個月&#xff09; 1. 掌握核心基礎知識 計算機網絡&#…

express 怎么搭建 WebSocket 服務器

一&#xff1a;使用 express-ws var express require(express); var app express(); var expressWs require(express-ws)(app);app.use(function (req, res, next) {console.log(middleware);req.testing testing;return next(); });app.get(/, function(req, res, next){…

【AI論文】SuperEdit:修正并促進基于指令的圖像編輯的監督信號

摘要&#xff1a;由于手動收集準確的編輯數據存在挑戰&#xff0c;現有的數據集通常使用各種自動化方法構建&#xff0c;導致編輯指令和原始編輯圖像對之間不匹配導致監督信號出現噪聲。 最近的研究試圖通過生成更高質量的編輯圖像、在識別任務上進行預訓練或引入視覺語言模型&…

關于大疆紅外圖片提取溫度方法 python 方法

思路 紅外圖片需要是黑白圖片 提取紅外圖片最高和最低溫度 溫度圖例 根據最高溫度31.2攝氏度 最低溫度19.9攝氏度 那中間的值在 0到255 之間 那有這個值之后。就可以獲取到圖片里面 每個點或者面的值 實現方式 def find_Gray(self, t_max, t_min, c_temp):"""…

金融小知識

&#x1f4c9; 一、“做空”是啥&#xff1f; 通俗說法&#xff1a;押“它會跌”&#xff0c;賺錢&#xff01; ? 舉個例子&#xff1a; 有一天老王的包子漲價到 10 塊一個&#xff0c;張三覺得這價格肯定撐不住&#xff0c;未來會跌到 5 塊。于是他&#xff1a; 向朋友借了…

JavaScript 數據存儲全攻略:從 Cookie 到 IndexedDB

1. Cookie&#xff1a;傳統的輕量級存儲 Cookie 是最早的客戶端存儲解決方案之一&#xff0c;最初設計用于服務器和客戶端之間的狀態保持。 基本用法 javascript 復制 下載 // 設置cookie document.cookie "usernameJohnDoe; expiresThu, 18 Dec 2025 12:00:00 UTC…

Leetcode 刷題記錄 09 —— 鏈表第三彈

本系列為筆者的 Leetcode 刷題記錄&#xff0c;順序為 Hot 100 題官方順序&#xff0c;根據標簽命名&#xff0c;記錄筆者總結的做題思路&#xff0c;附部分代碼解釋和疑問解答&#xff0c;01~07為C語言&#xff0c;08及以后為Java語言。 01 合并 K 個升序鏈表 /*** Definitio…

如何利用 Elastic Load Balancing 提升應用性能與可用性?

當今云計算的快速發展中&#xff0c;隨著應用需求的增加&#xff0c;如何確保系統能夠高效、穩定地處理不斷增長的流量成為了每個技術團隊關注的焦點。Elastic Load Balancing&#xff08;ELB&#xff09;作為一種強大的工具&#xff0c;能夠幫助開發者和運維人員輕松應對流量波…

Word如何制作三線表格

1.需求 將像這樣的表格整理成論文中需要的三線表格。 2.直觀流程 選中表格 --> 表格屬性中的邊框與底紋B --> 在設置中選擇無&#xff08;重置表格&#xff09;–> 確定 --> 選擇第一行&#xff08;其實是將第一行看成獨立表格了&#xff0c;為了設置中線&…

JVM的雙親委派模型

引言 Java類加載機制中的雙親委派模型通過層層委托保證了核心類加載器與應用類加載器之間的職責分離和加載安全性&#xff0c;但其單向的委托關系也帶來了一些局限性。尤其是在核心類庫需要訪問或實例化由應用類加載器加載的類時&#xff0c;雙親委派模型無法滿足需求&#xf…