لماذا Rust هو الخيار الأمثل للعمل مع ChatGPT API؟
\nعندما يتعلق الأمر بإنشاء خدمات ذكاء اصطناعي عالية التحميل، يميل معظم المطورين غريزيًا إلى Python. ولكن ماذا لو أخبرتك أن Rust يمكنه التفوق على Python في السرعة والأمان، مع الحفاظ على كل قوة التفاعل مع ChatGPT API؟ اليوم سنشرح كيفية الجمع بين أناقة الشبكات العصبية وأداء لغة النظام.
\nتخيل: روبوت الدردشة الخاص بك بلغة Rust يعالج آلاف الطلبات في الثانية، دون أن يتعطل بأخطاء الذاكرة ويستهلك موارد أقل بعشر مرات من نظيره في Python. يبدو وكأنه خيال علمي؟ مرحبًا بك في الواقع. في هذه المقالة، سنبني مساعد ذكاء اصطناعي متكامل سيتواصل مع OpenAI API أسرع مما يمكنك قول "ChatGPT".
\nبالمناسبة، إذا كنت لا تزال غير معتاد على هذه اللغة، فلا تقلق - سنبدأ من الأساسيات ونغوص تدريجيًا في أعماق البرمجة غير المتزامنة. Rust لا يعض إذا كنت تعرف كيفية التعامل معه.
\n\nماذا نحتاج للبدء؟
\nقبل أن نغوص في الكود، دعنا نجهز الأدوات. ستحتاج إلى:
\n- \n
- Rust (مثبت عبر
rustup) \n - مفتاح API من OpenAI (يمكن الحصول عليه من platform.openai.com) \n
- فهم أساسي لطلبات HTTP و JSON \n
- القليل من الصبر وفنجان من القهوة \n
سنكتب كل الكود باستخدام الكريتات الحديثة: reqwest لطلبات HTTP، serde لتسلسل البيانات، و tokio للبرمجة غير المتزامنة. هذه هي الحزمة القياسية للعمل مع Rust API في عام 2024.
إنشاء المشروع وإضافة التبعيات
\nافتح الطرفية وأنشئ مشروعًا جديدًا:
\ncargo new chatgpt_rust --bin\ncd chatgpt_rust\nالآن افتح Cargo.toml وأضف الكريتات اللازمة:
[dependencies]\ntokio = { version = "1", features = ["full"] }\nreqwest = { version = "0.12", features = ["json"] }\nserde = { version = "1", features = ["derive"] }\nserde_json = "1"\ndotenv = "0.15" # لتخزين مفتاح API في .env\nلاحظ features = ["json"] في reqwest - سيقوم هذا تلقائيًا بتفعيل دعم تسلسل JSON. بدون ذلك، كان عليك تحليل الردود يدويًا.
إعداد متغيرات البيئة
\nأنشئ ملف .env في جذر المشروع وأضف مفتاحك فيه:
OPENAI_API_KEY=sk-your-secret-key-here\nلا تنس إضافة .env إلى .gitignore - الأمان أولاً! Rust صارم مع الأنواع، لكنه أكثر صرامة مع الأسرار.
هيكل البيانات لطلب ChatGPT API
\nيتوقع OpenAI منا JSON محدد بدقة. دعنا نصفه باستخدام serde - وهذا سيجعل الكود قابلاً للقراءة وآمنًا:
\nuse 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، كان عليك كتابة أطنان من الكود النمطي.
كتابة عميل غير متزامن لـ OpenAI
\nالآن الجزء الأكثر إثارة - إنشاء دالة ستتواصل مع ChatGPT API. سنستخدم reqwest و tokio للطلبات غير المتزامنة:
use std::env;\nuse dotenv::dotenv;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n dote