Většina .NET týmů, které dnes přidávají AI funkce, končí psaním stejné infrastruktury: HTTP klient, politiku opakování, správu tajemství pro API klíč a řádek fakturace za token na něčí kreditní kartu. Aspose.LLM volí jiný přístup. Jedná se o balíček NuGet, který spouští inferenci velkých jazykových modelů uvnitř vašeho vlastního procesu – žádná služba k volání, žádný klíč k otáčení a žádná žádost neopouštějící stroj.
Tento článek představuje knihovnu, vysvětluje tři koncepty, na nichž je postaveno její API, a provede vás fungující chatovací aplikací. Pokud můžete přidat odkaz na balíček, můžete odesílat výzvy během několika desítek řádků.
Proč je lokální model důležitý
Spuštění modelu v procesu mění to, co můžete vytvořit.
- Data zůstávají na místě. Výzvy nikdy neopouštějí hostitele, což je důležité při práci s kontrakty, lékařskými poznámkami, zdrojovým kódem nebo čímkoli jiným, co spadá pod politiku rezidence dat.
- Žádné náklady za token. Jakmile je model na disku, inferování je náklad na CPU nebo GPU, který již vlastníte, nikoli měřený API hovor.
- Žádná síťová závislost za běhu. Desktopové nástroje, lokální služby a izolovaná prostředí fungují stejným způsobem.
- Jeden artefakt nasazení. Konfigurace modelu je součástí vaší aplikace místo toho, aby žila v dashboardu samostatného účtu.
Kompromis je upřímný a stojí za to ho hned na začátku uvést: vy poskytujete hardware. Model, který běží lokálně, potřebuje lokální paměť a první spuštění vyžaduje stažení několika gigabajtů.
Aspose.LLM pro .NET ve třech konceptech
Plocha je úmyslně malá. Téměř vše, co děláte s Aspose.LLM, zahrnuje tyto tři typy.
| Koncept | Typ | Role |
|---|---|---|
| Licence | Aspose.LLM.License | Aktivuje knihovnu. Zavolejte SetLicense před jakýmkoli jiným použitím API. |
| Předvolba | např. Qwen25Preset | Zahrnuje soubory modelu s parametry generování, jako je teplota sampleru. |
| Instance API | AsposeLLMApi | Vstupní bod. Vytvořeno z předvolby, uchovává konverzaci, vystavuje SendMessageAsync. |
Předvolba je ta zajímavá. Místo toho, aby vás nutila ručně nastavovat cesty k modelům, nastavení tokenizéru a hodnoty sampleru, předvolba balí osvědčenou kombinaci. Qwen25Preset je výchozí bod a můžete později upravit jeho parametry nebo vyměnit za jinou předvolbu, aniž byste se dotkli zbytku svého kódu.
Požadavky
Před psaním jakéhokoli kódu:
- Nainstalujte balíček -
Install-Package Aspose.LLM - Umístěte licenci - umístěte
Aspose.LLM.licněkam, kde ji spustitelný soubor může načíst za běhu. - Zkontrolujte svůj rozpočet paměti - předvolba Qwen25 vyžaduje alespoň 8 GB volné RAM.
Pro podrobnosti o produktu viz stránka produktu Aspose.LLM for .NET.
Váš první chat
Zde je nejkratší program, který vede skutečný rozhovor. Všimněte si druhého a třetího volání: instance API sama sleduje kontext, takže model stále ví, kdo je Alice.
Co kód dělá
- Vytvoří
Licensea nasměruje ji na váš licenční soubor. - Vytvoří instanci
Qwen25Presets výchozí konfigurací. - Vytvoří jednu instanci
AsposeLLMApiz tohoto přednastavení. - Odešle několik výzev, všechny sdílející stejnou konverzaci.
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) vrací klienta, který je si vědom relace. Každé volání SendMessageAsync přidá prompt do probíhající konverzace, takže získáte chování s více tahy, aniž byste museli spravovat jakýkoli stav sami. Deklarace using má význam – instance vlastní nativní zdroje a musí být uvolněna.
Poznámka: Tyto ukázky vycházejí z oficiální dokumentace Aspose a nebyly spuštěny v sandboxu. Ověřte je ve svém vlastním prostředí před nasazením.
Ladění chování pro jeden požadavek
Konverzační odpovědi těží z určité náhodnosti. Aritmetika ne. Místo přeconfigurování instance vytvořte druhé přednastavení a předávejte jej volání, které jej potřebuje.
Co kód dělá
- Vytvoří výchozí předvolbu a instanci API jako obvykle.
- Vytvoří
strictPresets nízkou teplotou sampleru. - Předá ji do
SendMessageAsyncpřes argumentpreset. - Nechává pozdější volání na původním výchozím nastavení.
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 řídí, jak velkou náhodnost sampler zavádí. Hodnoty blízké 0.1 produkují téměř deterministický výstup; vyšší hodnoty produkují rozmanitější formulace. Protože předvolba je omezena na volání, přepsání nepropadá do zbytku konverzace.
Zrušení a časové limity
Delší generování není zcela předvídatelné a požadavek, který běží dlouho, bude blokovat vše, co na něj čeká. SendMessageAsync přijímá CancellationToken, takže mu dejte jeden.
Co kód dělá
- Vytvoří
CancellationTokenSources rozpočtem 30 sekund. - Předá
cts.TokendoSendMessageAsync. - Zachytí
OperationCanceledExceptiona elegantně se přizpůsobí.
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.");
}
Zrušení ponechává stav relace nedotčený, takže konverzace pokračuje normálně při dalším volání. V handleru ASP.NET Core předejte zde také token RequestAborted požadavku – není důvod nadále generovat pro klienta, který již byl odpojen.
Kompletní konzolová aplikace
Skládání dohromady: REPL, který udržuje jednu relaci aktivní po celou dobu běhu procesu a zotavuje se z chyb jednotlivých zpráv.
Co kód dělá
- Nastaví licenci a výchozí předvolbu jednou při spuštění.
- Vytvoří jedinou instanci
AsposeLLMApipro celý program. - Opakuje se na vstupu uživatele, dokud uživatel nezadá
quit. - Odešle každý řádek a vytiskne odpověď.
- Zachytí výjimky pro každou zprávu, aby jedna chyba neukončila relaci.
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}");
}
}
}
}
Dva návrhové body stojí za to přenést do reálných aplikací. Za prvé, instance je vytvořena jednou a znovu použita – vytvoření je nákladné a, jak vysvětluje následující sekce, souběžné instance nejsou povoleny. Za druhé, try-catch je umístěn uvnitř smyčky místo kolem ní, takže jedna špatná zpráva vás stojí jen jeden tah místo celé relace.
Vyzkoušejte knihovnu s dočasnou licencí z stránky dočasné licence Aspose.
Chyby, na které pravděpodobně narazíte jako první
| Chyba | Typická příčina | Řešení |
|---|---|---|
Not licensed for this method | Chybí soubor licence nebo je cesta nesprávná | Ověřte, že Aspose.LLM.lic je čitelný z pracovního adresáře a že SetLicense je spuštěna před jakýmkoli jiným voláním API. |
Only one AsposeLLMApi instance can be created at a time | Dvě instance jsou aktivní najednou, často z továrny na požadavek | Zaregistrujte instanci jako singleton, nebo uvolněte předchozí před vytvořením další. |
| First response takes minutes | Engine stahuje nativní binární soubory a váhy modelu | Očekávejte 5–15 minut na čistém počítači. Spusťte Create během startu, aby náklady neplatil uživatel. |
Ten druhý řádek si zaslouží zdůraznění v servisních scénářích. Pokud propojujete Aspose.LLM do DI kontejneru, zaregistrujte AsposeLLMApi jako singleton a serializujte přístup k němu – registrace scoped nebo transient selže, jakmile se překryjí dva požadavky.
Další zdroje
Závěr
Aspose.LLM snižuje „add an LLM to this .NET application“ na tři typy a jednu metodu. Licence aktivuje knihovnu, předvolba definuje model a způsob, jakým generuje, a instance AsposeLLMApi nese konverzaci. Odtud SendMessageAsync zpracovává jednu otázku, víceotáčkovou relaci, přepsání parametrů pro jednotlivé volání a zrušitelnou dlouhodobou generaci.
Začněte s ukázkou v konzoli, ověřte, že model se chová tak, jak vaše funkce potřebuje, a poté přejděte k práci s více relacemi a perzistencí, jakmile budou základy pevné.
Často kladené otázky
1. Co je Aspose.LLM for .NET?
NuGet knihovna, která spouští inferenci velkých jazykových modelů ve vašem vlastním procesu .NET. Vytvoříte předvolbu, vytvoříte instanci API a odešlete výzvy – žádná externí služba, žádný API klíč.
2. Potřebuji k používání internetové připojení?
Pouze při prvním spuštění. Počáteční volání Create stáhne nativní engine a soubory modelu definované přednastavením a prostředky jsou následně uloženy lokálně do mezipaměti.
3. Jaké jsou předpoklady pro ukázkové kódy?
Balíček NuGet Aspose.LLM, platný soubor Aspose.LLM.lic a dostatek volné RAM pro vámi zvolené přednastavení – počítejte s alespoň 8 GB pro Qwen25.
4. Jak změnit chování modelu pro jediný požadavek?
Vytvořte druhý přednastavený profil, upravte jeho parametry (například SamplerParameters.Temperature) a předávejte jej metodě SendMessageAsync pomocí argumentu preset. Pozdější volání se vrátí k výchozímu přednastavení instance.
5. Jak zastavit generování, které trvá příliš dlouho?
Předávejte CancellationToken metodě SendMessageAsync a zachyťte OperationCanceledException. Stav relace přežije zrušení, takže konverzace pokračuje normálně.
6. Proč je první odpověď tak pomalá?
První volání Create stáhne nativní binární soubory a váhy modelu, což může na čistém počítači trvat 5–15 minut. Nahřejte instanci při spuštění aplikace místo toho, aby se zahřívala při první žádosti uživatele.
