当前位置: 首页 > news >正文

SpringBoot接入DeepSeek(硅基流动版)+ 前端页面调试(WebSocket连接模式)

文章目录

  • 前言
  • 正文
    • 一、项目环境
    • 二、项目代码
      • 2.1 pom.xml
      • 2.2 DeepSeekController.java
      • 2.3 启动类
      • 2.4 logback-spring.xml
      • 2.5 application.yaml
      • 2.6 WebsocketConfig.java
      • 2.7 AiChatWebSocketHandler.java
      • 2.8 SaveChatSessionParamRequest.java
      • 2.9 index.html
    • 三、页面调试
      • 3.1 主页
      • 3.2 参数调整
      • 3.3 问问题(看下效果)
    • 四、遗留问题

前言

本文使用SpringBoot提供 WebSocket 对话功能。通过模拟对话的方式,来和DeepSeek进行交互。包含Java后端和一个简单的前端页面。

另见SSE模式的实现: SpringBoot接入DeepSeek(硅基流动版)+ 前端页面调试(SSE连接模式)

硅基流动DeepSeek页面:
https://m.siliconflow.cn/playground/chat
硅基流动推理模型接口文档:
https://docs.siliconflow.cn/cn/userguide/capabilities/reasoning

正文

一、项目环境

  • Java版本:Java1.8
  • SpringBoot版本:2.7.7
  • deepseek-spring-boot-starter:1.1.0
  • spring-boot-starter-websocket:2.7.7

项目结构如下:
在这里插入图片描述

二、项目代码

2.1 pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.pine.ai</groupId><artifactId>pine-ai</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>pine-ai-demo</name><url>http://maven.apache.org</url><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.7.7</spring-boot.version></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.34</version><scope>provided</scope><optional>true</optional></dependency><dependency><groupId>io.github.pig-mesh.ai</groupId><artifactId>deepseek-spring-boot-starter</artifactId><version>1.1.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.7</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.7.7</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.7.7</version><configuration><mainClass>org.pine.ai.BootDemoApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
</project>

2.2 DeepSeekController.java

package org.pine.ai.controller;import lombok.extern.slf4j.Slf4j;
import org.pine.ai.client.request.SaveChatSessionParamRequest;
import org.pine.ai.config.AiChatWebSocketHandler;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@Slf4j
@RequestMapping("/deepseek")
public class DeepSeekController {/*** 保存会话参数*/@PostMapping(value = "/saveSessionParam")public ResponseEntity<Void> saveSessionParam(@RequestBody SaveChatSessionParamRequest request) {String sessionId = request.getSessionId();if (!StringUtils.hasText(sessionId)) {throw new IllegalArgumentException("sessionId is empty");}AiChatWebSocketHandler.putSessionParam(sessionId, "model", request.getModel());AiChatWebSocketHandler.putSessionParam(sessionId, "temperature", request.getTemperature());AiChatWebSocketHandler.putSessionParam(sessionId, "frequencyPenalty", request.getFrequencyPenalty());AiChatWebSocketHandler.putSessionParam(sessionId, "user", request.getUser());AiChatWebSocketHandler.putSessionParam(sessionId, "topP", request.getTopP());AiChatWebSocketHandler.putSessionParam(sessionId, "maxCompletionTokens", request.getMaxCompletionTokens());return new ResponseEntity<>(null, null, HttpStatus.OK);}
}

2.3 启动类

package org.pine.ai;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.CrossOrigin;@SpringBootApplication
@CrossOrigin(origins = "*",allowedHeaders = "*",exposedHeaders = {"Cache-Control", "Connection"}  // 暴露必要头
)
public class BootDemoApplication {public static void main(String[] args) {SpringApplication.run(BootDemoApplication.class, args);}}

2.4 logback-spring.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration debug="false"><!-- 配置控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!-- 格式化输出: %d表示日期, %thread表示线程名, %-5level: 级别从左显示5个字符宽度 %msg:日志消息, %n是换行符 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}[%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- 日志输出级别 --><root level="INFO"><appender-ref ref="STDOUT"/></root>
</configuration>

2.5 application.yaml

deepseek:# 硅基流动的urlbase-url: https://api.siliconflow.cn/v1# 秘钥(你自己申请的)api-key: sk-ezcxadqecocxisaspring:main:allow-bean-definition-overriding: trueserver:tomcat:keep-alive-timeout: 30000  # 30秒空闲超时max-connections: 100       # 最大连接数uri-encoding: UTF-8servlet:encoding:charset: UTF-8force: trueenabled: truecompression:enabled: false  # 禁用压缩(否则流式数据可能被缓冲)

2.6 WebsocketConfig.java

package org.pine.ai.config;import io.github.pigmesh.ai.deepseek.core.DeepSeekClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;import javax.annotation.Resource;@Configuration
@EnableWebSocket
public class WebsocketConfig implements WebSocketConfigurer {@Resourceprivate DeepSeekClient deepSeekClient;@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(aiChatWebSocketHandler(), "/ws/chat").setAllowedOrigins("*");}@Beanpublic WebSocketHandler aiChatWebSocketHandler() {return new AiChatWebSocketHandler(deepSeekClient);}
}

2.7 AiChatWebSocketHandler.java

package org.pine.ai.config;import io.github.pigmesh.ai.deepseek.core.DeepSeekClient;
import io.github.pigmesh.ai.deepseek.core.chat.ChatCompletionRequest;
import io.github.pigmesh.ai.deepseek.core.chat.ResponseFormatType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;@Slf4j
public class AiChatWebSocketHandler extends TextWebSocketHandler {private static final Map<String, WebSocketSession> WEB_SOCKET_SESSION_MAP = new ConcurrentHashMap<>();private final DeepSeekClient deepSeekClient;public AiChatWebSocketHandler(DeepSeekClient deepSeekClient) {this.deepSeekClient = deepSeekClient;}public static void putSessionParam(String sessionId, String key, Object value) {WebSocketSession webSocketSession = WEB_SOCKET_SESSION_MAP.get(sessionId);if (webSocketSession == null) {throw new IllegalArgumentException("sessionId is not exist");}Map<String, Object> attributes = webSocketSession.getAttributes();attributes.put(key, value);}@Overridepublic void afterConnectionEstablished(WebSocketSession session) {WEB_SOCKET_SESSION_MAP.put(session.getId(), session);log.info("新连接: {}", session.getId());try {session.sendMessage(new TextMessage("sysLog=连接成功!"));session.sendMessage(new TextMessage("sysLog=sessionId:" + session.getId()));} catch (IOException e) {e.printStackTrace();}}@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) {String payload = message.getPayload();log.info("收到消息: {}", payload);Map<String, Object> attributes = session.getAttributes();String model = attributes.getOrDefault("model", "deepseek-ai/DeepSeek-R1").toString();Double temperature = (Double) attributes.getOrDefault("temperature", 0.7);Double frequencyPenalty = (Double) attributes.getOrDefault("frequencyPenalty", 0.5);String user = attributes.getOrDefault("user", "user").toString();Double topP = (Double) attributes.getOrDefault("topP", 0.7);Integer maxCompletionTokens = (Integer) attributes.getOrDefault("maxCompletionTokens", 1024);log.info("model: {}, temperature: {}, frequencyPenalty: {}, user: {}, topP: {}, maxCompletionTokens: {}", model, temperature, frequencyPenalty, user, topP, maxCompletionTokens);ChatCompletionRequest request = buildRequest(payload, model, temperature, frequencyPenalty, user, topP, maxCompletionTokens);deepSeekClient.chatFluxCompletion(request).doOnNext(responseContent -> {// 发送消息给客户端try {String content = responseContent.choices().get(0).delta().content();String reasoningContent = responseContent.choices().get(0).delta().reasoningContent();if (StringUtils.hasText(reasoningContent) || (reasoningContent != null && reasoningContent.contains("\n"))) {session.sendMessage(new TextMessage("reasonContent=" + reasoningContent));} else if (StringUtils.hasText(content) || (content != null && content.contains("\n"))) {session.sendMessage(new TextMessage("content=" + content));}if ("stop".equals(responseContent.choices().get(0).finishReason())) {session.sendMessage(new TextMessage("\n\n回答结束!"));}} catch (IOException e) {e.printStackTrace();}}).subscribe();}private ChatCompletionRequest buildRequest(String prompt,String model,Double temperature,Double frequencyPenalty,String user,Double topP,Integer maxCompletionTokens) {return ChatCompletionRequest.builder()// 添加用户输入的提示词(prompt),即模型生成文本的起点。告诉模型基于什么内容生成文本。.addUserMessage(prompt)// 指定使用的模型名称。不同模型可能有不同的能力和训练数据,选择合适的模型会影响生成结果。.model(model)// 是否以流式(streaming)方式返回结果。.stream(true)// 控制生成文本的随机性。0.0:生成结果非常确定,倾向于选择概率最高的词。1.0:生成结果更具随机性和创造性。.temperature(temperature)// 控制生成文本中重复内容的惩罚程度。0.0:不惩罚重复内容。1.0 或更高:减少重复内容,增加多样性。.frequencyPenalty(frequencyPenalty)// 标识请求的用户。用于跟踪和日志记录,通常用于区分不同用户的请求。.user(user)// 控制生成文本时选择词的范围。0.7:从概率最高的 70% 的词中选择。1.0:不限制选择范围。.topP(topP)// 控制模型生成的文本的最大长度。这对于防止生成过长的文本或确保响应在预期的范围内非常有用。.maxCompletionTokens(maxCompletionTokens).maxTokens(maxCompletionTokens)// 响应结果的格式。.responseFormat(ResponseFormatType.TEXT).build();}@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) {WEB_SOCKET_SESSION_MAP.remove(session.getId());log.info("连接关闭: {}", session.getId());}
}

2.8 SaveChatSessionParamRequest.java

package org.pine.ai.client.request;import lombok.Data;import java.io.Serializable;@Data
public class SaveChatSessionParamRequest implements Serializable {private String sessionId;private String model;private Double temperature;private Double frequencyPenalty;private String user;private Double topP;private Integer maxCompletionTokens;
}

2.9 index.html

<!DOCTYPE html>
<html>
<head><title>WebSocket DeepSeek Chat</title><style>body {font-family: Arial, sans-serif;background-color: #f4f4f9;margin: 0;padding: 20px;display: flex;flex-direction: column;align-items: center;}.input-button-container {display: flex;align-items: center;margin-bottom: 20px;width: 1060px;}#messageInput {width: 900px;padding: 10px;margin-right: 10px;border: 1px solid #ccc;border-radius: 5px;}button {padding: 10px 20px;border: none;border-radius: 5px;background-color: #007bff;color: white;cursor: pointer;margin-right: 10px;}button:hover {background-color: #0056b3;}.message-container {width: 500px;margin-top: 20px;border: 1px solid #ccc;border-radius: 5px;background-color: white;padding: 10px;overflow-y: auto;height: 200px;}.message-container p {margin: 5px 0;}#messages {border-color: #ccc;}#reasonMessages {border-color: #e89c10;}#sysLog {border-color: #ec1b1b;}.section-title {font-weight: bold;margin-top: 20px;}#paramConfigForm input[type = "text"] {width: 100%;padding: 10px;margin-left: 10px;border: 1px solid #ccc;border-radius: 5px;margin-top: 8px;}#paramConfigForm label {font-weight: bold;margin-top: 20px;}</style>
</head>
<body>
<div class="input-button-container"><input type="text" id="messageInput" placeholder="输入消息"/><button onclick="sendMessage()">发送</button>
</div><div style="display: flex;justify-content: flex-start;width: 1060px;align-items: center;"><button onclick="connectWebSocket()">连接</button><button style="background-color: #ec1b1b" onclick="disconnectWebSocket()">断开连接</button>
</div><div style="display: flex; width: 1100px;"><div style="width: 520px"><div class="section-title">思考过程:</div><div id="reasonMessages" class="message-container"></div></div><div style="width: 520px; margin-left: 20px;"><div class="section-title">正式回答:</div><div id="messages" class="message-container"></div></div>
</div><div style="width: 1100px;margin-top: 40px;"><div class="section-title">系统日志记录:</div><div id="sysLog" class="message-container" style="height: 100px;width: 1040px;"></div>
</div><div style="width: 1000px;margin-top: 40px;border: 1px solid #aba8a8;"><div class="section-title">参数配置:</div><div style="height: 700px;width: 900px;"><form id="paramConfigForm"><div style="margin-top: 20px;"><label for="sessionId">sessionId:</label><input type="text" id="sessionId" name="sessionId" required></div><div style="margin-top: 20px;"><label for="model">model:</label><input type="text" id="model" name="model" value="deepseek-ai/DeepSeek-R1"></div><div style="margin-top: 20px;"><label for="temperature">temperature:</label><input type="text" id="temperature" name="temperature" value="0.7"></div><div style="margin-top: 20px;"><label for="frequencyPenalty">frequencyPenalty:</label><input type="text" id="frequencyPenalty" name="frequencyPenalty" value="0.5"></div><div style="margin-top: 20px;"><label for="user">user:</label><input type="text" id="user" name="user" value="user"></div><div style="margin-top: 20px;"><label for="topP">topP:</label><input type="text" id="topP" name="topP" value="0.7"></div><div style="margin-top: 20px;"><label for="maxCompletionTokens">maxCompletionTokens:</label><input type="text" id="maxCompletionTokens" name="maxCompletionTokens" value="1024"></div><div style="margin-top: 20px;"><button type="button" onclick="submitParamConfigForm()">提交</button></div></form></div>
</div>
<script>let socket;/*** 连接websocket*/function connectWebSocket() {if (socket) {disconnectWebSocket()}// 根据实际服务地址修改const wsUri = "ws://localhost:8080/ws/chat";socket = new WebSocket(wsUri);socket.onopen = function (event) {appendMessage("系统: 连接已建立", "sysLog");};socket.onmessage = function (event) {let message = event.data.toString();console.log("收到消息:" + message);if (message.startsWith("content=")) {appendInlineMessage("messages", "" + message.substring(8))} else if (message.startsWith("reasonContent=")) {appendInlineMessage("reasonMessages", "" + message.substring(14))} else if (message.startsWith("sysLog=")) {appendMessage("系统: " + message.substring(7), "sysLog");}if (message.startsWith("sysLog=sessionId:")) {document.getElementById("sessionId").value = message.substring(17);}};socket.onclose = function (event) {appendMessage("系统: 连接已断开", "sysLog");};socket.onerror = function (error) {console.error("WebSocket错误:", error);appendMessage("系统: 连接发生错误", "sysLog");};}/*** 断开连接*/function disconnectWebSocket() {if (socket) {socket.close();}}/*** 发送消息*/function sendMessage() {const input = document.getElementById("messageInput");if (socket.readyState === WebSocket.OPEN) {socket.send(input.value);appendMessage("我: " + input.value, "sysLog");input.value = "";document.getElementById("reasonMessages").textContent = "";document.getElementById("messages").textContent = "";} else {alert("连接尚未建立");}}function appendMessage(message, divId) {const messagesDiv = document.getElementById(divId);const p = document.createElement("p");p.textContent = message;messagesDiv.appendChild(p);messagesDiv.scrollTop = messagesDiv.scrollHeight;}function appendInlineMessage(divId, messages) {const messagesDiv = document.getElementById(divId);messagesDiv.textContent += messages;messagesDiv.scrollTop = messagesDiv.scrollHeight;}// 初始化连接window.onload = connectWebSocket;/*** 提交参数配置表单*/function submitParamConfigForm() {// 获取表单元素const form = document.getElementById('paramConfigForm');const formData = new FormData(form);// 创建一个对象来存储表单数据const data = {};formData.forEach((value, key) => {data[key] = value;});// 将对象转换为 JSON 字符串const jsonData = JSON.stringify(data);// 使用 fetch API 发送 POST 请求fetch('http://localhost:8080/deepseek/saveSessionParam', {method: 'POST',headers: {'Content-Type': 'application/json'},body: jsonData}).then(response => {if (!response.ok) {throw new Error('Network response was not ok ' + response.statusText);}}).then(data => {console.log('Success:', data);// 处理成功响应alert("参数配置成功")}).catch((error) => {console.error('Error:', error);// 处理错误alert(error)});}</script>
</body>
</html>

三、页面调试

3.1 主页

启动SpringBoot项目后,访问页面:
http://localhost:8080/

在这里插入图片描述

3.2 参数调整

可以在主页的下方,进行基本参数的调整,一次调整对应的是当前的session。默认参数是输入框中显示的内容,【提交】表单后,调用deepseek时的基本参数就是你刚刚修改的内容了。
在这里插入图片描述

3.3 问问题(看下效果)

问:如何学习Java
在这里插入图片描述

四、遗留问题

页面中对换行、markdown的渲染还有些问题,但是这个页面的初衷只是为了调试deepseek的文本对话接口。因此后续可能不会继续完善了!!

相关文章:

SpringBoot接入DeepSeek(硅基流动版)+ 前端页面调试(WebSocket连接模式)

文章目录 前言正文一、项目环境二、项目代码2.1 pom.xml2.2 DeepSeekController.java2.3 启动类2.4 logback-spring.xml2.5 application.yaml2.6 WebsocketConfig.java2.7 AiChatWebSocketHandler.java2.8 SaveChatSessionParamRequest.java2.9 index.html 三、页面调试3.1 主页…...

idea实现热部署

1.在pom.xml文件添加依赖 java <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency> 更新可见配置成功&#xff1a; 2.在appli…...

记一次误禁用USB导致键盘鼠标失灵的修复过程

背景说明 在电脑上插入了一个USB hub&#xff0c;然后弹窗提示&#xff1a;“集线器端口上出现电涌”&#xff0c;点开让选择“重置”或者“关闭”&#xff0c;不小心点了关闭&#xff0c;结果这个usb口就被关了&#xff0c;再插任何东西都没反应&#xff0c;找了很多办法都恢…...

0x03 http协议和分层架构

HTTP协议 简介 Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则 http协议基于TCP协议&#xff1a;面向连接&#xff0c;安全基于请求-响应模型&#xff1a;一次请求对应一次响应HTTP协议是无状态的协议&#xff…...

【leetcode hot 100 189】轮转数组

错误解法一&#xff1a;申请一个数组&#xff0c;第i个数放在新数组的ik或ik-nums.length上 class Solution {public void rotate(int[] nums, int k) {int[] resultsnew int[nums.length];for(int i0; i<nums.length; i){if(ik<nums.length){results[ik] nums[i];}els…...

医药行业哪些招聘管理系统有AI功能?

随着医药行业竞争加剧&#xff0c;企业对高端研发、临床、市场人才的需求日益迫切。传统招聘模式因效率低、成本高、匹配度不足等问题&#xff0c;已难以满足行业需求。2025年&#xff0c;以AI为核心的招聘管理系统成为解决痛点的关键工具。 一、医药行业招聘的痛点与AI解决方案…...

.net8 使用 license 证书授权案例解析

创建 webapi 项目 使用 .NET CLI 创建一个 ASP.NET Core Web API 应用&#xff0c;并添加指定的 NuGet 包&#xff0c;可以按照以下步骤操作&#xff1a; 创建 ASP.NET Core Web API 项目&#xff1a; dotnet new webapi -n WebAppLicense cd WebAppLicense添加 Standard.Li…...

golang的io

https://www.bilibili.com/video/BV1gx4y1r7xb 1. 原生io包 io包是Go语言标准库中底层的I/O接口层&#xff0c;定义了通用的读写规则和错误处理逻辑。每次读写都是直接调用底层系统 I/O&#xff0c;每次读取1字节&#xff0c;系统调用次数多。适用于小数据量、实时性要求高。i…...

全向广播扬声器在油气田中的关键应用 全方位守护安全

油气田作为高风险作业场所&#xff0c;安全生产始终是重中之重。在紧急情况下&#xff0c;如何快速、有效地传达信息&#xff0c;确保人员安全撤离&#xff0c;是油气田安全管理的关键环节。全向广播扬声器凭借其全方位覆盖、高音质输出和强大的环境适应性&#xff0c;成为油气…...

76.读取计时器运行时间 C#例子 WPF例子

TimerManager&#xff1a;一个增强的定时器类&#xff0c;带时间管理功能 在使用定时器时&#xff0c;我们常常需要知道定时器的运行状态&#xff0c;比如它已经运行了多久&#xff0c;或者还剩下多少时间。然而&#xff0c;.NET 的 System.Timers.Timer 类本身并没有直接提供…...

嵌入式开发:傅里叶变换(5):基于STM32,实现CMSIS中的DSP库

目录 步骤 1&#xff1a;准备工作 步骤 2&#xff1a;创建 Keil 项目&#xff0c;并配置工程 步骤 3&#xff1a;在MDK工程上添加 CMSIS-DSP 库 步骤 5&#xff1a;编写代码 步骤 6&#xff1a;配置时钟和优化 步骤 7&#xff1a;调试与验证 步骤 8&#xff1a;优化和调…...

探秘基带算法:从原理到5G时代的通信变革【六】CRC 校验

文章目录 2.5 CRC 校验2.5.1 前言2.5.2 CRC算法简介2.5.3 CRC计算的详细过程2.5.4 CRC校验的两种方法详解**分离比较法****整体运算法****不同位出错与余数的关系****总结** 2.5.5 CRC计算的C实现及工具介绍**C实现CRC计算****CRC计算工具推荐** **2.5.6 总结&#xff1a;CRC校…...

MySQL——DQL、多表设计

目录 一、DQL 1.基本查询 2.条件查询 3.分组查询 4.排序查询 5.分页查询 二、多表设计 1.一对多 2.一对一 3.多对多 一、DQL 1.基本查询 注意&#xff1a; *号代表查询所有字段&#xff0c;在实际开发中尽量少用&#xff08;不直观、影响效率&#xff09; 2.条件查询…...

XML 编辑器:全面指南与最佳实践

XML 编辑器:全面指南与最佳实践 引言 XML(可扩展标记语言)编辑器是处理XML文件的关键工具,对于开发人员、系统管理员以及任何需要处理XML数据的人来说至关重要。本文将全面介绍XML编辑器的概念、功能、选择标准以及最佳实践,旨在帮助读者了解如何选择和使用合适的XML编辑…...

【USRP】NVIDIA Sionna:用于 6G 物理层研究的开源库

目录 Sionna&#xff1a;用于 6G 物理层研究的开源库主要特点实现6G研究的民主化支持 5G、6G 等模块化、可扩展、可伸缩快速启动您的研究 好处原生人工智能支持综合研究平台开放生态系统 安装笔记使用 pip 安装基于Docker的安装从源代码安装“你好世界&#xff01;”探索锡奥纳…...

DeepSeek开源周Day6:DeepSeek V3、R1 推理系统深度解析,技术突破与行业启示

DeepSeek 在开源周第六天再次发文&#xff0c;中文原文、官方号在知乎 DeepSeek - 知乎DeepSeek-V3 / R1 推理系统概览 - 知乎deepseek-ai/open-infra-index: Production-tested AI infrastructure tools for efficient AGI development and community-driven innovation 引言 …...

intra-mart实现logicDesigner与forma联动

一、前言 有一个需求&#xff0c;想实现从页面上传一个excel文件&#xff0c;点击提交&#xff0c;就转发给forma模块&#xff0c;然后用户在forma模块里&#xff0c;确认下自动填写的信息是否正确&#xff0c;正确的话就点击保存&#xff0c;存入数据库&#xff1b;不正确的话…...

《大语言模型的原理发展与应用》:此文为AI自动生成

《大语言模型的原理发展与应用》&#xff1a;此文为AI自动生成 一、引言&#xff1a;大语言模型&#xff0c;AI 时代的 “新引擎” 在当今数字化浪潮中&#xff0c;大语言模型宛如一颗璀璨的明星&#xff0c;照亮了人工智能发展的道路&#xff0c;成为推动各领域变革的核心驱…...

生态安全相关

概念&#xff1a;生态安全指一个国家具有支撑国家生存发展的较为完整、不受威胁的生态系统&#xff0c;以及应对内外重大生态问题的能力。 &#xff08;1&#xff09;国外生态安全的研究进展 国际上对生态安全的研究是从“环境”与“安全”之间的关系展开的。开始的阶段&#x…...

DeepSeek-R1国产化系统gpu驱动+cuda+ollama+webui可视化离线私有化部署

1.概述 网上大部分教程都是在线部署&#xff0c;完全离线私有化部署的文章不多&#xff0c;本文介绍从GPU驱动、cuda、ollama、deepseek模型和open webui等完全离线安装几个方面&#xff0c;让小白0基础也可以私有化部署大模型deepseek-R1。 我使用的设备是银河麒麟V10操作系统…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...