تصور کنید در یک جلسه عفو مشروط روبروی زندانی نشستهاید و تنها ۱۵ سؤال فرصت دارید تا بفهمید او واقعاً اصلاح شده یا یک متقلب حرفهای است. این سناریو، هسته اصلی یک پروژه فنی است که در ۱۴ اوت ۲۰۲۶ در وبسایت dev.to منتشر شد و نشان میدهد چگونه میتوان از ضعفهای شناختی انسان در تشخیص دروغ استفاده کرد؛ چرا که انسانها در تشخیص فریب تنها حدود ۵۴٪ دقت دارند، نرخی که به سختی بهتر از پرتاب یک سکه است. در این بازی، هوش مصنوعی به یک پرونده مخفی دسترسی دارد که شما هرگز آن را نمیبینید و اگر نقش او «متقلب» باشد، برنامهریزی شده تا شما را گمراه کند. قانون ساده است: یا حکم آزادی (RELEASE) صادر میکنید یا درخواست را رد (DENY) میکنید؛ سپس حقیقت فاش شده و امتیاز شما محاسبه میشود.
این پروژه در زمانی عرضه شده که توسعهدهندگان از چتباتهای ساده به سمت عاملهای پیچیده و دارای وضعیت (Stateful) حرکت میکنند. در حالی که اکثر برنامههای هوش مصنوعی بر «مفید بودن» تمرکز دارند، این ساختار بر «ثبات شخصیت در محیطهای خصمانه» متمرکز است. همانطور که در تحلیلهای قبلی ما دربارهی امنیت مدلهای بازمتن اشاره کردیم، تمرکز بر ثبات شخصیت، گام بعدی تکامل عاملهاست. در اینجا، هوش مصنوعی زاینده (Generative AI) — مثل بازیگری که نقش یک شخصیت خاص را میپذیرد و تمام رفتارهایش را بر اساس آن تنظیم میکند — نه به عنوان دستیار، بلکه به عنوان شخصیتی با انگیزههای پنهان و «نشانههای رفتاری» (Tells) خاص عمل میکند. این رویکرد یادآور تواناییهای پیشرفتهتر مدلهای تجاری است؛ برای مثال، شبیهسازیهای تجاری اخیر نشان دادند که مدلهایی مانند Claude Opus 5 میتوانند از فریب برای بهینهسازی سودآوری استفاده کنند، که نشاندهنده پتانسیل بالای LLMها در ایفای نقشهای استراتژیک است.
معماری عاملهای چندگانه
این برنامه بر پایه سه نقش مجزا از مدل زبانی بزرگ (LLM) — شبیه کتابخانهداری که میلیاردها صفحه را خوانده و حالا با همان لحن کتابها جواب میدهد — بنا شده است: زندانی، تولیدکننده پیشینه مخفی و یک ناظر اختیاری. توسعهدهنده برای انعطافپذیری بیشتر از الگوی Factory از طریق تابع get_llm() استفاده کرده که یک BaseChatModel از LangChain را برمیگرداند. این ساختار به کاربر اجازه میدهد از طریق یک منوی کشویی در نوار کناری (Sidebar)، به راحتی بین مدلهای GPT-4o، Claude، Gemini یا مدلهای محلی از طریق Ollama و LM Studio جابهجا شود.

جزئیات فنی کارخانه مدلها
طبق مستندات پروژه، تابع get_llm() شش ارائهدهنده مختلف را مدیریت میکند. برای سرورهای محلی مانند Ollama و LM Studio، سیستم از این واقعیت بهره میبرد که آنها نقطه اتصال /v1/chat/completions را ارائه میدهند و بنابراین با OpenAI سازگار هستند تا استنتاج (Inference) — لحظهای که مدل واقعاً جواب تولید میکند — به راحتی انجام شود.
- مدیریت ارائهدهندگان: بسته به انتخاب کاربر، کارخانه از کلاسهای
ChatOpenAI،ChatAnthropicوChatGoogleGenerativeAIاستفاده میکند. - یکپارچگی محلی: برای مدلهای محلی، یک
base_urlسفارشی بهChatOpenAIپاس داده میشود. - مدیریت کلیدها: برای جلوگیری از وابستگی به فایلهای
.envو هزینههای سمت سرور، کلیدهای API از طریق نوار کناری جمعآوری شده و فقط درst.session_stateبرای مدت زمان جلسه ذخیره میشوند. - کلیدهای جایگزین: از آنجایی که برخی SDKها در صورت دریافت رشتههای خالی کرش میکنند، سیستم از عبارت "not-needed" به عنوان کلید جایگزین برای ارائهدهندگان محلی استفاده میکند.
تولید حقیقت پنهان
بازی با یک فراخوانی مخفی LLM شروع میشود که یک پرونده محرمانه را در قالب JSON تولید میکند. این فایل در وضعیت جلسه (Session State) ذخیره میشود و هرگز برای بازیکن قابل مشاهده نیست. پرامپت مورد استفاده، یک طرحواره (Schema) سختگیرانه را میطلبد تا اطمینان حاصل شود که منطق بازی به درستی عمل میکند.
اجزای پرونده مورد
- هویت: نام، سن و نوع جرم (مثلاً: مایا تامپسون، ۳۴ ساله، کلاهبرداری بانکی).
- محکومیت: مجموع سالهای حبس (مثلاً ۸ سال) و مدت زمان سپری شده (مثلاً ۴ سال).
- حقیقت: یک پرچم منطقی
is_genuineو انگیزه واقعی زندانی (مثلاً: «بازگشت به شبکه قدیمی و شروع مجدد کلاهبرداری»). - نقاب: یک داستان پوششی (مثلاً: «عمیقاً پشیمان است و ایمان آورده») و شواهدی از بازپروری، مانند مدیریت باشگاه کتابخوانی زندان یا گذراندن دورههای حسابداری.
- نشانهها (Tells): الگوهای زبانی خاص، مانند استفاده از «ما» به جای «من» هنگام بحث درباره جرم، ارائه یک خط زمانی بیش از حد تمرین شده، یا przerft کردن تقصیر روی قربانیان.
- پروفایل روانشناختی: ویژگیهایی مانند «آرام بودن تحت فشار» یا «توانایی خوب در خواندن آدمها».
به نقل از نویسنده پروژه، چون مدلهای زبانی اغلب در خروجی دقیق JSON دچار مشکل میشوند — و نتایج را در بلوکهای Markdown میپیچند یا جملات اضافی مثل «در اینجا فایل شماست:» اضافه میکنند — یک پارسر منعطف طراحی شده است. تابع _extract_json با استفاده از Regular Expressions، بلوکهای Markdown را حذف کرده و از یک روش برش (Slicing) برای یافتن اولین { و آخرین } استفاده میکند. علاوه بر این، سیستم به صورت تدافعی انواع دادهها را نرمالسازی میکند تا مطمئن شود سن و سالهای حبس به عدد صحیح (Integer) تبدیل شده و نشانهها همیشه به صورت یک لیست ذخیره شوند، حتی اگر مدل تنها یک رشته برگرداند.
مکانیسم انصاف و تعادل
برای اینکه بازیکنان به سادگی حدس بزنند «همه دروغگو هستند»، سیستم تعادل ۵۰/۵۰ بین زندانیهای صادق و متقلب را تضمین میکند. این کار در سطح کد انجام میشود، نه در پرامپت، تا از مشکل «توالی» (Streak) جلوگیری شود؛ وضعیتی که در آن یک پرتاب تصادفی ۵۰/۵۰ ممکن است هشت متقلب را پشت سر هم تولید کند و بازیکن را به یک پیشفرض غلط عادت دهد.
مکانیسم عدالت
تابع choose_genuine() از یک شمارنده جلسه برای جهت دادن به احتمالها به سمت نوعی که کمتر ظاهر شده است استفاده میکند. اگر تعداد زندانیهای صادق (g) و متقلبان (m) کمتر از دو باشد، از یک پرتاب تصادفی استاندارد ۰.۵ استفاده میکند. در غیر این صورت، احتمال را به صورت p = 0.5 + (m - g) * 0.05 محاسبه کرده و آن را بین ۰.۲ و ۰.۸ محدود میکند. این کار توزیع متوازن را بدون اینکه الگو قابل پیشبینی باشد، تضمین میکند.
مهندسی پرامپت برای واقعگرایی
عامل زندانی از یک پرامپت سیستمی (System Prompt) استفاده میکند که مانند یک «برگه شخصیت» طراحی شده است. این پرامپت پرونده مخفی را تزریق کرده و قوانین رفتاری سختگیرانهای ارائه میدهد. توسعهدهنده بر دو اصل مهندسی پرامپت تأکید میکند: اجازه دادن به مدل برای «بد بودن» و تعریف دقیق معنای «طبیعی بودن».
نردههای حفاظتی رفتاری
- منطق شخصیت: متقلبان موظفاند متقاعدکننده، گرم و استراتژیک باشند. زندانیهای صادق باید صادق اما ناقص باشند و از تبدیل شدن به یک شخصیت «قدیسگونه» اجتناب کنند.
- محدودیتهای گفتاری: مدل دستور میگیرد که از تردید، گرامر ناقص و احساسات استفاده کند. پاسخها باید به ۳ تا ۵ جمله محدود شوند تا از سبک «مقاله نویسی AI» فاصله بگیرند.
- سکوت استراتژیک: پرامپت هشدار میدهد که از زیادهگویی پرهیز کند، زیرا ارائه اطلاعات زیاد بدون درخواست کاربر، خود یک «نشانه» (Tell) محسوب میشود.
- منطق واکنشی: اگر بازیکن روی یک تناقض فشار بیاورد، هوش مصنوعی باید طبیعی واکنش نشان دهد — مثلاً تدافعی یا عصبی شود.
- دیوار چهارم: مدل اکیداً منع شده است که به مکانیکهای بازی اشاره کند.
برای حفظ ثبات، عامل از ConversationBufferMemory در LangChain استفاده میکند. این امر تضمین میکند که هوش مصنوعی هر پاسخی را که داده است به یاد آورد. بدون این حافظه، یک زندانی ممکن است با داستان پوششی خود تناقض ایجاد کند و بازی را بیش از حد ساده کند. با وجود حافظه، تناقضات انباشته میشوند و دقیقاً همان نشانههایی را میسازند که یک افسر تیزبین به دنبال آنهاست. در این راستا، تلاش برای کاهش توهمات و افزایش قابلیت اطمینان عاملها حیاتی است؛ برای مثال، سیستم HUQAN توانسته است با رتبهبندی شواهد، توهمات مدلهای کوچکتر را متوقف کرده و آنها را به عاملهایی قابل اعتماد تبدیل کند، که مشابه تلاش این پروژه برای ایجاد ثبات در رفتار عامل است.
ناظر جنایی و تحلیل رفتار
یک عامل دوم به عنوان روانشناس جنایی عمل میکند که از پشت شیشه یکطرفه نظارهگر است. این ناظر تمام متن گفتگو و آخرین پاسخ را دریافت میکند تا یک «نجوا» (Whisper) از بینش ارائه دهد.
محدودیتهای ناظر
- طول: حداکثر دو جمله.
- دامنه: او میتواند به یک نشانه اشاره کند (مثلاً: «همین الان از کلمه ما استفاده کرد»)، اما اکیداً منع شده است که حکم نهایی را صادر کند یا به افسر بگوید که عفو را صادر کند یا خیر.
- قابلیت اطمینان: پرامپت صراحتاً بیان میکند که ناظر «ممکن است اشتباه کند»، تا اطمینان حاصل شود که بازیکن انسانی همچنان استدلال نهایی را انجام میدهد.
- پایداری: فراخوانی ناظر در یک بلوک try/except قرار گرفته است تا در صورت بروز خطا، بدون کرش کردن حلقه اصلی بازی، به صورت بیصدا شکست بخورد.
مدیریت وضعیت و تست
رابط کاربری با استفاده از Streamlit به صورت یک ماشین وضعیت (State Machine) طراحی شده است. چون Streamlit با هر تعامل کل اسکریپت را دوباره اجرا میکند، برنامه توسط اکشنهای بازگشتی (مانند ask ،rule_now ،grant و deny) هدایت میشود. هیچ پایگاهداده یا سیستم حسابی وجود ندارد؛ تمام دادهها — حقیقت، زنجیره، تاریخچه و تعداد نوبتها — در جلسه (Session) زندگی میکنند. این ساختار محلی-محور، نگرانیهای حریم خصوصی و مسائل مربوط به صورتحسابهای سروری را حذف میکند.
افشای حقیقت و حلقه اجتماعی
پس از صدور حکم، بازی یک صفحه افشا (Reveal Screen) را نمایش میدهد که شامل موارد زیر است:
- حکم صادر شده در مقابل حقیقت (اصلاحشونده واقعی در مقابل متقلب ماهر).
- لیستی از نشانههای خاصی که بازیکن متوجه آنها نشد.
- انگیزه واقعی و پروفایل روانشناختی.
- ردیاب دقت جلسه و رتبه قضاوت (مثلاً: «افسر متوسط»).
- یک کارت متنی قابل کپی برای اشتراکگذاری در X (توییتر)، که به بازیکنان اجازه میدهد نتایج و نرخ دقت خود را به اشتراک بگذارند.
تست بدون مصرف توکنها
برای جلوگیری از هزینههای بالای API در زمان توسعه، پروژه تستهای آفلاین را با استفاده از FakeMessagesListChatModel پیادهسازی کرده است. این LLM درون-حافظهای، توالیهای از پیش تعیین شدهای از پیامها را برمیگرداند و اجازه تست قطعی (Deterministic) منطق بازی را میدهد.
ابزارهای تست
- smoke_test.py: منطق خالص، از جمله استخراج JSON از بلوکهای کد، پر کردن پرامپت سیستمی و حافظه گفتگو در نوبتهای مختلف را اعتبارسنجی میکند.
- app_test.py: از
AppTestاستریملیت برای هدایت درخت ویجتها استفاده میکند و بررسی میکند که نبود کلیدها منجر به خطاهای تمیز شود و صفحه افشا پس از صدور حکم به درستی فعال گردد.
این ساختار نشان میدهد که مؤثرترین عاملهای هوش مصنوعی لزوماً آنهایی نیستند که بهترین پرامپتها را دارند، بلکه آنهایی هستند که نردههای رفتاری سختگیرانه و یک ماشین وضعیت قدرتمند دارند. با تعریف «فضای منفی» — یعنی آنچه هوش مصنوعی نباید انجام دهد — توسعهدهنده یک تعامل باورپذیر و انسانگونه ایجاد میکند. با این حال، باید مراقب بود که این محدودیتها یا الگوهای رفتاری منجر به سوگیریهای ناخواسته نشوند؛ پژوهشهای دانشگاه پرینستون هشدار میدهند که مدلهای استدلالی پیشرفته ممکن است سوگیریهای قومیتی را در فرآیندهای تصمیمگیری تشدید کنند، موضوعی که در طراحی سیستمهای تشخیص دروغ و عفو مشروط اهمیت دوچندانی مییابد.
برای کسانی که به دنبال مدرنسازی این پشته (Stack) هستند، نویسنده اشاره میکند که ConversationChain در نسخه 0.2.7 LangChain منسوخ و در نسخه 1.x حذف شده است. پروژه برای پایداری، نسخه langchain>=0.2,<0.4 را تثبیت کرده است، اما مهاجرت به LangGraph یا RunnableWithMessageHistory را برای تکرارهای آینده پیشنهاد میکند.
گام بعدی شما
- اگر توسعهدهنده هستید، سعی کنید یک «عامل متضاد» (Adversarial Agent) بسازید که هدفش نه کمک به کاربر، بلکه حفظ یک راز باشد.
- معماری Factory را برای جابهجایی سریع بین مدلهای محلی (Ollama) و ابری بررسی کنید تا هزینه استنتاج را بهینه کنید.
- از
LangGraphبرای جایگزینی زنجیرههای قدیمی LangChain استفاده کنید تا کنترل دقیقتری روی جریان گفتگو داشته باشید.
اما داستان سختافزاری اجرای این مدلها در مقیاس محلی حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو