لماذا Go وChatGPT هما الثنائي المثالي؟
\nهل تساءلت يومًا كيف يمكنك بسرعة "تعليم" برنامجك بلغة Go التواصل مع المستخدم كإنسان حي؟ أو ربما تريد أتمتة إنشاء المحتوى، أو إنشاء مساعد ذكي، أو ببساطة إضافة "لمسة خاصة" لخدمتك؟ دمج ChatGPT API مع Go ليس مجرد موضة عابرة، بل أداة قوية تفتح أبواب عالم الذكاء الاصطناعي. Go، بسرعتها وبساطتها، مثالية لإنشاء طلبات سريعة وموثوقة للشبكات العصبية. في هذه المقالة، لن نناقش النظرية فقط، بل سنكتب كودًا حقيقيًا يمكنك استخدامه فورًا في مشاريعك.
\n\nتهيئة الأرضية: ماذا تحتاج للبدء؟
\nقبل الغوص في الكود، دعنا نتأكد من أن لدينا كل ما نحتاجه. ستحتاج إلى:
\n- \n
- Go مثبتة (الإصدار 1.21 أو أعلى لاستخدام جميع الإمكانيات الحديثة). \n
- مفتاح API من OpenAI. يمكنك الحصول عليه من منصة OpenAI. تعامل معه ككلمة مرور بطاقتك المصرفية - احفظه بسرية! \n
- فهم أساسي لطلبات HTTP وهياكل البيانات في Go. \n
سنكتب كل الكود في هذه المقالة في ملف واحد main.go لتبسيط الهيكل. هيا بنا!
الخطوة 1: إنشاء عميل HTTP وإرسال أول طلب
\nقلب تكاملنا سيكون الحزمة القياسية net/http. إنها خفيفة الوزن وسريعة ولا تتطلب تبعيات خارجية. مهمتنا هي إرسال طلب POST إلى نقطة النهاية https://api.openai.com/v1/chat/completions مع الجسم والرؤوس الصحيحة.
هيكل الطلب
\nيتوقع ChatGPT API JSON بتنسيق محدد. دعنا ننشئ هياكل Go تتطابق تمامًا مع هذا التنسيق:
\npackage main\n\nimport (\n "bytes"\n "encoding/json"\n "fmt"\n "io"\n "net/http"\n "os"\n)\n\ntype ChatMessage struct {\n Role string `json:"role"`\n Content string `json:"content"`\n}\n\ntype ChatRequest struct {\n Model string `json:"model"`\n Messages []ChatMessage `json:"messages"`\n}\n\ntype ChatResponse struct {\n Choices []struct {\n Message ChatMessage `json:"message"`\n } `json:"choices"`\n}\nلاحظ العلامات json:"...". إنها تضمن أن Go "يحزم" (يسلسل) بياناتنا بشكل صحيح إلى JSON الذي ستفهمه OpenAI.
دالة الإرسال
\nالآن سنكتب دالة تتولى كل العمل "القذر": تشكيل الطلب، إرساله، وتحليل الرد.
\nfunc askChatGPT(apiKey, prompt string) (string, error) {\n reqBody := ChatRequest{\n Model: "gpt-3.5-turbo",\n Messages: []ChatMessage{\n {Role: "user", Content: prompt},\n },\n }\n\n jsonData, err := json.Marshal(reqBody)\n if err != nil {\n return "", fmt.Errorf("خطأ في التسلسل: %w", err)\n }\n\n request, err := http.NewRequest("POST", "https://api.openai.com/v1/chat/completions", bytes.NewBuffer(jsonData))\n if err != nil {\n return "", fmt.Errorf("خطأ في إنشاء الطلب: %w", err)\n }\n\n request.Header.Set("Content-Type", "application/json")\n request.Header.Set("Authorization", "Bearer "+apiKey)\n\n client := &http.Client{}\n response, err := client.Do(request)\n if err != nil {\n return "", fmt.Errorf("خطأ في تنفيذ الطلب: %w", err)\n }\n defer response.Body.Close()\n\n body, err := io.ReadAll(response.Body)\n if err != nil {\n return "", fmt.Errorf("خطأ في قراءة الرد: %w", err)\n }\n\n // التحقق من رمز الحالة\n if response.StatusCode != http.StatusOK {\n return "", fmt.Errorf("أعادت API خطأ: %s, الجسم: %s", response.Status, string(body))\n }\n\n var chatResp ChatRes