שמירת מושב צ’אט מאפשרת ליישום .NET שלך לשרוד הפעלות מחדש, מספקת גיבוי של השיחה, ומאפשרת להעביר את המושב בין מחשבים. במדריך זה נסקור את שמירת והמשך של שיחת צ’אט ב‑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, ודא שהספרייה קיימת, ושמור שם לתרחישים מבודדים או סנדבוקס.

דוגמת קוד – שמירת מושב

הדוגמה הבאה מדגימה את כל שלוש הגישות:

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 יוצר קובץ בשם מזהה ההפעלה בתיקייה הפעילה הנוכחית.
כאשר אתה צריך מיקום קבוע או זמני, שלב את Path.GetTempPath עם מבנה התיקיות שלך וצור את הספרייה לפני השמירה.

הערה: קטעי קוד אלה משוחזרים מהתיעוד הרשמי של Aspose ולא בוצעו בסביבת sandbox. יש לאמת אותם בסביבת העבודה שלכם לפני השימוש בייצור.

שחזור מושב

טעינת מושב שנשמר בעבר היא פשוטה באותה מידה. ה‑API קורא את קובץ ה‑JSON, יוצר מחדש את המצב הפנימי, ומחזיר את מזהה המושב כך שתוכל להמשיך בתקשורת ללא צורך להעביר ידנית את המזהה שוב.

  1. קרא LoadChatSession עם הנתיב לקובץ ה-JSON.
  2. שמור את sessionId שהוחזר.
  3. השתמש ב-SendMessageToSessionAsync עם המזהה המשוחזר כדי להמשיך את השיחה.

דוגמת קוד – שחזור מושב

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

LoadChatSession קורא את הקובץ ומחזיר את מזהה ההפעלה המשוחזר.
ההפעלה המשוחזרת מוגדרת אוטומטית כהפעלה הפעילה, מה שמאפשר קריאות מיידיות ל-SendMessageToSessionAsync.

הערה: קטעי קוד אלה משוכפלים מהתיעוד הרשמי של Aspose ולא הורצו בסביבת sandbox. יש לאמת אותם בסביבת העבודה שלכם לפני השימוש בייצור.

דוגמה מלאה — שמירה, הפעלה מחדש, המשך

להלן הדגמה שלמה, מקצה לקצה. הבלוק הראשון מתחיל צ’אט, שולח כמה הודעות ושומר את ההפעלה. הבלוק השני מדמה תהליך חדש שטוען את הקובץ השמור וממשיך את השיחה.

דוגמת קוד – זרימת עבודה מקצה לקצה

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. מזהה הפגישה – המזהה הייחודי שסיפקת בעת תחילת הצ’אט.
  2. היסטוריית הודעות – רשימה מסודרת של כל הודעות המשתמש והעוזר, כולל תפקיד, תוכן וכל מטא‑נתוני מדיה.
  3. מטא‑נתוני מטמון מפתח‑ערך – מיקומים וגדלים פנימיים של מטמון המפתח‑ערך עבור כל הודעה, המאפשרים למודל להמשיך בדיוק מהמקום שבו הוא עצר.

מכיוון שהנתונים במטמון נכללים, המפגש המשוחזר יכול להמשיך את ההפקה ללא חישוב מחדש של תשומת הלב הקודמת, מה שהופך את פעולת ההמשך למהירה ודטרמיניסטית.

מגבלות ניידות

למרות שקובץ ה-JSON מכיל את כל מה שנדרש להמשך מושלם, הוא נייד רק תחת תנאים מסוימים:

  • אותו גרסת SDK ראשית – פורמט הקובץ עשוי להשתנות בין גרסאות ראשיות, ולכן שני הצדדים חייבים להשתמש באותה גרסה ראשית של Aspose.LLM.
  • קובץ מודל זהה – מודל Hugging Face הבסיסי (כולל קוונטיזציה) חייב להתאים בדיוק; אחרת מטמון KV יהפוך לא תואם.
  • התאמת BinaryManagerParameters.ReleaseTag – גרסת זמן הריצה של llama.cpp המשמשת לטעינת המודל חייבת להיות זהה, אחרת פריסות טנסורים ברמת הנמוכה שונות.

אם אחד מההגבלות האלה יופר, ייתכן שתראה שגיאות כגון InvalidOperationException או פלט משובש.

ניואנס ידוע בזמן טעינה

כאשר אתה קורא ל-LoadChatSession, ה‑SDK משחזר את השיחה אך מיישם ברירת מחדל ContextParameters, ChatParameters ו‑SamplerParameters. כל ההגדרות המותאמות (למשל, טמפרטורה, מקסימום טוקנים, פרומפטים מערכתיים) שהשתמשת בהן במהלך הסשן המקורי אינן משוחזרות אוטומטית. כדי לשמור על התנהגות הייצור המדויקת, יש להחיל מחדש את הפרמטרים המותאמים שלך לאחר הטעינה, או לשחזר את השיחה בסשן חדש עם ההגדרות הרצויות.

שגיאות נפוצות

להלן רשימת בדיקה מהירה לבעיות טיפוסיות שעשויות להיתקל בהן בעת טעינת סשן:

  • FileNotFoundException – אמת את נתיב הקובץ; נתיבים יחסיים נפתרים ביחס לתיקיית העבודה הנוכחית.
  • InvalidOperationException בטעינה – מצביע על גרסת SDK לא תואמת או קובץ JSON פגום.
  • Garbled output לאחר הטעינה – בדרך כלל נגרם על ידי קובץ מודל לא תואם או ReleaseTag. ודא שהקובץ הבינארי של המודל זהה בדיוק ונמצא במחשב שבו מתבצעת הטעינה.

טיפול בחריגות אלו בצורה אלגנטית ורישום אבחון מפורט יהפוך את היישום שלך לחזק יותר.

אבטחה

קובץ ה‑JSON המתמשך מכיל עותקים plain‑text של כל הודעה של משתמש ועוזר. אחסון שלו במיקום לא מוגן עלול לחשוף נתונים רגישים. שקול את המנגנונים הבאים:

  • הצפנת הקובץ לפני כתיבתו לדיסק (למשל, Windows DPAPI, Azure Key Vault, או ספרייה חוצת‑פלטפורמות כמו libsodium).
  • הגבלת הרשאות מערכת הקבצים כך שרק חשבון השירות שמריץ את היישום יוכל לקרוא/לכתוב את הקובץ.
  • אם הקובץ חייב לעבור ברשת, השתמשו בערוצי TLS מוצפנים ושקלו לחתום על הקובץ כדי לאתר שינוי בלתי מורשה.

מה הלאה

עכשיו כשאתה יכול לשמור ולהמשיך שיחות, ייתכן שתרצה לחקור יכולות קשורות:

  • מקרים של צ’אט מרובה סיבובים – לשמור על שיחות ארוכות יותר לאורך אינטראקציות רבות.
  • תצורת ערכה מותאמת – התאם את ערכת המודל לתחום שלך לפני השמירה.
  • התייחסות מלאה לשמירת מושב – סקור את תיעוד ה-API לקבלת משמעויות עמוקות יותר סביב SaveChatSession והנתונים המשוייכים.

בחירת הגישה הנכונה

המאמר הציג שלוש דרכים לשמור מפגש ושיטת טעינה פשוטה. בחרו בגישה שתתאים לתרחיש הפריסה שלכם:

  • נתיב מפורש – הכי טוב כאשר הקובץ חייב להימצא במיקום ידוע, כגון תיקייה ספציפית למשתמש או כונן רשת משותף.
  • שם קובץ ברירת מחדל – נוח לפרוטוטייפים מהירים או כאשר ההפעלה מתבצעת לצד הקובץ המבצע.
  • נתיב זמני עם יצירת תיקייה – אידיאלי לסביבות מבודדות, צינורות CI, או כאשר אתה רוצה שה‑OS ינהל ניקוי.

כל הגישות משתמשות באותו API בסיסי; הן שונות רק באופן שבו אתה מנהל את מערכת הקבצים.

קבל רישיון חינמי

אם עדיין אין לך רישיון קבוע, אתה יכול לקבל רישיון הערכה זמני מדף הרישיון הזמני של Aspose

משאבים נוספים חינמיים

Conclusion

שמירת מושב צ’אט עם Aspose.LLM מספקת לך עמידות, יכולת ביקורת וגמישות להעברת שיחות בין תהליכים או מכונות. למדת מתי ליישם תבנית זו, כיצד לשמור מושב בשלוש דרכים שונות, כיצד לשחזר אותו, מה מכיל קובץ ה‑JSON, ואת שיקולי התאימות והאבטחה שעליך לקחת בחשבון. מצויד בדוגמה המלאה, אתה יכול כעת לשלב שמירת מושב בכל פתרון צ’אט מבוסס .NET.

FAQs

  1. מתי שמירת סשן צ’אט שימושית?
    שמירה מועילה לאפליקציות שולחן עבודה או שרת שצריכות לשמור את מצב השיחה בין הפעלות, זרימות עבודה ארוכות, דרישות ביקורת או גיבוי, והעברת סשנים בין מכונות עם אותה גרסת SDK.

  2. איך ניתן לציין נתיב קובץ מותאם אישית בעת שמירת סשן?
    קראו api.SaveChatSession(sessionId, "myfolder\myfile.json"); או בנו נתיב עם Path.Combine והבטיחו שהספרייה קיימת לפני השמירה.

  3. מה מחזירה הפונקציה LoadChatSession?
    היא מחזירה את מזהה הסשן המשוחזר, מאפשרת להמשיך לשלוח הודעות ללא צורך לספק את המזהה שוב.

  4. האם ניתן להעביר קובץ סשן שמור למכונה אחרת?
    כן, כל עוד המכונה היעד משתמשת באותה גרסה ראשית של SDK, קובץ מודל זהה, ותגית ReleaseTag של llama.cpp תואמת.

  5. האם קובץ ה-JSON השמור בטוח?
    הקובץ מאחסן נתוני שיחה בטקסט פשוט, ולכן יש להצפין אותו לפני אחסון במקומות שאינם מהימנים.

  6. מדוע הגדרות הסמפולר או ההקשר המותאמות שלי אינן משוחזרות לאחר הטעינה?
    LoadChatSession מיישמת פרמטרים ברירת מחדל; יש להחיל מחדש את ההגדרות המותאמות לאחר הטעינה או לשחזר את ההיסטוריה בסשן חדש.

קרא עוד