اکثر تیمهای .NET که امروز ویژگیهای هوش مصنوعی اضافه میکنند، در نهایت همان زیرساختها را مینویسند: یک کلاینت HTTP، سیاست retry، مدیریت راز برای کلید API، و خط صورتحساب به ازای هر توکن روی کارت اعتباری شخصی. Aspose.LLM مسیر متفاوتی را پیش میگیرد. این یک بسته NuGet است که استنتاج مدل بزرگ زبانی را درون فرآیند خودتان اجرا میکند - بدون سرویس برای فراخوانی، بدون کلید برای چرخش، و بدون درخواست که از ماشین خارج شود.
این مقاله کتابخانه را معرفی میکند، سه مفهوم پایهای API آن را توضیح میدهد و شما را از طریق یک برنامه چت عملی راهنمایی میکند. اگر بتوانید یک ارجاع بسته اضافه کنید، میتوانید در چند ده خط درخواستها را ارسال کنید.
چرا یک مدل محلی مهم است
اجرای مدل بهصورت درونفرآیند، آنچه میتوانید بسازید را تغییر میدهد.
- دادهها در جای خود میمانند. درخواستها هرگز از میزبان خارج نمیشوند، که این موضوع زمانی مهم است که با قراردادها، یادداشتهای پزشکی، کد منبع یا هر چیز دیگری که تحت سیاست اقامت دادهها قرار دارد، کار میکنید.
- بدون هزینه به ازای هر توکن. وقتی مدل روی دیسک قرار دارد، استنتاج هزینهای برای CPU یا GPU است که قبلاً در اختیار دارید، نه یک تماس API متری.
- بدون وابستگی به شبکه در زمان اجرا. ابزارهای دسکتاپ، سرویسهای درونسازمانی و محیطهای ایزوله همگی به همان شکل کار میکنند.
- یک artifact استقرار. پیکربندی مدل همراه با برنامه شما تحویل داده میشود به جای اینکه در داشبورد حساب جداگانهای زندگی کند.
معاملۀ متقابل صادقانه است و ارزش دارد که از ابتدا بیان شود: شما سختافزار را فراهم میکنید. مدلی که بهصورت محلی اجرا میشود به حافظه محلی نیاز دارد و اولین اجرا نیاز به دانلود چند گیگابایت دارد.
Aspose.LLM for .NET در سه مفهوم
سطح بهطور عمدی کوچک است. تقریباً تمام کارهایی که با Aspose.LLM انجام میدهید شامل این سه نوع است.
| مفهوم | نوع | نقش |
|---|---|---|
| License | Aspose.LLM.License | کتابخانه را فعال میکند. قبل از استفاده از هر API دیگری، SetLicense را فراخوانی کنید. |
| Preset | e.g. Qwen25Preset | فایلهای مدل را همراه با پارامترهای تولید مانند دمای سمپلر بستهبندی میکند. |
| API instance | AsposeLLMApi | نقطه ورود. از یک پیشتنظیم ایجاد میشود، مکالمه را نگه میدارد و SendMessageAsync را در دسترس قرار میدهد. |
یک پیشتنظیم جالب است. به جای اینکه مجبور شوید مسیرهای مدل، تنظیمات توکنایزر و مقادیر سمپلر را بهصورت دستی تنظیم کنید، یک پیشتنظیم ترکیبی از تنظیمات معتبر را بستهبندی میکند. Qwen25Preset نقطه شروع پیشفرض است و میتوانید پارامترهای آن را تنظیم کنید یا بعداً پیشتنظیم دیگری را جایگزین کنید بدون اینکه به بقیه کد خود دست بزنید.
پیشنیازها
قبل از نوشتن هر کدی:
- نصب بسته -
Install-Package Aspose.LLM - قرار دادن لایسنس -
Aspose.LLM.licرا در مکانی قرار دهید که برنامه اجرایی در زمان اجرا بتواند آن را بخواند. - بررسی بودجه حافظه - پیشتنظیم Qwen25 حداقل 8 گیگابایت 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 مهم است - نمونه منابع بومی را در اختیار دارد و باید آزاد شود.
Note: این نمونهها مستندات رسمی Aspose را دنبال میکنند و در یک محیط ایزوله اجرا نشدهاند. قبل از انتشار، آنها را در محیط خود بررسی کنید.
تنظیم رفتار برای یک درخواست
پاسخهای مکالمهای از برخی تصادفی بودن بهره میبرند. ریاضیات اینگونه نیست. بهجای پیکربندی مجدد نمونه، یک پیشتنظیم دوم ایجاد کنید و آن را به فراخوانیای که به آن نیاز دارد، پاس دهید.
کاری که کد انجام میدهد
- پیشتنظیم پیشفرض و نمونه API را همانطور که معمول است ایجاد میکند.
strictPresetرا با دمای پایین نمونهگیر میسازد.- آن را از طریق آرگومان
presetبهSendMessageAsyncمیگذارد. - تماسهای بعدی را بر پیشفرض اصلی میگذارد.
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 | دو نمونه همزمان فعال هستند، اغلب از یک کارخانهٔ در‑هر‑درخواست | نمونه را بهعنوان تکنمونه (singleton) ثبت کنید، یا قبل از ایجاد نمونهٔ دیگر، نمونهٔ قبلی را از بین ببرید. |
| First response takes minutes | موتور در حال دانلود باینریهای بومی و وزنهای مدل است | انتظار داشته باشید که ۵ تا ۱۵ دقیقه طول بکشد روی یک ماشین تمیز. Create را در زمان راهاندازی فراخوانی کنید تا هزینه توسط کاربر پرداخت نشود. |
آن ردیف دوم در سناریوهای سرویس باید برجسته شود. اگر در حال اتصال Aspose.LLM به یک کانتینر DI هستید، AsposeLLMApi را بهعنوان یک Singleton ثبت کنید و دسترسی به آن را سریالسازی کنید – ثبت بهصورت Scoped یا Transient به محض همپوشانی دو درخواست شکست خواهد خورد.
منابع اضافی
نتیجهگیری
Aspose.LLM عبارت “add an LLM to this .NET application” را به سه نوع و یک متد کاهش میدهد. یک لایسنس کتابخانه را فعال میکند، یک پیشتنظیم مدل و نحوه تولید آن را تعریف میکند، و یک نمونه AsposeLLMApi گفتوگو را حمل میکند. از آنجا، SendMessageAsync یک سؤال تک، یک جلسه چند‑مرحلهای، یک بازنویسی پارامتر برای هر فراخوانی، و یک تولید طولانیمدت قابل لغو را مدیریت میکند.
با نمونهٔ کنسول شروع کنید، اطمینان حاصل کنید که مدل همانطور که ویژگی شما نیاز دارد رفتار میکند، سپس پس از تثبیت اصول پایه، به کارهای چند‑جلسهای و پایداری بروید.
سوالات متداول
1. Aspose.LLM for .NET چیست؟
یک کتابخانه NuGet که استنتاج مدل زبان بزرگ را داخل فرآیند .NET خود شما اجرا میکند. شما یک پیشتنظیم ایجاد میکنید، یک نمونه API میسازید و درخواستها را ارسال میکنید - بدون سرویس خارجی، بدون کلید API.
۲. آیا برای استفاده از آن به اتصال اینترنتی نیاز دارم؟
فقط برای اولین اجرا. فراخوانی اولیه Create موتور بومی و فایلهای مدل تعریفشده توسط پیشتنظیم را دانلود میکند و پس از آن داراییها بهصورت محلی کش میشوند.
۳. پیشنیازهای نمونههای کد چیست؟
پکیج NuGet Aspose.LLM، یک فایل معتبر Aspose.LLM.lic و حافظه RAM کافی برای پیشتنظیم انتخابی شما - حداقل ۸ گیگابایت برای Qwen25 برنامهریزی کنید.
4. چگونه رفتار مدل را برای یک درخواست واحد تغییر دهم؟
یک پیشتنظیم دوم ایجاد کنید، پارامترهای آن را (مانند SamplerParameters.Temperature) تنظیم کنید و آن را از طریق آرگومان preset به SendMessageAsync پاس دهید. تماسهای بعدی به پیشتنظیم پیشفرض نمونه بازمیگردند.
5. چگونه میتوانم یک تولید که زمان زیادی میگیرد را متوقف کنم؟
یک CancellationToken را به SendMessageAsync پاس کنید و OperationCanceledException را دریافت کنید. وضعیت جلسه پس از لغو باقی میماند، بنابراین مکالمه بهطور معمول ادامه مییابد.
6. چرا اولین پاسخ اینقدر کند است؟
اولین فراخوانی Create باینریهای بومی و وزنهای مدل را دانلود میکند، که میتواند 5 تا 15 دقیقه روی یک ماشین تمیز طول بکشد. به جای گرم کردن نمونه در اولین درخواست کاربر، آن را در زمان راهاندازی برنامه گرم کنید.
