تصور کنید حساسیت شدید به بادامزمینی دارید و هر وعده غذای بیرون از خانه برای شما به یک بازی خطرناک با مرگ تبدیل میشود. SafePlate دقیقاً برای این لحظات طراحی شده است تا با تبدیل یک عکس ساده از منو به ابزاری تشخیصی، ریسک سفارش غذا را به حداقل برساند. این پروژه که برای چالش آخر هفته Hacktoberfest ساخته شده است، از هوش مصنوعی روی دستگاه (On-device AI) برای نجات جان کاربران استفاده میکند.
برای افرادی مانند «آکشیتا» که دچار شوک آنافیلاکتیک (Anaphylactic Shock) به بادامزمینی، آجیلهای درختی و سختپوستان است، خواندن منو و پرسیدن سؤالات تکراری از گارسون فرآیندی فرسایشی است. او منو را دو بار میخواند، سه سؤال از گارسون میپرسد و در نهایت اغلب برای اطمینان، فقط برنج ساده سفارش میدهد. آلرژنها اغلب در جاهای غیرمنتظرهای مثل سس ساتای، پستو، «تاپینگهای ترد» یا حتی تابه مشترک آشپزخانه که برای سفارش قبلی استفاده شده، پنهان میشوند. طبق مستندات این پروژه، SafePlate با ایجاد یک لایهی نظارتی دوم که به اینترنت پایدار یا سیاستهای حریم خصوصی ارائهدهندگان ابری وابسته نیست، این استرس را کاهش میدهد.
معماری فنی
همانطور که در تحلیلهای پیشین ما دربارهی مدلهای زبانی کوچک اشاره کردیم، تمایل به اجرای مدلها روی سختافزار کاربر برای حفظ حریم خصوصی در حال افزایش است. این اپلیکیشن از Gemma 3 4B استفاده میکند؛ یک مدل چندوجهی (Multimodal) با وزنهای باز که از طریق Ollama بهصورت محلی اجرا میشود. به دلیل ماهیت چندوجهی این مدل، نیازی به مرحلهی مجزای نویسهخوانی نوری (OCR) نیست و عکس منو مستقیماً پردازش میشود.
بر اساس بررسیهای فنی، این مدل با حجم تقریبی ۳.۳ گیگابایت روی لپتاپهای معمولی اجرا شده و هر عکس را در حدود ۱۳ ثانیه تحلیل میکند. برای حفظ این سرعت، مرورگر ابتدا ابعاد عکسها را به ۱۲۸۰ پیکسل کاهش میدهد تا پردازش بهینهتر شود. توسعهدهنده برای دریافت پاسخهای عملیاتی و دقیق، از پارامتر format در Ollama استفاده کرده است تا مدل را مجبور به پیروی از یک طرحواره (Schema) سختگیرانه JSON کند. هر غذا با یک حکم مشخص — «ایمن» (safe)، «پرسوجو» (ask) یا «اجتناب» (avoid) — به همراه دلیل و یک سؤال دقیق برای پرسیدن از گارسون بازگردانده میشود. مدل با دمای (Temperature) صفر تنظیم شده و در دستورالعملهای سیستم (Prompt) صراحتاً ذکر شده است که «در صورت عدم اطمینان، گزینه پرسوجو را انتخاب کن».
جزئیات منطق و مکانیزمها
مکانیزمهای تشخیص در SafePlate به گونهای طراحی شدهاند که ابهام را به حداقل برسانند:
- خروجی ساختاریافته: مدل بهجای تولید متن آزاد، یک بلوک JSON شامل نام غذا، حکم نهایی، دلیل و سؤال
ask_serverرا برمیگرداند. - مثالهای عملی: در تستهای اولیه، سیستم غذای «مرغ کونگ پائو» را بهدرستی در دستهی «اجتناب» قرار داد و این سؤال را پیشنهاد کرد: «آیا میتوانید تأیید کنید که تابه بین هر سفارش شسته میشود؟» همچنین برای «پاستای پستو»، سؤال زیر را طرح کرد: «آیا پستویی بدون چلنی (Pine nuts) دارید؟»
- دستهبندی پرسوجو: برای مواردی مانند «سالاد پاپایا»، سیستم ممکن است پیشنهاد دهد: «آیا میتوانید تأیید کنید که سس ماهی بهصورت جداگانه از هرگونه آجیل تهیه شده است؟»
- شناسایی موارد ایمن: غذاهای سادهای مثل «برنج یاسمن بخارپز» مستقیماً در دستهی «ایمن» علامتگذاری میشوند.
شبکه ایمنی قطعی (Deterministic Safety Net)
اما نقطه قوت SafePlate در «شبکه ایمنی» (Safety Net) آن است. توسعهدهنده متوجه شد که حتی یک مدل ۴ میلیاردی توانمند هم ممکن است آلرژنهای بدیهی را نادیده بگیرد؛ مثلاً در برخی تستها، مدل در تشخیص میگو در «Garlic Butter Scallops» و سوپ «تام یام» برای کاربرانی با حساسیت به سختپوستان، حکمی پایینتر از «اجتناب» صادر کرد.
برای حل این مشکل، یک تابع «عمداً ساده» طراحی شده که پس از استنتاج (Inference) — لحظهای که مدل واقعاً جواب تولید میکند — اجرا میشود. این تابع تمام متن منو را برای کلمات کلیدی خطرناک اسکن میکند:
- جایگزینی کلمات کلیدی: اگر متن حاوی هر یک از کلمات کلیدی آلرژن باشد، سیستم بهاجبار حکم را به «اجتناب» تغییر میدهد.
- نگاشت آلرژنها: پروفایل کاربر، آلرژنها را به کلماتی که پشت آنها پنهان میشوند متصل میکند. برای بادامزمینی، کلماتی مثل «ساتای»، «groundnut» و «arachis» تعریف شدهاند. برای آجیلهای درختی، کلماتی چون «پستو»، «پرالین» و «مارزیپان» در لیست هستند.
- منطق سختگیرانه: کد بهگونهای طراحی شده که شبکه ایمنی فقط بتواند حکم را سختگیرانهتر کند، نه سهلانگارانهتر. اگر حکمی ناشناخته باشد یا در رتبهبندی تعریف شده نباشد، بهصورت پیشفرض روی «پرسوجو» قرار میگیرد.
- شفافیت: رابط کاربری بهطور صریح نمایش میدهد که چه زمانی یک غذا توسط شبکه کلمات کلیدی علامتگذاری شده است (مثلاً:
flagged_by: keyword safety net) تا کاربر بفهمد چرا ارزیابی اولیه هوش مصنوعی تغییر کرده است.
استقرار و دسترسی
در بخش استقرار، اپلیکیشن از یک مدل ترکیبی استفاده میکند تا دسترسی را تسهیل کند. اگر یک GEMINI_API_KEY در سیستم موجود باشد، برنامه از مدل Gemma 4 (gemma-4-26b-a4b-it) از طریق API گوگل استفاده میکند. این قابلیت اجازه میدهد اپلیکیشن روی لایه رایگان Render میزبانی شود، زیرا این سرورها فاقد GPU مورد نیاز برای استنتاج محلی هستند. از آنجایی که Gemma 4 در حالت میزبانی فاقد حالت JSON بومی است، کد بهگونهای نوشته شده که اولین بلوک {...} را از پاسخ استخراج کرده و «افکار» داخلی مدل را فیلتر کند.
استقرار روی Render با چندین چالش فنی همراه بود:
- بررسی سلامت (Health Checks): در ابتدا بررسی سلامت به مسیری با رمز عبور اشاره میکرد که منجر به خطاهای 401 میشد. این مشکل با ایجاد یک نقطه اتصال (Endpoint) بدون احراز هویت در مسیر
/healthzحل شد. - متدهای HTTP: بررسی استارتآپ Render یک درخواست
HEAD /ارسال میکند کهhttp.serverپایتون آن را با خطای 501 رد میکند، مگر اینکه متدdo_HEADصراحتاً اضافه شده باشد. - تغییرات API: زمانی که گوگل مدل Gemma 3 را از API خود حذف کرد و باعث خطاهای 404 شد، توسعهدهنده به Gemma 4 مهاجرت کرد و کد را بهروزرسانی نمود تا پیام خطای واقعی ارائهدهنده را نمایش دهد.
برای کمک به کاربران در محیطهای شلوغ رستوران، مدل eleven_flash_v2_5 از ElevenLabs برای تبدیل متن به گفتار با تأخیر کم ادغام شده است. خلاصه صوتی ابتدا موارد «اجتناب»، سپس هر غذای «پرسوجو» به همراه سؤالش و در نهایت موارد «ایمن» را لیست میکند. اگر کاربر آفلاین باشد یا کلید API نداشته باشد، سیستم بهطور خودکار به API داخلی speechSynthesis مرورگر بازمیگردد.
حریم خصوصی و نوآوری باز
به نقل از مستندات پروژه، انتخاب مدلهای وزنهای باز (Open Weights) صرفاً برای حفظ حریم خصوصی دادههای پزشکی است. لیست حساسیتهای تهدیدکننده زندگی، دادههای سلامتی حساسی هستند؛ با اجرای محلی، هیچ دادهای از سختافزار کاربر خارج نمیشود. این رویکرد مشابه راهکاری است که در پروژه Fridge Oracle برای حفاظت از حریم خصوصی رژیمهای غذایی به کار گرفته شد. این امر نیاز به حسابهای کاربری فروشنده، سیاستهای نگهداری داده یا هزینههای API را از بین میبرد.
علاوه بر این، ماهیت باز این خط لوله (Pipeline) اجازه کنترل کامل بر فرآیند استنتاج را میدهد. توسعهدهنده میتواند مدل را با یک تنظیم ساده تغییر دهد؛ مثلاً از MODEL=gemma3:12b برای دقت بالاتر در ماشینهای قدرتمندتر استفاده کند. این سطح از کنترل روی بررسیهای قطعی و دمای مدل، معمولاً در رابطهای چتباتهای بسته در دسترس نیست.
این پروژه نشاندهنده چرخش به سمت «هوش مصنوعی کوچک» است که قابلیت اطمینان و حریم خصوصی را بر تواناییهای عمومی ترجیح میدهد. در واقع، SafePlate یک مدل احتمالی را در یک لایه حفاظتی قطعی (Deterministic) محصور کرده است، زیرا در اینجا هزینه یک «تأیید اشتباه» (False Safe) بسیار زیاد است و نمیتوان تنها به هوش مصنوعی اعتماد کرد. این تلاش برای ایجاد تعادل میان دقت و ایمنی، یادآور تحقیقات درباره تنظیم مرزهای ایمنی در مدلهای زبانی است تا نرخ رد درخواستهای سالم کاهش یابد. کل اپلیکیشن سبک است و تنها از کتابخانه استاندارد پایتون (نسخه 3.9 به بالا) استفاده میکند، به این معنی که برای کاربران محلی هیچ نیازی به pip install نیست و تنها نصب Ollama، اجرای دستور ollama pull gemma3:4b و سپس python3 app.py کافی است.
SafePlate بهعنوان یک جفت چشم دوم طراحی شده است، نه جایگزینی برای پرسیدن از کارکنان رستوران یا حمل اپیپن (EpiPen).
گام بعدی شما
- اگر توسعهدهنده هستید، برای پروژههای حساس (پزشکی/مالی)، مدلهای احتمالی را با یک لایه فیلتر کلمات کلیدی (Hard-coded) ترکیب کنید.
- برای اجرای محلی مدلهای Gemma، ابزار Ollama را نصب کرده و دستور
ollama pull gemma3:4bرا اجرا کنید. - در طراحی رابط کاربری، همیشه دلیل تغییر حکم توسط سیستم ایمنی (مانند flagged_by: keyword safety net) را به کاربر نمایش دهید.
اما چالشهای اجرای مدلهای بینایی-زبانی در سختافزارهای ضعیف حتی پیچیدهتر است — به تحلیل ما دربارهی کوانتش وزنها در مدلهای لبه مراجعه کنید.




گفتگو