使用 Rust 集成 ChatGPT API:集强大与速度于一身

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

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

开始课程

为什么 Rust 是与 ChatGPT API 配合使用的理想选择?

\n

当谈到创建高负载 AI 服务时,大多数开发者会本能地选择 Python。但是,如果我告诉您,Rust 在速度和安全性方面可以胜过 Python,同时保留与 ChatGPT API 交互的全部能力呢?今天,我们将探讨如何将神经网络的高雅与系统语言的性能结合起来。

\n

想象一下:您的基于 Rust 的聊天机器人每秒处理数千个请求,不会因内存错误而崩溃,并且消耗的资源比 Python 版本少 10 倍。听起来像科幻小说?欢迎来到现实。在本文中,我们将构建一个完整的 AI 助手,它能够与 OpenAI API 通信,速度之快超乎您的想象。

\n

顺便说一句,如果您还不熟悉这门语言,请不要担心——我们将从基础开始,逐步深入异步编程的细节。只要知道如何入手,Rust 并不可怕。

\n\n

开始之前我们需要什么?

\n

在深入代码之前,让我们准备好工具。您需要:

\n
    \n
  • Rust(通过 rustup 安装)
  • \n
  • OpenAI API 密钥(可在 platform.openai.com 获取)
  • \n
  • 对 HTTP 请求和 JSON 的基本理解
  • \n
  • 一点耐心和一杯咖啡
  • \n
\n

我们将使用现代 crate 编写所有代码:reqwest 用于 HTTP 请求,serde 用于数据序列化,tokio 用于异步处理。这是 2024 年使用 Rust API 的标准技术栈。

\n\n

创建项目并添加依赖

\n

打开终端并创建一个新项目:

\n
cargo new chatgpt_rust --bin\ncd chatgpt_rust
\n

现在打开 Cargo.toml 并添加所需的 crate:

\n
[dependencies]\ntokio = { version = "1", features = ["full"] }\nreqwest = { version = "0.12", features = ["json"] }\nserde = { version = "1", features = ["derive"] }\nserde_json = "1"\ndotenv = "0.15"  # 用于在 .env 中存储 API 密钥
\n

请注意 reqwest 中的 features = ["json"]——这将自动启用 JSON 序列化支持。没有它,您将需要手动解析响应。

\n\n

配置环境变量

\n

在项目根目录创建一个 .env 文件,并添加您的密钥:

\n
OPENAI_API_KEY=sk-your-secret-key-here
\n

不要忘记将 .env 添加到 .gitignore 中——安全第一!Rust 对类型要求严格,但对秘密信息要求更严格。

\n\n

ChatGPT API 请求的数据结构

\n

OpenAI 期望我们提供严格定义的 JSON。让我们使用 serde 来描述它——这将使代码可读且安全:

\n
use serde::{Deserialize, Serialize};\n\n#[derive(Serialize)]\nstruct ChatRequest {\n    model: String,\n    messages: Vec<Message>,\n    temperature: f32,\n    max_tokens: u32,\n}\n\n#[derive(Serialize, Deserialize)]\nstruct Message {\n    role: String,\n    content: String,\n}\n\n#[derive(Deserialize)]\nstruct ChatResponse {\n    choices: Vec<Choice>,\n}\n\n#[derive(Deserialize)]\nstruct Choice {\n    message: Message,\n}
\n

请注意 #[derive] 属性——这是 Rust 的魔法,它会自动生成序列化方法。没有 serde,您将需要编写大量样板代码。

\n\n

编写用于 OpenAI 的异步客户端

\n

现在是最有趣的部分——创建与 ChatGPT API 通信的函数。我们将使用 reqwest 和 tokio 进行异步请求:

\n
use std::env;\nuse dotenv::dotenv;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    dote                

博客

书籍推荐