ESP32聊天助手——文心一言

🔥前言

随着人工智能技术的不断发展,自然语言处理领域也得到了广泛的关注和应用。在这个领域中,文心一言作为一款强大的自然语言处理工具,具有许多重要的应用价值。本文将重点介绍如何通过ESP32接入国产大模型之文心一言api,以及其中的重点词汇或短语。

了解文心一言

文心一言是百度打造出来的人工智能大语言模型,具备跨模态、跨语言的深度语义理解与生成能力,文心一言有五大能力,文学创作、商业文案创作、数理逻辑推算、中文理解、多模态生成,其在搜索问答、内容创作生成、智能办公等众多领域都有更广阔的想象空间。文心一言企业服务由千帆大模型平台提供,包括推理服务及大模型微调等一系列开发和应用工具链。文心一言大模型现已升级至4.0,企业客户可通过百度智能云千帆大模型平台申请接入。

接入文心一言

API 列表
百度智能云千帆平台提供了丰富的API,保留对话Chat、续写Completions、向量Embeddings、插件应用、Prompt工程、大模型训练、管理及服务等API能力,详情请查看API列表

  1. 大模型相关
  • 对话Chat:支持创建chat,用于发起一次对话。
  • 续写Completions:支持创建completion,用于发起一次续写请求,不支持多轮会话等。
  • 向量Embeddings:支持Embeddings,用于根据输入内容生成对应的向量表示。
  • 自定义模型导入:支持HuggingFace Transformer架构的自定义模型导入,提供自定义模型导入相关API能力。
  • 图像Images:提供图像相关API能力。
  1. 插件应用:提供域内知识搜索增强插件API相关能力。
  2. Prompt工程:提供模版相关API能力。
  3. 大模型训练:提供创建训练任务、任务运行、停止任务运行及获取任务运行详情等API能力。
  4. 大模型管理:提供获取模型、模型版本详情及将训练任务发布为模型等API能力。
  5. 大模型服务:提供创建服务、获取服务详情等API能力。

🔥API 调用流程简介

API 的调用流程如下图所示。

API调用流程

  1. 创建一个千帆应用。根据实际需求创建千帆应用,创建成功后,获取AppID、API Key、Secret Key 等信息。
  2. API 授权。对应用的 AppID 进行授权。
  3. 获取接口访问凭证 access_token 。根据第1步获取的 API Key 和 Secret Key ,调用获取access_token接口获取 access_token ,通过 access_token 鉴权调用者身份。
  4. 调用API接口。例如调用ERNIE-Bot相关接口,详见API列表

🔥API 调用流程

步骤一. 创建千帆应用

(1)登录百度智能云千帆控制台。

请您注册并登录百度智能云千帆控制台

千帆控制台

注意:为保障服务稳定运行,账户最好不处于欠费状态。

(2)创建千帆应用

进入控制台创建应用

创建千帆应用

(3)创建应用后,获取AppID、API Key、Secret Key。

获取key

步骤二. 调用API接口

调用千帆提供的相关接口,如ERNIE-Bot等,详见API列表

  1. ERNIE-Bot
    我们选择ERNIE-Bot:ERNIE-Bot是百度自行研发的大语言模型,覆盖海量中文数据,具有更强的对话问答、内容创作生成等能力。

创建chat

  1. 在线调试
    百度智能云千帆提供了 API在线调试平台-示例代码,用于帮助开发者调试接口,平台集成快速检索、查看开发文档、查看在线调用的请求内容和返回结果、复制和下载示例代码等功能,简单易用,更多内容请查看API在线调试介绍。

进入示例代码
3. 获取AccessToken
应用列表选择自己创建的《ESP32语音聊天助手》,采用C#示例代码,
获取AccessToken

然后点击调试,复制获取的AccessToken

获取AccessToken
1处粘贴上面的AccessToken,在2处中括号中输入

“role”:“user”,“content”:“介绍一下你自己”

调试
调试结果如下

调试结果
查看代码需要三部分,地址、请求头、body
查看代码

"https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=xxxxx"
"Content-Type", "application/json"
"{""messages"":[{""role"":""user"",""content"":""介绍一下你自己""},{""role"":""assistant"",""content"":""您好,我是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。""}],""disable_search"":false,""enable_citation"":false}"

🔥核心代码

ESP32 Arduino代码如下

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

// 1. Replace with your network credentials
const char* ssid = "wifi名称";
const char* password = "wifi密码";

String inputText = "你好,文心一言";
// 2. Replace with your access_token
String apiUrl = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=xxxxxxxxx";

String answer;
String getGPTAnswer(String inputText) {
    HTTPClient http;
    http.begin(apiUrl);
    http.setTimeout(30000);     //超过时间,回答超时(ms)
    http.addHeader("Content-Type", "application/json");
    // http.addHeader("access_token", String(access_token));
    String payload = "{\"messages\":[{\"role\": \"user\",\"content\": \"" + inputText + "\"}],\"disable_search\": false,\"enable_citation\": false}";
    int httpResponseCode = http.POST(payload);
    if (httpResponseCode == 200) {
    String response = http.getString();
    http.end();
    Serial.println(response);

    // Parse JSON response
    DynamicJsonDocument jsonDoc(1024);
    deserializeJson(jsonDoc, response);
    String outputText = jsonDoc["result"];
    return outputText;
    // Serial.println(outputText);
    } else {
    http.end();
    Serial.printf("Error %i \n", httpResponseCode);
    return "<error>";
    }
}

void setup() {
    // Initialize Serial
    Serial.begin(115200);

    // Connect to Wi-Fi network
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    Serial.print("Connecting to WiFi ..");
    while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
    }
    Serial.println(WiFi.localIP());
    answer = getGPTAnswer(inputText);
    Serial.println("Answer: " + answer);
    Serial.println("Enter a prompt:");

}

void loop() {
    // do nothing
    if (Serial.available()) {
    inputText = Serial.readStringUntil('\n');
    // inputText.trim();
    Serial.println("\n Input:"+inputText);

    answer = getGPTAnswer(inputText);
    Serial.println("Answer: " + answer);
    Serial.println("Enter a prompt:");
    }
    // delay(2);
}

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

  1. 导入必要的库:
#include <WiFi.h>   //用于处理Wi-Fi连接功能。
#include <HTTPClient.h>     //用于发送HTTP请求。
#include <ArduinoJson.h>    //用于解析从服务器返回的JSON格式数据。
  1. 第一处修改定义Wi-Fi网络凭证:
const char* ssid = "wifi名称";  //Wi-Fi网络名。
const char* password = "wifi密码";  //Wi-Fi网络密码。
  1. 第二处修改定义要调用的API地址,只要在access_token部分换上之前拿到的即可:
String apiUrl = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=xxxxxxxxx";
  1. 定义输入文本和函数 getGPTAnswer(String inputText):
  • 输入文本是固定的问候语”你好,文心一言”,在实际应用中可以根据需要修改。
  • 函数 getGPTAnswer() 负责执行以下操作:
    初始化HTTPClient对象并设置目标URL。设置Content-Type头信息,构造请求体payload,将用户输入的内容添加到JSON结构中。发送POST请求并检查HTTP响应码。如果响应码为200,则读取并解析返回的JSON数据,提取出结果字段作为回答。若非200,则返回错误字符串。
  1. setup() 函数:
  • 初始化串口通信, 连接到指定的Wi-Fi网络。
  • 连接成功后,获取一个初始的回答并打印出来,然后提示用户输入新的问题。
  1. loop() 函数:
  • 检查串口是否有可用的数据输入。
  • 如果有新输入,读取一行内容,调用 getGPTAnswer() 函数获取AI回答,并将对话过程输出到串口。

注意:虽然代码中有OpenAI API相关注释,但实际上该代码是针对百度文心一言API编写的。如果你想要与OpenAI API交互,你需要使用OpenAI提供的API URL、access token及相应的JSON结构进行请求。

🔥测试结果

打开串口监视器,注意右下角选择换行符,选择115200波特率,输入你想问的问题,他就可以回答你,这里让它编写了一个python的flask服务,他也能顺利实现,其他简单的问题也没什么问题。

测试对话

测试对话

报错

如果返回error ,可以对照列表查询错误代码,结合提示排查解决。
我遇到过-11,就添加了http.setTimeout(30000)以允许30s的响应时间,使得模型可以有时间输出回答。

错误 错误码 错误 错误码
HTTPC_ERROR_CONNECTION_FAILED -1 HTTPC_ERROR_NO_HTTP_SERVER -7
HTTPC_ERROR_SEND_HEADER_FAILED -2 HTTPC_ERROR_TOO_LESS_RAM -8
HTTPC_ERROR_SEND_PAYLOAD_FAILED -3 HTTPC_ERROR_ENCODING -9
HTTPC_ERROR_NOT_CONNECTED -4 HTTPC_ERROR_STREAM_WRITE -10
HTTPC_ERROR_CONNECTION_LOST -5 HTTPC_ERROR_READ_TIMEOUT -11
HTTPC_ERROR_NO_STREAM -6
  • Copyrights © 2023-2025 LegendLeo Chen
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信