چیت‌شیت

چت‌بات‌ها و ردیابی حالت گفت‌وگو (DST)

Chatbots and Dialogue State Tracking

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

  • ۱۲ بخش
  • ۳ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. مسیریابی ترکیبی
  2. حلقه‌ی ایجنت
  3. وظایف در کد
  4. به‌روزرسانی حالت مبتنی بر قانون
  5. ردیاب LLM همراه با اسکیما
  6. سرهم‌بندی بافتار به ازای هر پرسمان
  7. پارادایم‌ها و اصطلاحات DST
  8. پیش‌فرض‌ها و ارقام
  9. عیب‌یابی
  10. اختصارات
  11. پرسش‌ها
  12. نکات کاربردی

مسیریابی ترکیبی

معماری
مخربدر غیر این صورتتطبیقNonetool_callورودی کاربربررسی مخرب بودنکلمات خطرناکجریان کاری ساختاریافتهابتدا تأیید بگیربازیابی FAQآستانه‌ی 0.6حلقه‌ی ایجنت مبتنی بر LLMRAG و فراخوانی‌های ابزارابزارهاتوابع قابل‌فراخوانیپاسخ

حلقه‌ی ایجنت

گام‌به‌گام
  1. شروعhistory شامل یک پیام کاربر است. حلقه حداکثر max_steps بار اجرا می‌شود.
  2. LLMتابع llm(history, tools=tools) محتوا یا یک tool_call برمی‌گرداند.
  3. بررسینام ابزار ناشناخته یا آرگومان‌های غیر دیکشنری یک پیام خطا اضافه می‌کنند. حلقه ادامه می‌یابد.
  4. ابزارfn(**args) اجرا می‌شود. فراخوانی و نتیجه‌ی آن وارد history می‌شوند.
  5. پایانپاسخی بدون tool_call پاسخ نهایی است.
  6. بودجهپس از max_steps، بازگردانید: «نتوانستم وظیفه را در سقف گام‌های مجاز انجام دهم.»

وظایف در کد

کار و کد
وظیفهکد
پاسخ FAQ یا Nonefaq_respond(user_input, threshold=0.5)
تشخیص یک درخواست مخربis_destructive_action(text)
ایجنت با بودجه‌ی گامagent_loop(user_message, tools, llm, max_steps=5)
امتیازدهی به ردیابjoint_goal_accuracy(predicted_states, gold_states)
بودجه‌بندی پنجرهContextBudget(max_tokens=128000, generation_reserve=4000)
افزودن مؤلفه با سقف معینbudget.allocate("tools", tool_text, max_tokens=2000)
هرس کردن ابزارها بر اساس نیتselect_tools(query, token_budget=2000)
بهترین اسناد در ابتدا و انتهاreorder_lost_in_middle(items, scores)

به‌روزرسانی حالت مبتنی بر قانون

کد
python
SLOT_EXTRACTORS = {"cuisine": extract_cuisine, "area": extract_area,
                   "price": extract_price, "people": extract_people}

def update_state(state, utterance):
    new_state = dict(state)          # هرگز جایگاه‌های دست‌نخورده را ریست نکنید
    for slot, extractor in SLOT_EXTRACTORS.items():
        value = extractor(utterance)
        if value is not None:
            new_state[slot] = value  # یک اصلاح جایگزین مقادیر قبلی می‌شود
            continue
        if is_negation(utterance, slot):
            new_state[slot] = None   # «نوع غذا مهم نیست»
    return new_state

ردیاب LLM همراه با اسکیما

کد
python
class RestaurantState(BaseModel):
    cuisine: Optional[Literal["italian", "chinese", "indian", "thai", "any"]] = None
    area: Optional[Literal["north", "south", "east", "west", "center"]] = None
    price: Optional[Literal["cheap", "moderate", "expensive"]] = None
    people: Optional[int] = None
    day: Optional[str] = None                           # جایگاه آزاد (free-form)

def llm_dst(history, llm):
    prompt = f"""...{render(history)}...Output only the JSON state."""
    return llm(prompt, response_model=RestaurantState)  # کل حالت در هر نوبت گفت‌وگو

سرهم‌بندی بافتار به ازای هر پرسمان

گام‌به‌گام
  1. پرامپت سیستمدر ابتدا قرار می‌گیرد. سقف max_tokens=1000.
  2. ابزارهاابتدا classify_intent سپس select_tools. سقف 2000.
  3. بازیابیscore_relevance اسناد زیر آستانه را حذف می‌کند. سقف 3000.
  4. بازتریبreorder_lost_in_middle بهترین اسناد را در ابتدا و انتها قرار می‌دهد.
  5. تاریخچهخلاصه‌ها به اضافه‌ی نوبت‌های اخیر. سقف 5000.
  6. پرسماندر انتها قرار می‌گیرد. سقف 500. باقی‌مانده سهم ذخیره‌ی تولید است.

پارادایم‌ها و اصطلاحات DST

مفهوم‌ها
قاعده‌محور
الگوها، نیت‌ها و پر کردن اسلات. خارج از دامنه‌ی خود با شکست مواجه می‌شود.
بازیابی‌محور
نزدیک‌ترین پاسخ ذخیره‌شده. بدون تولید متن، پس بدون توهم.
مدل عصبی seq2seq
روان، اما با پاسخ‌های کلیشه‌ای و دریفت فکت‌ها.
ایجنت مبتنی بر LLM
برنامه‌ریزی، فراخوانی ابزار، مشاهده‌ی نتیجه، تصمیم‌گیری درباره‌ی گام بعدی.
جایگاه (Slot)
یک پارامتر نام‌دار که بک‌اند به آن نیاز دارد، مانند نوع غذا یا تاریخ.
ردیابی حالت دسته‌بندی
بله یا خیر برای هر جایگاه و مقدار نامزد. دامنه‌ی واژگان بسته.
ردیابی حالت تولیدی
تولید مقادیر جایگاه به صورت متن. دامنه‌ی واژگان باز. پیش‌فرض دنیای مدرن.
معیار JGA
درصد نوبت‌هایی که در آن‌ها همه‌ی جایگاه‌ها درست هستند. همه‌یاهیچ.

پیش‌فرض‌ها و ارقام

پیش‌فرض‌ها
تنظیمپیش‌فرضیادداشت
max_tokens128000اندازه‌ی پنجره در ContextBudget
generation_reserve40002000 تا 4000 را برای پاسخ ذخیره کنید
max_history_tokens5000بیشتر از آن، 2 نوبت قدیمی‌تر را خلاصه کنید
token_budget2000تعریف‌های ابزار برای یک پرسمان
Relevance threshold0.05متن درس از 0.1 استفاده می‌کند
Token estimate1.3توکن‌ها به ازای هر کلمه‌ی جداشده با فاصله
max_steps5بودجه‌ی گام‌های ایجنت
FAQ `threshold`0.5مسیریاب ترکیبی از 0.6 استفاده می‌کند

عیب‌یابی

عیب‌یابی
  • ایجنت مدعی انجام کاری می‌شود که نکرده است

    علت
    جعل با اطمینان بالا
    راه‌حل
    فقط به خروجی موفق ابزار اعتماد کنید
  • ورودی پرامپت سیستم را نادیده می‌گیرد

    علت
    تزریق پرامپت
    راه‌حل
    ورودی غیرقابل‌اعتماد، PVE، تأیید عملیات مخرب
  • فراخوانی پیاپی و مداوم یک ابزار

    علت
    حلقه‌ی بی‌نهایت
    راه‌حل
    بودجه‌ی گام، حذف فراخوانی‌های تکراری ابزار
  • گم شدن نوبت‌های ابتدایی

    علت
    پنجره‌ی بافتار پر شده است
    راه‌حل
    خلاصه‌سازی یا بازیابی نوبت‌های قدیمی
  • نادیده گرفته شدن فکت در میانه

    علت
    گم شدن در میانه
    راه‌حل
    فکت‌های کلیدی را در ابتدا یا انتها بیاورید
  • اصلاح یک مورد باعث پاک شدن سایر جایگاه‌ها می‌شود

    علت
    ریست شدن جایگاه‌های دست‌نخورده
    راه‌حل
    فقط جایگاه اصلاح‌شده را رونویسی کنید
  • تفاوت میان «Italian» و «italian»

    علت
    بزرگی و کوچکی حروف
    راه‌حل
    نرمال‌سازی در همه‌جا
  • داده‌های آموزشی قدیمی دچار مشکل می‌شوند

    علت
    جایگاه‌های جدیدی بعداً اضافه شده‌اند
    راه‌حل
    اسکیما را نسخه‌بندی کنید

اختصارات

اصطلاح‌ها
DST
ردیابی حالت گفت‌وگو. دیکشنری کلید-مقدار جایگاه‌ها را در طول نوبت‌ها نگه می‌دارد.
JGA
دقت اهداف مشترک. سیستم‌های برتر MultiWOZ 2.4 به 80 تا 83 درصد می‌رسند.
MultiWOZ
مجموعه‌داده‌ی WOZ چنددامنه‌ای. بنچمارک استاندارد DST.
LDST
ترکیب LLaMA به همراه LoRA، آموزش‌داده‌شده با پرامپت‌های دامنه-جایگاه.
TripPy
مدل DST مبتنی بر کپی همراه با انکودینگ BERT. استاندارد پیش از دوره‌ی LLM.
PVE
برنامه‌ریزی-بررسی-اجرا (Plan-Verify-Execute). ابتدا هر اقدام را با برنامه مطابقت دهید.
RAG
اسناد مرتبط را بازیابی کرده و سپس پاسخ را مستند به آن‌ها تولید کنید.
گم شدن در میانه
دقت 85 تا 90 درصد در دو انتها، 60 تا 70 درصد در میانه.

پرسش‌ها

پرسش و پاسخ
چرا مسیریابی به جای یک مدل واحد؟
هیچ معماری یکتایی همه‌ی درخواست‌ها را عالی انجام نمی‌دهد.
چرا برای پرداخت‌ها از قواعد استفاده کنیم؟
اقدامات مخرب نیاز به جریان‌های قطعی و تأییدشده دارند.
به‌روزرسانی تدریجی یا بازتولید؟
کل حالت را از تاریخچه بازتولید کنید. اصلاحات را پوشش می‌دهد.
هزینه‌ی بازتولید چقدر است؟
مجموعاً $O(n^2)$ توکن. نوبت‌های قدیمی را محدود یا خلاصه کنید.
آیا پنجره‌ی بزرگ‌تر کافی است؟
خیر. بافتار گلچین‌شده‌ی 10K اغلب بهتر از 100K انباشته‌شده عمل می‌کند.

نکات کاربردی

نکته‌ها
  • زیر آستانه‌ی FAQ، مقدار None برگردانید و موضوع را ارجاع دهید.
  • همه‌ی گام‌های ایجنت را لاگ کنید. نرخ انحراف از وظیفه (off-task) را بسنجید.
  • جایگاه‌های آزاد (نام‌ها، ساعت‌ها) را با جایگاه‌های بسته (نوع غذا، منطقه) ترکیب کنید.
  • همیشه کل تاریخچه را ارسال کنید تا مقادیر جایگاه‌های قبلی حفظ شوند.
  • هرس کردن ابزارها توکن‌های ابزار را 60 تا 80 درصد کاهش می‌دهد.
  • دو یا سه مثال چندنمونه‌ای (few-shot) خوب اغلب بهتر از دستورالعمل‌های طولانی هستند.