لماذا Rust والذكاء الاصطناعي ليسا خيالاً علمياً بل أداة عمل
\n\nعندما نسمع "الذكاء الاصطناعي" و"Rust" في جملة واحدة، عادة ما نتخيل شبكات عصبية معقدة مكتوبة بلغة Python. ولكن ماذا لو أخبرتك أن Rust يمكن أن يكون خلفية ممتازة للتفاعل مع ChatGPT؟ بدون Python البطيء، بدون تبعيات مثل TensorFlow - مجرد كود نقي وسريع وآمن يتواصل مع OpenAI API.
\n\nفي هذه المقالة، لن نتعلم الشبكة العصبية من الصفر - بل سنفعل شيئاً أكثر عملية: سنكتب برنامجاً بلغة Rust يرسل طلبات إلى ChatGPT ويتلقى الردود. ثم سنعلمه توليد الكود والتوثيق وحتى تصحيح الأخطاء. يبدو كالسحر؟ في الواقع، إنها مجرد بضعة كريتات ومفتاح 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 - مفتاح API من OpenAI - سجل في platform.openai.com، أنشئ مفتاحاً وضعه في متغير البيئة
OPENAI_API_KEY\n - مكتبات Rust - سنستخدم الكريتات
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 - سيتم جلب التبعيات تلقائياً.
كتابة أول طلب إلى ChatGPT بلغة Rust
\n\nأسهل طريقة "للتحدث" مع ChatGPT هي إرسال طلب POST إلى نقطة النهاية https://api.openai.com/v1/chat/completions. Rust مع كتابته الصارمة للأنواع مثالي لهذه المهمة: سنصف بوضوح هيكل الطلب والرد، وسيتحقق منا المترجم في كل خطوة.
هياكل البيانات لواجهة API
\nتتوقع واجهة OpenAI 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