اگر شما با حساسیتهای پوستی تشخیصدادهشده دستوپنجه نرم میکنید، یک پاسخ مطمئن اما غلط از سوی هوش مصنوعی، تنها یک باگ فنی نیست؛ بلکه یک ریسک جدی برای سلامتی شماست. برای حل این مشکل، یک توسعهدهنده مستقل ابزار AllerBot را بهعنوان بخشی از اکوسیستم AllerNote عرضه کرد تا اطمینان حاصل کند مدل هرگز در صدور احکام ایمنی، از خود تخیل نمیکند. مشکل اصلی این است که برای کسی با حساسیتهای واقعی، جملهای مثل «بله، این مرطوبکننده برای حساسیت شما مناسب است» در صورتی که مدل دچار توهم (Hallucination) — شبیه دوستی که خاطرهای را با اطمینان کامل اما اشتباه تعریف میکند — شده باشد، یک Improvisation خطرناک است.
بیشتر چتباتهای هوش مصنوعی برای تخصص یافتن به یک «پرامپت سیستم» تکیه میکنند تا مانند یک متخصص رفتار کنند، اما این روش به مدل اجازه میدهد تا بر اساس وزنهای آموزشی داخلی خود، یک حکم «ایمن» تولید کند. در حوزههای با ریسک بالا مانند حساسیتهای تماسی، این تسلط زبانی خطرناک است زیرا مدل میتواند با اعتمادبهنفس کامل، پاسخی کاملاً اشتباه ارائه دهد. سازنده AllerBot استدلال میکند که تنها راه تضمین ایمنی این است که نقش مدل را کاملاً تغییر دهیم و آن را «وارونه» کنیم. حکم نهایی — یعنی تککلمهای که کل تعامل روی آن میچرخد و حیاتیترین بخش پاسخ است — نباید یک متن تولیدشده توسط مدل باشد.
معماری قطعیت
طبق مستندات این پروژه، AllerBot بر پایه مدلهای Gemini Flash و Flash-Lite و با استفاده از قابلیت بومی فراخوانی توابع (Native Function Calling) اجرا میشود. اصل طراحی ساده است: مدل هرگز اجازه ندارد حکم ایمنی را از دانش خود بیان کند. در عوض، حکم نهایی مقدار بازگشتیِ یک ابزار (Tool) خاص است که ترکیبات محصول را با حساسیتهای ذخیرهشده کاربر در یک سطح شدت مشخص تطبیق میدهد. اگر پایگاه داده عبارت «ایمن» را برنگرداند، مدل هم نمیتواند بگوید «ایمن است».

این سیستم از یک حلقه عامل (Agent Loop) استاندارد استفاده میکند که مدل را با یک طرحواره ابزار (Tool Schema) فراخوانی کرده، ابزارهای درخواستی را اجرا میکند و نتایج را دوباره به مدل بازمیگرداند. این فرآیند تا زمانی تکرار میشود که مدل دیگر ابزاری درخواست نکند و پاسخ نهایی را بهصورت متن ساده برگرداند. برای جلوگیری از حلقههای بینهایت — که گاهی رخ میدهد وقتی مدل تصمیم میگیرد برای همیشه ابزار فراخوانی کند — توسعهدهنده یک سقف سخت ۵ تکراری (Iteration Cap) تعیین کرده است.
در هر نوبت (Turn)، تمام ابزارهایی که مدل درخواست میکند بهصورت همزمان از طریق asyncio.gather اجرا میشوند. سپس کل دستهی نتایج بهعنوان یک بلوک پاسخ-ابزار (Tool-response block) بازگردانده میشود. این ساختار تضمین میکند که عامل (Agent) با وجود تأخیرهای ذاتی فراخوانیهای LLM، همچنان کارآمد باقی بماند.
ابزارها و سازوکارهای کنترل
به نقل از سازنده، حدود ۱۲ ابزار تخصصی با تایپ مشخص در سیستم تعریف شده است. ابزارهایی که بیشترین وزن و اهمیت را در سیستم دارند عبارتاند از:
get_user_allergen_profile: بازیابی حساسیتهای خاص کاربر که وارد حساب خود شده است، شامل سطوح شدت و یادداشتهای شخصی.scan_ingredients/check_product_safety: اینها تنها ابزارهایی هستند که اجازه صدور حکم ایمنی را دارند. آنها لیست ترکیبات را با پروفایل کاربر تطبیق داده و برای هر ترکیب، وضعیتی شامل «ایمن»، «هشدار» یا «خطر» برمیگردانند.lookup_ingredients_batch: دریافت متادیتای N ترکیب در یک فراخوانی واحد، تا از حلقه تکرار مدل برای بررسی تکتک ترکیبات جلوگیری شود.recommend_safe_products: فیلتر کردن کاتالوگ محصولات بر اساس حساسیتهای ذخیرهشده کاربر و همچنین حساسیتهایی که در میان چت ذکر شدهاند اما هنوز ذخیره نشدهاند.save_allergens_to_profile: این تنها مسیر «نوشتن» (Write path) در سیستم است و بهشدت پشت درِ رضایت صریح و مستقیم کاربر قرار دارد.
مبارزه با غریزه «کمکرسانی»
یکی از چالشهای اصلی، متوقف کردن مدل از «بیش از حد کمک کردن» بود. چون Gemini میداند عطرهای رایج چیستند، اغلب سعی میکند مستقیماً به سؤالات ایمنی پاسخ دهد. توسعهدهنده برای مقابله با این موضوع سه لایه انضباطی ایجاد کرد:
۱. پرامپت قراردادی: پرامپت سیستم بهجای تعریف شخصیت، مانند یک قرارداد (Contract) عمل میکند. این لایه صراحتاً ابداع آمار یا احکام را ممنوع کرده، مدل را مجبور میکند درخواستهای خارج از محدوده (مانند تشخیصهای پزشکی) را رد کند و الزام میکند پیش از هر ادعای ایمنی، حتماً یک ابزار فراخوانی شود.
۲. توصیفات دستوری ابزارها: توصیفات ابزارها بهصورت امری (Imperative) نوشته شدهاند زیرا مدل آنها را بهصورت تحتاللفظی دنبال میکند. مثلاً برای scan_ingredients صرفاً نوشته نشده که «محصول را بررسی میکند»، بلکه ذکر شده: «همیشه پیش از بیان ایمن بودن محصول این ابزار را فراخوانی کن؛ هرگز حدس نزن».
۳. سقف تکرار: محدودیت ۵ تکرار تضمین میکند که اگر حلقه دچار سردرگمی شود، بهجای اجرای بینهایت، در حالت بسته (Fail Closed) متوقف شود.

ورودیهای چندوجهی و پایداری پایگاه داده
برای حذف نیاز به تایپ خستهکننده لیست ترکیبات از پشت بطری محصولات، AllerBot از Gemini Vision برای استخراج متن (OCR) استفاده میکند. این قابلیت به کاربران اجازه میدهد عکس برچسبها را مستقیماً در چت بفرستند. سیستم بهگونهای طراحی شده که برچسبهای خمیده، تفاوت بین نامهای استاندارد INCI و نامهای رایج، و حتی اصطلاحات سنتی یا آیورودیک ترکیبات را تشخیص دهد. در صورتی که مسیر Gemini Vision با مشکل مواجه شود، یک مدل محلی به نام doctr بهعنوان جایگزین (Fallback) عمل میکند.
نکته کلیدی این است که ورودی عکس دقیقاً از همان مسیر تأیید متن عبور میکند. ترکیبات استخراجشده به همان ابزار scan_ingredients میروند. با هدایت هر دو حالت ورودی (متن و عکس) از طریق یک ابزار واحد، توسعهدهنده تضمین کرد که هیچ مسیر «سستتری» در کد وجود ندارد که قانون استناد (Grounding) را دور بزند. هیچ مسیر دومی برای عکس وجود ندارد.

پروژه با یک چالش فنی قابل توجه در تراکنشهای پایگاه داده مواجه بود. در ابتدا، برنامه یک تراکنش Postgres را برای کل درخواست، شامل زمانهای طولانی رفتوبرگشت مدل، باز نگه میداشت. چون برنامه از Postgres در پشت PgBouncer استفاده میکند، تایماوتهای اتصال (Idle-connection timeouts) باعث قطع شدن سوکت در حین «تفکر» مدل میشد. این موضوع منجر به خطاهای متناوب ConnectionDoesNotExistError میشد که بسته به زمان پاسخدهی Gemini رخ میداد.
راه حل، حذف نشستهای (Sessions) طولانیمدت بود. اکنون برنامه برای هر گام مجزا (بارگذاری تاریخچه، ذخیره پیام کاربر، اجرای یک ابزار و ذخیره پاسخ) یک نشست کوتاه باز کرده، Commit میکند و میبندد. این یعنی هیچ اتصالی در حالی که مدل در حال تفکر است، باز نمیماند. بهعنوان یک اثر جانبی، یک اسکن موفق بهطور مستقل Commit میشود و حتی اگر ذخیره پاسخ نهایی با خطا مواجه شود، نتیجه اسکن باقی میماند.
رابط کاربری و بهینهسازی توکنها
AllerBot برای جلوگیری از هدر رفتن توکن (Token) — تکههای کوچکی از متن که مدل پردازش میکند — و همچنین جلوگیری از فرمتبندی ضعیف، متنهای ادبی (Prose) را از دادههای ساختاریافته جدا کرده است. برخی از نتایج ابزارها هرگز برای تبدیل شدن به متن نبودند. برای مثال، وقتی ابزار recommend_safe_products نتایج را برمیگرداند، سیستم نمیخواهد مدل پنج محصول را در قالب Markdown بنویسد؛ در عوض، فرانتاند کارتهای محصول را رندر میکند.
به همین ترتیب، اگر کاربر به حساسیتی اشاره کند که هنوز ذخیره نکرده است، سیستم بهجای یک جمله مودبانه از مدل برای درخواست ذخیرهسازی، یک دکمه «این مورد را در پروفایل ذخیره کنیم؟» را فعال میکند. حلقه (Loop) دادههای ساختاریافته را از نتایج ابزارها استخراج کرده و آنها را در کنار متن بازمیگرداند. مدل جمله انسانی را مینویسد، در حالی که فرانتاند کامپوننت واقعی را نمایش میدهد.
گام بعدی شما
برای توسعهدهندگانی که اپلیکیشنهایی میسازند که در آنها «اشتباه کردن» پیامدهای جدی دارد، سازنده این پروژه چندین درس کلیدی ارائه میدهد:
- تعریف حق نویسندگی (Authorship): دقیقاً تصمیم بگیرید مدل اجازه دارد چه چیزی را بنویسد. در AllerBot، مدل نویسنده «توضیحات» است، اما هرگز نویسنده «حکم» نیست.
- کد بر وزنها اولویت دارد: منبع حقیقت (Source of Truth) را در کد قرار دهید، نه در وزنهای مدل. در حالی که RAG متنی را برای ترکیب مدل فراهم میکند، پاسخهای قطعی باید خروجی یک تابع باشند که مدل صرفاً آن را روایت میکند.
- مدل را مانند یک پیمانکار توجیه کنید: طرحوارههای ابزار بخشی از پرامپت هستند. توصیفات را بهگونهای بنویسید که انگار دارید به پیمانکاری دستور میدهید که هر چیزی را دقیقاً همانطور که هست میپذیرد.
- مدیریت دقیق وضعیت (State): مراقب باشید چه چیزهایی (اتصالات، قفلها، تراکنشها) در طول یک فراخوانی LLM باز میمانند، زیرا این بخش کندترین قسمت درخواست است.
پشته تکنولوژی (The Stack)
این برنامه در فرانتاند با Nuxt 4 و Vue 3 (با استفاده از SSR/ISR برای کراولرها)، در بکاند با FastAPI به همراه SQLAlchemy async و pgvector، برای احراز هویت از Firebase، برای عامل و بینایی از Gemini Flash و برای OCR جایگزین از doctr استفاده میکند.
شما میتوانید قرارداد استناد (Grounding Contract) را بهصورت رایگان در allernote.com/allerbot آزمایش کنید. وارد شوید تا بات بتواند حساسیتهای تست-وصله (Patch-test) ذخیرهشده شما را برای صدور احکام شخصیسازیشده بخواند.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو