امید میراب زاده اردکانی
امید میراب زاده اردکانی
خواندن ۱۰ دقیقه·۳ سال پیش

آشنایی با توسعه دستیار هوشمند مکالمه‌ای با استفاده از پلتفرم رسا - قسمت دوم

بخش درک زبان طبیعی

توسعۀ دستیار هوش مصنوعی در رسا با طراحی مکالمه شروع می‌شود.

در فرایند طراحی مکالمه، دربارۀ این‌ها سؤال می‌شود:

  • کاربران چه کسانی هستند؟
  • برای چه منظوری از دستیار استفاده می‌کنند؟

طراحی مکالمه گام بسیار مهمی است که به شما کمک می‌کند تا مقصود و کاربردپذیری (usability) دستیارتان را بهتر درک کنید.

بهترین راه برای شروع طراحی مکالمه این است که به چیزهایی که از قبل دربارۀ مخاطب بالقوۀ خود می‌دانید رجوع کنید.

برای مثال:

  • کار کردن با خبره‌های دامنه و اهرم کردن دانش آن‌ها دربارۀ کاربران شما؛
  • بیشترین کوئری‌های جست‌وجوی کاربران در وب‌سایت؛
  • رایج‌ترین سؤال‌هایی که از تیم پشتیبانی مشتریان پرسیده شده است.

اطلاعاتی نظیر این‌ها به شما کمک می‌کند تا رایج‌ترین سؤال‌هایی را که ممکن است مخاطب بالقوه از دستیار شما بپرسد تعریف کنید.

در حالت کلی، طراحی مکالمه کاری چالشی است، چراکه در زندگی واقعی، مکالمه‌ها معمولاً از تعاملات رفت‌وبرگشتی زیادی شکل می‌گیرند؛

به همین دلیل، توصیه می‌شود در مراحل اولیه به مکالمه‌های ساده‌ اکتفا کنید و دستیارتان را توسعه دهید و آن را در اولین فرصت در اختیار کاربرانتان قرار دهید.

همان‌طور که در مطلب اول به‌اختصار اشاره شد، بخش درک زبان طبیعی مبتنی بر دو مفهوم اینتنت و انتیتی عمل می‌کند.

تعریف اینتنت و انتیتی‌ها در رسا در فایل nlu.yml انجام می‌شود. قالب تعریف انتیتی به این صورت است:

[entity_name] (entity_type)

نکته‌هایی که در زمان ایجاد مجموعۀ تعلیم باید به آن‌ها دقت کنید:

  • برای شروع، معمولاً ۵ تا ۱۰ نمونه به‌ازای هر اینتنت عدد خوبی است.

واضح است که هرچه تعداد نمونه‌ها بیشتر باشد بهتر است، اما هم‌زمان باید اطمینان پیدا کنید داده‌ای که برای تعلیم مدل به کار گرفته می‌شود دادۀ باکیفیتی باشد.

نیازی نیست که تمامی تنوع‌های هر ورودی بخصوص را بنویسید تا اینتنت را تعلیم دهید.

  • بررسی کنید که نمونه‌ها مربوط به اینتنت‌های واقعی (actual intent) باشند.
  • اطمینان حاصل کنید که نمونه‌ها به‌اندازۀ کافی متنوع باشند (از منظر واژگان و از منظر ساختار جمله).

برای اینکه دستیار شما بتواند اینتنت‌ها را درک کند و انتیتی‌ها را استخراج کند (همان‌طور که اشاره شد، این‌ها در فایل NLU تعریف می‌شوند)، باید یک مدل بسازید.

این کار در ماژول درک زبان طبیعی، از طریق تعریف کردن پایپ‌لاین پردازش، انجام می‌شود.

پایپ‌لاین را می‌شود به‌عنوان دنباله‌ای از گام‌های پردازشی در نظر گرفت که برای استخراج ویژگی‌های خاص متن و تعلیم مؤلفه‌های بخصوصی استفاده می‌شود که به مدل اجازه می‌دهد تا الگوهای زیرین را از مثال‌های ارائه‌شده یاد بگیرد.

با استفاده از رسا، شما هم می‌توانید پایپ‌لاین شخصی‌شده‌ای بسازید و هم می‌توانید از پایپ‌لاین‌های از پیش پیکربندی‌شده استفاده کنید.

دو نمونه از پایپ‌لاین‌های از پیش پیکربندی‌شدۀ موجود در رسا در شکل ۱ نشان داده شده است.

شکل ۱: دو نمونه از پایپ‌لاین‌های از پیش پیکربندی‌شدۀ موجود در رسا.
شکل ۱: دو نمونه از پایپ‌لاین‌های از پیش پیکربندی‌شدۀ موجود در رسا.


در این مطلب، جزئیات گام‌های این پایپ‌لاین‌ها را بیان نمی‌کنیم، صرفاً به چند قانون سرانگشتی برای انتخاب پایپ‌لاین مناسب برای کاربرد شما اشاره می‌کنیم:

  • اگر دستیارتان را در زبانی می‌سازید که word embeddingهای pre-trained برای آن وجود ندارد، سراغ پایپ‌لاین supervised_embeddings بروید.
  • اگر دستیار شما قرار است نمونه‌های پیشرفته‌ای مثل پیام‌های دارای چندین اینتنت را مدیریت کند، سراغ پایپ‌لاین supervised_embeddings بروید.
  • اگر اصطلاح‌ها و acronymهای مختص دامنۀ شما خیلی زیاد است و درعین‌حال، داده‌های تعلیم زیادی در اختیار دارید، سراغ پایپ‌لاین supervised_embeddings بروید.
  • برای تعداد نمونه‌های مجموعۀ تعلیم عدد دقیقی را نمی‌شود بیان کرد، اما اگر هزار دادۀ برچسب‌خورده یا بیشتر دارید، می‌توانید از پایپ‌لاین supervised_embeddings استفاده کنید.

ساختن و پیکربندی کردن هر پایپ‌لاین کاری است که معمولاً از مجموعه‌ای از گام‌های رو به جلو و رو به عقب (رفت و برگشت) تا زمان رسیدن به بهترین نتایج تشکیل می‌شود.

هرچه دادۀ تعلیم بیشتری داشته باشید و بیشتر دربارۀ آن‌ها یاد بگیرید، می‌توانید مدل‌های بهتری بسازید.

داده مهم‌ترین بخش ساخت مدل‌های NLU خوب است. با داشتن داده‌های کافی و خوب می‌توانید اطمینان حاصل کنید که تمامی مؤلفه‌هایی که در پایپ‌لاین تعریف کرده‌اید به‌خوبی تعلیم دیده‌اند و مدل شما کاری را که انتظار می‌رود انجام می‌دهد.

در انتهای این بخش، به بررسی پرسش‌های متداول توسعه‌دهندگان و پاسخ آن‌ها می‌پردازیم:

  • آیا ترتیب قرارگیری مؤلفه‌ها در پایپ‌لاین مهم است؟

بله.

  • آیا باید نگران نامتوازن بودن کلاس‌ها در داده‌های تعلیم NLU باشیم؟

برخی اوقات، بعضی اینتنت‌ها به‌صورت درخور توجهی، حجم نمونۀ بیشتری نسبت به سایر کلاس‌ها دارند. در یادگیری ماشین به این مسئله، class imbalance می‌گویند و ممکن است روی مدل تأثیر بگذارد و باعث شود که مدل ضعیف عمل کند. چند کار هست که می‌توانید برای حل این مسئله انجام دهید.

  • باید سعی کنید کم‌وبیش تعداد مشابهی نمونه در هر کلاس داشته باشید.
  • رسا کارهایی را برای مدیریت این مسئله انجام داده است: پایپ‌لاین supervised_embeddings از استراتژی balanced batching strategy برای حل این مسئله استفاده می‌کند.
  • آیا علامت‌گذاری در داده‌های تعلیم مهم است؟

خیر، چون علامت‌گذاری‌ها به‌عنوان توکن استخراج نمی‌شوند و در نتیجه، به‌عنوان ویژگی‌های مدل در نظر گرفته نمی‌شوند؛ به همین دلیل، علامت‌گذاری روی خروجی intent classification یا NER تأثیر نمی‌گذارد.

  • آیا intent classification و Entity Extraction حساس به کوچک یا بزرگ بودن کاراکترها هستند؟

این مسئله به وظیفۀ در حال انجام بستگی دارد. به‌صورت پیش‌فرض، NER به کوچک و بزرگ بودن کاراکترها حساس است، NER توکن‌ها را همان‌طور که هستند (با حروف کوچک و بزرگ) می‌گیرد.

در نقطۀ مقابل، intent classification به‌صورت پیش‌فرض، به کوچک یا بزرگ بودن کاراکترها حساس نیست، چراکه featurizer‌ هر چیزی را به حروف کوچک تبدیل می‌کند.

  • احساس می‌کنم برخی اینتنت‌ها در مجموعۀ دادۀ تعلیم من خیلی به هم شبیه هستند. دربارۀ این‌ها باید چه‌کار کنم؟

در این صورت برای مدل خیلی سخت است که بین این اینتنت‌‌ها (کلاس‌ها) تمایز قائل شود.

با وجود این خیلی مهم است که در زمان ساخت مجموعۀ تعلیم مراقب باشید. معمولاً ایجاد اینتنت‌های جدید ضروری نیست، چراکه نمونه‌ها ممکن است توسط انتیتی‌ها از هم تفکیک شوند.

در شکل‌های ۲ و ۳، نمونه‌ای از ادغام دو اینتنت و تفکیک آن‌ها از طریق انتیتی نشان داده شده است.

شکل ۲. نمونه‌ای از دو اینتنت شبیه به هم.
شکل ۲. نمونه‌ای از دو اینتنت شبیه به هم.


برای این منظور، به‌جای دو اینتنت مجزای نام و تاریخ، می‌توانیم یک اینتنت اطلاعات در نظر بگیریم که نوع انتیتی آن در هر نمونه متمایز است.

شکل ۳. نمونه‌ای از ادغام دو اینتنت شبیه به هم و تفکیک آنها به کمک انتیتی.
شکل ۳. نمونه‌ای از ادغام دو اینتنت شبیه به هم و تفکیک آنها به کمک انتیتی.


در ادامه و در داده‌های تعلیم dialogue management می‌توانید story pathهای مختلفی تعریف کنید، بر حسب اینکه NLU چه انتیتی‌ای را استخراج کرده است.

  • اگر بخواهم از ورودی‌های تک‌کلمه‌ای انتیتی استخراج کنم باید چه‌کار کنم؟
  • این کار خیلی چالش‌برانگیز است. بهترین تکنیکی که می‌توانید در حال حاضر به کار بگیرید این است که یک اینتنت بخصوص بسازید (برای مثال inform) که شامل مثال‌ها و نمونه‌هایی خواهد بود از اینکه کاربر چطور اطلاعات ارائه می‌کند، حتی اگر آن ورودی‌ها فقط شامل یک کلمه باشد. شما باید این نمونه‌ها را همان‌طوری برچسب بزنید که هر نمونۀ NLU دیگری را برچسب می‌زنید و آن‌ها را برای intent classification و entity extraction به کار بگیرید.
  • آیا می‌توانم بیش از یک مدل intent classification در پایپ‌لاینم مشخص کنم؟

اگرچه ازنظر تکنیکی می‌توانید چنین کاری کنید، اما در واقع انجام این کار مزیتی ندارد، چراکه باتوجه‌به نحوۀ کار کردن رسا در حال حاضر، پیش‌بینی‌های آخرین مدل intent classification مشخص‌شده، همواره برنده خواهد شد.

  • چطور غلط‌های املایی کاربران را در ورودی‌ها مدیریت کنم؟

در دنیای واقعی، غلط‌های املایی در ورودی‌های کاربر چیزی است که نمی‌توان از آن اجتناب کرد، اما کارهای کمی هست که می‌توانید انجام دهید تا این مسئله را دور بزنید یا آن را کاهش دهید.

یکی از کارهایی که می‌توانید بکنید پیاده‌سازی نوعی spell checker شخصی‌سازی‌شده و اضافه کردن آن به پیکربندی پایپ‌لاین شخصی‌سازی‌شده‌تان است. این راه خیلی خوبی برای اصلاح غلط‌های املایی در انتیتی‌های استخراج‌شده است. کار دیگری که می‌توانید بکنید این است که نمونه‌هایی با غلط املایی در داده‌های تعلیمتان اضافه کنید تا مدل شما آن‌ها را هم بردارد و ببیند.

بخش مدیریت دیالوگ (Core)

با ساخت مدل‌های NLU، دستیار شما قادر خواهد بود تا ورودی‌های کاربر را بفهمد.

از طریق مدیریت دیالوگ، دستیار شما درحالی‌که زمینۀ مکالمه را حفظ می‌کند، می‌تواند به مکالمه پاسخ بدهد.

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

اما در مکالمۀ طبیعی، انحراف از این مسیر موردانتظار اجتناب‌ناپذیر است و امکان ندارد شما بتوانید قوانینی برای همۀ انحراف‌های احتمالی از مسیر مکالمه بنویسید.

در صورت استفاده از ماشین حالت، زمانی که مکالمۀ کاربر از مسیر موردانتظار منحرف می‌شود، دستیار شما از کار می‌افتد که این مسئله به خلق تجربۀ کاری ناامیدکننده‌ای منجر می‌شود.

چالش دیگر استفاده از ماشین حالت این است که وقتی مسئله بزرگ می‌شود، کار کردن با دستیارهای مبتنی بر قوانین خیلی دشوار است، چراکه مدیریت کردن، نگهداری و دیباگ کردن مجموعۀ عظیمی از قوانین خیلی دشوار است و با گذشت زمان دشوارتر می‌شود؛

به همین دلیل، رسا رویکرد کاملاً متفاوتی برای مدیریت دیالوگ انتخاب کرده است.

رسا به‌جای ایجاد قوانین و تحمیل کردن آن‌ها به کاربران، از یادگیری ماشین استفاده می‌کند تا از روی داده‌های مکالمه‌ای نمونه، الگوهای مکالمه‌ای را یاد بگیرد و پیش‌بینی کند که در هر وضعیت بخصوص، باتوجه‌به زمینه و تاریخچۀ مکالمه و جزئیات دیگر، دستیار چطور باید پاسخ دهد.

مؤلفه‌ای که در رسا مسئولیت مدیریت دیالوگ را به عهده دارد Core نامیده می‌شود.

در توسعۀ دستیار هوش مصنوعی مکالمه‌ای با استفاده از رسا، همه‌چیز از داده‌‌های تعلیم شروع می‌شود. در مدیریت دیالوگ، این داده‌ها، stories نامیده می‌شود: مکالمه‌ای مثالی بین کاربر و دستیار که در قالبی خاص نوشته شده است.

این فرمت بسیار ساده است. ورودی‌های کاربر در قالب اینتنت و انتیتی‌های متناظر بیان می‌شود، درحالی‌که پاسخ‌های دستیار در قالب action name‌ها بیان می‌شود.

در کل، دو نوع action وجود دارد که در رسا می‌توانید از آن‌ها استفاده کنید: Utterances و Custom Actions.

در رسا، Utteranceها پیام‌های hardcodeشده‌ای هستند که بازو/ دستیار می‌تواند با کمک آن‌ها به کاربر پاسخ بدهد.

از طرف دیگر، custom actions می‌تواند دربردارندۀ مجموعه‌ای کد شخصی باشد که قابلیت اجرا شدن دارد.

تعلیم ماژول مدیریت دیالوگ هم مثل تعلیم ماژول NLU به مجموعۀ متنوعی از نمونه‌های تعلیم نیاز دارد، به همین دلیل است که stories در داده‌های تعلیم شما باید انواع تغییر جهت‌های دیالوگ را پوشش دهد.

درحالی‌که قانون مشخصی وجود ندارد که برای تعلیم ماژول مدیریت دیالوگ و ساخت یک مدل خوب به چه تعداد نمونۀ تعلیم نیاز دارید، یک نکتۀ مهم که باید به خاطر بسپارید این است که دستیار شما باید در کوتاه‌ترین زمان ممکن، شروع به یاد گرفتن از کاربران واقعی کند.

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

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

دامنه جهانی را تعریف می‌کند که دستیار در آن جهان کار می‌کند. دستیار می‌تواند چه اینتنت و انتیتی‌هایی را بفهمد؟ دستیار باید آماده باشد تا به چه custom actionها و utteranceهایی پاسخ بدهد؟ آن utteranceها چطور به نظر می‌رسند؟ دستیار باید در طول مکالمه، چه اطلاعاتی را به خاطر بسپارد و در هر زمینۀ بخصوص به کار بگیرد؟

شکل ۴ اجزای تشکیل‌دهندۀ دامنه را نشان می‌دهد.

شکل ۴. اجزاء تشکیل‌دهنده دامنه.
شکل ۴. اجزاء تشکیل‌دهنده دامنه.


فایل دامنه سه جزء اصلی دارد که برای ساخت هر دستیاری با استفاده از پلتفرم رسا ضروری هستند:

  • Intents

جزئیات این بخش باید از مدل NLU بیاید.

نکته: انتیتی‌ها هم باید در فایل domain آورده شوند.

  • Actions

فهرست همۀ utteranceها و custom actionهایی که دستیار باید از آن‌ها استفاده کند تا به کاربر پاسخ بدهد.

  • Templates

اینجا جایی است که می‌توانید پاسخ‌های حقیقی‌ای را تعریف کنید که دستیار، وقتی که یک utterance بخصوص پیش‌بینی شده است، باید ارائه کند.

مشخص کردن پاسخ‌ها از دو طریق اضافه کردن قالب‌های پاسخ به فایل دامنه یا از طریق custom actionها انجام می‌شود.

ممکن است هر utterance بیش از یک قالب داشته باشد و پاسخ ممکن است از پاسخ‌های سادۀ متنی فراتر برود (استفاده از تصاویر، دکمه‌ها و...).

بخش دیگری که در فایل domain وجود دارد و برای مدیریت دیالوگ با رسا خیلی مهم است بخش slots است.

در رسا، Slotها حافظۀ دستیار شما هستند و دستیار شما را قادر می‌سازند که جزئیات مهم را به خاطر بسپارد و زمانی که مکالمه به پیش می‌رود، از این slotها در زمینه‌ای بخصوص استفاده کند.

مقادیر slotها تا زمانی که ریست نشوند در حافظه نگهداری می‌شوند.

در این مجموعه مطالب، به معرفی انواع slotهایی که در رسا موجود است و کاربرد هرکدام نمی‌پردازیم.

در رسا، ماژول‌های مدیریت دیالوگ از طریق dialogue policies تعریف می‌شوند.

سیاست مؤلفه‌ای است که مسئول تصمیم‌گیری دربارۀ این مسئله است که دستیار در مرحلۀ بعدی باید چطور پاسخ دهد.

سیاست‌های تعلیم ممکن است به‌سادگیِ تقلید کردن مدل از مکالمه‌هایی باشد که با استفاده از آن‌ها تعلیم دیده است یا الگوریتم‌های یادگیری ماشین کاملاً پیچیده‌ای باشد که قابلیت دارند اقدام بعدی را بر اساس بسیاری از جزئیات مثل سابقۀ مکالمه، زمینه و اطلاعات دیگر پیش‌بینی کنند.

پیکربندی سیاست شما ممکن است متشکل از چندین سیاست مختلف باشد؛ در این صورت، سیاست با بیشترین اطمینان از پیش‌بینی خود برنده می‌شود. اگر چندین سیاستْ اقدام بعدی را با امتیاز اطمینان یکسان پیش‌بینی کنند، سیاستی برنده می‌شود که policy priority بالاتری دارد.

در این مجموعه مطالب، به معرفی انواع هایپرپارامترهای سیاست و همچنین انواع سیاست‌هایی که در رسا موجود است و کاربرد هرکدام نمی‌پردازیم.

منابع

  1. Peart, A. (2020, May 19). Chatbot Statistics: 2020 & Beyond. Linkedin. https://www.linkedin.com/pulse/chatbot-statistics-2020-beyond-andy-peart/, Last accessed July 2021.
  2. Meese M. (2021, April 8). CB Insights reveals 2021 cohort of 100 most-promising AI companies. TechRepublic. https://www.techrepublic.com/article/cb-insights-reveals-2021-cohort-of-100-most-promising-ai-companies/, Last accessed July 2021.
  3. Revang, M., Baker, V., Manusama, B., Mullen, A., and Lee, A. Market Guide for Conversational Platforms. Gartner. https://www.gartner.com/en/documents/3953723/market-guide-for-conversational-platforms, Last accessed July 2021.
  4. Rasa. (2019, October). Rasa Masterclass: Developing Contextual AI assistants with Rasa tools. https://www.youtube.com/playlist?app=desktop&list=PL75e0qA87dlHQny7z43NduZHPo6qd-cRc, Last accessed July 2021.
  5. The Rasa Masterclass Handbook. 2019. The Rasa Masterclass Handbook; A Companion Guide to the Rasa Masterclass Video Series. Rasa Publication, 2019, https://cdn2.hubspot.net/hubfs/6711345/ebook-v3.pdf?__hstc=&__hssc=&hsCtaTracking=2cf912f3-4137-4338-829e-08bb4713f0f6%7Cda22eae5-512d-48fe-b46a-c74517f3d870.
پردازش زبان طبیعیچت‌بات
شاید از این پست‌ها خوشتان بیاید