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.

KonceptTypRole
LicenceAspose.LLM.LicenseAktivuje knihovnu. Zavolejte SetLicense před jakýmkoli jiným použitím API.
Předvolbanapř. Qwen25PresetZahrnuje soubory modelu s parametry generování, jako je teplota sampleru.
Instance APIAsposeLLMApiVstupní 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:

  1. Nainstalujte balíček - Install-Package Aspose.LLM
  2. Umístěte licenci - umístěte Aspose.LLM.lic někam, kde ji spustitelný soubor může načíst za běhu.
  3. 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á

  1. Vytvoří License a nasměruje ji na váš licenční soubor.
  2. Vytvoří instanci Qwen25Preset s výchozí konfigurací.
  3. Vytvoří jednu instanci AsposeLLMApi z tohoto přednastavení.
  4. 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á

  1. Vytvoří výchozí předvolbu a instanci API jako obvykle.
  2. Vytvoří strictPreset s nízkou teplotou sampleru.
  3. Předá ji do SendMessageAsync přes argument preset.
  4. 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á

  1. Vytvoří CancellationTokenSource s rozpočtem 30 sekund.
  2. Předá cts.Token do SendMessageAsync.
  3. Zachytí OperationCanceledException a 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á

  1. Nastaví licenci a výchozí předvolbu jednou při spuštění.
  2. Vytvoří jedinou instanci AsposeLLMApi pro celý program.
  3. Opakuje se na vstupu uživatele, dokud uživatel nezadá quit.
  4. Odešle každý řádek a vytiskne odpověď.
  5. 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í

ChybaTypická příčinaŘešení
Not licensed for this methodChybí 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 timeDvě instance jsou aktivní najednou, často z továrny na požadavekZaregistrujte instanci jako singleton, nebo uvolněte předchozí před vytvořením další.
First response takes minutesEngine stahuje nativní binární soubory a váhy modeluOč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.

Číst více