Das Persistieren einer Chat‑Sitzung ermöglicht es Ihrer .NET‑Anwendung, Neustarts zu überstehen, bietet ein Backup des Gesprächs und erlaubt das Verschieben der Sitzung zwischen Maschinen. In diesem Leitfaden gehen wir Schritt für Schritt durch Persist and Resume a Chat Session in C# mit Aspose.LLM und behandeln, wann das Muster eingesetzt werden sollte, wie Sitzungen gespeichert und geladen werden, welche Daten gespeichert werden, Portabilitätsaspekte und bewährte Sicherheitspraktiken.

Warum eine Chat‑Sitzung speichern und wieder aufnehmen?

Entwickler erstellen häufig interaktive Assistenten, Support‑Bots oder langlaufende Datenanalyse‑Workflows. In vielen Szenarien muss der Chat‑Kontext über die Lebensdauer eines einzelnen Prozesses hinaus bestehen bleiben:

  • Ein Desktop‑Support‑Tool, bei dem die Benutzer erwarten, dass ihre vorherigen Anfragen nach dem Schließen der App weiterhin verfügbar sind.
  • Serverseitige Automatisierung, die mehrere Schritte umfasst und aufgrund von Wartungsarbeiten neu gestartet werden kann.
  • Prüfungs‑ oder Compliance‑Anforderungen, die einen Schnappschuss des gesamten Gesprächs verlangen.
  • Das Verschieben einer Fehlersitzung von dem Laptop eines Entwicklers auf einen Produktionsserver.

Durch das Persistieren der Sitzung in einer JSON‑Datei erfassen Sie die vollständige Nachrichtenhistorie und den internen KV‑Cache, der für eine exakte Fortsetzung erforderlich ist, wodurch die oben genannten Anwendungsfälle einfach zu implementieren sind.

Erste Schritte mit Aspose.LLM

Fügen Sie zunächst das Aspose.LLM-Paket zu Ihrem Projekt hinzu:

Install-Package Aspose.LLM

Weitere Produktdetails finden Sie auf der Aspose.LLM .NET Produktseite. Das SDK erfordert eine gültige Lizenz, stellen Sie also sicher, dass Sie eine temporäre oder permanente Lizenzdatei bereit haben.

Voraussetzungen

  • Installieren Sie das Aspose.LLM NuGet‑Paket.
  • Wenden Sie eine Aspose.LLM‑Lizenz mit Aspose.LLM.License an.
  • Erstellen Sie eine AsposeLLMApi‑Instanz (zum Beispiel mit einem Qwen25Preset).

Wann dieses Muster zu verwenden ist

Dieses Muster glänzt, wenn Sie benötigen, dass das Gespräch über den aktuellen Prozess hinaus besteht, oder wenn Sie einen zuverlässigen Schnappschuss für Sicherung oder Migration wünschen. Typische Szenarien umfassen:

  • Desktop‑ oder Serveranwendungen, bei denen die Benutzer erwarten, dass der Chat zwischen Starts erhalten bleibt.
  • Langlaufende Workflows, die benötigen, dass das Gespräch länger als der Prozess lebt.
  • Backup‑ und Prüfungszwecke durch das Erstellen von Snapshots einer aktiven Unterhaltung.
  • Migration des Sitzungszustands zwischen Maschinen mit derselben SDK‑Version und denselben Voreinstellungen.

Voraussetzungen

Bevor Sie eine Sitzung speichern oder wiederherstellen können, stellen Sie sicher, dass Folgendes vorhanden ist:

  1. Aspose.LLM NuGet-Paket – installiert über den zuvor gezeigten Befehl.
  2. Lizenz – erstellen Sie ein Aspose.LLM.License-Objekt und rufen Sie SetLicense mit Ihrer .lic-Datei auf.
  3. API-Instanz – instanziieren Sie AsposeLLMApi mit dem gewünschten Preset (z. B. new Qwen25Preset()).

Diese Schritte werden im vollständigen Beispiel später im Artikel demonstriert.

Sitzung speichern

Das SDK bietet drei bequeme Möglichkeiten, eine Chatsitzung zu speichern. Befolgen Sie die nachstehenden Schritte und sehen Sie sich anschließend das Codebeispiel an.

  1. Rufen Sie SaveChatSession mit einem expliziten Dateipfad auf, wenn Sie die Datei an einem bekannten Ort benötigen.
  2. Lassen Sie den Pfad weg, damit das SDK <sessionId>.json neben der ausführbaren Datei schreibt.
  3. Erstellen Sie einen temporären Pfad mit Path.Combine, stellen Sie sicher, dass das Verzeichnis existiert, und speichern Sie dort für isolierte oder sandboxed Szenarien.

Codebeispiel – Speichern einer Sitzung

Das folgende Beispiel demonstriert alle drei Ansätze:

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") schreibt die JSON‑Datei an den angegebenen Speicherort.
Wenn Sie SaveChatSession ohne Pfad aufrufen, erstellt das SDK eine Datei mit dem Namen der Sitzungs‑ID im aktuellen Arbeitsverzeichnis.
Wenn Sie einen deterministischen oder temporären Speicherort benötigen, kombinieren Sie Path.GetTempPath mit Ihrer eigenen Ordnerstruktur und erstellen Sie das Verzeichnis vor dem Speichern.

Hinweis: Diese Snippets wurden aus der offiziellen Aspose-Dokumentation übernommen und wurden nicht in einer Sandbox ausgeführt. Überprüfen Sie sie in Ihrer Umgebung, bevor Sie sie in der Produktion verwenden.

Wiederherstellen einer Sitzung

Das Laden einer zuvor gespeicherten Sitzung ist ebenso einfach. Die API liest die JSON‑Datei, stellt den internen Zustand wieder her und gibt die Sitzungskennung zurück, sodass Sie die Nachrichtenübermittlung fortsetzen können, ohne die ID manuell übergeben zu müssen.

  1. Rufen Sie LoadChatSession mit dem Pfad zur JSON-Datei auf.
  2. Speichern Sie die zurückgegebene sessionId.
  3. Verwenden Sie SendMessageToSessionAsync mit der wiederhergestellten ID, um das Gespräch fortzusetzen.

Codebeispiel – Wiederherstellung einer Sitzung

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

LoadChatSession liest die Datei und gibt die wiederhergestellte Sitzungs‑ID zurück.
Die wiederhergestellte Sitzung wird automatisch als aktive festgelegt, sodass sofortige Aufrufe von SendMessageToSessionAsync möglich sind.

Hinweis: Diese Snippets wurden aus der offiziellen Aspose‑Dokumentation übernommen und wurden nicht in einer Sandbox ausgeführt. Überprüfen Sie sie in Ihrer Umgebung, bevor Sie sie in der Produktion verwenden.

Vollständiges Beispiel — Speichern, Neustarten, Fortsetzen

Im Folgenden finden Sie eine vollständige End‑zu‑End‑Demonstration. Der erste Block startet einen Chat, sendet einige Nachrichten und speichert die Sitzung. Der zweite Block simuliert einen neuen Prozess, der die gespeicherte Datei lädt und das Gespräch fortsetzt.

Codebeispiel – End‑to‑End‑Workflow

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);
}

Der erste Block erstellt eine Lizenz, instanziiert die API mit dem Qwen25Preset, startet einen neuen Chat mit dem Namen support-ticket-1234, sendet drei Nachrichten, um Kontext aufzubauen, und schreibt schließlich die Sitzung in support-ticket-1234.json. Der zweite Block erstellt die Lizenz und die API erneut, lädt die JSON‑Datei und führt den Dialog fort, wobei gezeigt wird, dass das Modell die vorherigen Nachrichten beibehält.

Hinweis: Diese Snippets wurden aus der offiziellen Aspose‑Dokumentation reproduziert und wurden nicht in einer Sandbox ausgeführt. Überprüfen Sie sie in Ihrer Umgebung, bevor Sie sie in der Produktion verwenden.

Was wird gespeichert?

SaveChatSession erzeugt ein JSON-Dokument mit drei wesentlichen Abschnitten:

  1. Session Identifier – die eindeutige ID, die Sie beim Starten des Chats angegeben haben.
  2. Message History – eine geordnete Liste aller Benutzer‑ und Assistenten‑Nachrichten, einschließlich Rolle, Inhalt und aller Mediendaten.
  3. KV Cache Metadata – interne Positionen und Größen des Schlüssel‑Wert‑Caches für jede Nachricht, die es dem Modell ermöglichen, genau dort weiterzumachen, wo es aufgehört hat.

Da die Cache‑Daten enthalten sind, kann die wiederhergestellte Sitzung die Generierung fortsetzen, ohne die vorherige Aufmerksamkeit neu zu berechnen, wodurch der Wiederaufnahmevorgang schnell und deterministisch ist.

Portabilitätsbeschränkungen

Obwohl die JSON-Datei alles enthält, was für eine perfekte Fortsetzung erforderlich ist, ist sie nur unter bestimmten Bedingungen portabel:

  • Gleiche SDK-Hauptversion – das Dateiformat kann sich zwischen Hauptversionen ändern, daher müssen beide Seiten dieselbe Hauptversion von Aspose.LLM verwenden.
  • Identische Modelldatei – das zugrunde liegende Hugging Face‑Modell (einschließlich Quantisierung) muss exakt übereinstimmen; andernfalls wird der KV‑Cache inkompatibel.
  • Übereinstimmender BinaryManagerParameters.ReleaseTag – die llama.cpp‑Laufzeitversion, die zum Laden des Modells verwendet wird, muss dieselbe sein, sonst unterscheiden sich die Low‑Level‑Tensor‑Layouts.

Eine bekannte Nuance beim Laden

Wenn Sie LoadChatSession aufrufen, rekonstruiert das SDK die Unterhaltung, wendet jedoch StandardContextParameters, ChatParameters und SamplerParameters an. Alle benutzerdefinierten Einstellungen (z. B. Temperatur, maximale Tokens, System‑Prompts), die Sie während der ursprünglichen Sitzung verwendet haben, werden nicht automatisch wiederhergestellt. Um das genaue Generierungsverhalten beizubehalten, wenden Sie Ihre benutzerdefinierten Parameter nach dem Laden erneut an oder wiederholen Sie die Unterhaltung in einer neuen Sitzung mit den gewünschten Einstellungen.

Häufige Fehler

Unten finden Sie eine kurze Checkliste für typische Probleme, die beim Laden einer Sitzung auftreten können:

  • FileNotFoundException – Überprüfen Sie den Dateipfad; relative Pfade werden relativ zum aktuellen Arbeitsverzeichnis aufgelöst.
  • InvalidOperationException on load – Zeigt eine inkompatible SDK-Version oder eine beschädigte JSON-Datei an.
  • Garbled output after load – Wird normalerweise durch eine nicht übereinstimmende Modelldatei oder ReleaseTag verursacht. Stellen Sie sicher, dass dieselbe Modelldatei auf dem ladenden Rechner vorhanden ist.

Das elegante Behandeln dieser Ausnahmen und das Protokollieren detaillierter Diagnosen macht Ihre Anwendung robuster.

Sicherheit

Die persistente JSON‑Datei enthält Klartext‑Kopien jeder Benutzer‑ und Assistenten‑Nachricht. Das Speichern an einem ungeschützten Ort kann sensible Daten preisgeben. Ziehen Sie die folgenden Gegenmaßnahmen in Betracht:

  • Verschlüsseln Sie die Datei, bevor Sie sie auf die Festplatte schreiben (z. B. Windows DPAPI, Azure Key Vault oder eine plattformübergreifende Bibliothek wie libsodium).
  • Beschränken Sie die Dateisystemberechtigungen so, dass nur das Servicekonto, das die Anwendung ausführt, die Datei lesen/schreiben kann.
  • Wenn die Datei über ein Netzwerk übertragen werden muss, verwenden Sie TLS‑verschlüsselte Kanäle und erwägen Sie, die Datei zu signieren, um Manipulationen zu erkennen.

Was kommt als Nächstes

Da Sie Chats jetzt speichern und wieder aufnehmen können, könnten Sie verwandte Funktionen erkunden:

  • Mehrere‑Runden‑Chat‑Anwendungsfälle – führen Sie längere Dialoge über viele Interaktionen hinweg.
  • Benutzerdefinierte Voreinstellungs‑Konfiguration – passen Sie die Modell‑Voreinstellung an Ihre Domäne an, bevor Sie sie speichern.
  • Vollständige Sitzungs‑Persistenz‑Referenz – prüfen Sie die API‑Referenz für tiefere Semantik rund um SaveChatSession und zugehörige Metadaten.

Auswahl des richtigen Ansatzes

Der Artikel stellte drei Möglichkeiten zum Speichern einer Sitzung sowie eine unkomplizierte Lademethode vor. Wählen Sie den Ansatz, der zu Ihrem Bereitstellungsszenario passt:

  • Expliziter Pfad – am besten, wenn die Datei an einem bekannten Ort liegen muss, z. B. in einem benutzerspezifischen Ordner oder einem freigegebenen Netzwerklaufwerk.
  • Standarddateiname – praktisch für schnelle Prototypen oder wenn die Sitzung neben der ausführbaren Datei existiert.
  • Temporärer Pfad mit Verzeichniserstellung – ideal für sandboxed Umgebungen, CI‑Pipelines oder wenn das Betriebssystem die Bereinigung übernehmen soll.

Alle Ansätze verwenden dieselbe zugrunde liegende API; sie unterscheiden sich nur darin, wie Sie das Dateisystem verwalten.

Holen Sie sich eine kostenlose Lizenz

Wenn Sie noch keine permanente Lizenz haben, können Sie eine temporäre Evaluationslizenz von der Aspose temporäre Lizenzseite erhalten.

Kostenlose zusätzliche Ressourcen

Fazit

Das Persistieren einer Chatsitzung mit Aspose.LLM bietet Ihnen Haltbarkeit, Nachvollziehbarkeit und die Flexibilität, Unterhaltungen zwischen Prozessen oder Maschinen zu verschieben. Sie haben gelernt, wann Sie dieses Muster anwenden, wie Sie eine Sitzung auf drei verschiedene Arten speichern, wie Sie sie wiederherstellen, was die JSON‑Datei enthält und welche Kompatibilitäts‑ und Sicherheitsüberlegungen Sie beachten müssen. Ausgestattet mit dem vollständigen Beispiel können Sie nun die Sitzungs‑Persistenz in jede .NET‑Chat‑Lösung integrieren.

FAQs

  1. Wann ist das Persistieren einer Chatsitzung nützlich?
    Das Persistieren ist hilfreich für Desktop- oder Serveranwendungen, die den Gesprächszustand über mehrere Starts hinweg benötigen, für langlaufende Workflows, Audit‑ oder Backup‑Anforderungen sowie für die Migration von Sitzungen zwischen Maschinen mit derselben SDK‑Version.
  2. Wie kann ich beim Speichern einer Sitzung einen benutzerdefinierten Dateipfad angeben?
    Rufen Sie api.SaveChatSession(sessionId, "myfolder\myfile.json"); auf oder erstellen Sie einen Pfad mit Path.Combine und stellen Sie sicher, dass das Verzeichnis vor dem Speichern existiert.
  3. Was gibt LoadChatSession zurück?
    Sie gibt die wiederhergestellte Sitzungskennung zurück, sodass Sie Nachrichten weiter senden können, ohne die ID erneut angeben zu müssen.
  4. Kann ich eine gespeicherte Sitzungsdatei auf einen anderen Rechner verschieben?
    Ja, solange die Zielmaschine dieselbe Haupt‑SDK‑Version, dieselbe Modelldatei und das passende llama.cpp ReleaseTag verwendet.
  5. Ist die gespeicherte JSON‑Datei sicher?
    Die Datei speichert Konversationsdaten im Klartext, daher sollten Sie sie verschlüsseln, bevor Sie sie an nicht vertrauenswürdigen Orten ablegen.
  6. Warum werden meine benutzerdefinierten Sampler‑ oder Kontext‑Einstellungen nach dem Laden nicht wiederhergestellt?
    LoadChatSession wendet Standardparameter an; wenden Sie nach dem Laden alle benutzerdefinierten Einstellungen erneut an oder spielen Sie den Verlauf in einer neuen Sitzung ab.

Mehr lesen