用C++调用DeepSeek API?保姆级教程来了(附完整代码)
在AI大模型API调用的主流示例中,curl、Python、Node.js是最常见的三种方式。但对于习惯用C++开发的同学来说,如何快速对接大模型API呢?
用C++调用DeepSeek API?保姆级教程来了(附完整代码)
在AI大模型API调用的主流示例中,curl、Python、Node.js是最常见的三种方式。但对于习惯用C++开发的同学来说,如何快速对接大模型API呢?
今天就以DeepSeek API为例,完整走一遍C++调用大模型的全过程——从核心接口认知,到依赖环境搭建,再到完整代码实现与运行!
一、先明确核心前提:3个必备信息
无论用哪种语言调用DeepSeek API,首先要确认3个关键信息,这是对接成功的基础:
-
api_key:需到DeepSeek官网注册账号后获取,是身份认证的核心凭证;
-
base_url:访问大模型的基础URL地址,DeepSeek默认是
https://api.deepseek.com; -
model:要调用的模型类型,比如对话模型
deepseek-chat。
先放一张DeepSeek官网文档的示例截图,大家可以清晰看到官方支持的三种调用方式:

二、前置知识:OpenAI接口核心逻辑
DeepSeek API兼容OpenAI协议,所以先搞懂OpenAI接口的核心设计,后续C++实现会更顺畅。OpenAI API基于HTTP/HTTPS协议,核心逻辑可总结为“身份认证+接口参数”两部分。
2.1 身份认证:两种方式,推荐前者
所有请求必须携带api_key验证身份,两种传递方式对比:
-
推荐方式:通过HTTP请求头传递,格式为
Authorization: Bearer <你的API Key>,安全性更高; -
备选方式:在请求参数中直接传递api_key,不推荐!容易导致密钥泄露。
2.2 核心接口详解(重点看这3个)
日常开发中最常用的是对话接口、嵌入接口和函数调用接口,下面逐一说明关键参数(必选参数标红):
2.2.1 对话接口(核心!最常用)
用于和大模型进行多轮对话,核心是构造符合格式的JSON请求参数,具体说明如下:
| 参数名 | 参数类型 | 是否必选 | 简介 |
|---|---|---|---|
| model | string | 是 | 模型名称,如 deepseek-chat |
| messages | list[dict] | 是 | 对话历史,每个dict包含 role(角色)和 content(内容) |
| role | string | 否 | 可选值:system(系统指令)、user(用户)、assistant(助手)、function(函数) |
| temperature | float | 否 | 随机性,0~2,0最确定,2最随机(默认1) |
| max_tokens | int | 否 | 生成的最大tokens数(模型总tokens有限,如GPT-3.5上限4096) |
| top_p | float | 否 | 核采样,0~1,替代temperature的随机性控制(二选一即可) |
| stream | bool | 否 | 是否流式返回(实时输出,而非一次性返回) |
| tools | list[dict] | 否 | 函数调用配置,定义模型可调用的工具/函数 |
| response_format | dict | 否 | 指定响应格式,如 {"type": "json_object"}(强制JSON输出) |
| 响应方式由 stream 参数决定: |
-
非流式响应:返回完整JSON,包含核心对话内容;
-
流式响应:返回SSE(Server-Sent Events)流,逐段输出(适合实时对话场景)。
2.2.2 嵌入接口(Embeddings)
用于将文本转换为向量(Embedding),适用于文本检索、相似度计算等场景,核心参数如下:
| 参数名 | 参数类型 | 是否必选 | 简介 |
|---|---|---|---|
| model | string | 是 | 模型名称,如 deepseek-embed |
| input | string/list | 是 | 待嵌入的文本(单文本或文本列表) |
| encoding_format | string | 否 | 输出格式:float(默认)、base64 |
2.2.3 函数调用接口
属于对话接口的扩展,通过 tools 参数定义函数,让模型自主判断是否需要调用工具(比如查天气、调用数据库)。举个获取城市天气的示例:
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "北京今天气温多少?"}],
tools=[ // 定义可调用的函数
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的实时气温",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名"}
},
"required": ["city"]
}
}
}
],
tool_choice="auto" // 让模型自动决定是否调用函数
}
三、C++实现步骤:环境搭建+完整代码
接下来进入核心环节,用C++实现DeepSeek API的调用。我们需要两个核心依赖:处理HTTP请求的 libcurl 和处理JSON的 nlohmann-json。
3.1 依赖环境安装(Ubuntu系统)
直接执行以下两条命令即可完成安装:
sudo apt install nlohmann-json3-dev # 安装JSON处理库
sudo apt install libcurl4-openssl-dev # 安装HTTP请求库
3.2 完整实现代码
下面是完整的C++代码,实现了“持续对话”功能,包含类封装、请求构造、响应解析等逻辑,关键步骤已加注释:
#include <iostream>
#include <string>
#include <vector>
#include <nlohmann/json.hpp>
#include <curl/curl.h>
using json = nlohmann::json;
// 回调函数:接收HTTP响应数据
static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
((std::string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
}
// OpenAI客户端类封装
class OpenAIClient {
private:
std::string api_key; // 核心密钥
std::string base_url; // 基础URL
CURL* curl; // curl句柄
public:
// 构造函数:初始化密钥、URL和curl
OpenAIClient(const std::string& api_key, const std::string& base_url = "https://api.deepseek.com")
: api_key(api_key), base_url(base_url) {
curl = curl_easy_init();
if (!curl) {
throw std::runtime_error("Failed to initialize curl");
}
}
// 析构函数:释放资源
~OpenAIClient() {
if (curl) {
curl_easy_cleanup(curl);
}
curl_global_cleanup();
}
// 核心方法:发送对话请求并获取响应
// 参数:model-模型名;messages-对话历史(角色+内容)
std::string chat_completion(const std::string& model, const std::vector<std::pair<std::string, std::string>>& messages) {
if (!curl) {
throw std::runtime_error("Curl not initialized");
}
// 1. 构造JSON请求体
json request_data;
request_data["model"] = model; // 指定模型
// 构造对话历史数组
json messages_json = json::array();
for (const auto& msg : messages) {
json msg_obj;
msg_obj["role"] = msg.first; // 角色(system/user/assistant)
msg_obj["content"] = msg.second; // 内容
messages_json.push_back(msg_obj);
}
request_data["messages"] = messages_json;
request_data["temperature"] = 0.7; // 中等随机性
request_data["max_tokens"] = 1000; // 最大生成 tokens 数
std::string request_body = request_data.dump(); // JSON转字符串
std::string response_string; // 存储响应数据
// 2. 设置curl选项
curl_easy_setopt(curl, CURLOPT_URL, (base_url + "/v1/chat/completions").c_str()); // 完整请求URL
curl_easy_setopt(curl, CURLOPT_POST, 1L); // POST请求
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request_body.c_str()); // 请求体
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, request_body.length()); // 请求体长度
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); // 响应回调函数
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_string); // 响应数据存储地址
// 3. 设置请求头(身份认证+JSON格式)
struct curl_slist* headers = NULL;
headers = curl_slist_append(headers, "Content-Type: application/json");
headers = curl_slist_append(headers, ("Authorization: Bearer " + api_key).c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
// 4. 执行请求
CURLcode res = curl_easy_perform(curl);
curl_slist_free_all(headers); // 释放请求头资源
// 错误处理
if (res != CURLE_OK) {
throw std::runtime_error(std::string("curl_easy_perform() failed: ") + curl_easy_strerror(res));
}
// 5. 解析响应JSON
json response_data = json::parse(response_string);
if (response_data.contains("error")) {
throw std::runtime_error("API Error: " + response_data["error"]["message"].get<std::string>());
}
// 返回核心对话内容
return response_data["choices"][0]["message"]["content"].get<std::string>();
}
};
// 主函数:测试持续对话
int main() {
try {
// 初始化curl全局环境
curl_global_init(CURL_GLOBAL_DEFAULT);
// 替换为你的DeepSeek API密钥(官网注册获取)
std::string api_key = "填写你的API密钥(官网注册账号获取)";
OpenAIClient client(api_key);
// 定义模型和初始系统指令
std::string model = "deepseek-chat";
std::vector<std::pair<std::string, std::string>> messages = {
{"system", "You are a helpful assistant."}
};
// 打印欢迎信息
std::cout << "========================================" << std::endl;
std::cout << "DeepSeek AI 对话系统(C++版)" << std::endl;
std::cout << "输入 'exit' 或 'quit' 结束对话" << std::endl;
std::cout << "========================================" << std::endl;
// 持续对话循环
while (true) {
// 获取用户输入
std::string user_input;
std::cout << "\n用户: ";
std::getline(std::cin, user_input);
// 退出条件判断
if (user_input == "exit" || user_input == "quit") {
std::cout << "\n感谢使用,对话结束!" << std::endl;
break;
}
// 添加用户消息到对话历史
messages.emplace_back("user", user_input);
try {
// 调用API获取响应
std::string response = client.chat_completion(model, messages);
// 打印响应内容
std::cout << "\nDeepSeek: " << std::endl;
std::cout << response << std::endl;
// 添加模型响应到对话历史(支持多轮对话)
messages.emplace_back("assistant", response);
} catch (const std::exception& e) {
// 异常处理:打印错误信息并回滚对话历史
std::cerr << "\n错误: " << e.what() << std::endl;
messages.pop_back(); // 移除失败的用户消息
std::cout << "请重试或输入 'exit' 结束对话" << std::endl;
}
}
} catch (const std::exception& e) {
// 全局异常处理
std::cerr << "程序错误: " << e.what() << std::endl;
return 1;
}
return 0;
}
3.3 代码编译与运行
将代码保存为 deepseek_chat.cpp,然后执行以下编译命令(需链接curl库):
g++ deepseek_chat.cpp -o deepseek_chat -lcurl -std=c++11
编译成功后,运行生成的可执行文件:
./deepseek_chat
四、运行效果演示
运行程序后,输入问题即可和DeepSeek进行对话,输入 exit 或 quit 可结束对话。实际运行效果如下:

五、小结与拓展
“C++通过OpenAI协议调用DeepSeek API”,本质是封装HTTPS请求+JSON数据交互:
-
依赖:libcurl(处理HTTP请求)+ nlohmann-json(处理JSON序列化/反序列化);
-
步骤:构造符合协议的JSON请求体 → 设置HTTP请求头(携带api_key) → 执行请求 → 解析JSON响应。
拓展方向:
-
实现流式响应(设置stream=true),适配实时对话场景;
-
集成函数调用,让大模型能调用本地工具/接口;
-
替换为其他兼容OpenAI协议的模型(如GPT、通义千问等),只需修改base_url和model、apikey参数。
我是小C 欢迎大家讨论交流~ 觉得有用的话,记得点赞+在看+转发哦!
更多推荐



所有评论(0)