ESPWiFi模块接入Deepseek大模型,实现AI女友的第一步
首先,接入Deepseek不是把整个大模型塞进开发板里,而是通过接入官方的API来实现对话,当然如果你有钱的话,可以自己搭建一个服务器把大模型塞进去,这样这个大模型就只有你能用,而且还是最强状态,但是如果纯粹为了搞一个玩一玩那就没必要搞这么麻烦。
一、前言
首先,接入Deepseek不是把整个大模型塞进开发板里,而是通过接入官方的API来实现对话,当然如果你有钱的话,可以自己搭建一个服务器把大模型塞进去,这样这个大模型就只有你能用,而且还是最强状态,但是如果纯粹为了搞一个玩一玩那就没必要搞这么麻烦。
我在网上翻了很多,发现大多数都是通过直接刷固件,通过小智 AI 聊天机器人 (xiaozhi.me)来DIY,但是很多人只是刷个乐子,不知道是什么原理,而且这个固件只支持ESP32-S3等等,整个开发板都要好多钱,那对于手里只有ESP8266的穷哥们自然不会去选择,所以我今天研究了一下午,终于搞定了用ESP8266接入AI大模型。
二、搞定API接口
我们是通过API来实现对话的,目前想接入Deepseek有两种方法。
1、Deepseek官网
去Deepseek开放平台DeepSeek 开放平台,注册登录来到首页。
然后点击接口文档,里面有Deepseek文本访问的格式
但是官网的Deepseek容易繁忙,很大概率不会回复信息,我刚开始测试的时候就以为是我的代码有问题,后面才知道是Deepseek服务器的问题,还有一点,官网访问要花钱,所以这并不适合我们穷哥们,反而更适合开服务器自己部署,这样就不会繁忙。
2、硅基流动官网
硅基流动SiliconCloud (siliconflow.cn)是大模型平台,里面有很多大模型,包括Qwen、Deepseek等等。
我们也是找到官网注册登录,来到首页。
可以看到首页里模型很多,目前只有两个模型不付费,就是Deepseek1.5B和7B,都是蒸馏模型,但是对于我们来玩一玩已经足够了。
然后点击左边的API密钥,来到密钥界面,创建一个新密钥,名字备注什么的随便,然后就会看到页面多了一个密钥,这个密钥我们等等要用。
三、代码实例
接下来来到我们最友好的ESP开发平台Arduino,当然Arduino可能有的人也不会,这里有安装教程Arduino环境安装ESP32(详细教程)_arduino esp32-CSDN博客,里面讲了如何配置ESP环境,配置好ESP开发环境之后,我们就要安装库了,首先就是ESP8266的库,版本也要是最近的新版,不然代码会报错,我这里放一下我库的版本。
ESP8266 Core: 2.7.4
ArduinoJson: 6.21.3
ESP8266的库在工具-->开发板-->开发板管理器里面。
其他的库在项目-->加载库里面。
其他的开发板配置如下
(要是有问题可以在评论区留言,我看到都会回复一下)
都安装完成后,就可以开发代码了,我这里不多讲,直接放代码
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#include <ArduinoJson.h>
// 配置参数
const char* ssid = "你的WiFi名称(最好是英文)";
const char* password = "你的WiFi密码";
const char* apiKey = "你所创建的密钥"; // 替换为真实API密钥
const char* apiEndpoint = "https://api.siliconflow.cn/v1/chat/completions";
BearSSL::WiFiClientSecure client;
HTTPClient http;
void setup() {
Serial.begin(115200);
connectToWiFi();
// 配置SSL(开发阶段可跳过验证)
client.setInsecure();
}
void loop() {
if (Serial.available()) {
String input = Serial.readStringUntil('\n');
input.trim();
input.replace(",", ","); // 替换中文逗号为英文
if (input.length() > 0) {
processRequest(input);
}
}
}
void connectToWiFi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected!");
}
void processRequest(const String& question) {
// 构建完整的请求体
DynamicJsonDocument doc(2048);
doc["model"] = "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B";
doc["stream"] = false;
doc["max_tokens"] = 512;
doc["stop"] = nullptr; // JSON null
doc["temperature"] = 0.7;
doc["top_p"] = 0.7;
doc["top_k"] = 50;
doc["frequency_penalty"] = 0.5;
doc["n"] = 1;
// 添加response_format
JsonObject response_format = doc.createNestedObject("response_format");
response_format["type"] = "text";
// 添加messages
JsonArray messages = doc.createNestedArray("messages");
JsonObject message = messages.createNestedObject();
message["role"] = "user";
message["content"] = question;
// // 添加tools(示例结构)
// JsonArray tools = doc.createNestedArray("tools");
// JsonObject tool1 = tools.createNestedObject();
// tool1["type"] = "function";
// JsonObject function = tool1.createNestedObject("function");
// function["description"] = "sample function";
// function["name"] = "demo_function";
// function["strict"] = false;
// function.createNestedObject("parameters"); // 空对象
// 序列化请求体
String requestBody;
serializeJson(doc, requestBody);
// 打印调试信息
Serial.println("Request Body:");
serializeJsonPretty(doc, Serial);
Serial.println("\n");
if (http.begin(client, apiEndpoint)) {
http.addHeader("Content-Type", "application/json");
http.addHeader("Authorization", String("Bearer ") + apiKey);
int httpCode = http.POST(requestBody);
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
Serial.println("Raw Response:");
Serial.println(payload);
// 解析响应
DynamicJsonDocument resDoc(4096); // 增大缓冲区
DeserializationError error = deserializeJson(resDoc, payload);
if (!error) {
if (resDoc.containsKey("choices")) {
String content = resDoc["choices"][0]["message"]["content"];
Serial.println("\nResponse Content:");
Serial.println(content);
} else if (resDoc.containsKey("error")) {
Serial.println("API Error: " + resDoc["error"]["message"].as<String>());
}
} else {
Serial.println("JSON Parse Error: " + String(error.c_str()));
}
} else {
Serial.println("HTTP Error Code: " + String(httpCode));
Serial.println("Response: " + http.getString());
}
http.end();
} else {
Serial.println("Connection Failed");
}
}
我用的是免费的7B版本,里面的model参数就是所调用大模型的名字,要是想换成其他的可以直接去官网找到自己喜欢的大模型然后复制名字换掉就好了,这个提问结构都是通用的,我们也可以从首页随便选一个模型进去,点击API文档。
四、实验现象
下载完程序,打开串口监视器,等待WiFi连接成功就可以输入内容提问了,切记Arduino里面只能用纯小写英文!!!,用其他汉字、符号、大写英文都会报错,这是Arduino的问题。
然后我们去其他第三方软件试一试,这里用正点原子的XCOM试一试,可以看到没有问题,但是输入中文和符号也会乱码
我们再去一个支持中文的第三方工具试一试,可以看到该程序是支持中文输入的
五、写在最后
这只是接入AI大模型的第一步,同时这一步也是蛮重要的,我们既然能同AI对话,是不是也可以加个语言模块把文本转成音频呢,或者加个屏幕让AI显示出来,再配置一个音色是不是就是网上爆火的小智呢,后面不管怎么改,第一步永远是最重要的,我们写程序第一是模仿,后面当我们熟悉了之后,就要深挖背后的原理,不然学到最后也只懂一些表面的东西,正是因为一个个前辈去研究才能创造出给人带来快乐的程序,谁说程序员不懂浪漫的。
贴一句Deepseek的话:你们是数字时代的建筑师,用逻辑编织未来,用代码书写奇迹。每一次深夜的调试、每一行优雅的算法,都在为世界注入新的可能。Bug或许会暂时绊住脚步,但你们总能以耐心与智慧将其化为前进的阶梯。愿你们在键盘的敲击声中听见梦想的回响,在代码的海洋里找到纯粹的快乐。别忘了,偶尔抬头看看窗外的星光——你们的创造力,本就是照亮世界的星辰。Keep coding, keep creating! ✨
更多推荐
所有评论(0)