在AI大模型API调用的主流示例中,curl、Python、Node.js是最常见的三种方式。但对于习惯用C++开发的同学来说,如何快速对接大模型API呢?
今天就以DeepSeek API为例,完整走一遍C++调用大模型的全过程——从核心接口认知,到依赖环境搭建,再到完整代码实现与运行!
无论用哪种语言调用DeepSeek API,首先要确认3个关键信息,这是对接成功的基础:
- api_key:需到DeepSeek官网注册账号后获取,是身份认证的核心凭证;
- base_url:访问大模型的基础URL地址,DeepSeek默认是
https://api.deepseek.com;
- model:要调用的模型类型,比如对话模型
deepseek-chat。
先放一张DeepSeek官网文档的示例截图,大家可以清晰看到官方支持的三种调用方式:
DeepSeek API兼容OpenAI协议,所以先搞懂OpenAI接口的核心设计,后续C++实现会更顺畅。OpenAI API基于HTTP/HTTPS协议,核心逻辑可总结为“身份认证+接口参数”两部分。
所有请求必须携带api_key验证身份,两种传递方式对比:
- 推荐方式:通过HTTP请求头传递,格式为
Authorization: Bearer <你的api key="">你的api>,安全性更高;
- 备选方式:在请求参数中直接传递api_key,不推荐!容易导致密钥泄露。
日常开发中最常用的是对话接口、嵌入接口和函数调用接口,下面逐一说明关键参数(必选参数标红):
用于和大模型进行多轮对话,核心是构造符合格式的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)流,逐段输出(适合实时对话场景)。
用于将文本转换为向量(Embedding),适用于文本检索、相似度计算等场景,核心参数如下:
| 参数名 | 参数类型 | 是否必选 | 简介 |
|---|---|---|---|
| model | string | 是 | 模型名称,如 deepseek-embed |
| input | string/list | 是 | 待嵌入的文本(单文本或文本列表) |
| encodingformat | string | 否 | 输出格式:float(默认)、base64 |
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++实现DeepSeek API的调用。我们需要两个核心依赖:处理HTTP请求的 libcurl 和处理JSON的 nlohmann-json。
直接执行以下两条命令即可完成安装:
sudo apt install nlohmann-json3-dev # 安装JSON处理库 sudo apt install libcurl4-openssl-dev # 安装HTTP请求库
下面是完整的C++代码,实现了“持续对话”功能,包含类封装、请求构造、响应解析等逻辑,关键步骤已加注释:
#include
#include
#include
#include
#include
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
>& 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
()); } // 返回核心对话内容 return response_data["choices"][0]["message"]["content"].get
(); }
};
// 主函数:测试持续对话 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
> 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;
}
将代码保存为 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 欢迎大家讨论交流~ 觉得有用的话,记得点赞+在看+转发哦!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/223307.html