การคงสภาพเซสชันแชททำให้แอปพลิเคชัน .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 และการตั้งค่าเดียวกัน

ข้อกำหนดเบื้องต้น

ก่อนที่คุณจะบันทึกหรือกู้คืนเซสชัน ให้ตรวจสอบว่ามีสิ่งต่อไปนี้พร้อมใช้งาน:

  1. Aspose.LLM NuGet package – ติดตั้งผ่านคำสั่งที่แสดงไว้ก่อนหน้านี้.
  2. License – สร้างอ็อบเจ็กต์ Aspose.LLM.License และเรียก SetLicense พร้อมไฟล์ .lic ของคุณ.
  3. API instance – สร้างอินสแตนซ์ของ AsposeLLMApi ด้วยพรีเซ็ตที่ต้องการ (เช่น new Qwen25Preset()).

ขั้นตอนเหล่านี้จะแสดงในตัวอย่างเต็มที่อยู่ต่อในบทความ

บันทึกเซสชัน

SDK มีวิธีที่สะดวกสามวิธีในการเก็บรักษาเซสชันแชท ตามขั้นตอนด้านล่าง แล้วดูตัวอย่างโค้ด

  1. เรียก SaveChatSession พร้อมระบุเส้นทางไฟล์อย่างชัดเจนหากคุณต้องการไฟล์ในตำแหน่งที่รู้จัก
  2. ไม่ระบุเส้นทางเพื่อให้ SDK เขียน <sessionId>.json อยู่ข้างไฟล์ปฏิบัติการ
  3. สร้างเส้นทางชั่วคราวด้วย 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 ด้วยตนเองอีกครั้ง.

  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 อ่านไฟล์และส่งคืน 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 ที่มีสามส่วนสำคัญ:

  1. Session Identifier – รหัสประจำตัวที่คุณให้เมื่อเริ่มแชท
  2. Message History – รายการที่เรียงลำดับของข้อความทั้งหมดของผู้ใช้และผู้ช่วย รวมถึงบทบาท เนื้อหา และเมตาดาต้าสื่อใด ๆ
  3. 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

  1. เมื่อใดที่การคงสภาพเซสชันแชทเป็นประโยชน์?
    การคงสภาพเป็นประโยชน์สำหรับแอปเดสก์ท็อปหรือเซิร์ฟเวอร์ที่ต้องการสถานะการสนทนาข้ามการเปิดใช้งาน, กระบวนการทำงานที่ทำงานเป็นเวลานาน, ความต้องการการตรวจสอบหรือสำรองข้อมูล, และการย้ายเซสชันระหว่างเครื่องที่ใช้ SDK เวอร์ชันเดียวกัน.

  2. ฉันจะระบุเส้นทางไฟล์แบบกำหนดเองเมื่อบันทึกเซสชันได้อย่างไร?
    เรียก api.SaveChatSession(sessionId, "myfolder\myfile.json"); หรือสร้างเส้นทางด้วย Path.Combine และตรวจสอบให้แน่ใจว่าไดเรกทอรีมีอยู่ก่อนบันทึก.

  3. LoadChatSession คืนค่าอะไร?
    มันคืนค่าตัวระบุเซสชันที่กู้คืน, ทำให้คุณสามารถส่งข้อความต่อได้โดยไม่ต้องระบุ ID อีกครั้ง.

  4. ฉันสามารถย้ายไฟล์เซสชันที่บันทึกไว้ไปยังเครื่องอื่นได้หรือไม่?
    ได้, ตราบใดที่เครื่องเป้าหมายใช้ SDK เวอร์ชันหลักเดียวกัน, ไฟล์โมเดลที่เหมือนกัน, และ ReleaseTag ของ llama.cpp ที่ตรงกัน.

  5. ไฟล์ JSON ที่บันทึกไว้ปลอดภัยหรือไม่?
    ไฟล์นี้เก็บข้อมูลการสนทนาเป็นข้อความธรรมดา, ดังนั้นคุณควรเข้ารหัสก่อนเก็บไว้ในตำแหน่งที่ไม่เชื่อถือ.

  6. ทำไมการตั้งค่า sampler หรือ context ที่กำหนดเองของฉันไม่ถูกกู้คืนหลังจากโหลด?
    LoadChatSession ใช้พารามิเตอร์ค่าเริ่มต้น; ให้ตั้งค่าที่กำหนดเองใหม่หลังจากโหลดหรือเล่นประวัติใหม่ในเซสชันใหม่.

อ่านต่อ