نگهداری یک جلسه چت به برنامه .NET شما امکان می‌دهد پس از راه‌اندازی مجدد ادامه یابد، نسخه پشتیبان از گفتگو فراهم می‌کند و انتقال جلسه بین ماشین‌ها را ممکن می‌سازد. در این راهنما، ما Persist and Resume a Chat Session in C# را با استفاده از Aspose.LLM بررسی می‌کنیم و به مواردی مانند زمان استفاده از این الگو، نحوه ذخیره و بارگذاری جلسات، داده‌های ذخیره‌شده، ملاحظات قابل‌حمل بودن و بهترین شیوه‌های امنیتی می‌پردازیم.

چرا یک جلسه چت را ذخیره و از سر بگیرید؟

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

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

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

شروع کار با Aspose.LLM

اول، بسته Aspose.LLM را به پروژهٔ خود اضافه کنید:

Install-Package Aspose.LLM

می‌توانید جزئیات بیشتر محصول را در صفحه محصول Aspose.LLM .NET پیدا کنید. SDK به یک لایسنس معتبر نیاز دارد، بنابراین مطمئن شوید که یک فایل لایسنس موقت یا دائم آماده دارید.

پیش‌نیازها

  • پکیج NuGet Aspose.LLM را نصب کنید.
  • با استفاده از Aspose.LLM.License یک لایسنس Aspose.LLM اعمال کنید.
  • یک نمونه AsposeLLMApi ایجاد کنید (به عنوان مثال، با Qwen25Preset).

زمان استفاده از این الگو

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

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

پیش‌نیازها

قبل از اینکه بتوانید یک جلسه را ذخیره یا بازیابی کنید، اطمینان حاصل کنید که موارد زیر موجود هستند:

  1. Aspose.LLM NuGet package – نصب شده با فرمانی که قبلاً نشان داده شد.
  2. License – یک شیء Aspose.LLM.License ایجاد کنید و SetLicense را با فایل .lic خود فراخوانی کنید.
  3. API instanceAsposeLLMApi را با پیش‌تنظیم مورد نظر (مثلاً new Qwen25Preset()) نمونه‌سازی کنید.

این مراحل در مثال کامل که در ادامه مقاله آمده است، نشان داده شده‌اند.

ذخیره یک جلسه

SDK سه روش راحت برای حفظ یک جلسه چت ارائه می‌دهد. مراحل زیر را دنبال کنید، سپس نمونه کد را ببینید.

  1. اگر به فایلی در مکان مشخصی نیاز دارید، SaveChatSession را با مسیر فایل صریح فراخوانی کنید.
  2. مسیر را حذف کنید تا SDK فایل <sessionId>.json را در کنار فایل اجرایی بنویسد.
  3. یک مسیر موقت با Path.Combine بسازید، اطمینان حاصل کنید که پوشه وجود دارد، و برای سناریوهای ایزوله یا sandboxed در آن ذخیره کنید.

نمونه کد – ذخیره‌سازی جلسه

مثال زیر تمام سه رویکرد را نشان می‌دهد:

api.SaveChatSession(sessionId, "session-42.json");

api.SaveChatSession(sessionId); // writes <sessionId>.json next to the executable

string path = Path.Combine(Path.GetTempPath(), "chats", $"{sessionId}.json");
Directory.CreateDirectory(Path.GetDirectoryName(path)!);
api.SaveChatSession(sessionId, path);

api.SaveChatSession(sessionId, "session-42.json") فایل JSON را در مکان ارائه‌شده می‌نویسد. اگر SaveChatSession را بدون مسیر صدا بزنید، SDK فایلی با نام شناسه جلسه در دایرکتوری کاری فعلی ایجاد می‌کند. وقتی به یک مکان تعیین‌شده یا موقت نیاز دارید، Path.GetTempPath را با ساختار پوشه خود ترکیب کنید و قبل از ذخیره‌سازی، دایرکتوری را ایجاد کنید.

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

بازگرداندن یک جلسه

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

  1. متد LoadChatSession را با مسیر فایل JSON فراخوانی کنید.
  2. مقدار بازگردانده شده sessionId را ذخیره کنید.
  3. از SendMessageToSessionAsync با شناسه بازیابی شده استفاده کنید تا گفتگو را ادامه دهید.

نمونه کد – بازیابی یک جلسه

string sessionId = await api.LoadChatSession("session-42.json");
string reply = await api.SendMessageToSessionAsync(sessionId, "What did we discuss?");

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

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

مثال کامل — ذخیره، راه‌اندازی مجدد، ادامه

در زیر یک نمایش کامل، انتها‑به‑انتها ارائه شده است. بلوک اول یک چت را آغاز می‌کند، چند پیام ارسال می‌کند و جلسه را ذخیره می‌نماید. بلوک دوم یک فرآیند جدید را شبیه‌سازی می‌کند که فایل ذخیره‌شده را بارگذاری کرده و گفت‌وگو را ادامه می‌دهد.

نمونه کد – جریان کار انتها به انتها

using Aspose.LLM;
using Aspose.LLM.Abstractions.Parameters.Presets;

// ---------- First run: save ----------
{
    var license = new Aspose.LLM.License();
    license.SetLicense("Aspose.LLM.lic");

using var api = AsposeLLMApi.Create(new Qwen25Preset());

string sessionId = await api.StartNewChatAsync(sessionId: "support-ticket-1234");

await api.SendMessageToSessionAsync(sessionId,
        "Customer reports that the migration from v25 to v26 broke their startup script.");
    await api.SendMessageToSessionAsync(sessionId,
        "Their environment: Windows Server 2022, .NET 8, CUDA 12.6.");
    await api.SendMessageToSessionAsync(sessionId,
        "What questions should I ask them next?");

api.SaveChatSession(sessionId, "support-ticket-1234.json");
    Console.WriteLine("Session saved.");
}

// ---------- Second run: resume ----------
{
    var license = new Aspose.LLM.License();
    license.SetLicense("Aspose.LLM.lic");

using var api = AsposeLLMApi.Create(new Qwen25Preset());

string sessionId = await api.LoadChatSession("support-ticket-1234.json");
    Console.WriteLine($"Resumed session: {sessionId}");

string reply = await api.SendMessageToSessionAsync(sessionId,
        "They replied that they use a custom build step that copies native DLLs. How should I proceed?");
    Console.WriteLine(reply);
}

بلوک اول یک مجوز ایجاد می‌کند، API را با Qwen25Preset نمونه‌سازی می‌کند، یک گفتگوی جدید به نام support-ticket-1234 را شروع می‌کند، سه پیام برای ساخت زمینه ارسال می‌کند و در نهایت جلسه را در support-ticket-1234.json می‌نویسد. بلوک دوم مجوز و API را دوباره ایجاد می‌کند، فایل JSON را بارگذاری می‌کند و گفت‌وگو را ادامه می‌دهد، نشان می‌دهد که مدل پیام‌های قبلی را حفظ می‌کند.

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

چه چیزی ذخیره می‌شود؟

SaveChatSession یک سند JSON با سه بخش اساسی تولید می‌کند:

  1. Session Identifier – شناسهٔ یکتایی که هنگام شروع چت فراهم کرده‌اید.
  2. Message History – فهرستی مرتب از تمام پیام‌های کاربر و دستیار، شامل نقش، محتوا و هر متادیتای رسانه‌ای.
  3. KV Cache Metadata – موقعیت‌ها و اندازه‌های داخلی کش کلید‑مقدار برای هر پیام، که به مدل اجازه می‌دهد دقیقاً از جایی که متوقف شده بود ادامه دهد.

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

محدودیت‌های قابلیت حمل

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

  • نسخه اصلی یکسان SDK – قالب فایل ممکن است بین نسخه‌های اصلی متفاوت باشد، بنابراین هر دو طرف باید از همان نسخه اصلی Aspose.LLM استفاده کنند.
  • فایل مدل یکسان – مدل پایه Hugging Face (از جمله کوانتیزیشن) باید دقیقاً مطابقت داشته باشد؛ در غیر این صورت کش KV ناسازگار می‌شود.
  • برچسب انتشار BinaryManagerParameters هم‌خوان – نسخه زمان اجرا llama.cpp که برای بارگذاری مدل استفاده می‌شود باید یکسان باشد، در غیر این صورت چیدمان‌های تنسور سطح پایین متفاوت خواهند شد.

یک نکته شناخته‌شده در زمان بارگذاری

هنگامی که LoadChatSession را فراخوانی می‌کنید، SDK مکالمه را بازسازی می‌کند اما پیش‌فرض ContextParameters، ChatParameters و SamplerParameters را اعمال می‌نماید. هر تنظیم سفارشی (مانند دما، حداکثر توکن‌ها، اعلان‌های سیستم) که در جلسهٔ اصلی استفاده کرده‌اید، به‌صورت خودکار بازگردانده نمی‌شود. برای حفظ رفتار دقیق تولید، پس از بارگذاری پارامترهای سفارشی خود را دوباره اعمال کنید یا مکالمه را در یک جلسهٔ جدید با تنظیمات دلخواه بازپخش کنید.

خطاهای رایج

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

  • FileNotFoundException – مسیر فایل را بررسی کنید؛ مسیرهای نسبی نسبت به دایرکتوری کاری جاری حل می‌شوند.
  • InvalidOperationException on load – نشان‌دهنده نسخه ناسازگار SDK یا فایل JSON خراب است.
  • Garbled output after load – معمولاً به دلیل عدم تطابق فایل مدل یا ReleaseTag ایجاد می‌شود. اطمینان حاصل کنید که همان باینری مدل دقیقاً بر روی ماشین بارگذاری موجود باشد.

به‌طور مؤثر این استثناها را مدیریت کنید و تشخیص‌های دقیق را ثبت کنید تا برنامه شما مقاوم‌تر شود.

امنیت

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

  • فایل را قبل از نوشتن بر روی دیسک رمزگذاری کنید (به عنوان مثال، Windows DPAPI، Azure Key Vault، یا کتابخانه‌ای چندپلتفرمی مانند libsodium).
  • دسترسی‌های سیستم فایل را محدود کنید تا فقط حساب سرویس‌کاربری که برنامه را اجرا می‌کند بتواند فایل را بخواند/بنویسد.
  • اگر فایل باید از طریق شبکه منتقل شود، از کانال‌های رمزگذاری‌شده TLS استفاده کنید و برای تشخیص دستکاری، امضای فایل را در نظر بگیرید.

چه‌کار بعدی

اکنون که می‌توانید گفتگوها را ذخیره و از سر بگیرید، ممکن است به قابلیت‌های مرتبط بپردازید:

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

انتخاب رویکرد مناسب

مقاله سه روش برای ذخیره‌سازی یک جلسه و یک روش ساده برای بارگذاری ارائه داد. رویکردی را انتخاب کنید که با سناریوی استقرار شما مطابقت داشته باشد:

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

تمام روش‌ها از همان API پایه استفاده می‌کنند؛ آن‌ها فقط در نحوه مدیریت سیستم فایل متفاوت هستند.

دریافت لایسنس رایگان

اگر هنوز لایسنس دائمی ندارید، می‌توانید یک لایسنس ارزیابی موقت از صفحه لایسنس موقت Aspose دریافت کنید.

منابع اضافی رایگان

نتیجه‌گیری

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

FAQs

  1. چه زمانی نگهداری یک جلسه چت مفید است؟
    نگهداری برای برنامه‌های دسکتاپ یا سرور که به وضعیت مکالمه در طول راه‌اندازی‌های متعدد، گردش‌کارهای طولانی‌مدت، نیازهای حسابرسی یا پشتیبان‌گیری، و انتقال جلسات بین ماشین‌ها با همان نسخه SDK نیاز دارند، مفید است.
  2. چگونه می‌توانم مسیر فایل سفارشی را هنگام ذخیره‌سازی یک جلسه مشخص کنم؟
    متد api.SaveChatSession(sessionId, "myfolder\myfile.json"); را فراخوانی کنید یا با استفاده از Path.Combine مسیر را بسازید و قبل از ذخیره‌سازی اطمینان حاصل کنید که پوشه موجود است.
  3. LoadChatSession چه مقداری برمی‌گرداند؟
    این متد شناسه جلسه بازسازی‌شده را برمی‌گرداند، به‌طوری که بتوانید بدون نیاز به ارائه دوباره شناسه، به ارسال پیام‌ها ادامه دهید.
  4. آیا می‌توانم فایل جلسه ذخیره‌شده را به ماشین دیگری منتقل کنم؟
    بله، به‌شرط این‌که ماشین مقصد از همان نسخه اصلی SDK، فایل مدل یکسان و ReleaseTag مطابقت‌دار با llama.cpp استفاده کند.
  5. آیا فایل JSON ذخیره‌شده امن است؟
    این فایل داده‌های مکالمه را به‌صورت متن ساده ذخیره می‌کند، بنابراین باید قبل از ذخیره‌سازی در مکان‌های غیرقابل اعتماد، آن را رمزنگاری کنید.
  6. چرا تنظیمات سفارشی sampler یا context پس از بارگذاری بازنشانی نمی‌شوند؟
    LoadChatSession پارامترهای پیش‌فرض را اعمال می‌کند؛ پس از بارگذاری، تنظیمات سفارشی خود را دوباره اعمال کنید یا تاریخچه را در یک جلسه جدید بازپخش کنید.

بیشتر بخوانید