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

چیزی که در تجربه‌های واقعی روی پروژه‌های چت‌باتی زیاد دیده‌ام این است: تیم‌ها معمولاً با یک پرامپت ساده شروع می‌کنند، همه‌ی نوبت‌ها را در قالب یک آرایه‌ی پیام ارسال می‌کنند، و بعد وقتی تعداد پیام‌ها زیاد می‌شود، متوجه می‌شوند که نه هزینه قابل‌کنترل است و نه کیفیت. راه‌حل واقعی، داشتن یک معماری صریح برای مدیریت نشست است.

چکیده‌ای از آنچه پیش رو دارید

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

گفتگوی چندنوبتی چیست؟

گفتگوی چندنوبتی (Multi-turn Conversation) به نشستی گفته می‌شود که در آن مدل زبانی با یک پیشینه‌ی پیوسته از پیام‌ها روبه‌رو است. هر نوبت شامل یک پیام ورودی از سمت کاربر و یک پیام خروجی از سمت مدل است، و همه‌ی این پیام‌ها در مجموع همان چیزی هستند که به مدل به‌عنوان زمینه ارائه می‌شود. تفاوت اساسی این حالت با یک درخواست تک‌نوبتی، وابستگی پاسخ‌های آینده به گذشته است.

این وابستگی دو لبه دارد. از یک سو، اجازه می‌دهد مکالمه به سمت عمق برود و مدل بتواند به پرسش‌های پیگیرانه پاسخ دهد. از سوی دیگر، پیچیدگی‌های مدیریتی جدی ایجاد می‌کند که در نوشتار راهنمای پایه پرامپت نویسی به آن اشاره کرده‌ام. همین پیچیدگی‌ها هستند که یک نشست ساده را به یک معماری نیازمند تبدیل می‌کنند.

نقش‌ها در گفتگوی چندنوبتی و تعریف استانداردشان

در بیشتر APIهای مدل‌های زبانی مدرن، پیام‌ها در قالب نقش‌ها ارسال می‌شوند. شناخت دقیق این نقش‌ها اولین گام مدیریت درست یک نشست است:

نقشتوضیحپایداری
Systemدستورالعمل‌های پایه و چارچوب رفتاری مدلدر کل نشست ثابت
Userپیام‌های ورودی از سمت کاربردر هر نوبت جدید
Assistantپاسخ‌های تولیدشده توسط مدلبه‌عنوان پیشینه نگه‌داری می‌شود
Toolنتیجه‌ی فراخوانی ابزارهای خارجیدر نوبت فراخوانی

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

چالش‌های اصلی مدیریت پیشینه مکالمه

سه چالش اصلی وجود دارد که هر معماری گفتگوی چندنوبتی با آن‌ها دست‌به‌گریبان است:

۱. رشد خطی توکن‌ها

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

۲. از دست رفتن نیت اولیه

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

۳. تناقض میان نوبت‌ها

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

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

پنج راهبرد عملی برای مدیریت گفتگوی چندنوبتی

در تجربه کار روی پروژه‌های چت‌بات، پنج راهبرد بیشترین بازده را داشته‌اند:

راهبرد اول: پنجره لغزان

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

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

به‌جای نگه داشتن همه پیام‌ها، نسخه خلاصه‌ای از پیشینه ساخته می‌شود و در هر چند نوبت، خلاصه به‌روزرسانی می‌شود. این راهبرد در نشست‌های طولانی بسیار مؤثر است.

راهبرد سوم: تفکیک حافظه از زمینه

حافظه (Memory) به‌عنوان یک انبار جداگانه نگه داشته می‌شود و در لحظه نیاز، بخش مرتبط آن به پرامپت تزریق می‌شود. این راهبرد، پایه معماری سیستم‌های پیشرفته است. برای مطالعه دقیق‌تر، نوشتار حافظه در پرامپت نویسی چه نقشی دارد را ببینید.

راهبرد چهارم: بازنویسی نیت

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

راهبرد پنجم: تحلیل هوشمند پیشینه

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

خلاصه‌سازی تدریجی و نوبت‌های غلتان

خلاصه‌سازی تدریجی (Rolling Summary) ساده‌ترین و در عین حال مؤثرترین راهبرد است. ساختار کار به این شکل است:

  1. هر N نوبت یک‌بار، پیام‌های پیشین با یک مدل سبک خلاصه می‌شوند.
  2. خلاصه به‌عنوان یک پیام سیستمی در ابتدای پیشینه نگه داشته می‌شود.
  3. فقط چند نوبت آخر به‌طور کامل نگه داشته می‌شوند.

این ساختار دو مزیت اصلی دارد: از یک سو مصرف توکن را کنترل می‌کند و از سوی دیگر اطلاعات کلیدی مکالمه را حفظ می‌کند. مهم این است که خلاصه به‌صورت دوره‌ای بازبینی شود تا اطلاعات مهم حذف نشوند.

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

محدودسازی پیشینه با بودجه توکن

هر معماری نشست باید یک بودجه توکن صریح داشته باشد. مثلاً:

بخشدرصد بودجهمثال
پرامپت سیستمی۱۵٪دستورالعمل‌های ثابت
خلاصه پیشینه۲۰٪نسخه فشرده از مکالمه قبلی
نوبت‌های اخیر۳۰٪پنج نوبت آخر به‌طور کامل
زمینه مرتبط۱۵٪اسناد بازیابی‌شده
سقف خروجی۲۰٪پاسخ نوبت جاری

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

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

ردیابی نیت در گفتگوهای طولانی

ردیابی نیت (Intent Tracking) یکی از تکنیک‌های مهم در سیستم‌های گفتگومحور است. هدف این است که در هر نوبت، بدانیم کاربر واقعاً چه می‌خواهد و آن نیت را در ابتدای پرامپت قرار دهیم.

ساختار پیشنهادی:

[نیت اصلی کاربر در این نشست: ...]
[نوبت قبلی: چه اتفاقی افتاد]
[پیام جدید کاربر: ...]

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

تفاوت حافظه با پنجره زمینه

حافظه (Memory) و پنجره زمینه (Context Window) دو مفهوم متفاوت هستند که زیاد با هم اشتباه گرفته می‌شوند:

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

حافظه معمولاً در یک پایگاه داده برداری یا یک سیستم Key-Value نگه داشته می‌شود و در زمان نیاز، بخش مرتبط آن بازیابی می‌شود. این تفکیک، فضای طراحی معماری نشست را بسیار باز می‌کند. برای مطالعه دقیق‌تر، نوشتار معماری حافظه کوتاه‌مدت و بلندمدت عامل‌های هوش مصنوعی را ببینید.

اشتباهات رایج در مدیریت گفتگوی چندنوبتی

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

سنجش کیفیت گفتگوی چندنوبتی

چند شاخص کلیدی برای سنجش کیفیت یک نشست چندنوبتی وجود دارد:

شاخصتوضیح
Coherence Scoreانسجام پاسخ‌ها با نوبت‌های قبلی
Intent Retentionحفظ نیت اصلی در طول نشست
Token Growth Rateنرخ رشد مصرف توکن در هر نوبت
Contradiction Rateنرخ تناقض بین نوبت‌ها
Resolution Rateدرصد نشست‌هایی که به حل مسئله می‌رسند

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

پرسش‌های پرتکرار درباره مدیریت گفتگوی چندنوبتی

گفتگوی چندنوبتی در پرامپت نویسی چیست؟

گفتگوی چندنوبتی به نشستی گفته می‌شود که در آن مدل با یک پیشینه پیوسته از پیام‌ها روبه‌روست. مدیریت این نشست یعنی کنترل اینکه چه بخشی از پیشینه در هر نوبت به مدل برسد و با چه ساختاری.

چطور از انحراف مکالمه جلوگیری کنیم؟

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

آیا باید کل پیشینه در هر نوبت ارسال شود؟

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

آیا حافظه و پنجره زمینه یکی هستند؟

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

چطور گفتگوی چندنوبتی را برای زبان فارسی بهینه کنیم؟

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

نگاه معمارانه به نشست‌های چندنوبتی

از منظر معماری، یک نشست چندنوبتی چیزی شبیه به یک سیستم توزیع‌شده با حالت (State) است. هر نوبت، یک تراکنش روی این حالت است که باید با قواعد مشخص به‌روزرسانی شود. اگر این ذهنیت را بپذیرید، سؤال‌های طراحی هم تغییر می‌کنند: چه بخشی از حالت باید پایدار بماند؟ چه بخشی قابل فشرده‌سازی است؟ چه زمانی حالت باید بازنشانی شود؟

در سیستم‌های بالغ، معمولاً سه لایه حالت وجود دارد. لایه اول، پیشینه کوتاه‌مدت است که شامل نوبت‌های اخیر می‌شود. لایه دوم، خلاصه میان‌مدت است که با rolling summary ساخته می‌شود. لایه سوم، حافظه بلندمدت است که در یک پایگاه داده برداری نگه داشته می‌شود و با تکنیک‌هایی مثل بازنویسی پرسش برای بازیابی هدفمندتر فراخوانی می‌شود.

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

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

تجربه شما

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