چیتشیت
چتباتها و ردیابی حالت گفتوگو (DST)
Chatbots and Dialogue State Tracking
مسیریابی نوبتهای گفتوگو، اجرای حلقهی ایجنت، ردیابی جایگاهها در طول گفتوگو و بودجهبندی پنجرهی بافتار. کدهای پایتون برگرفته از درسها.
فهرست مطالب
مسیریابی ترکیبی
معماریحلقهی ایجنت
گامبهگام- شروع
historyشامل یک پیام کاربر است. حلقه حداکثرmax_stepsبار اجرا میشود. - LLMتابع
llm(history, tools=tools)محتوا یا یکtool_callبرمیگرداند. - بررسینام ابزار ناشناخته یا آرگومانهای غیر دیکشنری یک پیام خطا اضافه میکنند. حلقه ادامه مییابد.
- ابزار
fn(**args)اجرا میشود. فراخوانی و نتیجهی آن واردhistoryمیشوند. - پایانپاسخی بدون
tool_callپاسخ نهایی است. - بودجهپس از
max_steps، بازگردانید: «نتوانستم وظیفه را در سقف گامهای مجاز انجام دهم.»
وظایف در کد
کار و کد| وظیفه | کد |
|---|---|
پاسخ FAQ یا None | faq_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) # کل حالت در هر نوبت گفتوگو
سرهمبندی بافتار به ازای هر پرسمان
گامبهگام- پرامپت سیستمدر ابتدا قرار میگیرد. سقف
max_tokens=1000. - ابزارهاابتدا
classify_intentسپسselect_tools. سقف 2000. - بازیابی
score_relevanceاسناد زیر آستانه را حذف میکند. سقف 3000. - بازتریب
reorder_lost_in_middleبهترین اسناد را در ابتدا و انتها قرار میدهد. - تاریخچهخلاصهها به اضافهی نوبتهای اخیر. سقف 5000.
- پرسماندر انتها قرار میگیرد. سقف 500. باقیمانده سهم ذخیرهی تولید است.
پارادایمها و اصطلاحات DST
مفهومها- قاعدهمحور
- الگوها، نیتها و پر کردن اسلات. خارج از دامنهی خود با شکست مواجه میشود.
- بازیابیمحور
- نزدیکترین پاسخ ذخیرهشده. بدون تولید متن، پس بدون توهم.
- مدل عصبی seq2seq
- روان، اما با پاسخهای کلیشهای و دریفت فکتها.
- ایجنت مبتنی بر LLM
- برنامهریزی، فراخوانی ابزار، مشاهدهی نتیجه، تصمیمگیری دربارهی گام بعدی.
- جایگاه (Slot)
- یک پارامتر نامدار که بکاند به آن نیاز دارد، مانند نوع غذا یا تاریخ.
- ردیابی حالت دستهبندی
- بله یا خیر برای هر جایگاه و مقدار نامزد. دامنهی واژگان بسته.
- ردیابی حالت تولیدی
- تولید مقادیر جایگاه به صورت متن. دامنهی واژگان باز. پیشفرض دنیای مدرن.
- معیار JGA
- درصد نوبتهایی که در آنها همهی جایگاهها درست هستند. همهیاهیچ.
پیشفرضها و ارقام
پیشفرضها| تنظیم | پیشفرض | یادداشت |
|---|---|---|
max_tokens | 128000 | اندازهی پنجره در ContextBudget |
generation_reserve | 4000 | 2000 تا 4000 را برای پاسخ ذخیره کنید |
max_history_tokens | 5000 | بیشتر از آن، 2 نوبت قدیمیتر را خلاصه کنید |
token_budget | 2000 | تعریفهای ابزار برای یک پرسمان |
Relevance threshold | 0.05 | متن درس از 0.1 استفاده میکند |
Token estimate | 1.3 | توکنها به ازای هر کلمهی جداشده با فاصله |
max_steps | 5 | بودجهی گامهای ایجنت |
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) خوب اغلب بهتر از دستورالعملهای طولانی هستند.