如何让C++与神经网络友好相处:编写ChatGPT API客户端

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么C++和ChatGPT不是奇怪组合,而是强大力量

\n\n

当谈到神经网络集成时,不知为何大家总是首先想到Python。是的,Python开发者拥有像openai和requests这样优雅的库。但如果您的项目是一个高负载的C++服务器、桌面应用程序或游戏引擎,该怎么办?难道要全部用Python重写吗?

\n\n

好消息是:在C++中集成ChatGPT API并非魔法,而是一个完全可以解决的工程问题。您将获得原生代码的速度、对内存的控制,以及将AI功能直接嵌入应用程序核心的能力。无需Python或Node.js中间层——只有纯C++和与API的直接交互。

\n\n

在本文中,我们将从头开始讲解如何编写一个用于OpenAI API的C++客户端。您将学习如何发送HTTP请求、处理JSON以及从ChatGPT获取响应。让我们开始吧!

\n\n

我们需要什么:工具集

\n\n

为了在C++中使用ChatGPT API,我们需要解决两个基本任务:

\n\n
    \n
  • 发送HTTP请求(最好支持HTTPS)
  • \n
  • 解析和生成JSON
  • \n
\n\n

我们将使用两个经过验证的库:

\n\n
    \n
  • libcurl — C/C++中HTTP的事实标准。在任何包管理器中都能找到。
  • \n
  • nlohmann/json — 一个现代、便捷的JSON库。只需包含头文件即可。
  • \n
\n\n

我们还需要一个来自OpenAI的API密钥。如果您还没有,请访问platform.openai.com,注册并在API keys部分创建一个密钥。请安全保管,最好存储在环境变量中。

\n\n

简单客户端的架构

\n\n

我们的客户端将做一件事:将用户的消息发送给ChatGPT并获取回复。所有与API的通信都通过POST方法访问端点https://api.openai.com/v1/chat/completions。

\n\n

结构如下:

\n\n
    \n
  1. 构建包含请求参数(模型、消息、温度)的JSON
  2. \n
  3. 通过libcurl发送POST请求
  4. \n
  5. 获取JSON响应并解析
  6. \n
  7. 提取助手的回复文本
  8. \n
\n\n

听起来很简单?让我们开始编写代码。

\n\n

步骤1:准备JSON请求

\n\n

我们从构建请求体的函数开始。我们将使用nlohmann/json库。安装非常简单:从GitHub下载json.hpp并将其放在项目文件夹中。

\n\n
#include <string>\n#include "json.hpp"\n\nusing json = nlohmann::json;\n\nstd::string build_chat_request(const std::string& user_message) {\n    json request;\n    request["model"] = "gpt-3.5-turbo";\n\n    json messages = json::array();\n    json user_msg;\n    user_msg["role"] = "user";\n    user_msg["content"] = user_message;\n    messages.push_back(user_msg);\n\n    request["messages"] = messages;\n    request["temperature"] = 0.7;\n    request["max_tokens"] = 1024;\n\n    return request.dump();\n}
\n\n

请注意:我们使用了gpt-3.5-turbo模型——这是质量和速度之间的最佳平衡。如果您需要更强大的模型,可以使用gpt-4,但成本更高。

\n\n

步骤2:使用libcurl发送HTTP请求

\n\n

现在是最有趣的部分——C++ HTTP请求的处理。libcurl需要一些初始化,但总体来说非常直接。

\n\n

让我们编写一个函数,它接受请求体和API密钥,并返回服务器的原始响应。

\n\n
#include <curl/curl.h>\n#include <string>\n\nsize_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) {\n    size_t total_size = size * nmemb;\n    output->append((char*)contents, total_size);\n    return total_size;\n}\n\nstd::string send_chat_request(const std::string& json_body, const                

博客

书籍推荐