جاءني أحد العملاء في أبو ظبي العام الماضي، وهو يحتسي رشفة من قهوته العربية الثالثة: "يقوم مستخدمونا بكتابة أوصاف للأحداث يدويًا تتكون من 300 كلمة. هل يمكن للتطبيق إنشاء هذه الأوصاف تلقائيًا ببعض لمسات الذكاء الاصطناعي؟"
كان لدي قيدان:
- كان تطبيق Laravel الخاص بهم يعمل في مرحلة الإنتاج لمدة 4 سنوات.
- لم يكونوا سيدفعون مقابل إعادة كتابة كاملة النطاق.
لقد قمت بتسليم أكثر من 40 مشروعًا في الإمارات العربية المتحدة ودول مجلس التعاون الخليجي. يريد العملاء هنا نتائج - بسرعة. لذلك فعلت ما يفعله أي مطور كسول وفعال: ألصقت ميزات الذكاء الاصطناعي الجديدة بقاعدة التعليمات البرمجية الحالية. دعني أشرح كيف.
الخطوة 1: لا تلمس الجوهر
قام التطبيق بتخزين الأحداث في قاعدة بيانات MySQL مع عمود عادي event_descriptions. إعادة كتابة مسار إنشاء الأحداث من قوالب blade إلى وحدات التحكم؟ لا.
بدلاً من ذلك، قمت بما يلي:
- •بناء نقطة نهاية
/ai-descriptionمنفصلة. - •إنشاء مكون Vue مخصص يتم تحميله فقط عندما ينقر المستخدمون على "إنشاء باستخدام الذكاء الاصطناعي".
- •تركت التعليمات البرمجية القديمة دون تغيير.
هذا مهم في سياق دول مجلس التعاون الخليجي - نادرًا ما يرغب العملاء في المقامرة بأنظمة تحقق أرباحًا بالفعل.
الخطوة 2: اختر محرك ذكاء اصطناعي تم اختباره جيدًا
درسنا إمكانية الضبط الدقيق لنموذج لغوي كبير LLM محلي، لكن ذلك يعني توظيف علماء بيانات. لم يتمكن العميل من تحمل الجدول الزمني.
اخترت GPT-3.5 Turbo API الخاص بـ OpenAI. الأسباب:
- •يدعم اللغتين العربية والإنجليزية - وهو أمر حيوي لمستخدمي الإمارات العربية المتحدة.
- •زمن انتقال منخفض عبر منطقة eu-west-3 الخاصة بهم (الأقرب إلى مناطق AWS في أبو ظبي).
- •SDKs متوافقة مع Laravel للطلبات غير المتزامنة.
الخطوة 3: طبقة الخدمة التي أنقذت صوابي
لقد أنشأت فئة AIService مستقلة في app/Services. إليكم الحقيقة البشعة - تصبح فئات خدمة Laravel فوضوية بسرعة، لكن هذه الفئة التزمت بقاعدة واحدة: لا تلمس قاعدة البيانات مباشرةً.
class AIService {
protected $client;
public function __construct()
{
$this->client = new Client([
'headers' => [
'Authorization' => 'Bearer ' . env('OPENAI_KEY'),
'Content-Type' => 'application/json',
]
]);
}
public function generateEventDescription(array $data): string
{
$response = $this->client->post('/v1/chat/completions', [
'json' => [
'model' => 'gpt-3.5-turbo',
'messages' => [
['role' => 'system', 'content' => 'You are a professional content writer for events in the UAE. Always respond in Arabic or English depending on $data["language"]'],
['role' => 'user', 'content' => "Write a 300-word description for an event: Name: {{$data['name']}}, Type: {{$data['type']}}, Date: {{$data['date']}}"]
]
]
]);
// Handle response parsing, error retries, etc.
}
}عزلت هذه التعليمات البرمجية منطق الذكاء الاصطناعي. إذا تعطل OpenAI غدًا، فإن نقطة النهاية /ai-description فقط هي التي ستتعطل - وليس التطبيق بأكمله.
مفاجأة الإمارات العربية المتحدة: إخراج بلغة مختلطة
إليكم ما لم أتوقعه - استمر النموذج في خلط اللغتين العربية والإنجليزية في النتائج. على سبيل المثال، كان يكتب "This event offers great فرص تواصل" (مزيج من العربية والإنجليزية).
الحل؟ تغييران في المطالبة:
- ترميز لغة الاستجابة في رسالة النظام: "أجب دائمًا باللغة العربية."
- إضافة محدد
-- Arabic Text --بين الطلب وإخراج النموذج.
ليس أنيقًا. لكنه قلل من الاستجابات المختلطة اللغات بنسبة 90٪.
معالجة الأخطاء في الوقت الفعلي (وزمن الوصول الحقيقي في الإمارات العربية المتحدة)
إن OpenAI API ليس مجانيًا، ولم يكن العميل سعيدًا عندما أدت عمليات التشغيل التجريبية إلى ارتفاع الفاتورة. لقد تعلمت هذا بالطريقة الصعبة بعد عطلة نهاية أسبوع حيث تم إجراء 12 ألف مكالمة API.
لقد حددنا طول الإدخال وقمنا بتجميع الطلبات. لكن الإصلاح الحقيقي كان تنفيذ Laravel Horizon + طوابير Redis. ساعد هذا أيضًا خلال فترات ذروة حركة المرور في دبي خلال شهر رمضان - حافظت المعالجة غير المتزامنة على سلاسة الواجهة الأمامية.
فوز واقعي: محرك الحجز الخاص بـ Tawasul Limo
إذا كنت قد رأيت ملف أعمالي، فقد فعلت شيئًا مشابهًا لـ Tawasul Limo. لقد احتاجوا إلى الذكاء الاصطناعي لاقتراح باقات ليموزين تلقائيًا بناءً على سجل بحث المستخدم. نفس المبدأ: الذكاء الاصطناعي كطبقة خدمة، بدون إعادة كتابة.
الفرق هنا؟ كانت بيانات Tawasul أنظف (تم تخزين جلسات المستخدم في Redis) - مما جعل توجيه النموذج أسهل.
مقاييس الإخراج النهائية
بعد 3 أسابيع:
- •قبل 82٪ من المستخدمين الأوصاف التي تم إنشاؤها بواسطة الذكاء الاصطناعي دون تعديلات
- •متوسط وقت الإنشاء 400 مللي ثانية (بانخفاض من 1.2 ثانية بعد الإعداد غير المتزامن)
- •وفر العميل ما يقرب من 80 ساعة / شهر من عمل الكتابة اليدوية
هل سأفعلها مرة أخرى؟
بصراحة، نعم. لكنني لن أثق في النموذج للتعامل مع الحالات الشاذة خارج الصندوق. أسوأ لحظة في الساعة 2 صباحًا؟ تصحيح الأخطاء في سبب استمرار بيانات حدث أحد العملاء في التسبب في أخطاء OpenAI. اتضح أن لديهم وقت بدء حدث الساعة 3 صباحًا - وهو ما فسره النموذج على أنه "ملهى ليلي" بغض النظر عن السياق. الفروق الدقيقة في الثقافة العربية، يا جماعة.
إذا كنت تضيف الذكاء الاصطناعي إلى تطبيق Laravel قديم:
- •حافظ على فصل رمز الذكاء الاصطناعي
- •اختبر المطالبات مع متغيرات اللغة / المنطقة الزمنية
- •ضع ميزانية لتكاليف API كما لو كانت بائعًا خارجيًا
هل تحتاج إلى مساعدة في ذلك؟ لقد أضعت ما يكفي من عطلات نهاية الأسبوع حتى لا تضطر إلى ذلك. تواصل.