حفظ جلسة الدردشة يسمح لتطبيق .NET الخاص بك بالبقاء بعد إعادة التشغيل، ويوفر نسخة احتياطية من المحادثة، ويمكنك من نقل الجلسة بين الأجهزة. في هذا الدليل سنستعرض حفظ واستئناف جلسة دردشة في C# باستخدام Aspose.LLM، مع تغطية متى يتم استخدام النمط، وكيفية حفظ وتحميل الجلسات، وما هي البيانات التي يتم تخزينها، واعتبارات القابلية للنقل، وأفضل ممارسات الأمان.

لماذا حفظ واستئناف جلسة الدردشة؟

غالبًا ما يقوم المطورون بإنشاء مساعدين تفاعليين أو روبوتات دعم أو تدفقات عمل تحليل بيانات طويلة الأمد. في العديد من السيناريوهات يجب أن يبقى سياق الدردشة موجودًا بعد انتهاء عملية واحدة:

  • أداة دعم سطح المكتب حيث يتوقع المستخدمون أن تظل استفساراتهم السابقة متاحة بعد إغلاق التطبيق.
  • أتمتة على جانب الخادم تمتد عبر عدة خطوات وقد يتم إعادة تشغيلها بسبب الصيانة.
  • متطلبات التدقيق أو الامتثال التي تتطلب لقطة سريعة للمحادثة بأكملها.
  • نقل جلسة استكشاف الأخطاء وإصلاحها من حاسوب المطور المحمول إلى خادم الإنتاج.

من خلال حفظ الجلسة في ملف JSON، تقوم بالتقاط تاريخ الرسائل الكامل وذاكرة التخزين المؤقت KV الداخلية اللازمة لاستمرار دقيق، مما يجعل حالات الاستخدام المذكورة أعلاه سهلة التنفيذ.

البدء مع Aspose.LLM

أولاً، أضف حزمة Aspose.LLM إلى مشروعك:

Install-Package Aspose.LLM

يمكنك العثور على مزيد من تفاصيل المنتج على صفحة منتج Aspose.LLM .NET. يتطلب SDK ترخيصًا صالحًا، لذا تأكد من أن لديك ملف ترخيص مؤقت أو دائم جاهز.

المتطلبات المسبقة

  • تثبيت حزمة NuGet الخاصة بـ Aspose.LLM.
  • تطبيق ترخيص Aspose.LLM باستخدام Aspose.LLM.License.
  • إنشاء مثيل AsposeLLMApi (على سبيل المثال، باستخدام Qwen25Preset).

متى تستخدم هذا النمط

يتألق هذا النمط عندما تحتاج إلى أن تستمر المحادثة بعد العملية الحالية، أو عندما تريد نسخة احتياطية موثوقة للنسخ الاحتياطي أو الترحيل. تشمل السيناريوهات النموذجية:

  • تطبيقات سطح المكتب أو الخادم حيث يتوقع المستخدمون أن تستمر الدردشة بين عمليات التشغيل.
  • سير عمل طويل الأمد يحتاج إلى أن تبقى المحادثة بعد انتهاء العملية.
  • أغراض النسخ الاحتياطي والتدقيق من خلال أخذ لقطة لحالة محادثة نشطة.
  • نقل حالة الجلسة بين الأجهزة التي تستخدم نفس نسخة SDK والإعداد المسبق.

المتطلبات المسبقة

قبل أن تتمكن من حفظ أو استعادة جلسة، تأكد من أن ما يلي موجود:

  1. Aspose.LLM حزمة NuGet – تم تثبيته عبر الأمر المعروض سابقًا.
  2. الترخيص – أنشئ كائن Aspose.LLM.License واستدعِ SetLicense مع ملف .lic الخاص بك.
  3. مثيل API – أنشئ مثيلًا لـ AsposeLLMApi باستخدام الإعداد المسبق المطلوب (مثال: new Qwen25Preset()).

يتم توضيح هذه الخطوات في المثال الكامل لاحقًا في المقال.

حفظ جلسة

يقدم SDK ثلاث طرق مريحة لحفظ جلسة الدردشة. اتبع الخطوات أدناه، ثم راجع مثال الشيفرة.

  1. استدعِ SaveChatSession مع مسار ملف صريح إذا كنت بحاجة إلى الملف في موقع معروف.
  2. احذف المسار لتسمح لـ SDK بكتابة <sessionId>.json بجوار الملف التنفيذي.
  3. أنشئ مسارًا مؤقتًا باستخدام Path.Combine، وتأكد من وجود الدليل، واحفظ هناك للسيناريوهات المعزولة أو في بيئات الصندوق الرملي.

عينة الشيفرة – حفظ الجلسة

يوضح المثال التالي جميع النهج الثلاثة:

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، وتستمر في الحوار، مما يُظهر أن النموذج يحتفظ بالرسائل السابقة.

Note: تم إعادة إنتاج هذه المقاطع من الوثائق الرسمية لـ Aspose ولم يتم تنفيذها في بيئة تجريبية. تحقق منها في بيئتك قبل استخدامها في الإنتاج.

ما الذي يتم حفظه؟

SaveChatSession ينتج مستند JSON يحتوي على ثلاثة أقسام أساسية:

  1. معرّف الجلسة – المعرف الفريد الذي قدمته عند بدء الدردشة.
  2. سجل الرسائل – قائمة مرتبة بجميع رسائل المستخدم والمساعد، بما في ذلك الدور والمحتوى وأي بيانات تعريف وسائط.
  3. بيانات تعريف ذاكرة التخزين المؤقت KV – المواقع الداخلية وأحجام ذاكرة التخزين المؤقت المفتاح‑القيمة لكل رسالة، مما يسمح للنموذج بالمتابعة من حيث توقف.

نظرًا لأن بيانات الذاكرة المؤقتة مُضمنة، يمكن للجلسة المستعادة متابعة التوليد دون إعادة حساب الانتباه السابق، مما يجعل عملية الاستئناف سريعة وحتمية.

قيود القابلية للنقل

على الرغم من أن ملف JSON يحتوي على كل ما يلزم لاستمرار مثالي، إلا أنه قابل للنقل فقط تحت ظروف معينة:

  • نفس إصدار SDK الرئيسي – قد يتغير تنسيق الملف بين الإصدارات الرئيسية، لذا يجب على الطرفين استخدام نفس الإصدار الرئيسي من Aspose.LLM.
  • ملف نموذج متطابق – يجب أن يتطابق نموذج Hugging Face الأساسي (بما في ذلك التكميم) تمامًا؛ وإلا سيصبح ذاكرة KV غير متوافقة.
  • مطابقة BinaryManagerParameters.ReleaseTag – يجب أن تكون نسخة زمن تشغيل llama.cpp المستخدمة لتحميل النموذج هي نفسها، وإلا ستختلف تخطيطات الموترات منخفضة المستوى.

إذا تم انتهاك أي من هذه القيود قد ترى أخطاء مثل InvalidOperationException أو مخرجات مشوشة.

فكرة معروفة حول وقت التحميل

عند استدعاء LoadChatSession، يقوم SDK بإعادة بناء المحادثة لكنه يطبق الافتراضية ContextParameters و ChatParameters و SamplerParameters. أي إعدادات مخصصة (مثل درجة الحرارة، الحد الأقصى للتوكنات، مطالبات النظام) استخدمتها خلال الجلسة الأصلية ليس يتم استعادتها تلقائيًا. للحفاظ على سلوك التوليد الدقيق، أعد تطبيق المعلمات المخصصة بعد التحميل، أو أعد تشغيل المحادثة في جلسة جديدة بالإعدادات المطلوبة.

الأخطاء الشائعة

فيما يلي قائمة مراجعة سريعة للمشكلات الشائعة التي قد تواجهها أثناء تحميل الجلسة:

  • FileNotFoundException – تحقق من مسار الملف؛ المسارات النسبية تُحل بالنسبة إلى دليل العمل الحالي.
  • InvalidOperationException عند التحميل – يشير إلى نسخة SDK غير متوافقة أو ملف JSON تالف.
  • Garbled output after load – عادةً ما يكون ناتجًا عن ملف نموذج غير متطابق أو ReleaseTag. تأكد من وجود نفس ملف النموذج الثنائي على جهاز التحميل.

معالجة هذه الاستثناءات بلطف وتسجيل التشخيصات التفصيلية سيجعل تطبيقك أكثر قوة.

الأمان

ملف JSON المستمر يحتوي على نسخ نص عادي من كل رسالة للمستخدم والمساعد. تخزينه في موقع غير محمي يمكن أن يكشف عن بيانات حساسة. ضع في اعتبارك التدابير التالية:

  • تشفير الملف قبل كتابته على القرص (مثال: Windows DPAPI، Azure Key Vault، أو مكتبة متعددة المنصات مثل libsodium).
  • تقييد أذونات نظام الملفات بحيث لا يستطيع سوى حساب الخدمة الذي يشغّل التطبيق قراءة/كتابة الملف.
  • إذا كان يجب نقل الملف عبر الشبكة، استخدم قنوات مشفّرة بـ TLS وفكّر في توقيع الملف لاكتشاف أي تعديل غير مصرح به.

ما التالي

الآن بعد أن يمكنك حفظ واستئناف الدردشات، قد ترغب في استكشاف القدرات ذات الصلة:

  • حالات استخدام الدردشة متعددة الأدوار – الحفاظ على حوارات أطول عبر العديد من التفاعلات.
  • تكوين مسبق مخصص – تخصيص الإعداد المسبق للنموذج لمجالك قبل حفظه.
  • مرجع حفظ الجلسة الكامل – مراجعة مرجع API للحصول على دلالات أعمق حول SaveChatSession والبيانات الوصفية ذات الصلة.

اختيار النهج المناسب

قدمت المقالة ثلاث طرق لحفظ الجلسة وطريقة تحميل بسيطة. اختر النهج الذي يتوافق مع سيناريو النشر الخاص بك:

  • المسار الصريح – الأفضل عندما يجب أن يكون الملف موجودًا في موقع معروف، مثل مجلد مخصص للمستخدم أو محرك شبكة مشترك.
  • اسم الملف الافتراضي – مناسب للنماذج الأولية السريعة أو عندما تكون الجلسة موجودة جنبًا إلى جنب مع الملف التنفيذي.
  • المسار المؤقت مع إنشاء الدليل – مثالي لبيئات العزل، خطوط أنابيب CI، أو عندما تريد أن يدير نظام التشغيل عملية التنظيف.

جميع الأساليب تستخدم نفس واجهة برمجة التطبيقات الأساسية؛ وتختلف فقط في طريقة إدارة نظام الملفات.

احصل على ترخيص مجاني

إذا لم يكن لديك ترخيص دائم بعد، يمكنك الحصول على ترخيص تقييم مؤقت من صفحة الترخيص المؤقتة Aspose.

موارد إضافية مجانية

الخلاصة

إن حفظ جلسة دردشة باستخدام Aspose.LLM يمنحك المتانة، وإمكانية التدقيق، والمرونة لنقل المحادثات بين العمليات أو الأجهزة. لقد تعلمت متى يجب تطبيق هذا النمط، وكيفية حفظ الجلسة بثلاث طرق مختلفة، وكيفية استعادتها، وما يحتويه ملف JSON، والاعتبارات المتعلقة بالتوافق والأمان التي يجب أن تضعها في الاعتبار. مسلحًا بالمثال الكامل، يمكنك الآن دمج حفظ الجلسة في أي حل دردشة .NET.

الأسئلة المتكررة

  1. متى يكون حفظ جلسة الدردشة مفيدًا؟
    يكون الحفظ مفيدًا لتطبيقات سطح المكتب أو الخادم التي تحتاج إلى حالة المحادثة عبر عمليات التشغيل، أو سير عمل طويل الأمد، أو متطلبات التدقيق أو النسخ الاحتياطي، وكذلك نقل الجلسات بين الأجهزة التي تستخدم نفس إصدار SDK.
  2. كيف يمكنني تحديد مسار ملف مخصص عند حفظ الجلسة؟
    استدعِ api.SaveChatSession(sessionId, "myfolder\myfile.json"); أو أنشئ مسارًا باستخدام Path.Combine وتأكد من وجود الدليل قبل الحفظ.
  3. ماذا تُعيد الدالة LoadChatSession؟
    تُعيد معرف الجلسة المستعادة، مما يتيح لك الاستمرار في إرسال الرسائل دون الحاجة لتوفير المعرف مرة أخرى.
  4. هل يمكنني نقل ملف الجلسة المحفوظ إلى جهاز آخر؟
    نعم، طالما أن الجهاز الهدف يستخدم نفس الإصدار الرئيسي من SDK، وملف النموذج المتطابق، وعلامة الإصدار ReleaseTag الخاصة بـ llama.cpp.
  5. هل ملف JSON المحفوظ آمن؟
    الملف يخزن بيانات المحادثة كنص عادي، لذا يجب تشفيره قبل تخزينه في مواقع غير موثوقة.
  6. لماذا لا يتم استعادة إعدادات الموزع المخصص أو سياق الإعدادات بعد التحميل؟
    تقوم LoadChatSession بتطبيق المعلمات الافتراضية؛ أعد تطبيق أي إعدادات مخصصة بعد التحميل أو أعد تشغيل السجل في جلسة جديدة.

اقرأ المزيد