پرش به محتوای اصلی
پرش به محتوای مقاله

«تراشیدن پنجرهٔ زمینه»؛ راهکار مایکروسافت برای مدیریت تاریخچهٔ گفتگوها

·۲۳ مهر ۱۴۰۵۴ دقیقه مطالعه
راهنما
تاریخچه چت پنجره زمینه را می‌بلعد — با کاهش‌دهنده آن را اصلاح کنید
تاریخچه چت پنجره زمینه را می‌بلعد — با کاهش‌دهنده آن را اصلاح کنید
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

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

صورت‌حساب API شما هر بار که کاربر وارد بحث‌های حاشیه‌ای می‌شود یا یک باگ را تکرار می‌کند، به‌صورت خطی رشد می‌کند. در ۱۵ اکتبر ۲۰۲۶، یک راهنمای فنی افشا کرد که نسخه ۱۰.۱۰ کتابخانه Microsoft.Extensions.AI (با پرچم آزمایشی MEAI001) از طریق رابط IChatReducer جلوی تورم پنجرهٔ زمینه (Context Window) — که شبیه میز کاری است که فقط جای چند ورق دارد، نه کل کتابخانه — را می‌گیرد تا تمرکز مدل از دست نرود.

همان‌طور که در تحلیل قبلی ما درباره‌ی اینکه چگونه نتایج ابزارها می‌توانند ۹۵٪ از پنجره زمینه را هدر دهند اشاره کردیم، این رویکرد فراتر از یک برش ساده است. تصور کنید تاریخچهٔ چت شما یک دفتر کل فیزیکی است؛ به‌جای اینکه صرفاً ۱۰ صفحه آخر را پاره کنید، یک Reducer به‌طور هوشمند صفحات قدیمی را خلاصه می‌کند اما قوانین اصلی خانه را دست‌نخورده باقی می‌گذارد.

سازوکار کاهش حجم

به نقل از گزارش dev.to، کلاس ReducingChatClient پیام‌های ورودی را رهگیری کرده و پیش از ارسال به کلاینت اصلی، یک سیاست کاهش (Reduction Policy) را اعمال می‌کند. این کار مانع از «فراموشی» مدل می‌شود؛ وضعیتی که در آن بات‌ها شناسه‌های حساب کاربری را که در ابتدای گفتگو ذکر شده بود، فراموش می‌کنند. این چالش در مدیریت حافظه بلندمدت، مشابه موانعی است که در بررسی شکاف‌های فنی LangGraph برای عامل‌های چندروزه تحلیل کردیم.

این سازوکار بر متد ReduceAsync متکی است که به صورت زیر تعریف شده است:
Task<IEnumerable<ChatMessage>> ReduceAsync(IEnumerable<ChatMessage> messages, CancellationToken cancellationToken)

پیاده‌سازی آن از الگوی Builder پیروی می‌کند:
IChatClient client = new ChatClientBuilder(inner).UseChatReducer(reducer).Build();

چهار تله در پیاده‌سازی Reducer

بر اساس مستندات، توسعه‌دهندگان هنگام طراحی Reducer باید از این چهار خطای رایج دوری کنند:

  • جفت‌های یتیم ابزار: برش‌های ساده و ابتدایی اغلب یک FunctionCallContent (فراخوانی تابع) را از FunctionResultContent (نتیجه تابع) جدا می‌کنند. این اتفاق باعث خطاهای ۴۰۰ در سمت ارائه‌دهنده می‌شود که شبیه به ناپایداری مدل به نظر می‌رسد. Reducerهای داخلی برای حفظ پایداری، این جفت‌ها را از نمای کاهش‌یافته حذف نمی‌کنند تا پیوستگی حفظ شود. اگر یک Reducer سفارشی می‌نویسید، باید از تست‌های واحد (Unit Tests) با تاریخچه‌های ترکیبی استفاده کنید تا مطمئن شوید هیچ‌کدام از این دو نوع محتوا به‌تنهایی باقی نمی‌مانند.
  • تعداد پیام در برابر تعداد توکن: مدل MessageCountingChatReducer(targetCount) پیام سیستمی اول و نوبت‌های اخیر غیرسیستمی را نگه می‌دارد. این روش برای سوالات متداول (FAQ) پیش‌بینی‌پذیر و عالی است اما وقتی کاربر یک Stack Trace حجیم را کپی می‌کند، شکست می‌خورد. در اینجا به TokenAwareChatReducer نیاز است تا هزینه واقعی را تخمین بزند. این Reducer از یک گاردریل (تعداد کاراکترها تقسیم بر ۴) استفاده می‌کند و از جدیدترین پیام به قدیمی‌ترین پیام حرکت می‌کند تا زمانی که بودجه توکن پر شود.
  • خلاصه‌سازی گران‌قیمت: استفاده از یک مدل پرچم‌دار برای خلاصه کردن تاریخچه، منجر به ایجاد یک صورت‌حساب دوم می‌شود. کلاس SummarizingChatReducer(summarizer, targetCount, threshold) زمانی فعال می‌شود که پیام‌های خلاصه‌نشده از حد آستانه (threshold) فراتر روند. راهنما توصیه می‌کند که Summarizer را به یک کلاینت کوچک، ارزان یا آفلاین متصل کنید. توجه داشته باشید که خلاصه‌سازی ممکن است مقدار __summary__ را در AdditionalProperties ثبت کند؛ بنابراین نقاط انتهایی پیش‌نمایش (Preview Endpoints) باید پیام‌ها را کلون کنند تا ذخیره‌ساز زنده نشست (Session Store) تغییر نکند. این تلاش برای حفظ معنای گفتگو در عین کاهش حجم، یادآور رویکرد پروژه Coders Talk در انتقال حافظه شناختی برنامه‌نویسان به عامل‌های هوش مصنوعی است.
  • فرسایش پرامپت سیستمی: حذف پرامپت سیستمی (System Prompt) برای صرفه‌جویی در توکن، ماهیت محصول را به‌طور بنیادی تغییر می‌دهد. تمام Reducerهای معتبر باید با پرامپت سیستمی مانند یک امر مقدس برخورد کنند. اگر خودِ پرامپت سیستمی بیش از حد بزرگ است، باید خودِ پرامپت در محیط تولید اصلاح شود، نه اینکه حذف گردد.

کاهش‌دهنده: راه‌حلی برای مدیریت تاریخچه چت و جلوگیری از پرشدن پنجره زمینه

معماری نشست (Session)

برای یک پیاده‌سازی حرفه‌ای، این راهنما یک سطح دسترسی مینیمال با مسیرهای API مشخص را پیشنهاد می‌دهد:

  • POST /api/sessions: ایجاد یک نشست جدید.
  • POST /api/sessions/{id}/messages: مدیریت چت و بازگرداندن تعداد توکن‌های قبل و بعد از کاهش.
  • GET /api/sessions/{id}/history: بازیابی متن خام و کامل تاریخچه.
  • GET /api/sessions/{id}/reduced: پیش‌نمایش نمای شمارشی، خلاصه‌شده یا توکن-آگاه.

این تغییر در پیاده‌سازی یعنی توسعه‌دهندگان دیگر مجبور نیستند بین یک «پنجره لغزان» (Sliding Window) ساده و یک Payload گران‌قیمت از کل تاریخچه یکی را انتخاب کنند. با جداسازی ذخیره نشست (متن کامل تاریخچه) از داده‌های ارسالی روی شبکه (نسخه کاهش‌یافته)، شما یک ردپای حسابرسی (Audit Trail) کامل دارید بدون اینکه در هر نوبت هزینه آن را بپردازید.

برای کیف پول توسعه‌دهنده، این یعنی تغییر رشد هزینه‌ها از حالت خطی به یک بودجه سقف‌دار برای هر درخواست. این موضوع این فرض را که «زمینه بیشتر همیشه بهتر است» به چالش می‌کشد و ثابت می‌کند که زمینهٔ گلچین‌شده (Curated Context) است که در واقع پایداری عامل (Agent) را تضمین می‌کند. این پایداری در لایه مدیریت نشست، مکمل مکانیزم‌هایی است که در سیستم Critic برای جلوگیری از قطع ارتباط عامل‌ها به کار گرفته شده است.

برای پیاده‌سازی این قابلیت، پروژه خود را به نسخه ۱۰.۱۰ کتابخانه Microsoft.Extensions.AI متصل (Pin) کنید و پرچم آزمایشی MEAI001 را به عنوان سیگنالی در نظر بگیرید که شاید نام‌ها تغییر کنند، اما منطق آن برای محیط تولید آماده است. اکنون می‌توانید کلاینت‌های داخلی آفلاین را با OpenAI یا Azure جایگزین کنید بدون اینکه نیاز باشد لایه کاهش حجم خود را از ابتدا بازنویسی کنید.

گام بعدی شما

  • پروژه خود را به نسخه ۱۰.۱۰ کتابخانه Microsoft.Extensions.AI ارتقا دهید.
  • برای کاهش هزینه‌ها، یک TokenAwareChatReducer را جایگزین شمارش ساده پیام‌ها کنید.
  • از مدل‌های کوچک (SLM) برای لایه خلاصه‌سازی استفاده کنید تا هزینه استنتاج نهایی افزایش نیابد.

اما داستان سخت‌افزاری این تحول حتی شگفت‌انگیزتر است — به تحلیل ما درباره‌ی تراشه‌های Blackwell مراجعه کنید.

چرا این موضوع مهم است؟

این رویکرد با کاهش حجم داده‌های ارسالی به API، هزینه‌های عملیاتی را به‌شدت کاهش داده و نرخ توهم را به دلیل تمرکز بیشتر مدل بر داده‌های کلیدی می‌کاهد. اعتبار این متد از استقرار آن در اکوسیستم مایکروسافت و تمرکز بر پایداری ابزارها (Tool-use) می‌آید.

تأثیر برای ایران

توسعه‌دهندگان ایرانی که با محدودیت بودجه دلاری برای APIهای OpenAI یا Azure دست‌وپنجه نرم می‌کنند، می‌توانند با این متد هزینه‌های استنتاج را به‌طور چشم‌گیری کاهش دهند.

·نگاه ما
تحریریه دات‌هوش

جایگزینی «بیشترین زمینه ممکن» با «بهینه‌ترین زمینه» نشان می‌دهد که صنعت از مرحلهٔ کورکورانه افزایش پنجره‌های متنی عبور کرده است. مدیریت فعال حافظه در لایه کلاینت، فشار را از روی مدل‌های زبانی برمی‌دارد و باعث می‌شود مدل‌های کوچک‌تر بتوانند در وظایف پیچیده با مدل‌های غول‌پیکر رقابت کنند.

منابع

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

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.