Laravel محیط بسیار مناسبی برای پیادهسازی قابلیتهای هوش مصنوعی است؛ از تولید پیشنویس و خلاصهسازی تیکتها گرفته تا دستهبندی پیامهای پشتیبانی یا ساخت یک دستیار داخلی.
اما چالش اصلی صرفاً ارسال یک درخواست به مدل هوش مصنوعی نیست. مسئله مهم این است که SDK را به شکلی در Laravel پیادهسازی کنیم که:
- کلیدهای API امن باقی بمانند.
- درخواستهای طولانی باعث مسدود شدن کاربران نشوند.
- خروجی مدل قبل از استفاده یا ذخیرهسازی اعتبارسنجی شود.
- خطاها و عملکرد درخواستها بهدرستی ثبت و مدیریت شوند.
در این آموزش، یک الگوی عملی برای استفاده از یک AI SDK در پروژه Laravel پیادهسازی میکنیم.
در پایان، موارد زیر را خواهید داشت:
- یک AI Client که در Service Container لاراول ثبت شده است.
- یک سرویس سبک برای Chat و تولید متن.
- یک Job در Queue برای درخواستهای زمانبر.
- اعتبارسنجی و Logging پایه برای خروجی مدل هوش مصنوعی.
برای اجرای این مثالها به موارد زیر نیاز دارید:
- Laravel 10 یا 11
- PHP 8.1 یا بالاتر
- API Key از ارائهدهنده سرویس هوش مصنوعی
- یک Queue Driver برای محیط Production مانند
database یا redis
هرگز API Key را مستقیماً داخل کد قرار ندهید.
کلیدهای API باید در فایل .env قرار بگیرند و سپس از طریق فایلهای config/ در اختیار برنامه قرار داده شوند:
سپس در فایل config/services.php تنظیمات مربوط به سرویس AI را اضافه کنید:
به این ترتیب، اطلاعات حساس مستقیماً داخل سورسکد قرار نمیگیرند و میتوانید تنظیمات مربوط به مدل، آدرس API و Timeout را از طریق Environment مدیریت کنید.
نام دقیق پکیجها بسته به Provider مورد استفاده شما متفاوت است. نکته مهم این است که یک Application Service واحد داشته باشید که Client مربوط به Vendor را در خود قرار دهد.
برای مثال، برای SDK مربوط به OpenAI میتوانید از دستورهای زیر استفاده کنید:
سپس یک سرویس برای تولید متن ایجاد کنید:
حالا در AppServiceProvider این سرویس را در Service Container ثبت کنید:
ساخت Client را متناسب با SDK انتخابی خود تنظیم کنید.
نکته مهم این است که فقط یک Binding برای این سرویس داشته باشید تا Controllerها مجبور نباشند هر بار بهصورت دستی Client مربوط به AI را ایجاد کنند.
این کار باعث میشود ساختار برنامه تمیزتر و تغییر Provider یا SDK در آینده بسیار سادهتر شود.
برای درخواستهای کوتاه و سریع میتوانید مستقیماً از Controller با سرویس AI ارتباط برقرار کنید.
به عنوان مثال، یک Endpoint برای خلاصهسازی متن:
در این مثال ابتدا ورودی کاربر اعتبارسنجی میشود.
سپس متن به مدل ارسال شده و نتیجه دریافت میشود.
در نهایت نیز بررسی میکنیم که مدل پاسخ خالی برنگردانده باشد.
فقط زمانی از درخواست Synchronous استفاده کنید که زمان پاسخ قابل قبول باشد.
اگر درخواست ممکن است چند ثانیه یا بیشتر طول بکشد، بهتر است آن را به Queue منتقل کنید.
برای عملیات زمانبر بهتر است از Laravel Queue استفاده کنید.
ابتدا یک Job ایجاد کنید:
سپس Job را به شکل زیر پیادهسازی کنید:
حالا میتوانید Job را Dispatch کنید:
در این حالت، کاربر مجبور نیست منتظر پاسخ AI بماند.
Laravel عملیات تولید محتوا را در Queue قرار میدهد و Worker در پسزمینه آن را اجرا میکند.
این روش برای مواردی مانند:
- تولید مقاله
- خلاصهسازی تعداد زیادی متن
- پردازش فایلها
- تولید توضیحات محصولات
- تحلیل دادهها
- پردازش گروهی درخواستهای AI
مناسبتر است.
یکی از نکات بسیار مهم این است که خروجی LLM را ورودی قابل اعتماد در نظر نگیرید.
مدل هوش مصنوعی ممکن است خروجی ناقص، اشتباه یا حتی با فرمت غیرمنتظره تولید کند.
بنابراین قبل از ذخیره یا استفاده از خروجی، آن را اعتبارسنجی کنید.
حداقل اقدامات پیشنهادی:
- پاسخ خالی را رد کنید.
- حداکثر طول خروجی را محدود کنید.
- اگر خروجی قرار است در HTML نمایش داده شود، HTML را Sanitize یا Escape کنید.
- برای وظایف ساختاریافته، از JSON استفاده کرده و آن را اعتبارسنجی کنید.
برای مثال:
در اینجا از مدل خواستهایم فقط JSON برگرداند.
سپس:
JSON Decode میشود.
بررسی میکنیم که خروجی واقعاً یک Array باشد.
ساختار داده با Laravel Validator اعتبارسنجی میشود.
فقط در صورت معتبر بودن، میتوانیم از داده استفاده یا آن را ذخیره کنیم.
هنگام ساخت قابلیتهای AI در Laravel، نکات زیر را رعایت کنید:
Promptها را در Controllerهای مختلف پراکنده نکنید.
بهتر است آنها را در:
- Serviceها
- Classهای اختصاصی
- فایلهای Configuration
قرار دهید.
این کار مدیریت و تغییر Promptها را سادهتر میکند.
مواردی مانند:
- نام مدل
- زمان پاسخ
- وضعیت درخواست
- دلیل خطا
- تعداد Retryها
را Log کنید.
اما هرگز Secretها و API Keyها را در Log ذخیره نکنید.
اگر قابلیت AI از طریق API عمومی در اختیار کاربران قرار دارد، حتماً Rate Limiting اضافه کنید.
در غیر این صورت ممکن است یک کاربر با ارسال تعداد زیادی درخواست، هزینه API شما را بهشدت افزایش دهد.
برای محتوای تولیدشده توسط AI بهتر است ابتدا آن را بهصورت Draft ذخیره کنید.
سپس کاربر یا ادمین بتواند آن را بررسی و تأیید کند.
در تستهای CI نباید هر بار واقعاً به API سرویس AI متصل شوید.
بهتر است Client مربوط به AI را Fake کنید تا تستها:
- سریعتر باشند.
- هزینه API ایجاد نکنند.
- به اینترنت وابسته نباشند.
- نتایج قابل پیشبینی داشته باشند.
قرار دادن API Key در سورسکد یا Git Repository یک اشتباه امنیتی جدی است.
کلیدهای API را در .env قرار دهید و مطمئن شوید .env در Git Commit نمیشود.
اگر مدل چندین ثانیه زمان نیاز دارد، نباید کاربر را مجبور کنید تا پایان درخواست منتظر بماند.
در این شرایط از Queue استفاده کنید.
اگر مدل HTML تولید میکند، نباید آن را بدون بررسی مستقیماً در سایت نمایش دهید.
ابتدا باید خروجی را Sanitize یا Escape کنید تا از مشکلات امنیتی جلوگیری شود.
ارتباط با سرویسهای خارجی همیشه ممکن است با خطا یا Timeout مواجه شود.
بنابراین باید برای درخواستها Timeout و در صورت نیاز Retry Strategy مناسب داشته باشید.
به جای ساخت یک Prompt عظیم که قرار است «همه کارها» را انجام دهد، بهتر است وظایف را به عملیات کوچکتر تقسیم کنید.
این ساختار معمولاً قابل کنترلتر، قابل تستتر و قابل نگهداریتر است.
استفاده از یک AI SDK در Laravel بیشتر از آنکه یک مسئله پیچیده مربوط به هوش مصنوعی باشد، یک مسئله مربوط به مهندسی نرمافزار صحیح است.
یک معماری مناسب باید شامل موارد زیر باشد:
Config برای مدیریت Secretها
Service Boundary برای جدا کردن Vendor SDK
Queue برای عملیات زمانبر
Validation برای بررسی خروجی مدل
با ایجاد این ساختار پایه، اضافه کردن قابلیتهای مختلف هوش مصنوعی بسیار سادهتر میشود.
همچنین اگر در آینده تصمیم بگیرید مدل یا Provider خود را تغییر دهید، به جای بازنویسی کل پروژه، فقط بخش کوچکی از سیستم را تغییر خواهید داد.
بهتر است از SDK رسمی یا یک Client معتبر و بهخوبی نگهداریشده برای Provider مورد نظر خود استفاده کنید.
با این حال، توصیه میشود برنامه شما مستقیماً به کلاسهای Vendor وابسته نباشد.
به جای آن، یک Abstraction مانند:
ایجاد کنید و Controllerها و سایر بخشهای برنامه را به این سرویس وابسته کنید.
در این صورت تغییر Provider یا مدل در آینده بسیار سادهتر خواهد بود.
بله.
بسیاری از SDKها از Streaming پشتیبانی میکنند.
Streaming برای رابطهای Chat بسیار مناسب است، زیرا کاربر میتواند پاسخ را همزمان با تولید شدن مشاهده کند.
اما برای پردازشهای گروهی و Batch Generation همچنان بهتر است از Queue و Job استفاده کنید.
خیر.
برای شروع میتوانید از Queue مبتنی بر database استفاده کنید.
با افزایش تعداد درخواستهای AI، حجم پردازش و تعداد Retryها، Redis میتواند انتخاب مناسبتری برای Queue باشد.
در نتیجه، میتوانید با Database Queue شروع کنید و در صورت افزایش بار سیستم، زیرساخت Queue را به Redis منتقل کنید.