基于QT和C++的豆包AI接入
豆包大模型api_key和模型申请
接入豆包大模型前要进行一系列申请
-
进入火山大模型官网
官网链接. -
进入开通管理,选择一个大模型进行开通
-
创建 API Key
管理,点击【创建 API Key】,填写名称后创建 API Key 备用。
-
创建接入点
官方示例
curl --location 'https://ark.cn-beijing.volces.com/api/v3/chat/completions' \
--header 'Authorization: Bearer $ARK_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "ep-20250106165900-qj2w8",
"messages": [
{"role": "user", "content": [
{
"type":"text",
"text": "这是哪里"
},
{
"type": "image_url",
"image_url": {
"url": "https://ark-project.tos-cn-beijing.ivolces.com/images/view.jpeg"
}
}
]}
]
}'
由官方示例,可以得到官方的接口地址
https://ark.cn-beijing.volces.com/api/v3/chat/completions
结合上文3、4步中的api_key和接入点id我们就可以调用模型了。
QT代码
创建用以调用大模型的类
//头文件
#ifndef DOUBAOAPI_H
#define DOUBAOAPI_H
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QSslConfiguration>
#include <QString>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QEventLoop>
class DoubaoAI : public QObject
{
Q_OBJECT
public:
DoubaoAI();
QString DoubaoAI_request(QString& question);
private:
QString OPENAI_BASE_URL = "https://ark.cn-beijing.volces.com/api/v3/chat/completions";
QString OPENAI_API_KEY = "设置为前面申请的api_key";
QString OPENAI_MODEL = "设置为前面申请的模型id";
};
#endif // DOUBAOAPI_H
实现调用大模型的类
对大模型的提问只需将官方示例里面的text
内容进行修改即可
#include "DoubaoApi.h"
DoubaoAI::DoubaoAI() {}
QString DoubaoAI::DoubaoAI_request(QString& question)
{
QNetworkRequest request;
QNetworkAccessManager manager;
request.setUrl(QUrl(OPENAI_BASE_URL));
//头部信息设置
QString token = "Bearer " + OPENAI_API_KEY;
request.setRawHeader("Authorization", token.toUtf8());
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
//post附加信息,用json格式构建官方示例里面的请求体内容
QJsonArray context;
QJsonObject textobj;
textobj["type"] = "text";
textobj["text"] = question;
context.append(textobj);
QJsonArray messagesarray;
QJsonObject messageobj;
messageobj["role"] = "user";
messageobj["content"] = context;
messagesarray.append(messageobj);
QJsonObject data;
data["model"] = OPENAI_MODEL;
data["messages"] = messagesarray;
QJsonDocument doc(data);
QByteArray postData = doc.toJson();
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setProtocol(QSsl::AnyProtocol);
config.setPeerVerifyMode(QSslSocket::VerifyNone);
request.setSslConfiguration(config);
//发送post请求
QNetworkReply *reply = manager.post(request, postData);
//循环等待服务器返回数据
QEventLoop waitserver;
connect(reply, &QNetworkReply::finished, &waitserver, &QEventLoop::quit);
waitserver.exec();
if(reply != nullptr && reply->error() == QNetworkReply::NoError){
//得到返回的数据
QByteArray reply_data = reply->readAll();
//对返回的json数据进行解析
QJsonObject obj = QJsonDocument::fromJson(reply_data).object();
//qDebug() << "Response:" << obj;
QJsonArray choicesarray = obj.value("choices").toArray();
if (!choicesarray.isEmpty()){
QJsonObject choiceobj = choicesarray[0].toObject();
if (choiceobj.contains("message") && choiceobj["message"].isObject()) {
QJsonObject messageobj = choiceobj["message"].toObject();
if (messageobj.contains("content") && messageobj["content"].isString()) {
//qDebug() << "Content:" << context;
return messageobj["content"].toString();
}
}
}
} else {
qDebug() << "https request error:" << reply->errorString();
}
}
其中,返回的数据格式为
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"logprobs": null,
"message": {
"content": "我是豆包呀,是由字节跳动独立开发和训练的人工智能呀。",
"role": "assistant"
}
}
],
"created": 1736322123,
"id": "021736322110211c5cb3f1ae218438d046d2571270e500347cb8c",
"model": "doubao-vision-pro-32k-241028",
"object": "chat.completion",
"usage": {
"completion_tokens": 531,
"prompt_tokens": 11,
"prompt_tokens_details": {
"cached_tokens": 0
},
"total_tokens": 542
}
}
我们只需要解析出content
内容即可。
运行结果与说明
这里只简单的使用了豆包模型中的文本推理功能,后续可加入图片识别等功能,只需修改post请求体即可。