为什么Rust和AI不是幻想,而是实用工具
\n\n当我们听到“人工智能”和“Rust”出现在同一句话中时,通常想到的是用Python编写的复杂神经网络。但如果我告诉你,Rust可以成为与ChatGPT交互的优秀后端呢?没有慢速的Python,没有像TensorFlow那样的依赖——只有干净、快速、安全的代码与OpenAI API通信。
\n\n在本文中,我们不会从头开始训练神经网络——我们将做一些更实用的事情:用Rust编写一个程序,向ChatGPT发送请求并获取响应。然后,我们将教它生成代码、文档,甚至修复错误。听起来像魔法?实际上,这只需要几个crate和一个正确的API密钥。
\n\n如果你曾想为自己的Rust项目添加语言模型形式的“大脑”——你来对地方了。我们开始吧!
\n\n我们需要什么:工具和准备
\n\n在编写代码之前,让我们弄清楚将ChatGPT集成到Rust应用程序中需要什么。
\n\n必要组件
\n- \n
- Rust — 已安装的编译器(rustc)和包管理器Cargo。如果你还没有Rust——
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n - OpenAI API密钥 — 在platform.openai.com注册,创建密钥并将其放入环境变量
OPENAI_API_KEY中 \n - Rust库 — 我们将使用crate
reqwest(用于HTTP请求)、serde和serde_json(用于处理JSON)、tokio(异步运行时) \n
创建项目
\ncargo new rust_chatgpt\ncd rust_chatgpt\n\n将依赖项添加到Cargo.toml:
[dependencies]\nreqwest = { version = "0.12", features = ["json"] }\ntokio = { version = "1", features = ["full"] }\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"\n\n现在可以运行cargo build——依赖项将自动拉取。
用Rust编写第一个ChatGPT请求
\n\n与ChatGPT“对话”的最简单方法是向端点https://api.openai.com/v1/chat/completions发送POST请求。Rust凭借其严格的类型系统非常适合此任务:我们将清晰地描述请求和响应的结构,编译器将在每一步为我们检查。
API的数据结构
\nOpenAI API期望JSON具有特定的模式。让我们用serde来描述它:
use serde::{Deserialize, Serialize};\n\n#[derive(Serialize)]\nstruct ChatRequest {\n model: String,\n messages: Vec<Message>,\n temperature: f32,\n}\n\n#[derive(Serialize, Deserialize, Clone)]\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\n注意:Message既用于发送也用于接收——因此我们添加了Serialize和Deserialize两个属性。
异步请求
\n现在编写一个函数,发送消息并返回ChatGPT的响应:
\n\nuse std::env;\n\nasync fn ask_chatgpt(prompt: &str) -> Result<String, Box<dyn std::error::Error>> {\n let api_key = env::var("OPENAI_API_KEY")\n .expect("环境变量OPENAI_API_KEY未设置");\n\n let client = reqwest::Client::new();\n\n let request_body = ChatRequest {\n model: "gpt-4o-mini".to_string(), // 快速且便宜的模型\n messages: vec![\n Message {\n role: "system".to_string(),\n