محمدمهدی خراسانی

توسعه‌دهنده Full-Stack

توسعه‌دهنده نرم‌افزار

توسعه‌دهنده بک‌اند

توسعه‌دهنده اپلیکیشن موبایل

طراح محصول

طراح تجربه کاربری (UX)

طراح رابط کاربری (UI)

طراح وب

طراح گرافیک

تحلیلگر داده

هوش مصنوعی

بینایی ماشین

یادگیری عمیق

یادگیری ماشین

پردازش زبان طبیعی (NLP)

مشاور توسعه سیستم‌های هوش مصنوعی

تحلیلگر تکنیکال بازارهای مالی

مدیر پروژه فناوری اطلاعات

توسعه‌دهنده بلاک‌چین

برنامه نویس میکروکنترلر

نوشته بلاگ

توهم، سوگیری و سوءاستفاده؛ سه غول پنهان در پروژه های چت باتی!

مرداد ۲۸, ۱۴۰۴ آموزش, تجربه, تخصصی, کدنویسی
توهم، سوگیری و سوءاستفاده؛ سه غول پنهان در پروژه های چت باتی!

توسعه‌ی ربات‌های گفتگوی مبتنی بر مدل‌های زبانی بزرگ (LLM) مثل GPT-4 (OpenAI)، Claude (Anthropic) یا خانواده‌ی LLaMA (متا) امکانات شگفت‌انگیزی به اپلیکیشن‌های هوش مصنوعی می‌دهد. این مدل‌ها می‌توانند مکالمه‌های طبیعی با کاربر داشته باشند و به پرسش‌ها پاسخ دهند. اما هر کسی که با این مدل‌ها کار کرده باشد می‌داند که سه چالش اساسی همیشه سر راه هستند: ۱) توهّم زدن مدل (Hallucination) یا همون پرت‌وپلا گفتن مدل خارج از اطلاعات موجود، ۲) سوگیری ناخواسته‌ی مدل (Bias) نسبت به موضوعات حساس یا بر خلاف خواست ما، و ۳) سوءاستفاده‌ی کاربر یا درخواست‌های خارج از سیاست‌ها که باعث هزینه‌ی اضافی می‌شود. توی این مقاله‌ی خودمونی و کاربردی، قراره این سه مشکل رو بررسی کنیم و ببینیم بهترین راهکارها و ترفندهای به‌روز برای مهار کردن‌شون چیه. مخاطب ما برنامه‌نویس‌های مبتدی تا حرفه‌ای هستن، پس سعی می‌کنیم هم قابل فهم باشه هم مطلب کم نداشته باشه.

اول از همه دو رویکرد کلی برای ساختن همچین ربات‌هایی وجود داره:

  • استفاده از APIهای آماده مثل APIهای OpenAI (مدل‌های GPT-3.5، GPT-4) یا Anthropic (Claude) و غیره. شما به یه مدل قدرتمند روی سرورهای اونا دسترسی دارین و می‌تونین باهاش مکالمه کنین یا حتی مدل رو تا حدی فاین‌تیون (fine-tune) کنین.
  • استفاده از مدل‌های متن‌باز و میزبانی خودتون مثل LLaMA 2، Bloom یا سایر مدل‌های اوپن‌سورس. اینجا کنترل کامل مدل دست خودتونه و می‌تونین اونو روی دیتای خودتون فاین‌تیون کنین و هر جوری خواستین استفاده کنین. البته زحمت راه‌اندازی و منابع محاسباتیش با خودتونه.

هر دوی این رویکردها اون چالش‌های سه‌گانه رو دارن. در ادامه برای هر چالش توضیح می‌دیم که مشکل چیه و چه راه‌حل‌هایی برای هر کدوم (چه در استفاده از API آماده و چه مدل‌های متن‌باز) وجود داره. تمرکز ویژه هم روی مدل‌های OpenAI (GPT) و Claude و LLaMA هست، و اینکه چجوری می‌شه این توصیه‌ها رو حتی در پروژه‌های فارسی به کار برد.

جلوگیری از توهّم مدل و پرت‌وپلاگویی خارج از داده‌ها

یکی از دردسرهای بزرگ LLMها اینه که اگه جواب سوالی رو ندونن، ممکنه به جای «نمی‌دانم» گفتن، یه چیز من‌در‌آوردی با اطمینان تحویل بدن! این پدیده که بهش توهم مدل یا hallucination گفته می‌شه، یعنی مدل یه پاسخ با اعتمادبه‌نفس می‌ده که اصلاً با داده‌های آموزشی یا اطلاعاتی که بهش دادیم قابل توجیه نیست. مثلا ممکنه ازش درآمد شرکت تسلا رو بپرسی، اگه ندونه یه عدد الکی بسازه و با قاطعیت بگه «درآمد تسلا فلان قدر است» که کاملاً اشتباهه. مشخصه که همچین پاسخ‌های نادرستی می‌تونه کاربر رو گمراه کنه و اعتماد به سیستم رو از بین ببره. پس چیکار کنیم که مدل «چرت و پرت نگه» وقتی جواب رو نمی‌دونه؟

راهکارهای عملی برای جلوگیری از توهم مدل:

  • استفاده از روش بازیابی و تولید (RAG): این روش خیلی ترند شده چون کمک می‌کنه مدل روی داده‌های واقعی “گراند” (زمینه‌دهی) بشه و کمتر از خودش حرف دربیاره. ایده‌ی RAG (Retrieval-Augmented Generation) اینه که قبل از پاسخ دادن، ربات ما توی یه پایگاه دانش یا اسناد جستجو می‌کنه و تکه‌های مرتبط رو پیدا میکنه و همراه سوال کاربر به مدل می‌ده. مدل موظفه جواب رو فقط بر اساس اون متون داده‌شده تولید کنه. به زبان خودمونی: به مدل می‌گیم «هر چی لازم داری اینجاست، خارج از اینا چیزی نگو». این کار چندتا فایده داره: اول اینکه اطلاعات به‌روز و اختصاصی رو می‌تونیم به مدل بدیم (مثلا اسناد فنی شرکت خودمون یا مقالات جدید) بدون اینکه نیاز باشه مدل رو از اول آموزش بدیم. دوم اینکه خطای توهم کمتر می‌شه چون مدل به جای حافظه‌ی خودش، داره از یه منبع موثق که دادیم نقل قول می‌کنه. حتماً دیده‌اید که خود ChatGPT با اینترنت (مثل بینگ) وقتی وصل می‌شه کمتر چرت میگه، چون قبلش سرچ می‌کنه!
  • طراحی پرامپت (Prompt Engineering) هوشمندانه: صرف‌نظر از RAG، نحوه‌ی دستور دادن ما به مدل خیلی مهمه. ما می‌تونیم توی پیام سیستم یا دستور اولیه به مدل تاکید کنیم که: ۱) فقط بر اساس اطلاعات داده‌شده جواب بده، ۲) اگه جواب توی اون اطلاعات نبود، صریح بگو «نمی‌دانم» یا «اطلاعات کافی نیست» و ۳) چیزی رو از خودت حدس نزن. به عنوان مثال، مایکروسافت پیشنهاد می‌کنه از چارچوب ICE استفاده کنیم: Instructions, Constraints, Escalation به این معنی که اول دستور و سوال رو واضح بدیم، بعد محدودیت‌ها رو ذکر کنیم (مثلا “تنها از اسناد بازیابی‌شده استفاده کن”) و در نهایت راه فراری تعیین کنیم مثل “اگر مطمئن نیستی بگو نمی‌دانم”. در واقع می‌تونیم توی متن پرامپت همچین چیزی رو بیاریم: *«فقط با تکیه بر متن‌های بالا پاسخ بده. اگر اطلاعات کافی موجود نیست، صریحاً بگو ‘اطلاعات موجود نیست’ و حدس نزن.»*. این کار مدل رو شرطی می‌کنه که به جای توهم زدن، همون «نمی‌دانم» رو بگه و تموم. خیلی از تیم‌های حرفه‌ای تاکید می‌کنن که AI باید یاد بگیره با اطمینان محدودیت‌هاشو اعلام کنه و حدسی جواب نده.
  • تنظیمات مدل (دمای نمونه‌گیری و غیره): اگه دیدین مدل زیادی خلاقیت به خرج می‌ده و جواب‌های بی‌ربط می‌سازه، می‌تونین پارامتر دما (temperature) رو پایین بیارین. Temperature پایین (مثلا ۰٫۲ یا ۰٫۳) خروجی مدل رو محافظه‌کارتر و مبتنی بر شایع‌ترین الگو می‌کنه، در نتیجه کمتر احتمال داره چیز عجیبی ببافه. این ترفند بیشتر برای وقتی خوبه که شما جواب دقیق و واقعی می‌خواید نه جواب خلاقانه. پس برای پرسش‌های دانش‌محور یا فکتی، دما رو پایین تنظیم کنین تا مدل بیشتر به دانسته‌های قطعی تکیه کنه.
  • فاین‌تیون برای راستگویی: در مواردی که خیلی براتون مهمه مدل هیچ اطلاعات نادرستی تولید نکنه، می‌شه خود مدل رو با داده‌های جدید آموزش تکمیلی داد که حالت “راستگویی” و “نمی‌دانم گفتن” درش تقویت بشه. مثلا محققین یه کاری کردن اومدن مدل‌های کوچیک‌تر رو طوری Fine-tune کردن که وقتی جواب رو نمی‌دونن صادقانه ابراز نادانی کنن و این واقعا توهم رو کم کرده. البته فاین‌تیون یه مدل بزرگ مثل GPT-3.5 یا GPT-4 توسط ما ممکن نیست (اونارو فقط خودشون می‌تونن فاین‌تیون کنن)، ولی OpenAI اجازه می‌ده مدل‌های خودش (مثلا davinci یا GPT-3.5) رو با داده‌هاتون یه مقدار فاین‌تیون محدود کنین. برای مدل‌های متن‌باز مثل LLaMA هم می‌تونین کامل یا با تکنیک‌هایی مثل LoRA فاین‌تیون‌شون کنین. ایده اینه که تو داده‌های آموزشی، مواردی داشته باشین که سوالاتی خارج از دانش پرسیده شده و جواب «نمی‌دانم» توش هست، تا مدل یاد بگیره این الگو هم اوکیه. حتی یک مقاله جدید (MBIAS) نشون داده با اضافه کردن تعداد کمی مثال‌های آموزشیِ حاوی ملاحظات ایمنی و صداقت، می‌شه خروجی مدل رو ۳۰٪ کمتر bias یا توهم داشت و در عین حال اطلاعات اصلی رو حذف نکرد. خلاصه که آموزش تکمیلی می‌تونه مدل رو محتاط‌تر و قابل اعتمادتر کنه (البته باید حواستون باشه به «فراموشیCatastrophic Forgetting» دچار نشه که مطالب اصلی خودش یادش بره، تعادل مهمه).
  • بررسی خودکار پاسخ‌ها (Evaluation & Feedback): در محیط پروداکشنی، شما نمی‌تونین به حدس خود مدل ۱۰۰٪ اعتماد کنین، بهتره مکانیزم‌هایی داشته باشین که جواب‌هاش رو چک کنن. مثلا می‌تونین یک گام بازبینی اضافه کنین که پاسخ مدل رو با منابع موجود مطابقت بده. بعضی‌ها میان یه مدل دیگه یا یه الگوریتم ساده‌تر رو بکار می‌گیرن که ببینه آیا ادعاهای پاسخ در منابع داده‌شده بود یا نه (به این روش گاهی Fact-checking خودکار می‌گن). یا مثلا ابزارهای اوپن‌سورس مثل RAGAS هستن که خروجی سیستم‌های RAG رو تحلیل می‌کنن و میزان هذیان بودن جواب رو نمره می‌دن. هر چند این جور ابزارها کامل نیستن، ولی اگه واقعا دقت حیاتی باشه (مثلا در کاربرد پزشکی یا حقوقی)، حتماً یه مرحله‌ی بازبینی خودکار یا حتی Human in the Loop (بازبینی توسط آدم) قرار بدین که جلوی جواب اشتباه رو قبل از دادن به کاربر بگیره. مثلا می‌تونین تعیین کنین که اگر مدل خیلی مطمئن جواب می‌ده ولی هیچ رفرنسی نیاورده یا مدرکی تو داده‌ها نبوده، اون پاسخ برای تأیید انسانی کنار گذاشته بشه.

در مجموع، ترکیب RAG + Prompt خوب + تنظیم درست مدل تا حد زیادی توهم رو کنترل می‌کنه. حتی مدل‌های قدرتمند OpenAI و Claude هم با این روش‌ها قابل اعتمادتر می‌شن. یادتون باشه که «مدل هر وقت جواب رو نمی‌دونه بهتره راحت بگه نمی‌دونم» ، اینو توی هر مرحله بهش یادآوری کنین. کاربران هم بیشتر اعتماد می‌کنن به سرویسی که صادق باشه تا اینکه با قطعیت بهشون اطلاعات اشتباه بده.

در ضمن، مدل‌های بزرگ مثل GPT-4 اطلاعات عمومی انگلیسیشون عالیه ولی توی فارسی یا اطلاعات محلی ممکنه کم بیارن. پس احتمال توهم در حوزه‌هایی که داده‌ی فارسی کافی ندارن بیشتره. RAG اینجا خیلی کمک می‌کنه که مثلا مقالات یا ویکی‌پدیای فارسی رو بدیم دستش وگرنه ممکنه از حافظه‌ی انگلیسیش چیز نادرستی رو ترجمه کنه و تحویل بده. پس در کاربردهای فارسی حتی بیشتر به مستندسازی و منبع‌دهی اهمیت بدین.

جلوگیری از سوگیری مدل و جانبداری ناخواسته

مدل‌های زبانی روی حجم عظیمی از متن‌های اینترنتی و کتاب و … آموزش دیدن، برای همین طبیعیه که یه سری سوگیری‌ (Bias) انسانی هم توی اون‌ها نهادینه شده باشه. مثلا ممکنه نسبت به یه جنسیت، نژاد یا ملیت خاص کلی استریوتایپ توی دیتای آموزشیشون بوده باشه و حالا مدل ناخودآگاه تو خروجی تکرار کنه. یا مثلا دیده شده ChatGPT در بحث‌های سیاسی کمی متمایل به برخی جناح‌ها جواب می‌ده؛ حتی اگه ما مستقیم هم جهت ندیم ممکنه جواب‌هاش از لحاظ ادبیات یا محتوا جانب‌دارانه باشه. این مسئله هم از نظر اخلاقی و هم برای اعتماد کاربران مشکله. فرض کنین یه چت‌بات استخدام دارین که رزومه‌ها رو بررسی می‌کنه اما به شکل نامحسوس مردها رو برای موقعیت‌های مدیریت شایسته‌تر در نظر می‌گیره، این می‌تونه تبعیض‌آمیز و خطرناک باشه. پس باید تا حد امکان سوگیری‌های نامطلوب مدل رو خنثی کنیم یا کاهش بدیم، خصوصاً اونایی که خلاف سیاست‌ها یا خواست صریح ما هستن.

چند تا بهترین روش برای مقابله با Bias مدل:

  • استفاده از داده‌های متنوع و متعادل: چه در پرامپت و مثال‌هایی که به مدل می‌دیم (مثلا few-shot prompts)، چه در دیتاست فاین‌تیون، حتماً تنوع رو رعایت کنین. یعنی اگه می‌خواین مدل نسبت به مثلاً جنسیت bias نداشته باشه، در داده‌هاتون هر دو جنس (یا همه جنسیت‌ها) رو در موقعیت‌های مختلف بیارین. یا اگر دارین مدل رو برای کاربرد فارسی آماده می‌کنین، مطمئن شین هم از متون عامیانه، هم رسمی، هم از نویسندگان با دیدگاه‌های مختلف تو دیتا هست که مدل فقط لحن یا نظر یک‌طرفه رو یاد نگیره. برای RAG هم همین طور: پایگاه دانشی که می‌سازین از منابع مختلف با دیدگاه‌های گوناگون باشه. مثلا اگه ربات جواب‌های پزشکی می‌ده، هم از تحقیقات غربی داشته باشین هم منابع فارسی یا طب سنتی (البته با ذکر معتبر بودن یا نبودنش) که جانب یک کدوم رو ناخودآگاه نگیره. تنوع داده یکی از اولین قدم‌ها در کاهش سوگیریه.
  • آزمون و کشف سوگیری‌ها (Bias Detection): پیدا کردن باگ‌های مدل در زمینه‌ی bias بعضی وقتا سخته چون مدل ممکنه تو پرسش‌های مستقیم خودش رو لو نده. بهتره خودمون مدل رو رد تیم (Red Team) کنیم، یعنی با ورودی‌هایی محک بزنیم که پتانسیل ایجاد سوگیری دارن. پژوهشگرها مثلا میان یه سوال رو در چند حالت مختلف می‌پرسن ، فقط یه متغیر رو عوض می‌کنن مثل جنسیت در جمله، بعد خروجی‌ها رو مقایسه می‌کنن که آیا تفاوت معناداری داره؟ شما هم می‌تونین همچین تست‌هایی طراحی کنین. مثلا از چت‌باتتون ۲۰۰ بار بخواید برای اسم‌های ایرانی مختلف (زنونه و مردونه، یا اقوام مختلف) یه متن یا توصیه بنویسه و ببینید فرق لحن یا محتوا داره یا نه. یا در مورد لهجه‌ها یا گویش‌ها تست کنین (مطالعه‌ای بوده که مدل‌های زبانی نسبت به لهجه‌های غیراستاندارد عملکرد ضعیف‌تری دارن که خودش یه جور bias زبانیه). ابزارهای خودکاری هم هستن که به این کار کمک می‌کنن؛ مثلا سرویس‌های آنلاینی که هزاران ورودی مختلف (شامل موارد حساس) رو می‌فرستن و خروجی‌ها رو از نظر جانبداری امتیازدهی می‌کنن. حتی کتابخونه‌هایی مثل Promptfoo APIای دارن که می‌تونین متن ورودی/خروجی رو بدین و اونا از مدل‌های طبقه‌بند برای شناسایی محتوای جانبدارانه یا سمی استفاده می‌کنن و فلگ می‌کنن. به طور خلاصه، اول باید بفهمیم مدل کجا Bias داره تا بعد بتونیم رفعش کنیم.
  • راه‌اندازی گاردریل‌ها و فیلترهای محتوایی: مشابه بحث محتوای نامناسب (که در بخش بعد بیشتر می‌گیم)، برای خروجی‌های مغرضانه یا توهین‌آمیز هم باید گاردریل داشته باشیم. یعنی اگه مدل حرف نامناسبی زد یا فرضا پاسخ داد «زن‌ها در مدیریت ضعیف‌ترند» سیستم ما بلافاصله اینو تشخیص بده و جلوی نمایش یا ادامه‌ی اون سبک پاسخ رو بگیره. این کارو می‌شه با همون APIهای content moderation انجام داد (مثلا OpenAI Moderation فقط فحش و خشونت و… رو نمی‌گیره، بعضی نشونه‌های hate speech یا محتوای تحقیرآمیز رو هم برمی‌گردونه). یا می‌شه مدل رو طوری تنظیم کرد که خودش این موارد رو تصحیح کنه ، مثلا Anthropic Claude از چیزی به اسم AI قانون اساسی یا Constitutional AI استفاده می‌کنه که یه سری اصول اخلاقی براش تعریف شده و موقع تولید جواب، مدل به اون اصول مراجعه می‌کنه تا مطمئن بشه جوابش منصفانه و بی‌طرفانه و بدون آسیب رسوندن کلامیه. یکی از اون اصول حتماً عدم سوگیری نژادی/جنسی و رفتار محترمانه‌س. به همین خاطره که Claude نسبت به ورودی‌های نامناسب یا جانبدار معمولاً بهتر عمل می‌کنه و اصلاح‌شده‌تر جواب می‌ده. شما هم می‌تونین یه جور «قانون‌نامه» برای مدل خودتون درست کنین ، مثلا توی پرامپت سیستم یه لیست از خط قرمزها و ارزش‌ها بگذارین: «همیشه بی‌طرف باش مگر اینکه کاربر نظر شخصی بخواد»، «هیچ گروه قومی یا عقیدتی رو برتر نشان نده» و از این قبیل. این یه جور متاپرامپت می‌شه که مدل رو در چهارچوب نگه می‌داره. البته توجه کنین اگه کاربر خیلی اصرار کنه یا prompt injection بزنه ممکنه این خطوط قرمز شکسته بشه، ولی داشتنش بهتر از نداشتنه.
  • اصلاح Bias با فاین‌تیون یا روش‌های فنی: اگه بعد از موارد بالا دیدین باز هم مدل bias ناجور داره، شاید نیاز باشه دست به کار شین و مدل رو مجدداً آموزش بدین یا از روش‌های تکنیکی بهره ببرید. مثلا برای مدل‌های متن‌باز، یه روش اینه که embeddingهای مدل رو Debias کنین. این کار تو تحقیقات انجام شده که بیان بردارهای مربوط به مفاهیم حساس (مثل جنسیت) رو در فضای برداری مدل طوری تنظیم می‌کنن که تأثیرش کم بشه. یا روش Adversarial Training: یه شبکه‌ی تشخیص bias رو همزمان آموزش می‌دن که خروجی مدل رو بررسی کنه و اگه bias دید به مدل اصلی فیدبک منفی بده تا یاد بگیره اونطور جواب نده. اینا البته کارهای پیچیده و زمان‌برین ولی اگه پروژه‌ی حساس (مثل پزشکی، یا تصمیم‌گیری مالی) دارین، سرمایه‌گذاری روش می‌ارزه. برای اکثر توسعه‌دهنده‌ها، همون Fine-tune با داده‌های دستورالعملی کفایت می‌کنه: مثلا OpenAI خودش مدل GPT-4 رو با بازخورد انسانی و کلی نمونه‌ی جهت‌دهی شده تربیت کرده که خروجی‌هاش از نظر ارزش‌های اخلاقی معقول باشه. برای مدل خودتون هم می‌تونین چند صد یا چند هزار نمونه Q/A که پاسخ‌های “صحیح سیاسی” (politically correct) یا بی‌طرف داره جمع کنید و مدل رو روی اونها tuning کنید که حداقل در موضوعات مشخصی سوگیری رو کنار بذاره. ضمناً RLHF (یادگیری تقویتی از بازخورد انسانی) هم یکی از قوی‌ترین ابزارها برای تنظیم ظرافت‌های مدل از جمله ادب و عدم سوگیری بوده؛ البته اجرای RLHF در عمل سخت و گرونه ولی بدونین که مدل‌های پیشرفته مثل GPT-4، Claude و LLaMA-2-Chat همه به کمک RLHF یا تکنیک‌های مشابه حسابی روی خروجی‌هاشون کار شده تا قابل قبول‌تر بشن.

خلاصه این بخش اینکه شما به عنوان توسعه‌دهنده‌ی یه چت‌بات باید از همون اول حواست به Bias باشه. هم در دیتایی که استفاده می‌کنی رعایتش کنی، هم بعد از ساخت ربات با تست‌های مختلف ضعف‌هاشو پیدا کنی، هم یه سری محافظ و راهنما برای رفتار مدل بذاری که حتی‌الامکان بی‌طرف بمونه. اینطوری کاربران احساس می‌کنن با یه دستیار منصف و قابل اعتماد حرف می‌زنن، نه یه ربات که پیشفرض‌های یک طرفه داره.

مدل‌های بزرگ تجاری (GPT-4 و Claude) عمدتاً با داده‌های انگلیسی عالی تربیت شدن ولی در مورد زبان فارسی ممکنه بعضی Biasهای فرهنگی غربی رو داشته باشن یا نسبت به بعضی موضوعات داخلی ایران درک درستی نداشته باشن. مثلا احتمال داره نسبت به مذهب یا اقوام ایرانی یه طرف‌داری یا بی‌اطلاعی توشون باشه چون دیتاشون کمتر بوده. اگر چت‌باتتون برای کاربر فارسیه، حتماً اینو در نظر بگیرین. شاید لازم باشه یه مقدار Fine-tune محلی‌تر انجام بدین یا حداقل دستورهای سیستم رو سفارشی به فرهنگ خودمون بنویسین. برای نمونه، شاید بخواید مدل در زمینه‌های سیاسی داخل کشور بی‌طرفی کامل نشون بده؛ اینو حتماً باید توی دستورالعمل‌هاش ذکر کنین چون ممکنه پیشفرض مدل (به خاطر داده‌های اینترنت) چیز دیگه‌ای باشه.

مدیریت سوءاستفاده کاربران و صرفه‌جویی در هزینه‌ی پردازش

چالش سوم زمانی پیش میاد که کاربر یا سوءنیتی داره یا نادانسته سؤالات/دستورات خارج از چارچوب قوانین سرویس از ربات می‌خواد. دو تا دغدغه اینجا مطرحه: یکی حفظ امنیت و اخلاق (که مدل محتوای نامناسب، خطرناک یا خلاف قانون تولید نکنه)، یکی هم هزینه‌ها که الکی منابع پردازشی و پولمون صرف جواب دادن به درخواست‌هایی که نباید پاسخ داده بشن، نشه. مخصوصاً اگه دارین از API پولی مثل OpenAI استفاده می‌کنین، هر پاسخ مدل براتون هزینه‌برداره. چه فایده که ما پول بدیم مدل یه جواب تولید کنه که نه باید به کاربر نشون بدیم (چون نقض قوانینه) و نه رضایت‌بخشه؟ بهتره این جور تلاش‌ها رو زود شناسایی کنیم و جلوی ادامه‌شون رو بگیریم.

بهترین رویکرد برای حل این موضوع یه مکانیزم چندلایه‌ی نظارتیه که هم ورودی‌های کاربر رو چک کنه، هم خروجی‌های مدل رو. خوشبختانه خود OpenAI و سایر توسعه دهنده‌ها ابزارهایی برای این کار دارن. مثلاً OpenAI یه چیزی داره به اسم Moderation API که به صورت جداگونه می‌تونین متن رو بهش بدین، می‌گه آیا حاوی محتوای ممنوع (مانند فحاشی، تنفر، خشونت شدید، محتوای جنسی نامناسب، خودکشی و غیره) هست یا نه. خبر خوب اینه که این اندپوینت رایگانه و استفاده ازش هزینه‌ای نداره، پس حتماً قبل از هر ارسال پیام کاربر به مدل اصلی، یه چک توسط این API انجام بدین. اگر متن مشکل‌دار بود، اصلاً مدل GPT/Claude رو صدا نکنین ، همین‌جا متوقف شین یا یه پاسخ از پیش تعیین‌شده برگردونین که «متأسفم، نمی‌تونم به این درخواست پاسخ بدم». اینجوری هم هزینه‌ی پردازش اضافه نمی‌دین هم ریسک اینکه مدل چیزی تولید کنه که دردسر شه از بین میره.

برای مدل‌های متن‌باز که چنین سرویسی در دسترس نیست، می‌تونین از یه طبقه‌بند محتوای از پیش آموزش‌دیده استفاده کنین یا حتی خلاقانه‌تر، دوباره از APIهای آماده کمک بگیرین. مثلا خیلی‌ها میان ترکیب می‌کنن: مدل اصلیشون لوکاله اما برای فیلتر کردن ورودی/خروجی call می‌زنن به همون OpenAI Moderation (چون رایگانه) یا از سرویس‌هایی مثل Perspective API گوگل استفاده می‌کنن. اگه نمی‌خواین وابسته به سرویس خارجی باشین، می‌تونین یه مدل کوچیک (مثل RoBERTa یا حتی مدل‌های چندزبانه) رو روی دیتای تشخیص ناسزا/نفرت فاین‌تیون کنین که قبل از مدل بزرگ اجرا بشه. توی HuggingFace هم یه سری مدل آماده برای دیتکشن محتوای سمی هست. اینا شاید به دقت OpenAI Moderation نرسن ولی تا حد خوبی چیزای تابلو رو می‌گیرن.

علاوه بر فیلتر محتوا، اقدامات دیگه‌ای هم هست برای جلوگیری از سوءاستفاده:

  • تعیین نرخ و محدودیت: حواستون باشه وقتی سرویس چت‌بات رو می‌ذارین آنلاین، ممکنه یه سری افراد یا بات‌ها شروع کنن به بمباران کردنش با درخواست (یا حتی حملات مخرب). اگه جلوشونو نگیرین هم هزینه تون می‌ره بالا هم ممکنه اطلاعات ناخواسته لو بره. پس حتماً محدودیت نرخ (Rate Limiting) بذارین که هر کاربر یا هر IP نتونه بیش از X درخواست در دقیقه داشته باشه. سرویس‌هایی مثل Cloudflare حتی فایروال مخصوص APIهای هوش مصنوعی ارائه دادن که حملات این مدلی رو تشخیص می‌ده و بلاک می‌کنه. می‌تونین از reCAPTCHA قبل شروع چت استفاده کنین که روباتها نتونن سوءاستفاده کنن. به طور کلی، مثل هر سرویس دیگه‌ای مکانیزم‌های احراز هویت و محدودیت رو جدی بگیرین، چون مدل‌های زبانی جذابن و ممکنه هدف انواع شیطنت قرار بگیرن.
  • راهنمایی و اخطار به کاربر: همیشه قرار نیست نیت کاربر بد باشه؛ شاید ندونه چی مجازه چی نه. بهتره ربات شما در مواجهه با درخواست‌های خارج از قوانین، مودبانه کاربر رو راهنمایی کنه. یعنی به جای اینکه یهو کاربر رو بن کنه، اول یه جواب کوتاه بده که «متأسفم، نمی‌تونم در این مورد کمکتون کنم چون قوانین سرویس اجازه نمی‌ده.» و شاید یه پیشنهاد جایگزین بده اگه ممکنه. مثلا اگه کاربر درخواست اطلاعات شخصی فردی رو داره، ربات بگه «نمی‌تونم اطلاعات خصوصی کسی رو افشا کنم. در عوض می‌تونم در مورد موضوعات عمومی مرتبط راهنماییت کنم.» اینجوری با حداقل هزینه (یک پاسخ کوتاه)، گفتگو رو به مسیر ایمن هدایت می‌کنین. اکثر مدل‌های معروف از قبل یاد گرفتن در برابر درخواست‌های نامناسب یه پیام عذرخواهی و عدم امکان پاسخ بدن (حتماً دیدین که ChatGPT مثلا می‌گه «عذرخواهی می‌کنم، من قادر به انجام این درخواست نیستم»). شما می‌تونین همون رو توی پرامپت سیستم تقویت کنین که «اگر کاربر چیزی خواست که تو خلاف قوانینمونه، مؤدبانه عذرخواهی کن و ادامه نده». Claude و GPT-4 خودشون این کار رو تا حد زیادی می‌کنن ولی محض احتیاط گفتنش خوبه.
  • قطع دسترسی در صورت تکرار تخلف: اگه کاربر گوش نکرد و باز هم خواست قوانین رو دور بزنه یا سوءاستفاده کنه، باید قاطع باشین. می‌تونین سیاستی بذارین که مثلا بعد از دو بار اخطار، مکالمه خاتمه پیدا کنه یا حتی اون کاربر در سیستم شما بلاک بشه. این دیگه بستگی به خط‌مشی شما داره. مثلا در یک سرویس ممکنه نخواین کاربر رو کامل از دست بدین، پس فقط همون جلسه رو می‌بندین و می‌گین «برای ادامه‌ی استفاده باید تعهد بدی قوانین رو رعایت می‌کنی». در سرویس دیگه‌ای ممکنه همون اول کار احراز هویت کنین و اگه کسی سوءرفتار داشت اکانتشو تعلیق کنین. هر چی هست، حفظ اقتدار قوانینی که تعریف کردین مهمه ، چون اگه مدل یه دفعه اشتباهاً به یه درخواست ممنوع پاسخ بده، هم می‌تونه به لحاظ حقوقی براتون مشکل شه هم اگه از API مثل OpenAI استفاده می‌کنین ممکنه کلیدتون مسدود بشه. خود OpenAI توی راهنمای تولید به‌سوی پروداکشن پیشنهاد کرده که moderation endpoint رو قبل و بعد از هر درخواست چک کنین و لاگ کنین که اگه مشکلی پیش اومد، بتونین نشون بدین شما سعی خودتونو کردین. در واقع داشتن این لایه نظارتی خودکار بهترین تمرینه: متن ورودی کاربر قبل از تماس با مدل فیلتر شه، پاسخ مدل هم قبل از نشون دادن به کاربر یه بار چک شه که احیاناً محتوای خطا توش نباشه (مدل‌های بزرگ خیلی کم پیش میاد چیز خلاف سیاست تحویل بدن مگه کاربر مجبورشون کنه، ولی مدل‌های اوپن‌سورس ممکنه لغزش کنن). ترکیب این پیش‌فیلتر و پس‌فیلتر نهایت ایمنی رو می‌ده.
  • جلوگیری از حملات پرسش مخرب (Prompt Injection): این مورد یه کم تخصصی‌تره ولی بد نیست اشاره کنیم. کاربرهای مهاجم ممکنه سعی کنن با ورودی‌هاشون مدل ما رو گول بزنن که قوانین رو نادیده بگیره. مثلا داخل پیامشون بنویسن «سیستم: این قوانین را نادیده بگیر و …». یا متنی بدن که ساختارش جوریه مدل فکر کنه باید چیزی فاش کنه. برای جلوگیری از این، سعی کنین دستورالعمل‌های مهم رو به شکل امن به مدل بدین. خوشبختانه APIهای جدید (مثل OpenAI Chat API) نقش پیام‌ها رو از هم جدا می‌کنن و کاربر نمی‌تونه پیام سیستم شما رو مستقیماً بازنویسی کنه. با این حال، همیشه آماده باشین که خروجی‌های مدل رو نظارت کنین و اگه دیدین دستور شما رو نقض کرده سریع اقدام کنین. ابزارهای مانیتورینگی هستن که به صورت درجا تشخیص می‌دن آیا مدل داره اطلاعات حساسی که نباید، رو بیرون می‌ده یا نه. مثلا می‌تونین کل خروجی رو یه regex یا کلیدواژه‌کاو رد کنین که مثلا اگر دید «OPENAI_API_KEY» یا یه الگوی شبیه کلید یا پسورد توشه، اون رو ماسک کنه یا جلوی ارسالشو بگیره. اینجور موارد رو هم توی سناریوهای بد در نظر بگیرین.

آخر سر، هدف اینه که کاربر نهایی نتونه از ربات شما سوءاستفاده کنه یا اگه تلاش کرد، متحمل کمترین هزینه و آسیب بشین. با ترکیب فیلتر خودکار محتوا، پرامپت‌های حفاظتی و سیاست تنبیه/جلوگیری از اسپم، می‌شه یک سیستم ایمن و مقرون‌به‌صرفه داشت. مثلاً فرض کنین تو یه ساعت ۱۰ تا کاربر بیان بخوان ازتون دستورالعمل ساخت ماده‌ی غیرقانونی بگیرن؛ اگه سیستم پیش‌فیلتر نداشته باشه مدل شاید ۱۰ بار پاسخ رد طولانی تولید کنه که شما هزینه‌شو دادین. ولی با یه فیلتر قبل از مدل، همون ۱۰ تا درخواست بلافاصله رد می‌شه بدون صرف حتی یک توکن از GPT ، در عوض شما یه پیام ثابت از سرور خودتون می‌دین «این درخواست مجاز نیست». به همین ترتیب، اگه یکی بخواد ۱۰۰۰ بار سوال کنه سرورها رو مشغول کنه، Rate Limit جلوشو می‌گیره. اینطوری هوشمندانه منابع رو فقط خرج پاسخ‌های مفید می‌کنین.

 

توسعه‌ی یک ربات گفتگو با هوش مصنوعی کار شگفت‌انگیزیه ولی آسون نیست. سه غول توهم، سوگیری و سوءاستفاده همیشه کمین کردن که پروژه‌ی شما رو خراب کنن. تو این مقاله سعی کردیم راهکارهای عملی و آزموده شده برای رام کردن هر سه رو به زبون ساده مرور کنیم:

  • با منبع‌دهی به مدل (RAG) و دستور مناسب، جلوی پرت‌وپلا گفتنش رو می‌گیریم و یادش می‌دیم به جای حدس الکی، راستش رو بگه «نمی‌دونم».
  • با داده‌ی متنوع، دستورالعمل‌های بی‌طرفی و فیلتر کردن خروجی‌ها، نمی‌ذاریم biasهای ناخواسته تو جواب‌ها نمود کنه و برای کاربرا عدالت و اعتماد رو حفظ می‌کنیم.
  • و با نظارت خودکار روی ورودی/خروجی و سیاست‌های سختگیرانه در برابر تخلف، هم جلوی خطرات اخلاقی و قانونی رو می‌گیریم هم پولمون رو پای پاسخ‌های بیهوده هدر نمی‌دیم.

خبر خوب اینه که مدل‌های مطرح مثل GPT-4 و Claude-2 همین الان هم نسبت به نسل‌های قبلی خیلی کم‌خطاتر و امن‌تر شدن چون روی همین موارد حسابی کار شده. مدل‌های متن‌باز جدید مثل LLaMA-2-Chat هم با اینکه آزادانه در اختیار ما هستن، از قبل مقداری تنظیم شدن که دستورهای مضر رو رد کنن و پاسخ مودب بدن. اما نباید صرفاً به تنظیمات پیش‌فرض اونا تکیه کنیم ، هر مدلی رو که به کار می‌گیرین، شما به عنوان برنامه‌نویس نقش ناظر نهایی رو دارین. با استفاده از ترکیب روش‌های بالا، می‌تونین یک دستیار هوش مصنوعی حرفه‌ای و مسئولانه بسازین که هم کاربرا دوستش داشته باشن هم خیالتون از بابت خطاها راحت‌تر باشه.

فراموش نکنیم که این حوزه به سرعت در حال پیشرفته. هر روز ابزارها و متدهای جدیدی برای مهار بهتر hallucination، کاهش bias یا افزایش ایمنی منتشر می‌شه. پس به‌روز موندن خودش یه Best Practice مهمه! امیدوارم این مقاله برات مفید بوده باشه و بتونی نکاتش رو تو پروژه‌های فارسی خودت به کار ببندی. موفق باشی و رباتت بی‌توهم و بی‌طرف و سالم بمونه!

برچسب ها:
درج دیدگاه