רוב צוותי .NET שמוסיפים תכונות AI היום מסתיימים בכתיבת אותה תשתית: לקוח HTTP, מדיניות נסיונות חוזרים, ניהול סודות למפתח API, וקו חיוב לכל טוקן בכרטיס האשראי של מישהו. Aspose.LLM בוחרת בדרך שונה. זהו חבילת NuGet שמריצה אינפרנס של מודל שפה גדול בתוך התהליך שלך – ללא שירות לקריאה, ללא מפתח לסיבוב, וללא בקשה שיוצאת מהמחשב.
המאמר מציג את הספרייה, מסביר את שלוש המושגים שעליהם מבוססת ה‑API, ומלווה אותך ביישום צ׳אט עובד. אם תוכל להוסיף הפניה לחבילה, תוכל לשלוח פקודות בכמה עשרות שורות.
למה מודל מקומי חשוב
הפעלת המודל בתהליך משנה את מה שאתה יכול לבנות.
- הנתונים נשארים במקום. ההנחיות לעולם אינן עוזבות את המארח, וזה חשוב כשאתה עובד עם חוזים, רשומות רפואיות, קוד מקור, או כל דבר אחר המכוסה במדיניות מגורים של נתונים.
- אין עלות לכל טוקן. ברגע שהמודל נמצא על הדיסק, ההסקה היא עלות CPU או GPU שכבר ברשותך, ולא קריאת API מדודה.
- אין תלות ברשת בזמן ריצה. כלי שולחן עבודה, שירותים במקומות פנימיים, וסביבות מבודדות פועלים באותו האופן.
- פריט פריסה אחד. תצורת המודל נשלחת עם היישום שלך במקום לחיות בלוח המחוונים של חשבון נפרד.
הפשרה היא כנה וראויה לציון מראש: אתה מספק את החומרה. מודל שמופעל מקומית זקוק לזיכרון מקומי, והריצה הראשונה דורשת להוריד כמה גיגבייטים.
Aspose.LLM for .NET בשלושה מושגים
שטח הפנים הוא בכוונה קטן. כמעט כל מה שאתה עושה עם Aspose.LLM כולל את שלושת הסוגים האלה.
| מושג | סוג | תפקיד |
|---|---|---|
| License | Aspose.LLM.License | מפעיל את הספרייה. יש לקרוא ל‑SetLicense לפני כל שימוש אחר ב‑API. |
| Preset | e.g. Qwen25Preset | אוסף את קבצי המודל יחד עם פרמטרי יצירה כגון טמפרטורת הסמפולר. |
| API instance | AsposeLLMApi | נקודת הכניסה. נוצר מראש, מחזיק את השיחה, חושף את SendMessageAsync. |
הקבוע הוא המעניין. במקום לגרום לך לחבר ידנית נתיבי מודלים, הגדרות טוקניזר וערכי מדגם, קבוע מאגד שילוב מוכח. Qwen25Preset הוא נקודת ההתחלה המוגדרת כברירת מחדל, ואתה יכול להתאים את הפרמטרים שלו או להחליף בקבוע אחר מאוחר יותר מבלי לגעת בשאר הקוד שלך.
דרישות מוקדמות
לפני כתיבת קוד כלשהו:
- התקן את החבילה -
Install-Package Aspose.LLM - מקם את הרישיון שלך - שים
Aspose.LLM.licבמקום שהקובץ הניתן להרצה יכול לקרוא בזמן ריצה. - בדוק את תקציב הזיכרון שלך - ההגדרה Qwen25 דורשת לפחות 8 GB של RAM חופשית.
לפרטי המוצר, ראה את דף המוצר של Aspose.LLM for .NET.
הצ’אט הראשון שלך
הנה התוכנית הקצרה ביותר שמקיימת שיחה אמיתית. שים לב לקריאות השנייה והשלישית: מופע ה‑API עוקב אחרי ההקשר בעצמו, ולכן המודל עדיין יודע מי אליס.
מה הקוד עושה
- יוצר
Licenseומפנה אותו לקובץ הרישיון שלך. - יוצר מופע של
Qwen25Presetעם התצורה ברירת המחדל שלו. - יוצר מופע אחד של
AsposeLLMApiמהקבוע הזה. - שולח מספר פקודות, כולן חולקות את אותה השיחה.
using Aspose.LLM;
using Aspose.LLM.Abstractions.Parameters.Presets;
var license = new Aspose.LLM.License();
license.SetLicense("Aspose.LLM.lic");
var preset = new Qwen25Preset();
using var api = AsposeLLMApi.Create(preset);
string reply = await api.SendMessageAsync("What is 2 + 2?");
Console.WriteLine(reply);
// Output: 2 + 2 equals 4.
await api.SendMessageAsync("My name is Alice.");
string reply2 = await api.SendMessageAsync("What is my name?");
Console.WriteLine(reply2);
// Output: Your name is Alice.
AsposeLLMApi.Create(preset) מחזיר לקוח מודע למפגש. כל קריאה ל-SendMessageAsync מוסיפה את ההנחיה לשיחה המתמשכת, כך שאתה מקבל התנהגות מרובת סיבובים מבלי לנהל שום מצב בעצמך. הצהרת using חשובה – המופע מחזיק משאבים מקומיים וצריך להיות משוחרר.
הערה: דוגמאות אלה עוקבות אחרי התיעוד הרשמי של Aspose ולא בוצעו בסביבת sandbox. יש לאמת אותן בסביבת העבודה שלכם לפני השחרור.
כיוונון התנהגות לבקשה יחידה
תשובות שיחה נהנות ממעט אקראיות. חשבון אינו כך. במקום לשנות את תצורת המופע, בנו פריסט שני והעבירו אותו לקריאה אחת שדורשת זאת.
מה הקוד עושה
- יוצר את הפריסט המוגדר מראש ואת מופע ה-API כרגיל.
- בונה
strictPresetעם טמפרטורת מדגם נמוכה. - מעביר אותו ל-
SendMessageAsyncדרך הפרמטרpreset. - משאיר קריאות מאוחרות על ברירת המחדל המקורית.
using Aspose.LLM.Abstractions.Parameters.Presets;
// Default preset used by the API instance
var defaultPreset = new Qwen25Preset();
using var api = AsposeLLMApi.Create(defaultPreset);
// A more deterministic preset, for this question only
var strictPreset = new Qwen25Preset();
strictPreset.SamplerParameters.Temperature = 0.1f;
string reply = await api.SendMessageAsync(
"What is the square root of 144?",
preset: strictPreset);
Console.WriteLine(reply);
// Output: The square root of 144 is 12.
SamplerParameters.Temperature שולט בכמות האקראיות שהסמפלר מוסיף. ערכים קרובים ל-0.1 מייצרים פלט כמעט דטרמיניסטי; ערכים גבוהים יותר מייצרים ניסוחים מגוונים יותר. מכיוון שהקבוע מוגדר רק לשיחה, ההחלפה לא מדליקה לשאר השיחה.
ביטול ופסקי זמן
אורך הדור אינו צפוי במלואו, ובקשה שלוקחת זמן ארוך תחסום כל מה שממתין לה. SendMessageAsync מקבלת CancellationToken, ולכן יש לספק אחת.
מה הקוד עושה
- יוצר
CancellationTokenSourceעם תקציב של 30 שניות. - מעביר את
cts.Tokenל-SendMessageAsync. - תופס
OperationCanceledExceptionומתנהג בצורה חלקה.
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
try
{
string reply = await api.SendMessageAsync(
"Write a 500-word essay about migration patterns of the Arctic tern.",
cancellationToken: cts.Token);
Console.WriteLine(reply);
}
catch (OperationCanceledException)
{
Console.WriteLine("Generation timed out.");
}
הביטול משאיר את מצב ההפעלה של המושב שלם, ולכן השיחה נמשכת כרגיל בקריאה הבאה. במטפל של ASP.NET Core, העבר כאן גם את אסימון RequestAborted של הבקשה עצמה – אין סיבה להמשיך ליצור עבור לקוח שכבר התנתק.
יישום קונסול מלא
הצבה יחד: REPL ששומר על מושב אחד פעיל לכל חיי התהליך ומתאושש מכשלונות לכל הודעה.
מה הקוד עושה
- מגדיר את הרישיון וההגדרה המוגדרת מראש פעם אחת, בעת ההפעלה.
- יוצר מופע יחיד של
AsposeLLMApiלכל התוכנית. - מבצע לולאה על קלט המשתמש עד שהמשתמש מקליד
quit. - שולח כל שורה ומדפיס את התשובה.
- תופס חריגות לכל הודעה כך שכשלון אחד לא יסתיים את ההפעלה.
using Aspose.LLM;
using Aspose.LLM.Abstractions.Parameters.Presets;
internal class SimpleChatDemo
{
public static async Task Main()
{
var license = new Aspose.LLM.License();
license.SetLicense("Aspose.LLM.lic");
var preset = new Qwen25Preset();
using var api = AsposeLLMApi.Create(preset);
Console.WriteLine("Ask me anything. Type 'quit' to exit.");
while (true)
{
Console.Write("> ");
string? line = Console.ReadLine();
if (line == null || line.Equals("quit", StringComparison.OrdinalIgnoreCase))
break;
try
{
string reply = await api.SendMessageAsync(line);
Console.WriteLine(reply);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
}
שתי נקודות עיצוב שוות להעביר ליישומים אמיתיים. ראשית, המופע נוצר פעם אחת ומשמש מחדש – יצירה יקרה וכפי שמסביר הסעיף הבא, אינן מותרות מופעים מקבילים. שנית, ה‑try‑catch נמצא בתוך הלולאה במקום סביבו, ולכן הודעה שגויה אחת עולה לך בתור אחד במקום על כל ההפעלה.
העריכו את הספרייה עם רישיון זמני מהדף הרישיון הזמני של Aspose.
שגיאות שאתה עלול להיתקל בהן ראשונה
| שגיאה | סיבה טיפוסית | פתרון |
|---|---|---|
Not licensed for this method | קובץ הרישיון חסר או שהנתיב שגוי | אשר ש‑Aspose.LLM.lic קריא מתיקיית העבודה וש‑SetLicense מתבצע לפני כל קריאה אחרת ל‑API. |
Only one AsposeLLMApi instance can be created at a time | שני מופעים חיים בו‑זמנית, לרוב ממפעל לכל בקשה | רשום את המופע כסינגלטון, או נטרל (dispose) את הקודם לפני יצירת מופע נוסף. |
| First response takes minutes | המנוע מוריד קבצים בינריים מקומיים ומשקלי מודל | צפה ל‑5‑15 דקות במכונה נקייה. הפעל Create בזמן האתחול כך שהעלות לא תיגרם למשתמש. |
השורה השנייה הזו דורשת הדגשה בתרחישי שירות. אם אתה מחבר את Aspose.LLM למיכל DI, רשום את AsposeLLMApi כסינגלטון ושרשר את הגישה אליו – רישום scoped או transient ייכשל ברגע ששתי בקשות חופפות.
משאבים נוספים
סיכום
Aspose.LLM מצמצמת את “add an LLM to this .NET application” לשלושה סוגים ושיטה אחת. רישיון מפעיל את הספרייה, פריסט מגדיר את המודל וכיצד הוא מייצר, ו‑AsposeLLMApi משמש לניהול השיחה. משם, SendMessageAsync מטפל בשאלה יחידה, במפגש מרובה סיבובים, בהחלפת פרמטר לכל קריאה, וביצירה ארוכה שניתנת לביטול.
התחל עם דוגמת הקונסול, אשר שהמודל מתנהג כפי שהפיצ’ר שלך דורש, ואז עבור לעבודה מרובה‑הפעלות ולשימור נתונים ברגע שהיסודות מוצקים.
שאלות נפוצות
1. מהו Aspose.LLM for .NET?
ספריית NuGet שמריצה אינפרנס של מודל שפה גדול בתוך תהליך .NET שלך. אתה יוצר הגדרה מראש, יוצר מופע API ושולח פרומפטים - ללא שירות חיצוני, ללא מפתח API.
2. האם אני צריך חיבור אינטרנט כדי להשתמש בו?
רק עבור ההפעלה הראשונה. הקריאה הראשונית Create מורידה את המנוע המקומי וקבצי המודל המוגדרים על ידי הפרמטר המוגדר מראש, והנכסים נשמרים במטמון מקומי לאחר מכן.
3. מהם הדרישות המוקדמות לדוגמאות הקוד?
חבילת NuGet של Aspose.LLM, קובץ Aspose.LLM.lic תקף, וכמות מספקת של RAM חופשי עבור הפרמטר שנבחר – תכנן לפחות 8 GB עבור Qwen25.
4. איך אני משנה את ההתנהגות של המודל עבור בקשה אחת?
צור פריסט מוגדר שני, התאם את הפרמטרים שלו (כגון SamplerParameters.Temperature), והעבר אותו ל-SendMessageAsync באמצעות ארגומנט preset. קריאות מאוחרות יחזרו לפריסט המוגדר כברירת מחדל של המופע.
5. איך לעצור יצירה שלוקחת זמן רב מדי?
העבר CancellationToken ל‑SendMessageAsync ותפוס OperationCanceledException. מצב ההפעלה נשאר אחרי הביטול, ולכן השיחה ממשיכה כרגיל.
6. למה התגובה הראשונה כל כך איטית?
הקריאה הראשונה Create מורידה קבצים בינריים מקומיים ומשקלי מודל, מה שיכול לקחת 5‑15 דקות במכונה נקייה. חמם את המופע בעת אתחול היישום במקום בבקשת המשתמש הראשונה.
