ساخت نسخه اولیه یک ********بات با مدل زبانی آسان است، اما پایدارکردن آن به چند تصمیم معماری نیاز دارد. اگر همه چیز مستقیماً به SDK و نام مدل یک Provider وصل شود، تغییر قیمت، محدودیت منطقهای یا حذف مدل میتواند کل برنامه را متوقف کند.
راه بهتر این است که منطق ********بات را از Provider جدا کنیم.
چهار بخش اصلی ********بات
رابط کاربر
مدیریت گفتگو
سرویس LLM
Adapter مربوط به Provider
رابط کاربر میتواند ترمینال، سایت یا پیامرسان باشد. مدیریت گفتگو مسئول نگهداری چند پیام آخر است. سرویس LLM یک قرارداد ثابت ارائه میدهد و Adapter جزئیات Base URL، کلید و Model ID را میداند.
قرارداد ساده سرویس
from typing import Protocol
class ********Provider(Protocol):
def reply(self, messages: list[dict[str, str]]) -> str:
...
منطق برنامه فقط متد reply را صدا میزند. در نتیجه میتوان Adapter مربوط به Provider اول را با Adapter دیگری جایگزین کرد.
مدیریت تاریخچه
ارسال تمام پیامهای گذشته باعث افزایش توکن و هزینه میشود. برای نسخه ساده میتوان فقط چند پیام آخر را نگه داشت:
MAX_MESSAGES = 12
history = history[-MAX_MESSAGES:]
برای گفتگوهای طولانیتر، خلاصهسازی دورهای یا ذخیره اطلاعات مهم در پایگاه داده بهتر است.
System Prompt فارسی
System Prompt باید کوتاه و مشخص باشد. برای نمونه:
تو یک دستیار فارسی هستی. پاسخها را دقیق و روشن بنویس.
هنگام نبود اطلاعات کافی، حدس قطعی نزن.
اطلاعات محرمانه یا کلید API درخواست نکن.
دستورهای بسیار طولانی هم توکن بیشتری مصرف میکنند و هم احتمال تعارض را بالا میبرند.
مدیریت خطا برای تجربه کاربری بهتر
نباید متن خام خطای Provider مستقیماً به کاربر نشان داده شود. بهتر است خطاها به چند گروه تبدیل شوند:
- احراز هویت: تنظیمات سرویس مشکل دارد؛
- محدودیت مصرف: کمی بعد دوباره تلاش شود؛
- مدل نامعتبر: Model ID نیاز به بازبینی دارد؛
- شبکه: اتصال موقتاً برقرار نیست؛
- خطای داخلی Provider: مسیر جایگزین فعال شود.
Retry باید محدود و همراه Backoff باشد. تکرار نامحدود درخواست 429 فقط سهمیه را بدتر میکند.
امنیت API Key
کلید باید فقط در Backend نگهداری شود. قراردادن کلید در JavaScript مرورگر، اپ موبایل بدون Backend، Repository عمومی یا تصویر آموزشی ناامن است.
برای محیطهای مختلف از Secret Manager یا Environment Variable استفاده کنید و دسترسی کلید را حداقل نگه دارید.
Provider رایگان را چگونه انتخاب کنیم؟
برای یک ********بات فارسی این معیارها مهماند:
- کیفیت پاسخ فارسی؛
- Context کافی؛
- Rate limit مناسب؛
- Streaming در صورت نیاز؛
- دسترسی عملی از ایران؛
- سازگاری با SDK موجود؛
- امکان استفاده از مدل جایگزین.
کیفیت فارسی را با چند Prompt واقعی پروژه بسنجید. نام یا اندازه مدل بهتنهایی تضمین نمیکند که لحن، دستورپذیری یا نگارش فارسی مناسب باشد.
Fallback ساده
برای شروع میتوان دو Provider تعریف کرد. فقط خطاهای موقت مانند Timeout یا خطای ظرفیت باید مسیر دوم را فعال کنند. خطای Authentication نباید خودکار به Provider بعدی منتقل شود، چون ممکن است نشانه تنظیمات اشتباه یا مشکل امنیتی باشد.
آموزش کامل و نمونه Python برای ********بات قابل تعویض:
ساخت ********بات فارسی با API رایگان LLM
فهرست زنده Providerها و Source Code:
https://github.com/alirezasafaei-dev/awesome-free-llm-apis-ir
چطور یک ********بات فارسی بسازیم که به یک سرویس هوش مصنوعی وابسته نباشد؟