Większość zespołów .NET, które dziś dodają funkcje AI, kończy pisaniem tego samego „rurociągu”: klienta HTTP, polityki ponawiania, zarządzania tajemnicami dla klucza API oraz linii rozliczeniowej za tokeny na czyjejś karcie kredytowej. Aspose.LLM przyjmuje inną drogę. Jest to pakiet NuGet, który uruchamia wnioskowanie dużego modelu językowego we własnym procesie – bez wywoływania usługi, bez rotacji klucza i bez żądania opuszczającego maszynę.

Ten artykuł wprowadza bibliotekę, wyjaśnia trzy koncepcje, na których opiera się jej API, i prowadzi Cię przez działającą aplikację czatu. Jeśli możesz dodać odwołanie do pakietu, możesz wysyłać zapytania w kilku dziesiątkach linii.

Dlaczego lokalny model ma znaczenie

Uruchamianie modelu w procesie zmienia to, co możesz zbudować.

  • Dane pozostają na miejscu. Prompt nie opuszcza hosta, co ma znaczenie przy pracy z umowami, notatkami medycznymi, kodem źródłowym lub innymi materiałami objętymi polityką rezydencji danych.
  • Brak kosztu za token. Gdy model znajduje się na dysku, wnioskowanie to koszt CPU lub GPU, który już posiadasz, a nie płatne wywołanie API.
  • Brak zależności sieciowej w czasie działania. Narzędzia desktopowe, usługi on‑premises i środowiska odizolowane od sieci działają tak samo.
  • Jeden artefakt wdrożeniowy. Konfiguracja modelu jest dostarczana wraz z aplikacją, zamiast mieszkać w panelu osobnego konta.

Ta wymiana jest szczera i warta podania od razu: zapewniasz sprzęt. Model działający lokalnie potrzebuje pamięci lokalnej, a przy pierwszym uruchomieniu trzeba pobrać kilka gigabajtów.

Aspose.LLM for .NET w trzech koncepcjach

Powierzchnia jest celowo mała. Prawie wszystko, co robisz z Aspose.LLM, obejmuje te trzy typy.

KoncepcjaTypRola
LicenseAspose.LLM.LicenseAktywuje bibliotekę. Wywołaj SetLicense przed jakimkolwiek innym użyciem API.
Presete.g. Qwen25PresetZawiera pliki modelu wraz z parametrami generacji, takimi jak temperatura sampler.
API instanceAsposeLLMApiPunkt wejścia. Tworzony z presetem, przechowuje konwersację, udostępnia SendMessageAsync.

Preset jest tym interesującym. Zamiast zmuszać cię do ręcznego łączenia ścieżek modeli, ustawień tokenizera i wartości samplerów, preset pakietuje sprawdzoną kombinację. Qwen25Preset jest domyślnym punktem wyjścia i możesz dostosować jego parametry lub później zamienić na inny preset, nie dotykając reszty kodu.

Wymagania wstępne

Przed napisaniem jakiegokolwiek kodu:

  1. Zainstaluj pakiet - Install-Package Aspose.LLM
  2. Umieść swoją licencję - umieść Aspose.LLM.lic w miejscu, które wykonywalny plik może odczytać w czasie działania.
  3. Sprawdź swój budżet pamięci - preset Qwen25 wymaga co najmniej 8 GB wolnej pamięci RAM.

Aby uzyskać szczegóły produktu, zobacz stronę produktu Aspose.LLM for .NET.

Twój pierwszy czat

Oto najkrótszy program, który prowadzi prawdziwą rozmowę. Zwróć uwagę na drugie i trzecie wywołania: instancja API samodzielnie śledzi kontekst, więc model nadal wie, kim jest Alice.

Co robi kod

  1. Tworzy License i wskazuje na plik licencji.
  2. Tworzy instancję Qwen25Preset z domyślną konfiguracją.
  3. Tworzy jedną instancję AsposeLLMApi z tego presetu.
  4. Wysyła kilka podpowiedzi, wszystkie korzystające z tej samej konwersacji.
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) zwraca klienta świadomego sesji. Każde wywołanie SendMessageAsync dołącza prompt do trwającej rozmowy, więc otrzymujesz zachowanie wieloetapowe bez zarządzania stanem samodzielnie. Deklaracja using ma znaczenie – instancja posiada zasoby natywne i musi być zwolniona.

Uwaga: Te przykłady są zgodne z oficjalną dokumentacją Aspose i nie zostały uruchomione w środowisku testowym. Zweryfikuj je w swoim własnym środowisku przed wdrożeniem.

Dostosowywanie zachowania dla pojedynczego żądania

Odpowiedzi konwersacyjne korzystają z pewnej losowości. Arytmetyka nie. Zamiast rekonfigurować instancję, utwórz drugi preset i przekaż go do jednego wywołania, które go potrzebuje.

Co robi kod

  1. Tworzy domyślny preset i instancję API jak zwykle.
  2. Buduje strictPreset z niską temperaturą sampler.
  3. Przekazuje go do SendMessageAsync poprzez argument preset.
  4. Pozostawia późniejsze wywołania na oryginalnym domyślnym.
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 kontroluje, jak dużo losowości wprowadza sampler. Wartości bliskie 0.1 dają prawie deterministyczny wynik; wyższe wartości powodują bardziej zróżnicowane sformułowania. Ponieważ preset jest ograniczony do wywołania, nadpisanie nie wycieka do reszty konwersacji.

Anulowanie i limity czasu

Generowanie nie jest w pełni przewidywalne, a żądanie, które trwa długo, zablokuje wszystko, co na nie czeka. SendMessageAsync przyjmuje CancellationToken, więc podaj go.

Co robi kod

  1. Tworzy CancellationTokenSource z budżetem 30 sekund.
  2. Przekazuje cts.Token do SendMessageAsync.
  3. Przechwytuje OperationCanceledException i obsługuje to w sposób łagodny.
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.");
}

Anulowanie pozostawia stan sesji nienaruszony, więc rozmowa kontynuuje się normalnie przy następnym wywołaniu. W obsłudze ASP.NET Core przekaż tutaj również własny token RequestAborted żądania – nie ma powodu, aby dalej generować dla klienta, który już się rozłączył.

Kompletny program konsolowy

Składając wszystko razem: REPL, który utrzymuje jedną sesję aktywną przez cały czas działania procesu i odzyskuje się po awariach poszczególnych wiadomości.

Co robi kod

  1. Ustawia licencję i domyślny preset raz, przy uruchomieniu.
  2. Tworzy pojedynczą instancję AsposeLLMApi dla całego programu.
  3. Pętla oczekuje na dane wejściowe użytkownika, aż użytkownik wpisze quit.
  4. Wysyła każdą linię i wyświetla odpowiedź.
  5. Przechwytuje wyjątki dla każdej wiadomości, aby pojedyncza awaria nie zakończyła sesji.
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}");
            }
        }
    }
}

Dwa punkty projektowe warto przenieść do rzeczywistych aplikacji. Po pierwsze, instancja jest tworzona jednokrotnie i ponownie wykorzystywana – tworzenie jest kosztowne i, jak wyjaśnia kolejna sekcja, współbieżne instancje nie są dozwolone. Po drugie, blok try‑catch znajduje się wewnątrz pętli, a nie wokół niej, więc pojedyncza zła wiadomość kosztuje Cię tylko jedną turę zamiast całej sesji.

Oceń bibliotekę przy użyciu tymczasowej licencji ze Strona tymczasowej licencji Aspose

Błędy, które prawdopodobnie napotkasz jako pierwsze

ErrorTypical causeRemedy
Not licensed for this methodPlik licencji brak lub ścieżka jest nieprawidłowaUpewnij się, że Aspose.LLM.lic jest czytelny z katalogu roboczego i że SetLicense jest wywoływany przed jakimkolwiek innym wywołaniem API.
Only one AsposeLLMApi instance can be created at a timeDwie instancje istnieją jednocześnie, często z fabryki per‑requestZarejestruj instancję jako singleton lub zwolnij poprzednią przed utworzeniem kolejnej.
First response takes minutesSilnik pobiera natywne pliki binarne i wagi modeluSpodziewaj się 5‑15 minut na czystej maszynie. Wywołaj Create podczas uruchamiania, aby koszt nie został poniesiony przez użytkownika.

Ten drugi wiersz zasługuje na podkreślenie w scenariuszach serwisowych. Jeśli wstrzykujesz Aspose.LLM do kontenera DI, zarejestruj AsposeLLMApi jako singleton i serializuj dostęp do niego – rejestracja jako scoped lub transient zakończy się niepowodzeniem, gdy dwa żądania nakładają się na siebie.

Dodatkowe zasoby

Wnioski

Aspose.LLM redukuje „add an LLM to this .NET application” do trzech typów i jednej metody. Licencja aktywuje bibliotekę, preset definiuje model i sposób jego generowania, a instancja AsposeLLMApi prowadzi konwersację. Następnie SendMessageAsync obsługuje pojedyncze pytanie, sesję wieloturnową, nadpisanie parametrów dla pojedynczego wywołania oraz anulowalną długotrwałą generację.

Zacznij od przykładu konsolowego, potwierdź, że model zachowuje się tak, jak wymaga tego Twoja funkcja, a następnie przejdź do pracy nad wielosesją i trwałością, gdy podstawy będą solidne.

FAQs

1. Co to jest Aspose.LLM for .NET?

Biblioteka NuGet, która uruchamia wnioskowanie dużego modelu językowego wewnątrz własnego procesu .NET. Tworzysz preset, tworzysz instancję API i wysyłasz zapytania — bez zewnętrznej usługi, bez klucza API.

2. Czy potrzebuję połączenia z internetem, aby go używać?

Tylko przy pierwszym uruchomieniu. Początkowe wywołanie Create pobiera natywny silnik oraz pliki modelu określone w presecie, a zasoby są następnie buforowane lokalnie.

3. Jakie są wymagania wstępne dla przykładów kodu?

Pakiet NuGet Aspose.LLM, prawidłowy plik Aspose.LLM.lic oraz wystarczająca ilość wolnej pamięci RAM dla wybranego zestawu – zaplanuj co najmniej 8 GB dla Qwen25.

4. Jak mogę zmienić zachowanie modelu dla pojedynczego żądania?

Utwórz drugi preset, dostosuj jego parametry (np. SamplerParameters.Temperature) i przekaż go do SendMessageAsync za pomocą argumentu preset. Późniejsze wywołania przywracają domyślny preset instancji.

5. Jak zatrzymać generowanie, które trwa zbyt długo?

Przekaż CancellationToken do SendMessageAsync i przechwyć OperationCanceledException. Stan sesji przetrwa anulowanie, więc rozmowa kontynuuje się normalnie.

6. Dlaczego pierwsza odpowiedź jest tak wolna?

Pierwsze wywołanie Create pobiera natywne pliki binarne i wagi modelu, co może zająć 5‑15 minut na czystej maszynie. Rozgrzej instancję przy uruchamianiu aplikacji, a nie przy pierwszym żądaniu użytkownika.

Czytaj więcej