將 DeepSeek 集成到 Spring Boot 項目實現通過 AI 對話方式操作后臺數據

文章目錄

  • 項目簡介
  • Gitee
  • MCP 簡介
  • 環境要求
  • 項目代碼
  • 核心實現代碼
    • MCP 服務端(批量注冊 Tool)
    • MCP 客戶端(調用 DeepSeek)
  • DeepSeek API
  • Docker
    • sse 連接
    • ws 連接(推薦)
    • http 連接
  • Cherry Studio
    • 配置模型
    • 配置 MCP
    • 調用 MCP

項目簡介

在本項目中,我們基于 Spring Boot 構建并通過 Docker 部署了 MCP 服務端與 MCP 客戶端,通過 HTTP 協議 實現與現有系統的遠程控制與集成。整個系統作為獨立模塊運行,服務端直接連接數據庫,核心業務邏輯抽象于 tool 層中,具備良好的擴展性與解耦性。

為提升系統的實時交互能力,項目支持通過 Cherry Studio 使用 SSE(Server-Sent Events) 與 MCP 服務端保持長連接,實現消息的實時推送與指令響應。

此外,還新增了對 WebSocket 通信 的支持。相比于 HTTP 和 SSE,WebSocket 是一種 全雙工、低延遲、連接持久 的通信協議,特別適用于高頻次、強交互的控制場景。通過 WebSocket,客戶端不僅可以實時獲取狀態更新,還可主動發送控制指令并立即獲取響應,進一步增強了系統的交互性和用戶體驗。

Gitee

  • https://gitee.com/wufengsheng/spring-mcp-server

MCP 簡介

MCP 是一種開放協議,用于標準化應用程序如何向 LLM 提供上下文。可以將 MCP 視為 AI 應用程序的 USB-C 端口。就像 USB-C 提供了一種將設備連接到各種外圍設備和配件的標準化方式一樣,MCP 提供了一種將 AI 模型連接到不同數據源和工具的標準化方式。
在這里插入圖片描述

  • MCP 主機 (MCP Hosts):例如 Claude Desktop、IDE 或希望通過 MCP 訪問數據的 AI 工具等程序
  • MCP 客戶端 (MCP Clients):與服務器保持 1:1 連接的協議客戶端
  • MCP 服務器 (MCP Servers):輕量級程序,每個程序通過標準化的模型上下文協議 (MCP) 公開特定的功能
  • 本地數據源 (Local Data Sources):您的計算機的文件、數據庫和 MCP 服務器可以安全訪問的服務
  • 遠程服務 (Remote Services):可通過互聯網訪問的外部系統(例如,通過 API),MCP 服務器可以連接到這些系統

環境要求

  • Java 環境 >= JDK17
  • Spring Boot >= 3.x

在這里插入圖片描述

項目代碼

git clone https://gitee.com/wufengsheng/spring-mcp-server.git

注: Java 開發環境必須 >= JDK17,否則項目編譯不過。

在這里插入圖片描述

核心實現代碼

  • MCP 依賴 jar 包
<dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-M7</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><!-- mcp 服務端引入 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webflux</artifactId></dependency><!-- mcp 客戶端引入 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId></dependency>...
</dependencies>

MCP 服務端(批量注冊 Tool)

  • ToolCallbackProviderConfig.java
import lombok.AllArgsConstructor;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.Map;@Configuration
@AllArgsConstructor
public class ToolCallbackProviderConfig {private final ApplicationContext applicationContext;@Beanpublic ToolCallbackProvider methodToolCallbackProvider() {Map<String, McpTool> mcpBeanMap = applicationContext.getBeansOfType(McpTool.class);return MethodToolCallbackProvider.builder().toolObjects(mcpBeanMap.values().toArray()).build();}}
  • McpDemoService.java
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.server.core.McpTool;
import com.server.module.demo.domain.Demo;
import com.server.module.demo.service.IDemoService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@Slf4j
@Service
@AllArgsConstructor
public class McpDemoService implements McpTool {private final IDemoService demoService;@Tool(description = "根據年齡查詢 Demo 列表")@Transactional(rollbackFor = {RuntimeException.class, Exception.class})public String queryDemoInfoByAge(@ToolParam(description = "年齡") Integer age) {Page<Demo> page = new Page<>(1, 10);List<Demo> demoList = demoService.list(page, Wrappers.<Demo>lambdaQuery().eq(Demo::getAge, age).orderByAsc(Demo::getName));return JSON.toJSONString(demoList);}}

MCP 客戶端(調用 DeepSeek)

  • ChatService.java
import com.alibaba.fastjson2.JSON;
import io.modelcontextprotocol.client.McpSyncClient;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.mcp.SyncMcpToolCallbackProvider;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.stereotype.Service;import java.util.List;@Slf4j
@Service
public class ChatService {private final ChatClient chatClient;@Getterprivate final ToolCallback[] toolCallbacks;public ChatService(OpenAiChatModel openAiChatModel, List<McpSyncClient> mcpSyncClientList) {log.info("mcpSyncClientList={}", JSON.toJSONString(mcpSyncClientList));log.info("===============================================\n");for (McpSyncClient mcpSyncClient : mcpSyncClientList) {log.info("clientInfo={}", mcpSyncClient.getClientInfo());log.info("serverInfo={}", mcpSyncClient.getServerInfo());}log.info("===============================================\n");var mcpToolCallbackProvider = new SyncMcpToolCallbackProvider(mcpSyncClientList);toolCallbacks = mcpToolCallbackProvider.getToolCallbacks();log.info("toolCallbacks={}", JSON.toJSONString(toolCallbacks));log.info("===============================================\n");for (ToolCallback toolCallback : toolCallbacks) {log.info("toolCallback={}", JSON.toJSON(toolCallback.getToolDefinition()));}log.info("===============================================\n");this.chatClient = ChatClient.builder(openAiChatModel).defaultTools(mcpToolCallbackProvider).build();}public String askQuestion(String prompt) {return chatClient.prompt(prompt).call().content();}}
  • application.yml
spring:ai:openai:api-key: sk-xxxxxbase-url: https://api.deepseek.comchat:options:model: deepseek-chatmcp:client:type: syncname: spring-mcp-clientsse:connections:server1:url: http://localhost:9800

DeepSeek API

  • 申請 API_KEY:https://platform.deepseek.com/usage

Docker

  • 打包 jar 包并復制到 docker/app/ 對應目錄中
  • start.sh 腳本按順序先啟動 mcp-server 再啟動 mcp-client

在這里插入圖片描述

  • 配置 API_KEY 與 DeepSeek 模型
cd docker/app/mcp-client
vim application-prod.yml
spring:ai:openai:api-key: sk-xxxxxbase-url: https://api.deepseek.comchat:options:model: deepseek-chat
cd docker
docker-compose up -d mcp-server
docker logs -f mcp-server

sse 連接

http://127.0.0.1:9800/sse

ws 連接(推薦)

ws://127.0.0.1:9802/mcp/ws
  • js 測試腳本
cd node-ws-client
npm install
node client.js

在這里插入圖片描述

  • Nginx 配置 ws:// 或 wss://
location /mcp/ {proxy_set_header X-Real_IP $remote_addr;proxy_set_header Host $host;proxy_set_header X_Forward_For $proxy_add_x_forwarded_for;proxy_set_header Upgrade $http_upgrade;   # 需要配置支持websocketproxy_set_header Connection 'upgrade';    # 需要配置支持websocketproxy_pass http://192.168.0.160:9802/mcp/;
}

http 連接

http://127.0.0.1:9801/mcp/mcpClient/listTools

在這里插入圖片描述

http://127.0.0.1:9801/mcp/mcpClient/chat?prompt=查詢章若楠用戶信息

在這里插入圖片描述

Cherry Studio

  • 下載地址:https://cherry-ai.com/

配置模型

在這里插入圖片描述

在這里插入圖片描述

配置 MCP

在這里插入圖片描述
在這里插入圖片描述

調用 MCP

在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

【HDFS入門】HDFS性能調優實戰:壓縮與編碼技術深度解析

目錄 1 HDFS性能調優概述 2 HDFS壓縮技術原理與應用 2.1 常見壓縮算法比較 2.2 壓縮流程架構 2.3 壓縮配置實踐 3 列式存儲編碼技術 3.1 ORC與Parquet對比 3.2 ORC文件結構 3.3 Parquet編碼流程 4 性能調優實戰建議 4.1 壓縮選擇策略 4.2 編碼優化技巧 5 性能測試…

HCIP --- OSPF綜合實驗

一、拓撲圖 二、實驗要求 1&#xff0c;R5為ISP&#xff0c;其上只能配置IP地址;R4作為企業邊界路由器&#xff0c;出口公網地址需要通過PPP協議獲取&#xff0c;并進行chap認證。 2&#xff0c;整個0SPF環境IP基于172.16.0.8/16劃分。 3&#xff0c;所有設備均可訪問R5的環…

c++:線程(std::thread)

目錄 從第一性原理出發&#xff1a;為什么需要線程&#xff1f; ? 本質定義&#xff1a; &#x1f4cc; 使用基本語法&#xff1a; 線程之間的“并發”與“并行”的區別 線程安全與數據競爭&#xff08;Race Condition&#xff09; 如何讓線程“安全地”訪問數據&#x…

PCL軟件架構

Point Cloud Library (PCL) 采用模塊化設計,提供了豐富的點云處理功能。以下是PCL的核心架構和主要類的詳細介紹。 一、PCL整體架構 PCL的架構可以分為以下幾個主要層次: 數據表示層:基礎點云數據結構和基本操作 算法層:各種點云處理算法實現 I/O層:點云數據的輸入輸出 …

CCLinkIE轉EtherCAT邊緣計算網關構建智能產線:跨協議設備動態組網與數據優化傳輸

一、行業背景 隨著新能源汽車市場爆發式增長&#xff0c;汽車制造企業對產線效率、設備協同性及柔性生產能力的要求顯著提升。傳統產線多采用CC-LinkIEFieldBasic&#xff08;CCLINKIEFB&#xff09;協議的三菱PLC控制系統&#xff0c;而新一代伺服驅動設備普遍采用EtherCAT協…

模態雙俠闖江湖:SimTier 分層破局,MAKE 智煉新知

目錄 利用多模態表示提升淘寶展示廣告效果&#xff1a;挑戰、方法與洞察摘要1 引言2 預備知識推薦模型中的ID特征基于ID的模型結構 3 多模態表示的預訓練3.1 語義感知對比學習3.2 預訓練數據集的構建3.3 優化 4 與推薦模型的集成4.1 觀察和見解4.2 方法一&#xff1a;SimTier4.…

基于大模型的下肢靜脈曲張全流程預測與診療方案研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與創新點 1.3 研究方法與數據來源 二、下肢靜脈曲張概述 2.1 定義與病理生理 2.2 風險因素與臨床表現 2.3 診斷方法與現有治療手段 三、大模型預測原理與構建 3.1 大模型技術簡介 3.2 預測模型的數據收集與預處理 3.…

跨站腳本(XSS) 的詳細分類、對比及解決方案

以下是 跨站腳本&#xff08;XSS&#xff09; 的詳細分類、對比及解決方案&#xff1a; 一、XSS的分類與詳解 1. 反射型XSS&#xff08;非持久型XSS&#xff09; 定義&#xff1a;攻擊載荷通過URL參數傳遞&#xff0c;服務器直接返回到頁面中&#xff0c;需用戶主動觸發。 工…

thinkphp實現圖像驗證碼

示例 服務類 app\common\lib\captcha <?php namespace app\common\lib\captcha;use think\facade\Cache; use think\facade\Config; use Exception;class Captcha {private $im null; // 驗證碼圖片實例private $color null; // 驗證碼字體顏色// 默認配置protected $co…

swift-12-Error處理、關聯類型、assert、泛型_

一、錯誤類型 開發過程常見的錯誤 語法錯誤&#xff08;編譯報錯&#xff09; 邏輯錯誤 運行時錯誤&#xff08;可能會導致閃退&#xff0c;一般也叫做異常&#xff09; 2.1 通過結構體 第一步 struct MyError : Errort { var msg: String &#xff5d; 第二步 func divide(_ …

實驗擴充 LED顯示4*4鍵位值

代碼功能概述 鍵盤掃描&#xff1a; 使用 KeyPort&#xff08;定義為 P1&#xff09;作為鍵盤輸入端口。掃描 4x4 矩陣鍵盤&#xff0c;檢測按鍵并返回按鍵編號&#xff08;0~15&#xff09;。 數碼管顯示&#xff1a; 根據按鍵編號&#xff0c;從 SegCode 數組中獲取對應數碼…

從零開始搭建CLIP模型實現基于文本的圖像檢索

目錄 CLIP原理簡介代碼實現參考鏈接 CLIP原理簡介 論文鏈接&#xff0c;源碼鏈接 CLIP模型由OpenAI在2021年提出&#xff0c;利用雙Decoder&#xff08;Dual Encoder&#xff09;的架構來學習圖像和文本之間的對應關系&#xff0c;是多模態大模型的開創之作&#xff0c;為后續許…

熊海cms代碼審計

目錄 sql注入 1. admin/files/login.php 2. admin/files/columnlist.php 3. admin/files/editcolumn.php 4. admin/files/editlink.php 5. admin/files/editsoft.php 6. admin/files/editwz.php 7. admin/files/linklist.php 8. files/software.php 9. files…

[Java微服務組件]注冊中心P3-Nacos中的設計模式1-觀察者模式

在P1-簡單注冊中心實現和P2-Nacos解析中&#xff0c;我們分別實現了簡單的注冊中心并總結了Nacos的一些設計。 本篇繼續看Nacos源碼&#xff0c;了解一下Nacos中的設計模式。 目錄 Nacos 觀察者模式 Observer Pattern觀察者模式總結 Nacos 觀察者模式 Observer Pattern 模式定…

電腦 訪問 github提示 找不到網頁,處理方案

1、找到 本機的 host文件 例如 windows 的 一般在 C:\Windows\System32\drivers\etc\hosts 用管理員身份打開 hosts 文件 如果文件中沒有 github的配置&#xff0c;需要自己手動添加上去&#xff1b; 如果有&#xff0c;則需要 檢查 github.com 與 github.global.ssl.fastly.…

Linux系統中的網絡管理

1.RHEL9版本中&#xff0c;使用nm進行網絡配置&#xff0c;ifcfg不再是網絡配置文件的主存儲&#xff0c;樣式仍然可用&#xff0c;但它不再是NetworkManger存儲新網絡配置文件的默認位置&#xff0c;RHEL以key-file格式在etc/NetworkManger/system-connections/中存儲新的網絡…

AI技術深度解析:從移動芯片到AIoT的全面突破

作為全球無線通信技術和半導體解決方案的重要參與者,高通始終將技術創新作為核心驅動力,在移動通信、物聯網(IoT)、汽車電子、AI計算等領域占據關鍵地位。本文將從其核心產品線、技術突破、應用場景及未來布局四個維度,客觀解析高通的技術積累與行業角色。 一、核心產品線…

使用CS Roofline Toolkit測量帶寬

使用CS Roofline Toolkit測量帶寬 工程下載&#xff1a;使用CS Roofline Toolkit測量帶寬-案例工程文件&#xff0c;也可以按照下面的說明使用git clone下載 目錄 使用CS Roofline Toolkit測量帶寬0、Roofline模型理解1、CS Roofline Toolkit下載1.1、設置代理1.2、git clone下…

EAGLE代碼研讀+模型復現

要對代碼下手了&#xff0c;加油(? ?_?)? 作者在他們自己的設備上展現了推理的評估結果&#xff0c;受第三方評估認證&#xff0c;EAGLE為目前最快的投機方法&#xff08;雖然加速度是評估投機解碼方法的主要指標&#xff0c;但其他點也值得關注。比如PLD和Lookahead無需額…

基于SFC的windows修復程序,修復絕大部分系統損壞

效果:可以自動修復大部分由系統文件損壞而導致的錯誤 例如:系統應用無法打開 系統窗口(例如開始菜單)無法使用 電腦藍屏或者卡死.....文章 01技術背景 Windows自帶了一個SFC命令行應用程序,可以檢查大部分的系統文件錯誤,以及復這些文件 其中自動檢查所有系統文件&#x…