การคงสภาพเซสชันแชททำให้แอปพลิเคชัน .NET ของคุณสามารถอยู่ต่อหลังจากรีสตาร์ท, ให้การสำรองข้อมูลของการสนทนา, และทำให้สามารถย้ายเซสชันระหว่างเครื่องได้ ในคู่มือนี้เราจะพาไปผ่าน Persist and Resume a Chat Session in 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 และการตั้งค่าเดียวกัน
ข้อกำหนดเบื้องต้น
ก่อนที่คุณจะบันทึกหรือกู้คืนเซสชัน ให้ตรวจสอบว่ามีสิ่งต่อไปนี้พร้อมใช้งาน:
- Aspose.LLM NuGet package – ติดตั้งผ่านคำสั่งที่แสดงไว้ก่อนหน้านี้.
- License – สร้างอ็อบเจ็กต์
Aspose.LLM.LicenseและเรียกSetLicenseพร้อมไฟล์.licของคุณ. - API instance – สร้างอินสแตนซ์ของ
AsposeLLMApiด้วยพรีเซ็ตที่ต้องการ (เช่นnew Qwen25Preset()).
ขั้นตอนเหล่านี้จะแสดงในตัวอย่างเต็มที่อยู่ต่อในบทความ
บันทึกเซสชัน
SDK มีวิธีที่สะดวกสามวิธีในการเก็บรักษาเซสชันแชท ตามขั้นตอนด้านล่าง แล้วดูตัวอย่างโค้ด
- เรียก
SaveChatSessionพร้อมระบุเส้นทางไฟล์อย่างชัดเจนหากคุณต้องการไฟล์ในตำแหน่งที่รู้จัก - ไม่ระบุเส้นทางเพื่อให้ SDK เขียน
<sessionId>.jsonอยู่ข้างไฟล์ปฏิบัติการ - สร้างเส้นทางชั่วคราวด้วย
Path.Combineตรวจสอบให้แน่ใจว่าไดเรกทอรีมีอยู่แล้ว แล้วบันทึกที่นั่นสำหรับสถานการณ์ที่แยกจากกันหรืออยู่ใน sandbox
ตัวอย่างโค้ด – การบันทึกเซสชัน
ตัวอย่างต่อไปนี้แสดงวิธีการทั้งสามแบบ
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 จะสร้างไฟล์ที่มีชื่อเป็น ID ของเซสชันในไดเรกทอรีทำงานปัจจุบัน.
เมื่อคุณต้องการตำแหน่งที่กำหนดได้หรือชั่วคราว, ให้รวม Path.GetTempPath กับโครงสร้างโฟลเดอร์ของคุณเองและสร้างไดเรกทอรีก่อนบันทึก.
Note: ส่วนโค้ดเหล่านี้ถูกคัดลอกจากเอกสารอย่างเป็นทางการของ Aspose และไม่ได้รับการดำเนินการใน sandbox. ตรวจสอบให้แน่ใจว่าโค้ดเหล่านี้ทำงานในสภาพแวดล้อมของคุณก่อนนำไปใช้ในการผลิต.
กู้คืนเซสชัน
การโหลดเซสชันที่บันทึกไว้ก่อนหน้านั้นก็ง่ายเช่นกัน API จะอ่านไฟล์ JSON สร้างสถานะภายในใหม่ และส่งคืนตัวระบุเซสชันเพื่อให้คุณสามารถดำเนินการส่งข้อความต่อได้โดยไม่ต้องส่ง ID ด้วยตนเองอีกครั้ง.
- เรียก
LoadChatSessionพร้อมเส้นทางไปยังไฟล์ JSON. - เก็บ
sessionIdที่คืนค่าไว้. - ใช้
SendMessageToSessionAsyncพร้อม ID ที่กู้คืนเพื่อดำเนินการสนทนาต่อ.
ตัวอย่างโค้ด – การกู้คืนเซสชัน
string sessionId = await api.LoadChatSession("session-42.json");
string reply = await api.SendMessageToSessionAsync(sessionId, "What did we discuss?");
LoadChatSession อ่านไฟล์และส่งคืน ID ของเซสชันที่กู้คืน.
เซสชันที่กู้คืนจะถูกตั้งค่าเป็นเซสชันที่ใช้งานโดยอัตโนมัติ ทำให้สามารถเรียก SendMessageToSessionAsync ได้ทันที.
หมายเหตุ: ข้อความเหล่านี้ถูกคัดลอกจากเอกสารอย่างเป็นทางการของ Aspose และไม่ได้รับการดำเนินการใน sandbox. ตรวจสอบให้แน่ใจก่อนใช้ในสภาพแวดล้อมการผลิตของคุณ.
ตัวอย่างเต็ม — บันทึก, เริ่มใหม่, ดำเนินต่อ
ด้านล่างเป็นการสาธิตแบบครบวงจร ตั้งแต่ต้นจนจบ บล็อกแรกเริ่มการแชท ส่งข้อความหลายข้อความและบันทึกเซสชัน บล็อกที่สองจำลองกระบวนการใหม่ที่โหลดไฟล์ที่บันทึกไว้และดำเนินการสนทต่อไป
ตัวอย่างโค้ด – กระบวนการทำงานแบบ 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);
}
บล็อกแรกสร้างใบอนุญาต, สร้างอินสแตนซ์ของ API ด้วย Qwen25Preset, เริ่มแชทใหม่ชื่อ support-ticket-1234, ส่งข้อความสามข้อความเพื่อสร้างบริบท, และในที่สุดเขียนเซสชันไปยัง support-ticket-1234.json. บล็อกที่สองสร้างใบอนุญาตและ API ใหม่, โหลดไฟล์ JSON, และดำเนินการสนทต่อ, แสดงให้เห็นว่าโมเดลยังคงรักษาข้อความก่อนหน้าไว้.
หมายเหตุ: โค้ดตัวอย่างเหล่านี้ได้ถูกคัดลอกจากเอกสารอย่างเป็นทางการของ Aspose และไม่ได้ถูกเรียกใช้ใน sandbox. ตรวจสอบโค้ดเหล่านี้ในสภาพแวดล้อมของคุณก่อนนำไปใช้ในการผลิต.
สิ่งที่บันทึกคืออะไร?
SaveChatSession สร้างเอกสาร JSON ที่มีสามส่วนสำคัญ:
- Session Identifier – รหัสประจำตัวที่คุณให้เมื่อเริ่มแชท
- Message History – รายการที่เรียงลำดับของข้อความทั้งหมดของผู้ใช้และผู้ช่วย รวมถึงบทบาท เนื้อหา และเมตาดาต้าสื่อใด ๆ
- KV Cache Metadata – ตำแหน่งและขนาดภายในของแคชคีย์‑ค่า สำหรับแต่ละข้อความ ซึ่งทำให้โมเดลสามารถดำเนินต่อจากที่หยุดไว้ได้อย่างแม่นยำ
เนื่องจากข้อมูลแคชถูกรวมอยู่ การคืนค่าเซสชันที่กู้คืนสามารถดำเนินการสร้างต่อได้โดยไม่ต้องคำนวณความสนใจก่อนหน้า ทำให้การทำงานต่อเนื่องเร็วและกำหนดได้
ข้อจำกัดด้านการพกพา
แม้ว่าไฟล์ JSON จะมีทุกอย่างที่จำเป็นสำหรับการต่อเนื่องที่สมบูรณ์แบบ แต่ก็สามารถพกพาได้เฉพาะภายใต้เงื่อนไขบางประการเท่านั้น:
- เวอร์ชันหลักของ SDK เดียวกัน – รูปแบบไฟล์อาจเปลี่ยนแปลงระหว่างการปล่อยเวอร์ชันหลัก ดังนั้นทั้งสองฝ่ายต้องใช้เวอร์ชันหลักเดียวกันของ Aspose.LLM.
- ไฟล์โมเดลที่เหมือนกัน – โมเดล Hugging Face พื้นฐาน (รวมถึงการควอนต้า) ต้องตรงกันอย่างสมบูรณ์ มิฉะนั้น KV cache จะไม่เข้ากัน.
- ตรงกับ BinaryManagerParameters.ReleaseTag – เวอร์ชัน runtime ของ 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และเมตาดาต้าที่เกี่ยวข้อง.
การเลือกวิธีที่เหมาะสม
บทความได้เสนอวิธีการบันทึกเซสชันสามวิธีและวิธีโหลดที่เรียบง่าย เลือกวิธีที่ตรงกับสถานการณ์การใช้งานของคุณ:
- Explicit path – เหมาะที่สุดเมื่อไฟล์ต้องอยู่ในตำแหน่งที่ทราบ เช่น โฟลเดอร์เฉพาะผู้ใช้หรือไดรฟ์เครือข่ายที่แชร์
- Default filename – สะดวกสำหรับต้นแบบอย่างรวดเร็วหรือเมื่อเซสชันทำงานร่วมกับไฟล์ปฏิบัติการ
- Temporary path with directory creation – เหมาะสำหรับสภาพแวดล้อมแบบแซนด์บ็อกซ์, ไพป์ไลน์ CI, หรือเมื่อคุณต้องการให้ OS จัดการทำความสะอาด
ทุกวิธีใช้ API พื้นฐานเดียวกัน; แต่แตกต่างกันเฉพาะวิธีที่คุณจัดการระบบไฟล์
รับใบอนุญาตฟรี
หากคุณยังไม่มีใบอนุญาตถาวร คุณสามารถรับใบอนุญาตการประเมินผลชั่วคราวได้จาก หน้าใบอนุญาตชั่วคราวของ Aspose
แหล่งข้อมูลเพิ่มเติมฟรี
สรุป
การคงสภาพเซสชันแชทด้วย Aspose.LLM ให้ความทนทาน ความสามารถในการตรวจสอบ และความยืดหยุ่นในการย้ายการสนทนาระหว่างกระบวนการหรือเครื่องต่าง ๆ คุณได้เรียนรู้ว่าเมื่อใดควรใช้รูปแบบนี้ วิธีการบันทึกเซสชันในสามวิธีที่แตกต่างกัน วิธีการกู้คืนเซสชัน สิ่งที่ไฟล์ JSON มีอยู่ รวมถึงข้อพิจารณาด้านความเข้ากันได้และความปลอดภัยที่ต้องคำนึงถึง ด้วยตัวอย่างเต็มรูปแบบนี้ คุณสามารถผสานการคงสภาพเซสชันเข้ากับโซลูชันแชท .NET ใดก็ได้.
FAQs
เมื่อใดที่การคงสภาพเซสชันแชทเป็นประโยชน์?
การคงสภาพเป็นประโยชน์สำหรับแอปเดสก์ท็อปหรือเซิร์ฟเวอร์ที่ต้องการสถานะการสนทนาข้ามการเปิดใช้งาน, กระบวนการทำงานที่ทำงานเป็นเวลานาน, ความต้องการการตรวจสอบหรือสำรองข้อมูล, และการย้ายเซสชันระหว่างเครื่องที่ใช้ SDK เวอร์ชันเดียวกัน.ฉันจะระบุเส้นทางไฟล์แบบกำหนดเองเมื่อบันทึกเซสชันได้อย่างไร?
เรียกapi.SaveChatSession(sessionId, "myfolder\myfile.json");หรือสร้างเส้นทางด้วยPath.Combineและตรวจสอบให้แน่ใจว่าไดเรกทอรีมีอยู่ก่อนบันทึก.LoadChatSession คืนค่าอะไร?
มันคืนค่าตัวระบุเซสชันที่กู้คืน, ทำให้คุณสามารถส่งข้อความต่อได้โดยไม่ต้องระบุ ID อีกครั้ง.ฉันสามารถย้ายไฟล์เซสชันที่บันทึกไว้ไปยังเครื่องอื่นได้หรือไม่?
ได้, ตราบใดที่เครื่องเป้าหมายใช้ SDK เวอร์ชันหลักเดียวกัน, ไฟล์โมเดลที่เหมือนกัน, และ ReleaseTag ของ llama.cpp ที่ตรงกัน.ไฟล์ JSON ที่บันทึกไว้ปลอดภัยหรือไม่?
ไฟล์นี้เก็บข้อมูลการสนทนาเป็นข้อความธรรมดา, ดังนั้นคุณควรเข้ารหัสก่อนเก็บไว้ในตำแหน่งที่ไม่เชื่อถือ.ทำไมการตั้งค่า sampler หรือ context ที่กำหนดเองของฉันไม่ถูกกู้คืนหลังจากโหลด?
LoadChatSession ใช้พารามิเตอร์ค่าเริ่มต้น; ให้ตั้งค่าที่กำหนดเองใหม่หลังจากโหลดหรือเล่นประวัติใหม่ในเซสชันใหม่.
