Việc duy trì một phiên trò chuyện cho phép ứng dụng .NET của bạn tồn tại qua các lần khởi động lại, cung cấp bản sao lưu của cuộc hội thoại và cho phép di chuyển phiên giữa các máy. Trong hướng dẫn này, chúng tôi sẽ đi qua Persist and Resume a Chat Session in C# sử dụng Aspose.LLM, bao gồm khi nào nên sử dụng mẫu này, cách lưu và tải các phiên, dữ liệu nào được lưu trữ, các cân nhắc về khả năng di chuyển và các thực hành bảo mật tốt nhất.

Tại sao cần lưu trữ và tiếp tục một phiên trò chuyện?

Các nhà phát triển thường xây dựng các trợ lý tương tác, bot hỗ trợ, hoặc các quy trình phân tích dữ liệu kéo dài. Trong nhiều trường hợp, ngữ cảnh trò chuyện phải tồn tại vượt qua vòng đời của một tiến trình duy nhất:

  • Một công cụ hỗ trợ máy tính để bàn mà người dùng mong đợi các truy vấn trước đó vẫn còn sẵn sàng sau khi ứng dụng được đóng.
  • Tự động hóa phía máy chủ bao gồm nhiều bước và có thể được khởi động lại do bảo trì.
  • Yêu cầu kiểm toán hoặc tuân thủ đòi hỏi một bản chụp nhanh của toàn bộ cuộc trò chuyện.
  • Di chuyển một phiên khắc phục sự cố từ laptop của nhà phát triển sang máy chủ sản xuất.

Bằng cách lưu phiên vào tệp JSON, bạn ghi lại toàn bộ lịch sử tin nhắn và bộ nhớ đệm KV nội bộ cần thiết cho việc tiếp tục chính xác, giúp các trường hợp sử dụng ở trên dễ dàng thực hiện.

Bắt đầu với Aspose.LLM

Đầu tiên, thêm gói Aspose.LLM vào dự án của bạn:

Install-Package Aspose.LLM

Bạn có thể tìm thêm chi tiết sản phẩm trên trang sản phẩm Aspose.LLM .NET. SDK yêu cầu có giấy phép hợp lệ, vì vậy hãy chắc chắn rằng bạn đã chuẩn bị tệp giấy phép tạm thời hoặc vĩnh viễn.

Yêu cầu trước

  • Cài đặt gói NuGet Aspose.LLM.
  • Áp dụng giấy phép Aspose.LLM bằng cách sử dụng Aspose.LLM.License.
  • Tạo một thể hiện AsposeLLMApi (ví dụ, với Qwen25Preset).

Khi nào nên sử dụng mẫu này

Mẫu này tỏa sáng khi bạn cần cuộc trò chuyện duy trì vượt qua quá trình hiện tại, hoặc khi bạn muốn một bản sao đáng tin cậy để sao lưu hoặc di chuyển. Các kịch bản điển hình bao gồm:

  • Ứng dụng desktop hoặc server nơi người dùng mong đợi cuộc trò chuyện được duy trì giữa các lần khởi chạy.
  • Quy trình làm việc kéo dài cần cuộc trò chuyện tồn tại lâu hơn quá trình.
  • Mục đích sao lưu và kiểm toán bằng cách chụp ảnh nhanh một cuộc trò chuyện đang hoạt động.
  • Di chuyển trạng thái phiên giữa các máy có cùng phiên bản SDK và cấu hình trước.

Các yêu cầu trước

Trước khi bạn có thể lưu hoặc khôi phục một phiên, hãy đảm bảo các điều sau đã được thiết lập:

  1. gói NuGet Aspose.LLM – được cài đặt qua lệnh đã được hiển thị ở trên.
  2. License – tạo một đối tượng Aspose.LLM.License và gọi SetLicense với tệp .lic của bạn.
  3. API instance – khởi tạo AsposeLLMApi với preset mong muốn (ví dụ, new Qwen25Preset()).

Các bước này được trình bày trong ví dụ đầy đủ ở phần sau của bài viết.

Lưu một Phiên

SDK cung cấp ba cách tiện lợi để lưu trữ một phiên trò chuyện. Thực hiện các bước dưới đây, sau đó xem mẫu mã.

  1. Gọi SaveChatSession với một đường dẫn tệp cụ thể nếu bạn cần tệp ở vị trí đã biết.
  2. Bỏ qua đường dẫn để SDK ghi <sessionId>.json bên cạnh tệp thực thi.
  3. Tạo một đường dẫn tạm thời bằng Path.Combine, đảm bảo thư mục tồn tại, và lưu ở đó cho các kịch bản cô lập hoặc trong môi trường sandbox.

Mẫu mã – Lưu một phiên

Ví dụ sau đây minh họa cả ba cách tiếp cận:

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") ghi tệp JSON vào vị trí được cung cấp.
Nếu bạn gọi SaveChatSession mà không chỉ định đường dẫn, SDK tạo một tệp có tên dựa trên ID của phiên trong thư mục làm việc hiện tại.
Khi bạn cần một vị trí xác định hoặc tạm thời, hãy kết hợp Path.GetTempPath với cấu trúc thư mục của riêng bạn và tạo thư mục trước khi lưu.

Lưu ý: Các đoạn mã này được sao chép từ tài liệu chính thức của Aspose và chưa được thực thi trong môi trường sandbox. Hãy kiểm tra chúng trong môi trường của bạn trước khi sử dụng trong sản xuất.

Khôi phục một Phiên

Việc tải một phiên đã lưu trước đó cũng đơn giản tương tự. API đọc tệp JSON, tái tạo lại trạng thái nội bộ và trả về định danh phiên để bạn có thể tiếp tục nhắn tin mà không cần truyền ID một cách thủ công nữa.

  1. Gọi LoadChatSession với đường dẫn tới tệp JSON.
  2. Lưu trữ sessionId được trả về.
  3. Sử dụng SendMessageToSessionAsync với ID đã khôi phục để tiếp tục cuộc trò chuyện.

Mẫu mã – Khôi phục một phiên

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

LoadChatSession đọc tệp và trả về ID phiên đã khôi phục.
Phiên đã khôi phục sẽ tự động được đặt làm phiên hoạt động, cho phép gọi ngay SendMessageToSessionAsync.

Lưu ý: Các đoạn mã này được sao chép từ tài liệu chính thức của Aspose và chưa được thực thi trong môi trường sandbox. Hãy kiểm tra chúng trong môi trường của bạn trước khi sử dụng trong sản xuất.

Ví dụ đầy đủ — Lưu, Khởi động lại, Tiếp tục

Dưới đây là một bản demo hoàn chỉnh, từ đầu đến cuối. Khối đầu tiên khởi tạo một cuộc trò chuyện, gửi một vài tin nhắn và lưu phiên làm việc. Khối thứ hai mô phỏng một quy trình mới tải tệp đã lưu và tiếp tục cuộc trò chuyện.

Mẫu mã nguồn – Quy trình 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);
}

Khối đầu tiên tạo một giấy phép, khởi tạo API với Qwen25Preset, bắt đầu một cuộc trò chuyện mới có tên support-ticket-1234, gửi ba tin nhắn để xây dựng ngữ cảnh, và cuối cùng ghi phiên làm việc vào support-ticket-1234.json. Khối thứ hai tạo lại giấy phép và API, tải tệp JSON, và tiếp tục đối thoại, chứng minh rằng mô hình giữ lại các tin nhắn trước đó.

Lưu ý: Các đoạn mã này được sao chép từ tài liệu chính thức của Aspose và chưa được thực thi trong môi trường sandbox. Hãy xác minh chúng trong môi trường của bạn trước khi sử dụng trong môi trường sản xuất.

Cái gì được lưu?

SaveChatSession tạo ra một tài liệu JSON với ba phần thiết yếu:

  1. Định danh Phiên – ID duy nhất bạn cung cấp khi bắt đầu trò chuyện.
  2. Lịch sử Tin nhắn – danh sách có thứ tự của tất cả các tin nhắn người dùng và trợ lý, bao gồm vai trò, nội dung và bất kỳ siêu dữ liệu phương tiện nào.
  3. Siêu dữ liệu Bộ nhớ Đệm KV – vị trí và kích thước nội bộ của bộ nhớ đệm khóa‑giá trị cho mỗi tin nhắn, cho phép mô hình tiếp tục chính xác từ nơi nó dừng lại.

Vì dữ liệu bộ nhớ đệm được bao gồm, phiên được khôi phục có thể tiếp tục tạo mà không cần tính lại attention trước đó, làm cho thao tác tiếp tục nhanh chóng và có tính quyết định.

Ràng buộc tính di động

Mặc dù tệp JSON chứa mọi thứ cần thiết cho một tiếp tục hoàn hảo, nó chỉ có thể di chuyển được dưới một số điều kiện nhất định:

  • Cùng Phiên Bản SDK Chính – định dạng tệp có thể thay đổi giữa các phiên bản chính, vì vậy cả hai bên phải sử dụng cùng phiên bản chính của Aspose.LLM.
  • Tệp Mô Hình Giống Nhau – mô hình Hugging Face nền tảng (bao gồm cả lượng tử hoá) phải khớp chính xác; nếu không bộ nhớ đệm KV sẽ không tương thích.
  • Khớp BinaryManagerParameters.ReleaseTag – phiên bản runtime llama.cpp được dùng để tải mô hình phải giống nhau, nếu không bố cục tensor cấp thấp sẽ khác nhau.

Nếu bất kỳ ràng buộc nào bị vi phạm, bạn có thể gặp lỗi như InvalidOperationException hoặc đầu ra bị rối loạn.

Một Điểm Nhạy Khi Tải Được Biết

Khi bạn gọi LoadChatSession, SDK sẽ tái tạo lại cuộc trò chuyện nhưng áp dụng mặc định ContextParameters, ChatParametersSamplerParameters. Bất kỳ cài đặt tùy chỉnh nào (ví dụ: temperature, max tokens, system prompts) mà bạn đã sử dụng trong phiên ban đầu không được khôi phục tự động. Để giữ nguyên hành vi sinh ra, hãy áp dụng lại các tham số tùy chỉnh của bạn sau khi tải, hoặc phát lại cuộc trò chuyện trong một phiên mới với các cài đặt mong muốn.

Các lỗi thường gặp

Dưới đây là danh sách kiểm tra nhanh cho các vấn đề thường gặp khi tải một phiên làm việc:

  • FileNotFoundException – Xác minh đường dẫn tệp; các đường dẫn tương đối được giải quyết dựa trên thư mục làm việc hiện tại.
  • InvalidOperationException on load – Cho biết phiên bản SDK không tương thích hoặc tệp JSON bị hỏng.
  • Garbled output after load – Thường gây ra do tệp mô hình không khớp hoặc ReleaseTag. Đảm bảo cùng một tệp nhị phân mô hình chính xác có trên máy tải.

Xử lý các ngoại lệ này một cách khéo léo và ghi lại các chẩn đoán chi tiết sẽ làm cho ứng dụng của bạn trở nên mạnh mẽ hơn.

Bảo mật

Tệp JSON được lưu trữ chứa các bản sao plain‑text của mọi tin nhắn người dùng và trợ lý. Lưu trữ nó ở vị trí không được bảo vệ có thể làm lộ dữ liệu nhạy cảm. Xem xét các biện pháp giảm thiểu sau:

  • Mã hóa tệp trước khi ghi vào đĩa (ví dụ: Windows DPAPI, Azure Key Vault, hoặc một thư viện đa nền tảng như libsodium).
  • Hạn chế quyền truy cập hệ thống tệp sao cho chỉ tài khoản dịch vụ chạy ứng dụng có thể đọc/ghi tệp.
  • Nếu tệp phải truyền qua mạng, sử dụng các kênh được mã hóa TLS và cân nhắc ký tệp để phát hiện việc giả mạo.

Những gì tiếp theo

Bây giờ khi bạn có thể lưu trữ và tiếp tục các cuộc trò chuyện, bạn có thể khám phá các khả năng liên quan:

  • Các trường hợp sử dụng trò chuyện đa vòng – duy trì các cuộc đối thoại dài hơn qua nhiều tương tác.
  • Cấu hình preset tùy chỉnh – điều chỉnh preset mô hình cho lĩnh vực của bạn trước khi lưu.
  • Tham chiếu đầy đủ về việc duy trì phiên – xem lại tài liệu API để hiểu sâu hơn về ngữ nghĩa xung quanh SaveChatSession và siêu dữ liệu liên quan.

Lựa chọn cách tiếp cận phù hợp

Bài viết đã trình bày ba cách để lưu một phiên và một phương pháp tải đơn giản. Hãy chọn cách tiếp cận phù hợp với kịch bản triển khai của bạn:

  • Explicit path – tốt nhất khi tệp phải nằm ở vị trí đã biết, chẳng hạn như thư mục riêng của người dùng hoặc ổ đĩa mạng chia sẻ.
  • Default filename – tiện lợi cho các nguyên mẫu nhanh hoặc khi phiên làm việc tồn tại cùng với tệp thực thi.
  • Temporary path with directory creation – lý tưởng cho môi trường cách ly, pipeline CI, hoặc khi bạn muốn hệ điều hành quản lý việc dọn dẹp.

Tất cả các cách tiếp cận đều sử dụng cùng một API cơ bản; chúng chỉ khác nhau ở cách bạn quản lý hệ thống tệp.

Nhận giấy phép miễn phí

Nếu bạn chưa có giấy phép vĩnh viễn, bạn có thể nhận giấy phép đánh giá tạm thời từ trang giấy phép tạm thời của Aspose.

Tài nguyên bổ sung miễn phí

Conclusion

Việc duy trì một phiên trò chuyện với Aspose.LLM mang lại cho bạn tính bền vững, khả năng kiểm toán và sự linh hoạt để di chuyển các cuộc trò chuyện giữa các tiến trình hoặc máy móc. Bạn đã học được khi nào áp dụng mẫu này, cách lưu một phiên theo ba cách khác nhau, cách khôi phục nó, nội dung của tệp JSON, và các cân nhắc về tính tương thích và bảo mật mà bạn cần lưu ý. Với ví dụ đầy đủ, bạn hiện có thể tích hợp việc duy trì phiên vào bất kỳ giải pháp trò chuyện .NET nào.

Câu hỏi thường gặp

  1. Khi nào việc lưu trữ một phiên trò chuyện là hữu ích?
    Việc lưu trữ hữu ích cho các ứng dụng desktop hoặc server cần trạng thái cuộc trò chuyện qua các lần khởi động, quy trình làm việc dài hạn, yêu cầu kiểm toán hoặc sao lưu, và việc di chuyển các phiên giữa các máy có cùng phiên bản SDK.

  2. Làm thế nào để chỉ định đường dẫn tệp tùy chỉnh khi lưu một phiên?
    Gọi api.SaveChatSession(sessionId, "myfolder\myfile.json"); hoặc tạo đường dẫn bằng Path.Combine và đảm bảo thư mục tồn tại trước khi lưu.

  3. LoadChatSession trả về gì?
    Nó trả về định danh của phiên đã khôi phục, cho phép bạn tiếp tục gửi tin nhắn mà không cần cung cấp lại ID.

  4. Tôi có thể chuyển tệp phiên đã lưu sang máy khác không?
    Có, miễn là máy đích sử dụng cùng phiên bản SDK chính, tệp mô hình giống hệt và thẻ ReleaseTag của llama.cpp phù hợp.

  5. Tệp JSON đã lưu có an toàn không?
    Tệp lưu trữ dữ liệu cuộc trò chuyện dạng văn bản thuần, vì vậy bạn nên mã hoá nó trước khi lưu ở các vị trí không tin cậy.

  6. Tại sao các cài đặt bộ lấy mẫu hoặc ngữ cảnh tùy chỉnh của tôi không được khôi phục sau khi tải?
    LoadChatSession áp dụng các tham số mặc định; hãy áp dụng lại bất kỳ cài đặt tùy chỉnh nào sau khi tải hoặc phát lại lịch sử trong một phiên mới.

Đọc thêm