Збереження сеансу чату дозволяє вашому .NET застосунку переживати перезапуски, забезпечує резервну копію розмови та дає можливість переміщати сеанс між машинами. У цьому посібнику ми розглянемо Persist and Resume a Chat Session in C# за допомогою Aspose.LLM, охоплюючи коли слід використовувати цей шаблон, як зберігати та завантажувати сеанси, які дані зберігаються, питання портативності та кращі практики безпеки.

Чому варто зберігати та відновлювати чат‑сесію?

Розробники часто створюють інтерактивних помічників, підтримувальні боти або довготривалі робочі процеси аналізу даних. У багатьох сценаріях контекст чату має залишатися живим після завершення роботи окремого процесу.

  • Настільний інструмент підтримки, де користувачі очікують, що їхні попередні запити залишаться доступними після закриття програми.
  • Автоматизація на боці сервера, що охоплює кілька кроків і може бути перезапущена через технічне обслуговування.
  • Вимоги аудиту або відповідності, які вимагають знімка всієї розмови.
  • Перенесення сеансу усунення проблем з ноутбука розробника на продукційний сервер.

Зберігаючи сеанс у файл JSON, ви захоплюєте повну історію повідомлень та внутрішній кеш KV, необхідний для точного продовження, що робить вищезгадані випадки використання простими у реалізації.

Початок роботи з Aspose.LLM

Спочатку додайте пакет Aspose.LLM у ваш проєкт:

Install-Package Aspose.LLM

Більше деталей про продукт можна знайти на Aspose.LLM .NET product page. SDK вимагає дійсної ліцензії, тому переконайтеся, що у вас є готовий тимчасовий або постійний файл ліцензії.

Вимоги

  • Встановіть пакет NuGet Aspose.LLM.
  • Застосуйте ліцензію Aspose.LLM за допомогою Aspose.LLM.License.
  • Створіть екземпляр AsposeLLMApi (наприклад, з Qwen25Preset).

Коли використовувати цей шаблон

Цей шаблон відмінно підходить, коли вам потрібно, щоб розмова зберігалася поза межами поточного процесу, або коли ви хочете надійний знімок для резервного копіювання чи міграції. Типові сценарії включають:

  • Настільні або серверні додатки, у яких користувачі очікують, що чат буде зберігатися між запусками.
  • Тривалі робочі процеси, які потребують, щоб розмова існувала довше за процес.
  • Резервне копіювання та аудиторські цілі шляхом створення знімка активної розмови.
  • Перенесення стану сесії між машинами з однаковою версією SDK та попередньо налаштованим параметром.

Вимоги

Перш ніж ви зможете зберегти або відновити сеанс, переконайтеся, що наступне виконано:

  1. Aspose.LLM NuGet package – встановлено за допомогою команди, показаної раніше.
  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, відтворює внутрішній стан і повертає ідентифікатор сеансу, щоб ви могли продовжити обмін повідомленнями без необхідності вручну передавати ID знову.

  1. Викличте LoadChatSession з шляхом до файлу JSON.
  2. Збережіть повернений sessionId.
  3. Використайте SendMessageToSessionAsync з відновленим ID, щоб продовжити розмову.

Зразок коду – Відновлення сеансу

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. Ідентифікатор сесії – унікальний ID, який ви надали під час запуску чату.
  2. Історія повідомлень – упорядкований список усіх повідомлень користувача та асистента, включаючи роль, вміст та будь‑які метадані медіа.
  3. Метадані кешу KV – внутрішні позиції та розміри кешу ключ‑значення для кожного повідомлення, що дозволяє моделі продовжити саме там, де вона зупинилася.

Оскільки дані кешу включені, відновлена сесія може продовжити генерацію без повторного обчислення попередньої уваги, що робить операцію відновлення швидкою та детермінованою.

Обмеження портативності

Хоча файл JSON містить усе, що потрібно для ідеального продовження, він є портативним лише за певних умов:

  • Той самий основний випуск SDK – формат файлу може змінюватися між основними випусками, тому обидві сторони повинні використовувати один і той самий основний випуск Aspose.LLM.
  • Ідентичний файл моделі – базова модель Hugging Face (включаючи квантизацію) повинна точно збігатися; інакше кеш KV стає несумісним.
  • Відповідний BinaryManagerParameters.ReleaseTag – версія середовища виконання llama.cpp, що використовується для завантаження моделі, повинна бути такою ж, інакше низькорівневі розташування тензорів відрізняються.

Якщо будь-які з цих обмежень порушуються, ви можете бачити помилки, такі як InvalidOperationException, або спотворений вивід.

Відомий нюанс під час завантаження

Коли ви викликаєте LoadChatSession, SDK відтворює розмову, але застосовує за замовчуванням ContextParameters, ChatParameters та SamplerParameters. Будь-які користувацькі налаштування (наприклад, температура, максимальна кількість токенів, системні підказки), які ви використовували під час оригінальної сесії, не відновлюються автоматично. Щоб зберегти точну поведінку генерації, повторно застосуйте ваші користувацькі параметри після завантаження або відтворіть розмову у новій сесії з потрібними налаштуваннями.

Поширені помилки

Нижче наведено швидкий чек‑лист типових проблем, які ви можете зустріти під час завантаження сеансу:

  • FileNotFoundException – Перевірте шлях до файлу; відносні шляхи розв’язуються відносно поточної робочої директорії.
  • InvalidOperationException on load – Вказує на несумісну версію SDK або пошкоджений JSON‑файл.
  • Garbled output after load – Зазвичай викликано невідповідністю файлу моделі або ReleaseTag. Переконайтеся, що на машині завантаження присутній точно такий самий бінарний файл моделі.

Обробка цих винятків у спокійному режимі та журналювання докладної діагностики зробить ваш застосунок більш надійним.

Безпека

Збережений файл JSON містить plain‑text копії кожного повідомлення користувача та асистента. Зберігання його у незахищеному місці може розкрити конфіденційні дані. Розгляньте наступні заходи щодо пом’якшення:

  • Шифруйте файл перед записом на диск (наприклад, 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?
    Він повертає відновлений ідентифікатор сеансу, що дозволяє продовжувати надсилати повідомлення без повторного вказування ID.
  4. Чи можу я перемістити збережений файл сеансу на інший комп’ютер?
    Так, за умови, що цільова машина використовує ту ж головну версію SDK, ідентичний файл моделі та відповідний ReleaseTag llama.cpp.
  5. Чи безпечний збережений JSON‑файл?
    Файл зберігає дані розмов у вигляді простого тексту, тому його слід зашифрувати перед зберіганням у ненадійних місцях.
  6. Чому мої власні налаштування семплера або контексту не відновлюються після завантаження?
    LoadChatSession застосовує параметри за замовчуванням; повторно застосуйте будь‑які власні налаштування після завантаження або відтворіть історію в новому сеансі.

Читати далі