用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进行对话,输入 exitquit 可结束对话。实际运行效果如下:

五、小结与拓展

“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 欢迎大家讨论交流~ 觉得有用的话,记得点赞+在看+转发哦!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐