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

【ESP32接入国产大模型之Deepseek】

【ESP32接入国产大模型之Deepseek】

  • 1. Deepseek大模型
    • 1.1 了解Deepseek api
    • 1.2 Http接口鉴权
    • 1.3. 接口参数说明
    • 1.3.1 请求体(request)参数
    • 1.3.2 模型推理
  • 2. 先决条件
    • 2.1 环境配置
    • 2.2 所需零件
  • 3. 核心代码
    • 3.1 源码分享
    • 3.2 源码解析
    • 3.3 连续对话
      • 修改后的代码
      • 代码说明
      • 示例输出
      • 注意事项
  • 4. 上传验证
    • 4.1 对话测试
    • 4.2 报错
  • 5. 总结

1. Deepseek大模型

ESP32接入国产大模型之Deepseek

首先声明没有恰饭广告,源代码已经匿名处理,制作细节非常完善,方便大家复刻才会提供快捷的相关链接跳转!!!😘😘😘

在这里插入图片描述

DeepSeek 是一个先进的人工智能平台,旨在提供强大的对话和探索功能。它已经发布了性能更强的版本,并且已经开源,用户可以在网页端、APP 和 API 上注册使用。DeepSeek V3 是其最新的超级模型,用户可以免费与之对话,体验其强大的功能。

DeepSeek 的目标是探索未知的领域,提供创新的解决方案和工具。用户可以通过官方推出的手机 App 快速访问更多工具和资源。这个平台适合那些希望利用先进 AI 技术来增强其工作和生活体验的用户。。本文将重点介绍如何通过ESP32S3接入国产大模型之Deepseek api。
【ESP32接入国产大模型之腾讯混元】
上一篇博客已经分享了
【ESP32接入国产大模型之豆包】
【ESP32接入国产大模型之星火】
【ESP32接入国产大模型之MiniMax】
【ESP32接入语言大模型之智谱清言】
【ESP32接入国产大模型之文心一言】
【ESP32接入语言大模型之通义千问】
【ESP32接入国产大模型之kimi】
【ESP32接入国产大模型之Deepseek】
在这里插入图片描述

下面是不标准测评,参考而已

模型响应时间内容质量免费token次数地址
豆包2s9分50万https://www.volcengine.com/product/doubao
讯飞星火4s8分1亿https://www.xfyun.cn/doc/spark/HTTP%E8%B0%83%E7%94%A8%E6%96%87%E6%A1%A3.html
MiniMax3s8分500万https://www.minimaxi.com/
智谱清言7s7分300万https://open.bigmodel.cn/
文心一言10s7分500万https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Nlks5zkzu
通义千问8s7分800万https://tongyi.aliyun.com/qianwen/
Kimi2s9分50万https://platform.moonshot.cn/docs/guide/start-using-kimi-api
混元6s8分50万https://cloud.tencent.com/document/product/1729/105701
Deepseek12s9分50万https://cloud.tencent.com/document/product/1729/105701

这一次还是采用Platformio编程就会轻松许多开发。这样就可以把大模型装进口袋啦🤣🤣🤣

1.1 了解Deepseek api

为方便用户使用,我们提供了 原生 HTTP 来实现模型 API 的调用。
Deepseek api

在这里插入图片描述

1.2 Http接口鉴权

Deepseek API 兼容了 OpenAI 的接口规范,这意味着您可以直接使用 OpenAI 官方提供的 SDK 来调用混元大模型。您仅需要将 base_url 和 api_key 替换成混元的相关配置,不需要对应用做额外修改,即可无缝将您的应用切换到混元大模型。详见鉴权认证方式。

  1. apikey
    进入 [API Key 管理]https://console.cloud.tencent.com/hunyuan/start)页面,在您有权限的项目下点击新建 API Key,即可生成长效 API Key。进入兼容OpenAI API KEY的创建页面,点击新建即可生成API KEY。
    点击创建api key
    在这里插入图片描述

API Key 签名鉴权方式要求在 HTTP 请求 header 中按如下方式添加 Authorization header:

Authorization: Bearer $ARK_API_KEY

1.3. 接口参数说明

1.3.1 请求体(request)参数

curl https://api.deepseek.com/chat/completions \-H "Content-Type: application/json" \-H "Authorization: Bearer <DeepSeek API Key>" \-d '{"model": "deepseek-chat","messages": [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Hello!"}],"stream": false}'

注意

model选默认就好
在这里插入图片描述

1.3.2 模型推理

在这里插入图片描述

上下文拼接
在每一轮对话过程中,模型会输出思维链内容(reasoning_content)和最终回答(content)。在下一轮对话中,之前轮输出的思维链内容不会被拼接到上下文中,如下图所示:

在这里插入图片描述

2. 先决条件

在继续此项目之前,请确保检查以下先决条件。

我们将使用 Arduino IDE 对 ESP32/ESP8266 开发板进行编程,因此在继续本教程之前,请确保已在 Arduino IDE 中安装这些开发板。

2.1 环境配置

  1. Arduino IDE:下载并安装 Arduino IDE;
  2. ESP32 开发板库:在 Arduino IDE 中添加 ESP32 支持;
    参考博客:【esp32c3配置arduino IDE教程】
    为安装过程留出一些时间,具体时间可能因您的互联网连接而异。

2.2 所需零件

要学习本教程,您需要1个 ESP32 开发板或者ESP32C3,建议使用后者,笔者发现同样的代码后者可以轻松调用,ESP32不行(可能板子坏了)

目前这是我使用的ESP32S3官方硬件👍👍👍(小小的身材有大大的力量)只需要35元加摄像头麦克风79元,后期我会整理相关专栏进行Arduino系统学习😘😘😘。有需要可以购买xiao开发板💕💕💕

  1. SeeedXIAO ESP32S3 Sense硬件购买地址:https://s.click.taobao.com/lekazrt
    在这里插入图片描述

  2. ESP32-S3-CAM 核心开发板 N16R8 wifi蓝牙模块 OV2640摄像头硬件购买地址:https://s.click.taobao.com/1PTagos

在这里插入图片描述

3. 核心代码

3.1 源码分享

esp32S3 Arduino代码如下

#include <Arduino.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <ArduinoJson.h>// 替换为您的 WiFi 凭据
const char *ssid = "IQOO";
const char *password = "12345678";// 替换为您的 DeepSeek API 密钥
const char* apiKey = "sk-ea62673968ca4a34a1a1f6a82e4";// DeepSeek API 端点
const char* host = "api.deepseek.com";
const int httpsPort = 443;// 创建 WiFiClientSecure 对象
WiFiClientSecure client;// 设置超时时间 (单位:毫秒)
const unsigned long timeout = 10000;// 函数声明
void connectToWiFi();
String askDeepSeek(String question);
void printResponse(String response);void setup() {Serial.begin(115200);// 连接到 WiFiconnectToWiFi();// 关闭证书鉴权client.setInsecure();Serial.println("初始化完成,请输入您的问题:");
}void loop() {// 检查串口是否有输入if (Serial.available()) {String question = Serial.readStringUntil('\n');question.trim(); // 去除换行符和空格if (question.length() > 0) {Serial.println("正在向 DeepSeek 提问...");String response = askDeepSeek(question);printResponse(response);Serial.println("\n请输入下一个问题:");}}
}// 连接到 WiFi
void connectToWiFi() {WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.println("正在连接到 WiFi...");}Serial.println("已连接到 WiFi");
}// 向 DeepSeek 提问
String askDeepSeek(String question) {String response = "";// 连接到 DeepSeek APIif (!client.connect(host, httpsPort)) {Serial.println("连接失败");return "连接失败";}// 构建请求String request = "POST /v1/chat/completions HTTP/1.1\r\n";request += "Host: " + String(host) + "\r\n";request += "Authorization: Bearer " + String(apiKey) + "\r\n";request += "Content-Type: application/json\r\n";request += "Connection: close\r\n";// 构建请求体DynamicJsonDocument doc(1024);doc["model"] = "deepseek-chat";doc["messages"][0]["role"] = "user";doc["messages"][0]["content"] = question;doc["stream"] = true;String requestBody;serializeJson(doc, requestBody);request += "Content-Length: " + String(requestBody.length()) + "\r\n\r\n";request += requestBody;// 发送请求client.print(request);// 记录开始时间unsigned long startTime = millis();// 流式接收响应while (client.connected()) {// 检查超时if (millis() - startTime > timeout) {Serial.println("响应超时");break;}// 读取数据while (client.available()) {String line = client.readStringUntil('\n');if (line.startsWith("data: ")) {String jsonData = line.substring(6);DynamicJsonDocument doc(1024);deserializeJson(doc, jsonData);// 提取回复内容if (doc.containsKey("choices")) {String content = doc["choices"][0]["delta"]["content"];response += content;}}}}// 断开连接client.stop();return response;
}// 打印回复内容
void printResponse(String response) {Serial.println("DeepSeek 回复:");Serial.println(response);
}

这段代码是一个基于Arduino平台(可能是ESP32或ESP8266)的示例,它通过WiFi连接到指定的无线网络,并利用HTTPClient库向智谱清言API发送POST请求以获取AI生成的回答。

3.2 源码解析

以下是详细的解释:

  1. 导入必要的库:
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
  1. 第一处修改定义Wi-Fi网络凭证:
// 1. Replace with your network credentials
const char *ssid = "IQOO";
const char *password = "12345678";
  1. 第二处修改定义要调用的APIkey:
// 2. Replace with your OpenAI API key
const char* apiKey = "sk-ea62673968ca4a34a1a1f6a82e4";

这段代码是一个用于ESP32微控制器的程序,旨在通过WiFi连接到DeepSeek API,并与之进行交互。以下是代码的主要功能概述:

  1. WiFi连接:代码首先连接到指定的WiFi网络(ssidpassword)。如果连接丢失,它会尝试重新连接。

  2. 用户输入处理:通过串口监视器,用户可以输入问题或消息。这些输入被发送到DeepSeek API进行处理。

  3. API请求:代码构建一个HTTP POST请求,包含用户输入的内容,并将其发送到DeepSeek API。请求使用JSON格式,并包含API密钥进行身份验证。

  4. 分块响应处理:由于API响应可能是分块的,代码实现了分块解析状态机来处理这些响应。它读取每个块的大小和数据,直到所有数据接收完毕。

  5. 响应解析:接收到的响应被解析为JSON格式,并提取出DeepSeek的回复内容。代码还提取并显示了使用的Token数量(输入、输出和总计)。

  6. 错误处理:代码包含了对连接失败、JSON解析错误和API错误的处理,确保在出现问题时能够提供有用的调试信息。

总体而言,这段代码展示了如何在ESP32上实现与远程API的交互,处理分块响应,并解析JSON数据。这对于需要与云服务进行通信的物联网(IoT)应用非常有用。

3.3 连续对话

为了实现上下文拼接功能,并让模型在每一轮对话中输出思维链内容,我们需要对代码进行以下改进:

  1. 维护对话历史:

    • 使用一个数组或列表来存储用户和模型的对话内容。
    • 每次对话时,将用户的问题和模型的回复添加到对话历史中。
  2. 拼接上下文:

    • 在每次请求时,将对话历史作为上下文传递给 DeepSeek API。
  3. 提取思维链内容:

    • 根据 DeepSeek API 的响应,提取模型输出的思维链内容(通常是一个字段,如 reasoningchain_of_thought)。

以下是修改后的代码:


修改后的代码

#include <Arduino.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <ArduinoJson.h>// 替换为您的 WiFi 凭据
const char *ssid = "IQOO";
const char *password = "12345678";// 替换为您的 DeepSeek API 密钥
const char* apiKey = "sk-ea62673968ca4a34a1a1f6a82e4";// DeepSeek API 端点
const char* host = "api.deepseek.com";
const int httpsPort = 443;// 创建 WiFiClientSecure 对象
WiFiClientSecure client;// 设置超时时间 (单位:毫秒)
const unsigned long timeout = 10000;// 对话历史
const int maxHistory = 10; // 最大对话轮次
String conversationHistory[maxHistory]; // 存储对话历史
int historyIndex = 0; // 当前对话历史索引// 函数声明
void connectToWiFi();
String askDeepSeek(String question);
void printResponse(String response);
void addToHistory(String role, String content);
void printHistory();void setup() {Serial.begin(115200);// 连接到 WiFiconnectToWiFi();// 关闭证书鉴权client.setInsecure();Serial.println("初始化完成,请输入您的问题:");
}void loop() {// 检查串口是否有输入if (Serial.available()) {String question = Serial.readStringUntil('\n');question.trim(); // 去除换行符和空格if (question.length() > 0) {// 将用户问题添加到对话历史addToHistory("user", question);Serial.println("正在向 DeepSeek 提问...");String response = askDeepSeek(question);printResponse(response);// 将模型回复添加到对话历史addToHistory("assistant", response);// 打印当前对话历史printHistory();Serial.println("\n请输入下一个问题:");}}
}// 连接到 WiFi
void connectToWiFi() {WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.println("正在连接到 WiFi...");}Serial.println("已连接到 WiFi");
}// 向 DeepSeek 提问
String askDeepSeek(String question) {String response = "";// 连接到 DeepSeek APIif (!client.connect(host, httpsPort)) {Serial.println("连接失败");return "连接失败";}// 构建请求String request = "POST /v1/chat/completions HTTP/1.1\r\n";request += "Host: " + String(host) + "\r\n";request += "Authorization: Bearer " + String(apiKey) + "\r\n";request += "Content-Type: application/json\r\n";request += "Connection: close\r\n";// 构建请求体DynamicJsonDocument doc(1024);doc["model"] = "deepseek-chat";doc["stream"] = true;// 添加对话历史JsonArray messages = doc.createNestedArray("messages");for (int i = 0; i < historyIndex; i++) {JsonObject message = messages.createNestedObject();message["role"] = i % 2 == 0 ? "user" : "assistant"; // 交替用户和助手角色message["content"] = conversationHistory[i];}// 添加当前问题JsonObject newMessage = messages.createNestedObject();newMessage["role"] = "user";newMessage["content"] = question;String requestBody;serializeJson(doc, requestBody);request += "Content-Length: " + String(requestBody.length()) + "\r\n\r\n";request += requestBody;// 发送请求client.print(request);// 记录开始时间unsigned long startTime = millis();// 流式接收响应while (client.connected()) {// 检查超时if (millis() - startTime > timeout) {Serial.println("响应超时");break;}// 读取数据while (client.available()) {String line = client.readStringUntil('\n');if (line.startsWith("data: ")) {String jsonData = line.substring(6);DynamicJsonDocument doc(1024);deserializeJson(doc, jsonData);// 提取回复内容if (doc.containsKey("choices")) {String content = doc["choices"][0]["delta"]["content"];response += content;}// 提取思维链内容(假设字段为 "reasoning")if (doc.containsKey("choices") && doc["choices"][0].containsKey("delta") && doc["choices"][0]["delta"].containsKey("reasoning")) {String reasoning = doc["choices"][0]["delta"]["reasoning"];Serial.println("思维链: " + reasoning);}}}}// 断开连接client.stop();return response;
}// 打印回复内容
void printResponse(String response) {Serial.println("DeepSeek 回复:");Serial.println(response);
}// 添加对话历史
void addToHistory(String role, String content) {if (historyIndex < maxHistory) {conversationHistory[historyIndex] = content;historyIndex++;} else {// 如果历史记录已满,移除最早的记录for (int i = 0; i < maxHistory - 1; i++) {conversationHistory[i] = conversationHistory[i + 1];}conversationHistory[maxHistory - 1] = content;}
}// 打印对话历史
void printHistory() {Serial.println("\n当前对话历史:");for (int i = 0; i < historyIndex; i++) {Serial.println((i % 2 == 0 ? "用户: " : "助手: ") + conversationHistory[i]);}
}

代码说明

  1. 对话历史管理:

    • 使用 conversationHistory 数组存储对话内容。
    • 通过 addToHistory 函数将用户问题和模型回复添加到历史中。
    • 如果历史记录已满,移除最早的记录以保持最大轮次。
  2. 上下文拼接:

    • 在每次请求时,将对话历史作为 messages 数组传递给 DeepSeek API。
  3. 思维链提取:

    • 假设 DeepSeek API 返回的思维链内容字段为 reasoning,在流式接收时提取并打印。
  4. 对话历史打印:

    • 使用 printHistory 函数打印当前对话历史,方便调试和观察上下文。

示例输出

初始化完成,请输入您的问题:
你好,DeepSeek!
正在向 DeepSeek 提问...
思维链: 用户打招呼,我需要回应问候。
DeepSeek 回复:
你好!我是 DeepSeek,很高兴为您服务。请问有什么可以帮您的?当前对话历史:
用户: 你好,DeepSeek!
助手: 你好!我是 DeepSeek,很高兴为您服务。请问有什么可以帮您的?请输入下一个问题:

注意事项

  1. API 字段名称:

    • 确保 reasoning 字段与 DeepSeek API 返回的思维链字段名称一致。如果不一致,请根据 API 文档修改。
  2. 历史记录长度:

    • 根据 ESP32 的内存限制,调整 maxHistory 的大小,避免内存不足。
  3. 流式数据解析:

    • 确保解析逻辑能够正确处理流式数据的分块传输。

希望这段代码能满足您的需求!如果有其他问题,请随时告诉我。

4. 上传验证

下面给出下载配置,请严格配置
platformio.ini文件

; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html[env:esp32s3-cam]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
board_upload.flash_size = 16MB
board_build.partitions = default_16MB.csv
board_build.mcu = esp32s3
monitor_speed = 115200
upload_speed = 921600
lib_deps = bblanchon/ArduinoJson@^7.3.0

4.1 对话测试

打开串口监视器,注意右下角选择回车符,选择115200波特率,输入你想问的问题,他就可以回答你

在这里插入图片描述

个人感觉混元比其他国内大模型响应有点快啦,大约10s返回,太爽啦!😘😘😘

4.2 报错

如果返回error ,大家对照列表查询错误代码,结合提示排查解决

在这里插入图片描述

5. 总结

🥳🥳🥳现在,我们在本教程中,您学习了如何使用ESP32接入语言大模型之Deepseek。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,后期会持续分享esp32跑freertos实用案列🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣

如果你有任何问题,可以通过q group(945348278)加入鹏鹏小分队,期待与你思维的碰撞😘😘😘

鸣谢B站UP星汇极客
参考文献:ESP32对接DeepSeek API,实现AI大模型交互功能。

相关文章:

【ESP32接入国产大模型之Deepseek】

【ESP32接入国产大模型之Deepseek】 1. Deepseek大模型1.1 了解Deepseek api1.2 Http接口鉴权1.3. 接口参数说明1.3.1 请求体(request)参数1.3.2 模型推理 2. 先决条件2.1 环境配置2.2 所需零件 3. 核心代码3.1 源码分享3.2 源码解析3.3 连续对话修改后的代码代码说明示例输出注…...

Vue 2 路由指南:从基础到高级

注意&#xff1a;对于代码看不清的部分&#xff0c;用鼠标选中就能看到了&#xff0c;背景颜色和字体颜色过于接近&#xff0c;我也不知道怎么调&#xff0c;只能这样子先看着了 一、Vue Router 是什么&#xff1f; Vue Router 是 Vue.js 官方的路由管理器&#xff0c;它允许…...

2025最新深度学习pytorch完整配置:conda/jupyter/vscode

从今天开始&#xff0c;开始一个新的专栏&#xff0c;更新深度学习相关的内容&#xff0c;从入门到精通&#xff0c;首先的首先是关于环境的配置指南&#xff1a;工欲善其事必先利其器&#xff01; PyTorch 是由 Facebook&#xff08;现 Meta&#xff09;开发的 开源深度学习框…...

Python教学-最常用的标准库之一——OS库

os 库是 Python 标准库中的一个模块&#xff0c;它提供了一种方便的方式来使用操作系统相关的功能。os 模块提供了很多函数&#xff0c;可以用来处理文件和目录、访问环境变量、执行系统命令等。以下是一些常用的 os 模块的功能和示例&#xff1a; 1. 文件和目录操作 1.1 当前…...

尚硅谷爬虫note006

一、ajax的get请求 1. ajax的get请求—豆瓣电影第一页 # _*_ coding : utf-8 _*_ # Time : 2025/2/13 15:14 # Author : 20250206-里奥 # File : demo23_ajax的get请求 # Project : PythonProject10-14import urllib.requestfrom demo17_qingqiuduixaingdedingzhi import hea…...

LeetCode刷题---字符串---859

亲密字符串 859. 亲密字符串 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给你两个字符串 s 和 goal &#xff0c;只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果&#xff0c;就返回 true &#xff1b;否则返回 false 。 交换字母的定义是&…...

探索大数据处理:利用 Apache Spark 解锁数据价值

探索大数据处理&#xff1a;利用 Apache Spark 解锁数据价值 大家好&#xff0c;我是你们熟悉的大数据领域自媒体创作者Echo_Wish。今天&#xff0c;我们来聊聊如何利用Apache Spark进行大规模数据处理。Apache Spark作为一个快速、通用的集群计算框架&#xff0c;以其出色的性…...

伯克利 CS61A 课堂笔记 08 —— Strings and Dictionaries

本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理&#xff0c;全英文内容&#xff0c;文末附词汇解释。 目录 01 Strings 字符串 Ⅰ Strings are An Abstraction. Ⅱ Strings Literals have Three Forms Ⅲ String are Sequences 02 Dictionaries 字典 …...

V93K测试机

爱德万V9300&#xff08;又称V93K&#xff09;是Advantest公司推出的高端可扩展SoC测试平台&#xff0c;在半导体测试领域具有标杆地位。以下为该设备的详细介绍&#xff1a; ### 一、核心性能与技术优势 1. **高速高精度测试能力** V9300支持高达112 Gbps PAM4信号&…...

在 CentOS 上更改 SSH 默认端口以提升服务器安全性

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …...

基于逻辑概率的语义信道容量(Semantic Channel Capacity)和语义压缩理论(Semantic Compression Theory)

基于逻辑概率的语义信道容量&#xff08;Semantic Channel Capacity&#xff09;和语义压缩理论&#xff08;Semantic Compression Theory&#xff09;是语义通信&#xff08;Semantic Communication, SemCom&#xff09;的核心研究方向&#xff0c;它们旨在优化通信效率&#…...

Golang GORM系列:GORM事务及错误处理

在数据库管理领域&#xff0c;确保数据完整性至关重要。GORM是健壮的Go对象关系映射库&#xff0c;它为开发人员提供了维护数据一致性和优雅地处理错误的基本工具。本文是掌握GORM事务和错误处理的全面指南。我们将深入研究如何使用事务来保证原子性&#xff0c;并探索有效处理…...

51单片机-C语言扩展及最小系统

1、C-51的数据类型扩充定义 sfr&#xff1a;特殊功能寄存器声明 sfr&#xff1a;变量名地址值&#xff1b; 特殊功能寄存器在reg51.H这个头文件里面都帮我们定义好了&#xff0c;所以平时我们就不要自己去定义寄存器的名字。 sbit&#xff1a;特殊功能位声明sbit 变量名地址…...

日常问题-pnpm install执行没有node_modules生成

日常问题-pnpm install执行没有node_modules生成 1.问题2.解决方法 1.问题 执行pnpm i后&#xff0c;提示Scope: all 3 workspace projects Done in 503ms&#xff0c;而且没有node_modules生成。很奇怪 2.解决方法 确保根目录有 pnpm-workspace.yaml 文件&#xff1a; 把这…...

FreeRTOS低功耗总结

前言 Cortex-M核的MCU一般支持以下三种低功耗方式&#xff1a; ● 睡眠(Sleep)模式 ● 停止(Stop)模式 ● 待机(Standby)模式 睡眠模式 进入睡眠模式有两种指令&#xff1a;WFI(等待中断)和WFE(等待事件)&#xff0c; WFI进入睡眠模式后&#xff0c;任意中断都可唤醒。 WFE进…...

UniApp 实现炫酷导航栏:选中图标上移并隐藏文字

在移动应用开发中&#xff0c;导航栏是用户与应用交互的重要组成部分&#xff0c;一个美观且交互性强的导航栏能大大提升用户体验。本文将详细介绍如何使用 UniApp 实现一个独特的导航栏&#xff0c;当用户选中某个导航项时&#xff0c;对应的图标会上移并隐藏文字&#xff0c;…...

Django 操作表中的数据(增删改查)

1.新建数据 我之前已经在数据库中创建了两张表&#xff0c;如下 在urls.py文件中添加一行代码&#xff0c;然后再在views.py文件中编写函数 &#xff08;将 URL 路径 orm/ 映射到 Django 视图函数 views.orm&#xff0c;当用户访问 orm/ 时&#xff0c;Django 会调用 orm 视图…...

优选驾考小程序

第2章 系统分析 2.1系统使用相关技术分析 2.1.1Java语言介绍 Java语言是一种分布式的简单的 开发语言&#xff0c;有很好的特征&#xff0c;在安全方面、性能方面等。非常适合在Internet环境中使用&#xff0c;也是目前企业级运用中最常用的一个编程语言&#xff0c;具有很大…...

vue开发06:前端通过webpack配置代理处理跨域问题

1.定义 在浏览器尝试请求不同源&#xff08;域名、协议、端口号不同&#xff09;的资源时&#xff0c;浏览器的同源策略会阻止这种跨域请求。&#xff08;比如前端端口15500&#xff0c;后端端口5050&#xff0c;前端界面不可以直接调用5050端口&#xff09; 2.解决方案 使用前…...

C++基础 | 线程`std::thread`

什么是std::thread&#xff1f; std::thread是C11中引入的一个类&#xff0c;用于表示和管理线程。通过std::thread&#xff0c;我们可以创建一个新的线程来执行指定的任务。线程是操作系统调度的基本单位&#xff0c;多个线程可以并发执行&#xff0c;从而提高程序的效率。 创…...

体验 DeepSeek-R1:解密 1.5B、7B、8B 版本的强大性能与应用

文章目录 &#x1f34b;引言&#x1f34b;DeepSeek 模型简介&#x1f34b;版本更新&#xff1a;1.5B、7B、8B 的区别与特点&#x1f34b;模型评估&#x1f34b;体验 DeepSeek 的过程&#x1f34b;总结 &#x1f34b;引言 随着大规模语言模型的持续发展&#xff0c;许多模型在性…...

2024年认证杯SPSSPRO杯数学建模A题(第二阶段)保暖纤维的保暖能力全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 A题 保暖纤维的保暖能力 原题再现&#xff1a; 冬装最重要的作用是保暖&#xff0c;也就是阻挡温暖的人体与寒冷环境之间的热量传递。人们在不同款式的棉衣中会填充保暖材料&#xff0c;从古已有之的棉花、羽绒到近年来各种各样的人造纤维。不…...

P1878 舞蹈课(详解)c++

题目链接&#xff1a;P1878 舞蹈课 - 洛谷 | 计算机科学教育新生态 1.题目解析 1&#xff1a;我们可以发现任意两个相邻的都是异性&#xff0c;所以他们的舞蹈技术差值我们都要考虑&#xff0c;4和2的差值是2&#xff0c;2和4的差值是2&#xff0c;4和3的差值是1&#xff0c;根…...

或非门组成的SR锁存器真值表相关问题

PS&#xff1a;主要是给大家抛砖引玉&#xff0c;不喜勿喷。 问题描述&#xff1a;或非门组成的SR锁存器&#xff0c;为什么当SD和RD等于0时候的真值表一个是Q0&#xff0c;Q0.一个结果是Q1&#xff0c;Q1&#xff1f;...

机器学习算法 - 随机森林之决策树初探(1)

随机森林是基于集体智慧的一个机器学习算法&#xff0c;也是目前最好的机器学习算法之一。 随机森林实际是一堆决策树的组合&#xff08;正如其名&#xff0c;树多了就是森林了&#xff09;。在用于分类一个新变量时&#xff0c;相关的检测数据提交给构建好的每个分类树。每个…...

webpack构建流程

文章目录 [TOC](文章目录) 运行流程初始化流程编译构建流程compile编译make 编译模块build module 完成模块编译 输出流程seal输出资源emit输出完成 小结 运行流程 是一个串行的过程&#xff0c;它的工作流程就是将各个插件串联起来 在运行过程中会广播事件&#xff0c;插件只…...

服务器之连接简介(Detailed Explanation of Server Connection)

一台服务器最大能支持多少连接&#xff1f;一台客户端机器最多能发起多少条连接&#xff1f;&#xff1f; 我们知道TCP连接&#xff0c;从根本上看其实就是client和server端在内存中维护的一组【socket内核对象】&#xff08;这里也对应着TCP四元组&#xff1a;源IP、源端口、…...

第1章大型互联网公司的基础架构——1.5 服务发现

讲到这里&#xff0c;我们已经对一个客户端请求进入业务HTTP服务的过程有了较为详细的了解。业务HTTP服务在处理请求的过程中免不了与其他下游服务通信——可能会调用其他业务服务&#xff0c;可能需要访问数据库&#xff0c;可能会向消息中间件投递消息等&#xff0c;所以业务…...

uniapp PDF 预览和下载

创建 index.vue <template><view><view class"box"><view class"item" ><view class"title"><span></span><text>文件</text></view><view class"list" v-for"(…...

ubuntu服务器部署

关闭欢迎消息 服务器安装好 ubuntu 系统后&#xff0c;进行终端登录&#xff0c;会显示出很多的欢迎消息 通过在用户的根目录下执行 touch .hushlogin 命令&#xff0c;再次登录终端就不会出现欢迎消息 修改hostname显示 修改 /etc/hostname 文件内容为主机名&#xff0c;保…...

Deepseek 本地部署

准备环境 设备&#xff1a;家用笔记本电脑&#xff0c;8核/16G/1Tb SSD/无独显 系统&#xff1a;windows10 软件环境&#xff08;非源码部署不需要&#xff09;&#xff1a;conda 4.8.5、python3.7、git2.13 步骤 下载安装Ollama 下载地址&#xff1a;OllamaGet up and r…...

[Linux][问题处理]修改密码报You must wait longer to change your password

一、问题描述 在Linux控制台中修改密码&#xff0c;键入旧密码&#xff0c;设置并确认新密码后&#xff0c;却提示You must wait longer to change your password&#xff08;您必须等待更长时间才能更改密码&#xff09; 二、原因 当前修改时间 < Minimum number of da…...

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-22- 操作鼠标拖拽 - 下篇(详细教程)

1.简介 上一篇中&#xff0c;宏哥说的宏哥在最后提到网站的反爬虫机制&#xff0c;那么宏哥在自己本地做一个网页&#xff0c;没有那个反爬虫的机制&#xff0c;谷歌浏览器是不是就可以验证成功了&#xff0c;宏哥就想验证一下自己想法&#xff0c;其次有人私信宏哥说是有那种…...

SpringBoot3使用Swagger3

版本 springboot3.4.2 JAVA 17 一、引入Swagger3依赖 <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.0.4</version> </dependency> 二、快速启…...

HCIA综合项目之多技术的综合应用实验

十五 HCIA综合实验 15.1 IP规划 #内网分配网段192.168.1.0 24#内网包括骨干链路和两个用户网段&#xff0c;素以需要划分三个&#xff0c;借两位就够用了192.168.1.0 26--骨干192.168.1.64 26---R1下网络192.168.1.128 26---R2下网络192.168.1.192 26--备用​192.168.1.64 26--…...

燕千云ITSM已支持DeepSeek对接!AI能力持续升级

春节期间&#xff0c;DeepSeek火爆全网&#xff0c;引发热议&#xff0c;作为国产AI大模型的黑马&#xff0c;DeepSeek凭借独特的训练方法、先进的模型架构和强大的联网推理能力&#xff0c;正不断拓展AI技术的应用边界。其“快思考”能力&#xff0c;可在极短时间内完成复杂决…...

Windows 自动主题:Windows AutoTheme

Windows 自动主题&#xff1a;Windows AutoTheme 链接&#xff1a;https://pan.xunlei.com/s/VOJ2ZG5t8QjL7_fGVIBgyxJQA1?pwdgbie# 自动切换&#xff1a;根据日出、日落时间自动切换 Windows 主题模式。高效轻量&#xff1a;使用 Rust 提供高效的系统调用&#xff0c;保证运…...

自定义Spring Cloud Gateway过滤器:记录慢请求

在构建微服务架构时&#xff0c;API网关是一个关键组件&#xff0c;它负责路由、负载均衡、安全验证等多种功能。Spring Cloud Gateway提供了强大的扩展能力&#xff0c;允许开发者通过自定义过滤器来增强其功能。本文将详细介绍如何实现一个自定义过滤器&#xff0c;用于记录响…...

python 浅拷贝和深拷贝

浅拷贝&#xff08;Shallow Copy&#xff09;语法示例代码 1示例代码 2 深拷贝&#xff08;Deep Copy&#xff09;语法示例代码 浅拷贝与深拷贝的区别示例&#xff1a;浅拷贝与深拷贝的对比 浅拷贝&#xff1a;只复制外层容器&#xff0c;内层嵌套对象仍然是共享的&#xff0c;…...

uni-app 学习(一)

一、环境搭建和运行 &#xff08;一&#xff09;创建项目 直接进行创建 &#xff08;二&#xff09;项目结构理解 pages 是页面 静态资源 打包文件&#xff0c;看我们想输出成什么格式 app.vue 页面的入口文件 main.js 是项目的入口文件 存放对打包文件的配置 pages 存放整…...

unity学习37:新版的动画器:动画状态机 Animator

目录 1 给游戏物体添加&#xff0c;新版的动画器 Animator 2 关于 Animator 3 创建 动画器的控制器 Animator Controller 4 打开动画编辑器 Animator 5 动画编辑器 还是Animation 5.1 创建新的动画 5.2 创建第2个动画 5.3 测试2个动画均可用 6 再次打开动画编辑器 A…...

FFmpeg+SDL实现简易视频播放器

参考链接 https://blog.csdn.net/qq_26611129/article/details/98732561 https://www.cnblogs.com/Azion/p/17756274.html https://avmedia.0voice.com/?id49050 https://blog.csdn.net/qq_44825209/article/details/133760652 https://www.cnblogs.com/Azion/p/17525955.htm…...

Vue3实现优雅的前端版本更新提示

背景 在前端项目开发中,当我们发布了新版本后,需要及时通知用户刷新页面以获取最新代码。本文将介绍一种优雅的实现方案。 实现原理 在项目根目录维护一个version.json文件,记录当前版本号前端定期请求version.json检查版本对比本地存储的版本号,如有更新则提示用户 核心代…...

vim常用快捷键

正常模式 在打开文件进入 Vim 后&#xff0c;默认处于正常模式&#xff0c;该模式下的快捷键主要用于光标移动、文本操作等。 光标移动 基本移动&#xff1a;h&#xff08;左移&#xff09;、j&#xff08;下移&#xff09;、k&#xff08;上移&#xff09;、l&#xff08;右移…...

P1226 【模板】快速幂

P1226 【模板】快速幂 题目描述 给你三个整数 a , b , p a,b,p a,b,p&#xff0c;求 a b m o d p a^b \bmod p abmodp。 输入格式 输入只有一行三个整数&#xff0c;分别代表 a , b , p a,b,p a,b,p。 输出格式 输出一行一个字符串 a^b mod ps&#xff0c;其中 a , b…...

【gRPC-gateway】是否有拦截器的情况添加健康检查的细节,与多路复用runtime.NewServeMux和gRPC区别讲解,与跨域功能,go案例

健康检查详解 什么是健康检查&#xff1f; 健康检查&#xff08;Health Checking&#xff09;是一种机制&#xff0c;用于监控服务的状态&#xff0c;确保服务在运行时是健康的、可用的。通过健康检查&#xff0c;系统可以自动检测服务是否正常工作&#xff0c;并在出现问题时…...

vue开发时,用localStorage常用方法及存储数组方法。

localStorage 可以让你在浏览器中存储键值对&#xff0c;并且在页面关闭后数据依然保留。localStorage 中存储的数据会一直保存在客户端&#xff0c;直到被手动删除或者清除浏览器缓存。 localStorage 中存储的数据在同一浏览器的不同窗口之间是共享的&#xff0c;而 sessionSt…...

HashMap详解+简单手写实现(哈希表)

1. 什么是 HashMap&#xff1f; HashMap是Java集合框架中的一种数据结构&#xff0c;它实现了Map接口&#xff0c;用于存储键值对&#xff08;Key-Value Pair&#xff09;。HashMap允许null键和null值&#xff0c;并且不保证元素的顺序。 --- 2. HashMap 的工作原理 2.1 内…...

解决Did not find dashscope_api_key问题——jupyter设置环境变量

jupyter中使用通义千文langchain 报错 Value error, Did not find dashscope_api_key, please add an environment variable DASHSCOPE_API_KEY which contains it, or pass dashscope_api_key as a named parameter.我本来以为这样就是已经加上了&#xff1a; #导入相关包 i…...

尚硅谷爬虫note003

一、函数 1. 函数的定义 def 函数名&#xff08;&#xff09;&#xff1a; 代码 2.函数的调用 函数名&#xff08;&#xff09; 3. 定义参数&#xff08;不调用函数不执行&#xff09; def sum&#xff08;a&#xff0c;b&#xff09; #形参 c a b print&#xff08;c&…...