تصور کنید دارویی در پرونده مکتوب بیمار ثبت شده، اما پزشک در آخرین جلسه بهصورت شفاهی دستور توقف آن را داده است؛ در چنین شرایطی، یک هوش مصنوعی معمولی با خواندن PDF، داروی خطرناک را همچنان تجویز میکند. Steadywag دقیقاً برای حل این شکاف میان مدارک مکتوب و دستورات زبانی طراحی شده است. این اپلیکیشن که به عنوان یک اثر برای چالش Sanity (مسیر یک و دو) عرضه شد، یک شکست خاص در ثبت سوابق پزشکی را هدف قرار داده است: فاصله میان فایلهای PDF مکتوب و دستورات شفاهی پزشک در اتاق معاینه.
بسیاری از ردیابهای سلامتی تنها بر آنچه در یک سند موجود است تکیه میکنند. با این حال، برای حیوانات خانگی با شرایط پیچیده، خطرناکترین خطاها اغلب از لیستهای مکتوب قدیمی نشأت میگیرند. این اپلیکیشن بر اساس یک مورد واقعی ساخته شده است: تئو، یک سگ ۸ ساله میکس شیتزو که از بیماری کبدی ذخیره مس (copper storage hepatopathy)، پانکراتیت مکرر و تریگلیسیرید بالا رنج میبرد. تاریخچه مراقبتهای تئو در حدود ۱۸۰ صفحه PDF، ایمیلها و دستورات شفاهی پراکنده شده بود که در اتاقهای معاینه داده شده بود.
در دنیای مراقبتهای پزشکی، خطرناکترین خطاها معمولاً از لیستهای مکتوب قدیمی میآیند، نه نبودِ اطلاعات. همانطور که در تحلیلهای قبلی ما دربارهی امنیت دادههای پزشکی اشاره کردیم، تبدیل دادههای غیرساختاریافته به ساختار دقیق، کلید کاهش خطای انسانی است. Steadywag با مدلسازی «نبودِ داده» به عنوان یک رکورد ساختاریافته، این مشکل را حل میکند. توسعهدهنده این پروژه برای مدیریت این پیچیدگی از Sanity — که مثل یک دفترچه یادداشت هوشمند و سازمانیافته است و اجازه میدهد هر تکه اطلاعات در جای درست خود قرار بگیرد — استفاده کرده است.
او سیستمی ساخت که در آن یک دارو میتواند به عنوان «ثبت شده اما داده نشده» علامتگذاری شود، یا یک نتیجه آزمایش در صورتی که متخصصی قول داده باشد اما هرگز آن را تحویل نداده باشد، به عنوان یک «شکاف رکورد» (record gap) ثبت شود. به نقل از مستندات پروژه، این رویکرد باعث میشود هر خلأ در پرونده به یک هشدار فعال برای مراقبتکنندگان و پرستاران حیوانات تبدیل شود. این یعنی تبدیل یک فضای خالی در کاغذبازیها به یک اقدام عملی برای تیم مراقبت.
معماری فنی و ساختار داده
این سامانه بر پایه یک مجموعه داده ساختاریافته در Sanity بنا شده که شامل ۵۱۶ سند در ۲۲ نوع مختلف و یک شیء مشترک است. طبق گزارش توسعهدهنده، این دادهها شامل موارد زیر است:
- ۲۸۸ نتیجه آزمایش
- ۲۶ بازدید دامپزشکی
- ۲۶ ثبت وزن
- ۱۸ مورد دارو
سیستم از دو نقطه اتصال (Endpoint) خاص در Sanity Context برای تغذیه مدل Claude Sonnet 5.5 استفاده میکند: یکی یک نقطه اتصال نمودار در حالت GROQ و دیگری یک پایگاه دانش (Knowledge Base) متشکل از ۲۶ سند راهنمای استناد شده و قوانین رژیم غذایی. این اپلیکیشن بهگونهای طراحی شده است که به عنوان یک برنامه کاربردی فعال، هم روی گوشیهای هوشمند و هم روی کامپیوترها نصب و اجرا شود.
حفاظها و مدلسازی داده
برای جلوگیری از توهم (Hallucination) — یعنی وقتی مدل با اطمینان چیزی میگوید که اصلاً وجود ندارد، شبیه دوستی که خاطرهای را اشتباه تعریف میکند — چندین لایه حفاظی ساختاری تعریف شده است تا مدل از حدس زدن یا ترکیب منابع مختلف اجتناب کند:
- ارجاع به منبع: هر حقیقت شامل یک
sourceNoteاست که نوع سند، تاریخ و سطح اطمینان (تأیید شده، تکمنبع یا متناقض) را ذکر میکند. - مدلسازی خلأها: اسنادی برای ردیابی چیزهایی که در پرونده «نیست» ایجاد شده است. چون نبودِ داده را نمیتوان به روش سنتی جستوجو کرد، آن را به عنوان داده مدل کردند. در حال حاضر ۹ خلأ باز در پرونده تئو وجود دارد.
- تفکیک مسئولیتها: دستورات مکتوب دامپزشک (
medication.writtenInstruction) کاملاً از روتین مراقبتی روزانه خانواده (careRoutine) جدا شده تا توصیههای پزشکی رسمی با مشاهدات خانگی ترکیب نشوند و مدل آنها را با هم مخلوط نکند. - زنجیره شواهد: اشیای
historyChapterوhistoryPatternارجاعات مستقیمی به بازدیدها، آزمایشها و داروهایی دارند که بر پایه آنها بنا شدهاند تا هر ادعای مدل مستقیماً به مدرک متصل باشد. - ثبت تغییرات: یک لاگ تغییرات (
recordUpdate) وجود دارد. هر زمان دامپزشک لیستی را تغییر دهد، کاربر آن را در استودیو بهروز میکند، خلأ را برطرف کرده و ثبت میکند که چه کسی این دستور را داده است. این تغییر در کمتر از یک دقیقه در صفحه اصلی، بخش «امروز» و خلاصه مراقبتها اعمال میشود.
فرآیند Vibe Coding و توسعه
این پروژه با استفاده از Claude Code در محیط ترمینال به عنوان IDE اصلی هوش مصنوعی توسعه یافته است و از یک نمونه مرورگر-پایه Claude برای تأیید خروجیهای بصری استفاده شد. این رویکرد نمونهای از جایگزینی دانش فنی کدنویسی با زبان طبیعی یا همان Vibe Coding است که سرعت توسعه را به شدت افزایش میدهد. توسعهدهنده در نقش مدیر محصول، جزئیات ظریف خانوادگی و دستورات شفاهی را ارائه داد — اطلاعاتی که در هیچ سندی نبود، مانند مشاهدات قبل از حملات بیماری — و هوش مصنوعی کدها، اسکیماها و اسکریپتها را نوشت. در مجموع ۸۹۰۰ خط کد اپلیکیشن و ۱۳۰۰ خط اسکیمای Sanity در دو روز و طی ۴۰ کامیت تولید شد.
برای کنترل استقلال مدل، قانون «برنامهریزی، سپس انتظار» (Plan, then wait) اجرا شد. Claude Code موظف بود هر تصمیم بزرگ درباره پشته فنی، ذخیرهسازی یا دسترسی عمومی را ابتدا طرح کند و منتظر تأیید انسانی بماند. این کار مانع از آن شد که مدل تصمیماتی را نهایی کند که توسعهدهنده آنها را بررسی نکرده است. با این حال، این حجم بالای تولید کد توسط AI میتواند ریسکهای خاص خود را داشته باشد؛ همانطور که در تحلیل تلههای Vibe Coding اشاره شد، ارسال هزاران خط کد بدون تستهای دقیق میتواند منجر به ناکارآمدی سیستم شود. علاوه بر این، مجموعه داده ابتدا توسط اسکریپت و در حالت Dry-run ساخته شد و تنها پس از تأیید صریح بارگذاری گردید. مشاهدات خانوادگی نیز پشت یک پرچم (Flag) قرار داشتند که تا زمان تأیید توسعهدهنده خاموش میماند.
اصلاح خطاها و چالشهای مدل
در مسیر ساخت، چندین نقطه ضعف مدلهای زبانی بزرگ (LLM) آشکار شد. در یک مورد، مدل تمام ۸ گام ابزار خود را صرف جستوجو کرد و در نهایت نتوانست پاسخی برای سؤال «امروز او به چه چیزی نیاز دارد؟» بنویسد. راهکار ساختاری این بود که سقف گامهای ابزار از ۸ به ۱۲ افزایش یابد و گام آخر اجباراً متنی باشد. این چالش شباهت زیادی به مشکلات اتلاف وقت در خروجیهای عاملهای هوش مصنوعی دارد که در پروژههای مشابه برای جلوگیری از دفن شدن پاسخهای اصلی در میان جستوجوهای طولانی، بهینهسازی شدهاند.
توسعهدهنده از پرامپتهای کوتاه و خاصی استفاده کرد که اغلب با بازخوردهای بصری تحریک میشدند. برای مثال، با پرسیدن «چگونه میتوانیم عامل را مفیدتر کنیم... پایگاه دانش جداگانه؟ جستوجوی وب؟ حفاظها؟»، پاسخهای مربوط به غذا را به حالت «حکم اول» تغییر داد (مثلاً: «با قوانین برنامه او سازگار است»، «احتمالاً نه»، «نه»، «نمیتوانم بگویم») و جستوجوی وب را به لیست کوتاهی از منابع دامپزشکی محدود کرد.
سایر پرامپتها بر صداقت و رابط کاربری متمرکز بود. وقتی مدل اشاره کرد که میتواند برچسب یک محصول را جستوجو کند، توسعهدهنده با ارسال اسکرینشات پرسید: «آیا میتوانی این پاسخ را رتبهبندی کنی؟ او اطلاعات برچسب را پیدا نکرد». مدل صادقانه پاسخ خود را رتبهبندی کرد و این منجر به قانونی شد که مدل بهجای تظاهر، لیست ترکیبات را از کاربر بخواهد. همچنین یک شکایت تکخطی همراه با اسکرینشات درباره کارت دارویی در بخش «امروز»، اندازه آن را از ۵۴۰ پیکسل به ۱۵۵ پیکسل کاهش داد در حالی که هشدارها همچنان قابل مشاهده بودند.
چالشهای دیگر شامل موارد زیر بود:
- دادههای ساختگی: پایگاه دانش یک بار یک ردیف «مرزی ۴۰۰-۶۰۰» برای جدول مس کبد اختراع کرد. راهکار: دستور اکید برای عدم افزودن هر محدوده مرجعی که صراحتاً در منبع ذکر نشده است.
- اشتباه در تاریخ: مدل تاریخ «3/10» را بهجای ۱۰ مارس، ۳ مارس خواند. راهکار: تغییر فرمت به نوشتن کامل نام ماه.
- تلهٔ «مفید بودن»: وقتی درباره خوردن انبه توسط سگ سؤال شد و پاسخی در برنامه نبود، مدل سعی کرد با دادههای USDA جواب دهد اما آنها را «غیر از دامپزشک او» برچسب زد. در مورد دیگری، مدل تظاهر کرد که میتواند برچسب یک تشویقی را جستوجو کند. توسعهدهنده قانونی را اجرا کرد که مدل را ملزم میکرد بهجای حدس زدن، لیست ترکیبات را از کاربر بخواهد.
- مشکلات رابط کاربری: بریدگی پاسخها در پنجره چت دسکتاپ با سه اصلاح متوالی (فعال کردن اسکرول صفحه، تغییر کانتینر Flex و باز کردن محدودیت ردیف گرید) حل شد. همچنین مشکلی در عکس تئو وجود داشت که به دلیل مرکز کردن محتوا در جعبهای کوتاهتر از محتوا، بریده میشد.
- تلهٔ فیلتر: نقطه اتصال Sanity Context تنها انواع اسنادی را میبیند که در فیلترش هستند. وقتی انواع جدیدی اضافه شد، مدل صادقانه گزارش داد که «نمیتواند روتین خانواده را بازیابی کند»، که این موضوع توسعهدهنده را متوجه مشکل فیلتر کرد.
- متغیرهای محیطی: Vercel متغیرهای تولید را بهصورت پیشفرض «حساس» علامت میزند و باعث میشود مقادیر خالی برگردند. Claude Code ابتدا این را به عنوان «تنظیم نشده» خواند و زمانی را روی مشکلی غیرموجود تلف کرد تا زمانی که متغیرها به حالت غیرحساس تغییر یافتند.
امنیت و اعتبارسنجی
امنیت از طریق اسکن جامع مخزن کد، تاریخچه git و مجموعه دادههای زنده تأمین شد. هوش مصنوعی ۳۴ مورد ایمیل، شماره تلفن و شماره شناسایی خصوصی را در فایلهای اصلی شناسایی و حذف کرد. همچنین دو مورد IPهای خام بازدیدکننده در Rate Limiter و نبود هدرهای امنیتی مرورگر کشف و اصلاح شد. جالب اینجاست که افزودن هدر امنیتی باعث شکست تستهای لایه (Layout) توسعهدهنده شد (چون به جاسازی اپلیکیشن در یک Frame متکی بود) و او را مجبور کرد به تغییر اندازه مستقیم پنلها روی آورد.
برای سنجش قابلیت اطمینان، یک مجموعه ارزیابی (evals/) شامل ۲۴ سؤال طراحی شد تا تلههای شناختهشده (مانند بلوبری، رژیمهای پیش از تشخیص و تاریخهای داروی Atopica) تست شوند. در فایل README صراحتاً ذکر شده است که «قبول شدن» در این تستها به معنای بینقص بودن سیستم نیست، بلکه به این معناست که سیستم «از تلههای شناختهشده دوری کرده است».
جزئیات نهایی اجرا
Steadywag ابزاری برای ردیابی و آمادهسازی است و بههیچوجه جایگزین تشخیص، دوزبندی یا تجویز دامپزشک نیست. برای حفظ حریم خصوصی، تمام رکوردها ناشناس شدهاند و تنها از نام کوچک و سال تولد تئو استفاده شده است. توسعهدهنده اشاره کرد که اگر دوباره شروع کند، سؤالات ارزیابی را از روز اول مینویسد، ابتدا منابع را مدل میکند تا از ترکیب دادهها جلوگیری شود و اسکن امنیتی را از ابتدای مسیر اجرا میکند.
در مورد فرآیند ساخت، توسعهدهنده از App SDK یا Sanity Workflows استفاده نکرد. در عوض، از یک لاگ تغییرات سفارشی ذخیره شده به عنوان داده (recordUpdate) استفاده کرد. این کار تضمین میکند که وقتی دامپزشک لیستی را تغییر میدهد، بهروزرسانی در کمتر از یک دقیقه در صفحه اصلی، بخش امروز و خلاصه مراقبتها اعمال شود. همچنین وظایف داشبورد مانند ایجاد نقاط اتصال Context و پایگاه دانش بهصورت دستی و طبق یک دستورالعمل گامبهگام (docs/context-setup.md) که توسط Claude Code نوشته شده بود، انجام شد.
این پروژه نشاندهنده چرخش از «پرامپتنویسی ساده» به سمت «مدلسازی دقیق دادهها» است. با تبدیل خلأهای پرونده به دادههای درجهیک، Steadywag سطحی از ایمنی را فراهم میکند که یک سیستم RAG معمولی هرگز به آن نمیرسد.
گام بعدی شما
- اگر از عاملهای هوش مصنوعی برای مدیریت داده استفاده میکنید، بهجای تکیه بر جستوجوی متنی، «نبودِ داده» را به عنوان یک متغیر ساختاریافته مدل کنید.
- برای جلوگیری از توهم مدل در دادههای حساس، لایهای از ارجاع مستقیم (Source Attribution) به هر تکه داده اضافه کنید.
- از متد «Plan, then wait» در تعامل با ابزارهای کدنویسی AI استفاده کنید تا کنترل معماری سیستم از دست شما خارج نشود.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو