Menyimpan sesi obrolan memungkinkan aplikasi .NET Anda tetap berjalan setelah restart, menyediakan cadangan percakapan, dan memungkinkan memindahkan sesi antar mesin. Dalam panduan ini kami akan membahas Persist and Resume a Chat Session in C# menggunakan Aspose.LLM, mencakup kapan menggunakan pola ini, cara menyimpan dan memuat sesi, data apa yang disimpan, pertimbangan portabilitas, serta praktik terbaik keamanan.
Mengapa Menyimpan dan Melanjutkan Sesi Obrolan?
Pengembang sering membangun asisten interaktif, bot dukungan, atau alur kerja analisis data yang berjalan lama. Dalam banyak skenario, konteks obrolan harus bertahan melampaui masa hidup satu proses:
- Alat dukungan desktop di mana pengguna mengharapkan kueri sebelumnya tetap tersedia setelah aplikasi ditutup.
- Otomatisasi sisi server yang melibatkan beberapa langkah dan dapat dimulai ulang karena pemeliharaan.
- Persyaratan audit atau kepatuhan yang memerlukan snapshot seluruh percakapan.
- Memindahkan sesi pemecahan masalah dari laptop pengembang ke server produksi.
Dengan menyimpan sesi ke file JSON, Anda menangkap seluruh riwayat pesan dan cache KV internal yang diperlukan untuk kelanjutan yang tepat, sehingga kasus penggunaan di atas menjadi mudah diimplementasikan.
Memulai dengan Aspose.LLM
Pertama, tambahkan paket Aspose.LLM ke proyek Anda:
Install-Package Aspose.LLM
Anda dapat menemukan detail produk lebih lanjut di halaman produk Aspose.LLM .NET. SDK memerlukan lisensi yang valid, jadi pastikan Anda memiliki file lisensi sementara atau permanen yang siap.
Prasyarat
- Instal paket NuGet Aspose.LLM.
- Terapkan lisensi Aspose.LLM menggunakan
Aspose.LLM.License. - Buat instance
AsposeLLMApi(misalnya, denganQwen25Preset).
Kapan Menggunakan Pola Ini
Pola ini bersinar ketika Anda perlu percakapan tetap ada di luar proses saat ini, atau ketika Anda menginginkan snapshot yang dapat diandalkan untuk pencadangan atau migrasi. Skenario tipikal meliputi:
- Aplikasi desktop atau server di mana pengguna mengharapkan obrolan tetap ada antara peluncuran.
- Alur kerja yang berjalan lama yang memerlukan percakapan tetap ada setelah proses selesai.
- Tujuan pencadangan dan audit dengan mengambil snapshot percakapan yang aktif.
- Memigrasi status sesi antar mesin dengan versi SDK dan preset yang sama.
Prasyarat
Sebelum Anda dapat menyimpan atau memulihkan sesi, pastikan hal-hal berikut tersedia:
- Aspose.LLM NuGet package – diinstal melalui perintah yang ditunjukkan sebelumnya.
- License – buat objek
Aspose.LLM.Licensedan panggilSetLicensedengan file.licAnda. - API instance – instansiasi
AsposeLLMApidengan preset yang diinginkan (mis.,new Qwen25Preset()).
Langkah‑langkah ini ditunjukkan dalam contoh lengkap yang akan dibahas nanti di artikel.
Simpan Sesi
SDK menawarkan tiga cara yang nyaman untuk menyimpan sesi obrolan. Ikuti langkah-langkah di bawah ini, lalu lihat contoh kode.
- Panggil
SaveChatSessiondengan jalur file yang eksplisit jika Anda memerlukan file di lokasi yang diketahui. - Hilangkan jalur untuk membiarkan SDK menulis
<sessionId>.jsondi samping executable. - Bangun jalur sementara dengan
Path.Combine, pastikan direktori ada, dan simpan di sana untuk skenario terisolasi atau sandbox.
Contoh Kode – Menyimpan Sesi
Contoh berikut menunjukkan ketiga pendekatan:
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") menulis file JSON ke lokasi yang diberikan.
Jika Anda memanggil SaveChatSession tanpa path, SDK membuat file dengan nama ID sesi di direktori kerja saat ini.
Ketika Anda memerlukan lokasi yang deterministik atau sementara, gabungkan Path.GetTempPath dengan struktur folder Anda sendiri dan buat direktori sebelum menyimpan.
Catatan: Potongan kode ini diambil kembali dari dokumentasi resmi Aspose dan belum dijalankan di sandbox. Verifikasi mereka di lingkungan Anda sebelum menggunakannya di produksi.
Pulihkan Sesi
Memuat sesi yang sebelumnya disimpan sama sederhana. API membaca file JSON, membuat ulang keadaan internal, dan mengembalikan pengidentifikasi sesi sehingga Anda dapat melanjutkan pesan tanpa harus secara manual melewatkan ID lagi.
- Panggil
LoadChatSessiondengan path ke file JSON. - Simpan
sessionIdyang dikembalikan. - Gunakan
SendMessageToSessionAsyncdengan ID yang dipulihkan untuk melanjutkan percakapan.
Contoh Kode – Memulihkan Sesi
string sessionId = await api.LoadChatSession("session-42.json");
string reply = await api.SendMessageToSessionAsync(sessionId, "What did we discuss?");
LoadChatSession membaca file dan mengembalikan ID sesi yang dipulihkan.
Sesi yang dipulihkan secara otomatis diatur sebagai sesi aktif, memungkinkan pemanggilan langsung ke SendMessageToSessionAsync.
Catatan: Potongan kode ini disalin dari dokumentasi resmi Aspose dan belum dijalankan di sandbox. Verifikasi mereka di lingkungan Anda sebelum menggunakannya di produksi.
Contoh Lengkap — Simpan, Mulai Ulang, Lanjutkan
Berikut adalah demonstrasi lengkap dari awal hingga akhir. Blok pertama memulai obrolan, mengirim beberapa pesan, dan menyimpan sesi. Blok kedua mensimulasikan proses baru yang memuat file yang disimpan dan melanjutkan percakapan.
Contoh Kode – Alur Kerja End‑to‑End
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);
}
Blok pertama membuat lisensi, menginstansiasi API dengan Qwen25Preset, memulai obrolan baru bernama support-ticket-1234, mengirim tiga pesan untuk membangun konteks, dan akhirnya menulis sesi ke support-ticket-1234.json. Blok kedua membuat ulang lisensi dan API, memuat file JSON, dan melanjutkan dialog, menunjukkan bahwa model mempertahankan pesan‑pesan sebelumnya.
Catatan: Potongan kode ini diambil kembali dari dokumentasi resmi Aspose dan belum dijalankan di sandbox. Verifikasi mereka di lingkungan Anda sebelum menggunakannya dalam produksi.
Apa yang Disimpan?
SaveChatSession menghasilkan dokumen JSON dengan tiga bagian penting:
- Session Identifier – ID unik yang Anda berikan saat memulai percakapan.
- Message History – daftar berurutan semua pesan pengguna dan asisten, termasuk peran, konten, dan metadata media apa pun.
- KV Cache Metadata – posisi internal dan ukuran cache key‑value untuk setiap pesan, yang memungkinkan model melanjutkan tepat dari tempatnya berhenti.
Karena data cache disertakan, sesi yang dipulihkan dapat melanjutkan proses generasi tanpa menghitung ulang perhatian sebelumnya, sehingga operasi resume menjadi cepat dan deterministik.
Batasan Portabilitas
Meskipun file JSON berisi semua yang diperlukan untuk kelanjutan yang sempurna, file tersebut hanya dapat dipindahkan di bawah kondisi tertentu:
- Versi Mayor SDK yang Sama – format file dapat berubah antara rilis mayor, jadi kedua sisi harus menggunakan versi mayor yang sama dari Aspose.LLM.
- File Model yang Identik – model Hugging Face yang mendasari (termasuk kuantisasi) harus cocok persis; jika tidak, cache KV menjadi tidak kompatibel.
- BinaryManagerParameters.ReleaseTag yang Cocok – versi runtime llama.cpp yang digunakan untuk memuat model harus sama, jika tidak tata letak tensor tingkat rendah akan berbeda.
Jika salah satu dari batasan ini dilanggar, Anda mungkin akan melihat kesalahan seperti InvalidOperationException atau output yang rusak.
Nuansa Waktu Muat yang Diketahui
Saat Anda memanggil LoadChatSession, SDK merekonstruksi percakapan tetapi menerapkan default ContextParameters, ChatParameters, dan SamplerParameters. Pengaturan khusus apa pun (mis., suhu, token maksimum, prompt sistem) yang Anda gunakan selama sesi asli tidak dipulihkan secara otomatis. Untuk menjaga perilaku generasi yang tepat, terapkan kembali parameter khusus Anda setelah memuat, atau putar ulang percakapan dalam sesi baru dengan pengaturan yang diinginkan.
Kesalahan Umum
Berikut adalah daftar periksa singkat untuk masalah umum yang mungkin Anda temui saat memuat sesi:
- FileNotFoundException – Verifikasi jalur file; jalur relatif diresolusikan terhadap direktori kerja saat ini.
- InvalidOperationException saat memuat – Menunjukkan versi SDK yang tidak kompatibel atau file JSON yang rusak.
- Garbled output after load – Biasanya disebabkan oleh file model yang tidak cocok atau ReleaseTag. Pastikan binary model yang sama persis ada di mesin yang memuat.
Menangani pengecualian ini secara elegan dan mencatat diagnostik terperinci akan membuat aplikasi Anda lebih kuat.
Keamanan
File JSON yang dipertahankan berisi salinan plain‑text dari setiap pesan pengguna dan asisten. Menyimpannya di lokasi yang tidak terlindungi dapat mengungkap data sensitif. Pertimbangkan mitigasi berikut:
- Enkripsi file sebelum menuliskannya ke disk (misalnya, Windows DPAPI, Azure Key Vault, atau perpustakaan lintas‑platform seperti libsodium).
- Batasi izin sistem file sehingga hanya akun layanan yang menjalankan aplikasi yang dapat membaca/menulis file.
- Jika file harus ditransfer melalui jaringan, gunakan saluran terenkripsi TLS dan pertimbangkan menandatangani file untuk mendeteksi manipulasi.
Apa Selanjutnya
Sekarang karena Anda dapat menyimpan dan melanjutkan obrolan, Anda mungkin ingin menjelajahi kemampuan terkait:
- Multi‑turn chat use cases – pertahankan dialog yang lebih panjang di banyak interaksi.
- Custom preset configuration – sesuaikan preset model dengan domain Anda sebelum menyimpan.
- Full session‑persistence reference – tinjau referensi API untuk semantik yang lebih mendalam seputar
SaveChatSessiondan metadata terkait.
Memilih Pendekatan yang Tepat
Artikel ini menyajikan tiga cara untuk menyimpan sesi dan metode pemuatan yang sederhana. Pilih pendekatan yang sesuai dengan skenario penyebaran Anda:
- Explicit path – terbaik ketika file harus berada di lokasi yang diketahui, seperti folder khusus pengguna atau drive jaringan bersama.
- Default filename – nyaman untuk prototipe cepat atau ketika sesi berjalan berdampingan dengan executable.
- Temporary path with directory creation – ideal untuk lingkungan sandbox, pipeline CI, atau ketika Anda ingin OS mengelola pembersihan.
Semua pendekatan menggunakan API dasar yang sama; mereka hanya berbeda dalam cara Anda mengelola sistem file.
Dapatkan Lisensi Gratis
Jika Anda belum memiliki lisensi permanen, Anda dapat memperoleh lisensi evaluasi sementara dari halaman lisensi sementara Aspose.
Sumber Daya Tambahan Gratis
Kesimpulan
Menyimpan sesi obrolan dengan Aspose.LLM memberi Anda ketahanan, kemampuan audit, dan fleksibilitas untuk memindahkan percakapan antar proses atau mesin. Anda telah mempelajari kapan menerapkan pola ini, cara menyimpan sesi dalam tiga cara berbeda, cara memulihkannya, apa yang terkandung dalam file JSON, serta pertimbangan kompatibilitas dan keamanan yang perlu diingat. Dengan contoh lengkap, Anda kini dapat mengintegrasikan persistensi sesi ke dalam solusi obrolan .NET apa pun.
FAQ
Kapan menyimpan sesi obrolan berguna?
Menyimpan berguna untuk aplikasi desktop atau server yang memerlukan keadaan percakapan antar peluncuran, alur kerja yang berjalan lama, kebutuhan audit atau pencadangan, serta migrasi sesi antar mesin dengan versi SDK yang sama.Bagaimana cara menentukan jalur file khusus saat menyimpan sesi?
Panggilapi.SaveChatSession(sessionId, "myfolder\myfile.json");atau buat jalur denganPath.Combinedan pastikan direktori ada sebelum menyimpan.Apa yang dikembalikan oleh LoadChatSession?
Metode ini mengembalikan pengidentifikasi sesi yang dipulihkan, memungkinkan Anda melanjutkan pengiriman pesan tanpa harus menyediakan ID lagi.Apakah saya dapat memindahkan file sesi yang disimpan ke mesin lain?
Ya, selama mesin target menggunakan versi utama SDK yang sama, file model yang identik, dan ReleaseTag llama.cpp yang cocok.Apakah file JSON yang disimpan aman?
File tersebut menyimpan data percakapan dalam teks biasa, jadi sebaiknya Anda mengenkripsinya sebelum menyimpannya di lokasi yang tidak terpercaya.Mengapa sampler khusus atau pengaturan konteks saya tidak dipulihkan setelah memuat?
LoadChatSession menerapkan parameter default; terapkan kembali pengaturan khusus setelah memuat atau putar ulang riwayat dalam sesi baru.
