Utrzymywanie sesji czatu pozwala Twojej aplikacji .NET przetrwać ponowne uruchomienia, zapewnia kopię zapasową rozmowy i umożliwia przenoszenie sesji między maszynami. W tym przewodniku przeprowadzimy Cię przez Trwałe przechowywanie i wznawianie sesji czatu w C# przy użyciu Aspose.LLM, omawiając, kiedy stosować ten wzorzec, jak zapisywać i wczytywać sesje, jakie dane są przechowywane, kwestie przenośności oraz najlepsze praktyki bezpieczeństwa.
Dlaczego zachować i wznowić sesję czatu?
Programiści często tworzą interaktywne asystenty, boty wsparcia lub długotrwałe przepływy analizy danych. W wielu scenariuszach kontekst czatu musi przetrwać poza życiem pojedynczego procesu:
- Narzędzie wsparcia na pulpicie, w którym użytkownicy oczekują, że ich poprzednie zapytania pozostaną dostępne po zamknięciu aplikacji.
- Automatyzacja po stronie serwera, obejmująca wiele kroków i mogąca być ponownie uruchomiona z powodu konserwacji.
- Wymagania audytowe lub zgodności, które wymagają migawki całej konwersacji.
- Przeniesienie sesji rozwiązywania problemów z laptopa programisty na serwer produkcyjny.
Poprzez zapisanie sesji w pliku JSON przechwytujesz pełną historię wiadomości oraz wewnętrzną pamięć podręczną KV potrzebną do dokładnego kontynuowania, co sprawia, że powyższe przypadki użycia są proste do wdrożenia.
Rozpoczęcie pracy z Aspose.LLM
Najpierw dodaj pakiet Aspose.LLM do swojego projektu:
Install-Package Aspose.LLM
Więcej szczegółów produktu znajdziesz na stronie produktu Aspose.LLM .NET. SDK wymaga ważnej licencji, więc upewnij się, że masz gotowy tymczasowy lub stały plik licencji.
Wymagania wstępne
- Zainstaluj pakiet NuGet Aspose.LLM.
- Zastosuj licencję Aspose.LLM przy użyciu
Aspose.LLM.License. - Utwórz instancję
AsposeLLMApi(na przykład zQwen25Preset).
Kiedy używać tego wzorca
Ten wzorzec sprawdza się, gdy potrzebujesz, aby rozmowa utrzymywała się poza bieżącym procesem, lub gdy chcesz niezawodną migawkę do tworzenia kopii zapasowych lub migracji. Typowe scenariusze obejmują:
- Aplikacje desktopowe lub serwerowe, w których użytkownicy oczekują, że czat będzie utrzymywany między uruchomieniami.
- Długotrwałe przepływy pracy, które wymagają, aby konwersacja przetrwała proces.
- Kopia zapasowa i cele audytowe poprzez tworzenie migawki aktywnej konwersacji.
- Migracja stanu sesji pomiędzy maszynami z tą samą wersją SDK i ustawieniami.
Wymagania wstępne
Zanim będziesz mógł zapisać lub przywrócić sesję, upewnij się, że następujące elementy są spełnione:
- Aspose.LLM NuGet package – zainstalowano przy użyciu polecenia podanego wcześniej.
- Licencja – utwórz obiekt
Aspose.LLM.Licensei wywołajSetLicensez plikiem.lic. - Instancja API – utwórz
AsposeLLMApiz żądanym presetem (np.new Qwen25Preset()).
Te kroki są przedstawione w pełnym przykładzie później w artykule.
Zapisz sesję
SDK oferuje trzy wygodne sposoby na zachowanie sesji czatu. Postępuj zgodnie z poniższymi krokami, a następnie zobacz przykład kodu.
- Wywołaj
SaveChatSessionz wyraźną ścieżką pliku, jeśli potrzebujesz pliku w określonym miejscu. - Pomiń ścieżkę, aby SDK zapisało
<sessionId>.jsonobok pliku wykonywalnego. - Utwórz tymczasową ścieżkę przy użyciu
Path.Combine, upewnij się, że katalog istnieje, i zapisz tam w scenariuszach izolowanych lub w środowiskach sandbox.
Przykład kodu – Zapisywanie sesji
Poniższy przykład demonstruje wszystkie trzy podejścia:
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") zapisuje plik JSON w podanej lokalizacji.
Jeśli wywołasz SaveChatSession bez ścieżki, SDK tworzy plik o nazwie odpowiadającej identyfikatorowi sesji w bieżącym katalogu roboczym.
Gdy potrzebujesz deterministycznej lub tymczasowej lokalizacji, połącz Path.GetTempPath ze swoją własną strukturą folderów i utwórz katalog przed zapisem.
Uwaga: Te fragmenty kodu pochodzą z oficjalnej dokumentacji Aspose i nie zostały uruchomione w środowisku testowym. Zweryfikuj je w swoim środowisku przed użyciem w produkcji.
Przywrócenie sesji
Ładowanie wcześniej zapisanej sesji jest równie proste. API odczytuje plik JSON, odtwarza wewnętrzny stan i zwraca identyfikator sesji, abyś mógł kontynuować wymianę wiadomości bez ręcznego przekazywania ID ponownie.
- Wywołaj
LoadChatSessionz ścieżką do pliku JSON. - Przechowaj zwrócony
sessionId. - Użyj
SendMessageToSessionAsyncz przywróconym identyfikatorem, aby kontynuować rozmowę.
Przykład kodu – Przywracanie sesji
string sessionId = await api.LoadChatSession("session-42.json");
string reply = await api.SendMessageToSessionAsync(sessionId, "What did we discuss?");
LoadChatSession odczytuje plik i zwraca przywrócony identyfikator sesji.
Przywrócona sesja jest automatycznie ustawiana jako aktywna, co pozwala na natychmiastowe wywołania SendMessageToSessionAsync.
Uwaga: Te fragmenty zostały zaczerpnięte z oficjalnej dokumentacji Aspose i nie zostały uruchomione w środowisku testowym. Zweryfikuj je w swoim środowisku przed użyciem w produkcji.
Pełny przykład — Zapisz, uruchom ponownie, wznów
Poniżej znajduje się kompletny, pełny pokaz. Pierwszy blok rozpoczyna czat, wysyła kilka wiadomości i zapisuje sesję. Drugi blok symuluje nowy proces, który ładuje zapisany plik i kontynuuje rozmowę.
Przykład kodu – Przepływ pracy od początku do końca
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);
}
Pierwszy blok tworzy licencję, tworzy instancję API z Qwen25Preset, rozpoczyna nową rozmowę o nazwie support-ticket-1234, wysyła trzy wiadomości w celu zbudowania kontekstu i ostatecznie zapisuje sesję do support-ticket-1234.json. Drugi blok ponownie tworzy licencję i API, ładuje plik JSON i kontynuuje dialog, demonstrując, że model zachowuje wcześniejsze wiadomości.
Uwaga: Te fragmenty pochodzą z oficjalnej dokumentacji Aspose i nie zostały uruchomione w środowisku testowym. Zweryfikuj je w swoim środowisku przed użyciem w produkcji.
Co jest zapisane?
SaveChatSession tworzy dokument JSON z trzema istotnymi sekcjami:
- Identyfikator sesji – unikalny identyfikator podany przy rozpoczynaniu czatu.
- Historia wiadomości – uporządkowana lista wszystkich wiadomości użytkownika i asystenta, zawierająca rolę, treść oraz metadane mediów.
- Metadane pamięci podręcznej KV – wewnętrzne pozycje i rozmiary pamięci podręcznej klucz‑wartość dla każdej wiadomości, co pozwala modelowi kontynuować dokładnie tam, gdzie został przerwany.
Ponieważ dane pamięci podręcznej są uwzględnione, przywrócona sesja może kontynuować generowanie bez ponownego obliczania wcześniejszej uwagi, co sprawia, że operacja wznawiania jest szybka i deterministyczna.
Ograniczenia przenośności
Mimo że plik JSON zawiera wszystko, co potrzebne do idealnego kontynuowania, jest on przenośny tylko pod pewnymi warunkami:
- Ta sama główna wersja SDK – format pliku może się zmienić między głównymi wydaniami, więc obie strony muszą używać tej samej głównej wersji Aspose.LLM.
- Identyczny plik modelu – podstawowy model Hugging Face (włącznie z kwantyzacją) musi być dokładnie taki sam; w przeciwnym razie pamięć podręczna KV staje się niekompatybilna.
- Pasujący BinaryManagerParameters.ReleaseTag – wersja środowiska llama.cpp używana do załadowania modelu musi być taka sama, w przeciwnym razie układy tensorów niskiego poziomu różnią się.
Jeśli któreś z tych ograniczeń zostanie naruszone, możesz zobaczyć błędy takie jak InvalidOperationException lub zniekształcony wynik.
Znany niuans przy ładowaniu
Gdy wywołujesz LoadChatSession, SDK odtwarza konwersację, ale stosuje domyślne ContextParameters, ChatParameters i SamplerParameters. Wszystkie niestandardowe ustawienia (np. temperatura, maksymalna liczba tokenów, prompt systemowy), które użyłeś podczas oryginalnej sesji, nie są automatycznie przywracane. Aby zachować dokładne zachowanie generacji, ponownie zastosuj swoje niestandardowe parametry po załadowaniu lub odtwórz konwersację w nowej sesji z pożądanymi ustawieniami.
Typowe błędy
Poniżej znajduje się szybka lista kontrolna typowych problemów, które możesz napotkać podczas ładowania sesji:
- FileNotFoundException – Sprawdź ścieżkę do pliku; ścieżki względne są rozwiązywane względem bieżącego katalogu roboczego.
- InvalidOperationException on load – Wskazuje na niekompatybilną wersję SDK lub uszkodzony plik JSON.
- Garbled output after load – Zwykle spowodowane niezgodnym plikiem modelu lub ReleaseTag. Upewnij się, że dokładnie ten sam plik binarny modelu znajduje się na maszynie ładowania.
Obsługa tych wyjątków w sposób elegancki oraz rejestrowanie szczegółowych diagnostyk sprawi, że Twoja aplikacja będzie bardziej odporna.
Bezpieczeństwo
Trwale przechowywany plik JSON zawiera tekst‑jawny kopie każdej wiadomości użytkownika i asystenta. Przechowywanie go w niechronionym miejscu może ujawnić wrażliwe dane. Rozważ następujące środki zaradcze:
- Szyfruj plik przed zapisaniem go na dysku (np. Windows DPAPI, Azure Key Vault lub biblioteka wieloplatformowa, taka jak libsodium).
- Ogranicz uprawnienia systemu plików tak, aby tylko konto serwisowe uruchamiające aplikację mogło odczytywać/zapisywać plik.
- Jeśli plik musi być przesyłany przez sieć, używaj kanałów szyfrowanych TLS i rozważ podpisywanie pliku w celu wykrycia manipulacji.
Co dalej
Teraz, gdy możesz zachowywać i wznawiać czaty, możesz zbadać powiązane możliwości:
- Zastosowania czatu wieloturnowego – utrzymuj dłuższe dialogi w wielu interakcjach.
- Niestandardowa konfiguracja predefiniowanego ustawienia – dostosuj predefiniowany model do swojej domeny przed zapisaniem.
- Pełna referencja trwałości sesji – przejrzyj dokumentację API, aby poznać głębszą semantykę funkcji
SaveChatSessioni powiązanych metadanych.
Wybór odpowiedniego podejścia
W artykule przedstawiono trzy sposoby zapisywania sesji oraz prostą metodę ładowania. Wybierz podejście, które odpowiada Twojemu scenariuszowi wdrożenia:
- Ścieżka jawna – najlepiej, gdy plik musi znajdować się w znanej lokalizacji, takiej jak folder specyficzny dla użytkownika lub współdzielony dysk sieciowy.
- Domyślna nazwa pliku – wygodne dla szybkich prototypów lub gdy sesja znajduje się obok pliku wykonywalnego.
- Ścieżka tymczasowa z tworzeniem katalogu – idealne dla środowisk piaskownicy, potoków CI lub gdy chcesz, aby system operacyjny zarządzał czyszczeniem.
Wszystkie podejścia korzystają z tego samego podstawowego API; różnią się jedynie sposobem zarządzania systemem plików.
Uzyskaj darmową licencję
Jeśli nie masz jeszcze stałej licencji, możesz uzyskać tymczasową licencję ewaluacyjną ze strony tymczasowej licencji Aspose.
Darmowe dodatkowe zasoby
Podsumowanie
Utrzymywanie sesji czatu przy użyciu Aspose.LLM zapewnia trwałość, możliwość audytu oraz elastyczność w przenoszeniu konwersacji między procesami lub maszynami. Dowiedziałeś się, kiedy zastosować ten wzorzec, jak zapisać sesję na trzy różne sposoby, jak ją przywrócić, co zawiera plik JSON oraz jakie kwestie kompatybilności i bezpieczeństwa należy mieć na uwadze. Mając pełny przykład, możesz teraz zintegrować trwałość sesji z dowolnym rozwiązaniem czatu opartym na .NET.
Najczęściej zadawane pytania
Kiedy przydatne jest utrwalanie sesji czatu?
Utrwalanie jest przydatne w aplikacjach desktopowych lub serwerowych, które potrzebują zachować stan rozmowy pomiędzy uruchomieniami, w długotrwałych przepływach pracy, w wymaganiach audytu lub tworzenia kopii zapasowych oraz przy przenoszeniu sesji między maszynami z tą samą wersją SDK.Jak mogę określić niestandardową ścieżkę pliku przy zapisywaniu sesji?
Wywołajapi.SaveChatSession(sessionId, "myfolder\myfile.json");lub skonstruuj ścieżkę przy użyciuPath.Combinei upewnij się, że katalog istnieje przed zapisem.Co zwraca LoadChatSession?
Zwraca przywrócony identyfikator sesji, co pozwala kontynuować wysyłanie wiadomości bez ponownego podawania identyfikatora.Czy mogę przenieść zapisany plik sesji na inny komputer?
Tak, pod warunkiem że docelowy komputer używa tej samej głównej wersji SDK, identycznego pliku modelu oraz pasującego tagu ReleaseTag w llama.cpp.Czy zapisany plik JSON jest bezpieczny?
Plik przechowuje dane rozmowy w postaci zwykłego tekstu, dlatego powinieneś go zaszyfrować przed przechowywaniem w niepewnych lokalizacjach.Dlaczego moje niestandardowe ustawienia sampler lub kontekstu nie są przywracane po załadowaniu?
LoadChatSession stosuje domyślne parametry; po załadowaniu ponownie zastosuj własne ustawienia lub odtwórz historię w nowej sesji.
