Die meisten .NET-Teams, die heute KI‑Funktionen hinzufügen, schreiben am Ende dieselbe Infrastruktur: einen HTTP‑Client, eine Wiederholungsrichtlinie, die Verwaltung von Geheimnissen für einen API‑Schlüssel und eine pro‑Token‑Abrechnungszeile auf der Kreditkarte einer Person. Aspose.LLM geht einen anderen Weg. Es ist ein NuGet‑Paket, das die Inferenz großer Sprachmodelle innerhalb Ihres eigenen Prozesses ausführt – kein Dienst, den man aufrufen muss, kein Schlüssel, der rotiert werden muss, und keine Anfrage, die den Rechner verlässt.

Dieser Artikel stellt die Bibliothek vor, erklärt die drei Konzepte, auf denen ihre API basiert, und führt Sie durch eine funktionierende Chat‑Anwendung. Wenn Sie eine Paketreferenz hinzufügen können, können Sie Eingabeaufforderungen in wenigen Dutzend Zeilen senden.

Warum ein lokales Modell wichtig ist

Das Ausführen des Modells im Prozess ändert, was Sie erstellen können.

  • Daten bleiben vor Ort. Eingaben verlassen nie den Host, was wichtig ist, wenn Sie mit Verträgen, medizinischen Notizen, Quellcode oder anderen durch eine Datenaufbewahrungspolitik abgedeckten Informationen arbeiten.
  • Keine Kosten pro Token. Sobald das Modell auf der Festplatte ist, ist die Inferenz eine CPU‑ oder GPU‑Kosten, die Sie bereits besitzen, und kein abgerechneter API‑Aufruf.
  • Keine Netzwerkabhängigkeit zur Laufzeit. Desktop‑Tools, lokale Dienste und luftisolierte Umgebungen funktionieren alle gleich.
  • Ein Bereitstellungsartefakt. Die Modellkonfiguration wird mit Ihrer Anwendung ausgeliefert, anstatt in einem separaten Dashboard eines Kontos zu leben.

Der Kompromiss ist ehrlich und sollte von Anfang an klar benannt werden: Sie stellen die Hardware bereit. Ein Modell, das lokal ausgeführt wird, benötigt lokalen Speicher, und beim ersten Durchlauf muss es mehrere Gigabyte herunterladen.

Aspose.LLM for .NET in drei Konzepten

Die Oberfläche ist bewusst klein. Fast alles, was Sie mit Aspose.LLM tun, umfasst diese drei Typen.

KonzeptTypRolle
LizenzAspose.LLM.LicenseAktiviert die Bibliothek. Rufen Sie SetLicense auf, bevor Sie andere API‑Funktionen verwenden.
Voreinstellunge.g. Qwen25PresetBündelt die Modelldateien mit Generierungsparametern wie der Sampler‑Temperatur.
API‑InstanzAsposeLLMApiDer Einstiegspunkt. Aus einer Voreinstellung erstellt, hält die Unterhaltung, stellt SendMessageAsync bereit.

Ein Preset ist das Interessante. Anstatt Sie dazu zu zwingen, Modellpfade, Tokenizer‑Einstellungen und Sampler‑Werte von Hand zu konfigurieren, verpackt ein Preset eine bewährte Kombination. Qwen25Preset ist der standardmäßige Ausgangspunkt, und Sie können seine Parameter anpassen oder später ein anderes Preset einsetzen, ohne den Rest Ihres Codes zu berühren.

Voraussetzungen

Bevor Sie Code schreiben:

  1. Paket installieren - Install-Package Aspose.LLM
  2. Legen Sie Ihre Lizenz ab - legen Sie Aspose.LLM.lic an einen Ort, den die ausführbare Datei zur Laufzeit lesen kann.
  3. Überprüfen Sie Ihr Speicherbudget - das Qwen25‑Preset benötigt mindestens 8 GB freien RAM.

Für Produktdetails siehe die Aspose.LLM for .NET Produktseite.

Ihr erster Chat

Hier ist das kürzeste Programm, das ein echtes Gespräch führt. Beachten Sie den zweiten und dritten Aufruf: Die API‑Instanz verfolgt den Kontext selbst, sodass das Modell immer noch weiß, wer Alice ist.

Was der Code macht

  1. Erstellt eine License und verweist sie auf Ihre Lizenzdatei.
  2. Instanziiert ein Qwen25Preset mit seiner Standardkonfiguration.
  3. Erstellt eine AsposeLLMApi-Instanz aus diesem Preset.
  4. Sendet mehrere Eingabeaufforderungen, die alle dieselbe Konversation teilen.
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) gibt einen sitzungsbewussten Client zurück. Jeder SendMessageAsync‑Aufruf fügt die Eingabeaufforderung zur laufenden Unterhaltung hinzu, sodass Sie ein mehrstufiges Verhalten erhalten, ohne selbst den Zustand verwalten zu müssen. Die using‑Deklaration ist wichtig - die Instanz besitzt native Ressourcen und muss freigegeben werden.

Hinweis: Diese Beispiele folgen der offiziellen Aspose-Dokumentation und wurden nicht in einer Sandbox ausgeführt. Überprüfen Sie sie in Ihrer eigenen Umgebung, bevor Sie sie bereitstellen.

Feinabstimmung des Verhaltens für eine einzelne Anforderung

Konversationelle Antworten profitieren von ein wenig Zufälligkeit. Arithmetik nicht. Statt die Instanz neu zu konfigurieren, erstellen Sie eine zweite Voreinstellung und übergeben Sie sie dem Aufruf, der sie benötigt.

Was der Code macht

  1. Erstellt das Standard‑Preset und die API‑Instanz wie üblich.
  2. Erstellt strictPreset mit einer niedrigen Sampler‑Temperatur.
  3. Übergibt es an SendMessageAsync über das Argument preset.
  4. Lässt spätere Aufrufe beim ursprünglichen Standard.
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 steuert, wie viel Zufälligkeit der Sampler einführt. Werte nahe 0.1 erzeugen nahezu deterministische Ausgaben; höhere Werte führen zu abwechslungsreicheren Formulierungen. Da das Preset auf den Aufruf beschränkt ist, tritt die Überschreibung nicht in den Rest der Unterhaltung ein.

Abbruch und Zeitüberschreitungen

Die Generierungslänge ist nicht vollständig vorhersehbar, und eine lange laufende Anfrage blockiert alles, was darauf wartet. SendMessageAsync akzeptiert ein CancellationToken, also geben Sie eines.

Was der Code macht

  1. Erstellt ein CancellationTokenSource mit einem 30‑Sekunden‑Budget.
  2. Übergibt cts.Token an SendMessageAsync.
  3. Fängt OperationCanceledException ab und degradiert sich elegant.
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.");
}

Die Abbruchoperation lässt den Sitzungszustand unverändert, sodass das Gespräch beim nächsten Aufruf normal weitergeht. In einem ASP.NET Core‑Handler leiten Sie hier ebenfalls das RequestAborted‑Token der Anforderung weiter – es gibt keinen Grund, weiterhin für einen bereits getrennten Client zu generieren.

Eine vollständige Konsolenanwendung

Alles zusammenführen: ein REPL, das eine Sitzung für die gesamte Laufzeit des Prozesses aufrechterhält und sich von Fehlfunktionen pro Nachricht erholt.

Was der Code macht

  1. Richtet die Lizenz und die Standardvoreinstellung einmal beim Start ein.
  2. Erstellt eine einzelne AsposeLLMApi-Instanz für das gesamte Programm.
  3. Wartet in einer Schleife auf die Benutzereingabe, bis der Benutzer quit eingibt.
  4. Sendet jede Zeile und gibt die Antwort aus.
  5. Fängt Ausnahmen pro Nachricht ab, sodass ein Fehler die Sitzung nicht beendet.
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}");
            }
        }
    }
}

Zwei Designpunkte sind es wert, in reale Anwendungen übernommen zu werden. Erstens wird die Instanz einmal erstellt und wiederverwendet – die Erstellung ist teuer und, wie im nächsten Abschnitt erklärt wird, sind gleichzeitige Instanzen nicht erlaubt. Zweitens befindet sich das try-catch innerhalb der Schleife und nicht außerhalb, sodass eine einzelne fehlerhafte Nachricht nur einen Durchlauf kostet statt der gesamten Sitzung.

Bewerten Sie die Bibliothek mit einer temporären Lizenz von der Aspose temporäre Lizenzseite.

Fehler, die Sie wahrscheinlich zuerst antreffen

FehlerTypische UrsacheLösung
Not licensed for this methodLizenzdatei fehlt oder der Pfad ist falschStellen Sie sicher, dass Aspose.LLM.lic aus dem Arbeitsverzeichnis lesbar ist und dass SetLicense vor jedem anderen API-Aufruf ausgeführt wird.
Only one AsposeLLMApi instance can be created at a timeZwei Instanzen gleichzeitig aktiv, häufig durch eine pro‑Anfrage‑FactoryRegistrieren Sie die Instanz als Singleton oder entsorgen Sie die vorherige, bevor Sie eine neue erstellen.
First response takes minutesDie Engine lädt native Binärdateien und Modellgewichte herunterRechnen Sie mit 5–15 Minuten auf einer sauberen Maschine. Rufen Sie Create beim Start auf, damit die Kosten nicht dem Benutzer entstehen.

Diese zweite Zeile verdient in Service‑Szenarien besondere Betonung. Wenn Sie Aspose.LLM in einen DI‑Container einbinden, registrieren Sie AsposeLLMApi als Singleton und serialisieren Sie den Zugriff darauf – eine scoped‑ oder transient‑Registrierung schlägt fehl, sobald sich zwei Anfragen überschneiden.

Zusätzliche Ressourcen

Fazit

Aspose.LLM reduziert “add an LLM to this .NET application” auf drei Typen und eine Methode. Eine Lizenz aktiviert die Bibliothek, ein Preset definiert das Modell und wie es generiert, und eine AsposeLLMApi‑Instanz führt das Gespräch. Von dort aus verarbeitet SendMessageAsync eine einzelne Frage, eine mehrstufige Sitzung, eine pro Aufruf überschreibende Parameter und eine abbrechbare langlaufende Generierung.

Beginnen Sie mit dem Konsolenbeispiel, bestätigen Sie, dass das Modell so funktioniert, wie Ihre Funktion es erfordert, und gehen Sie dann zu Multi‑Session‑ und Persistenzarbeiten über, sobald die Grundlagen solide sind.

FAQs

1. Was ist Aspose.LLM for .NET?

Eine NuGet‑Bibliothek, die die Inferenz großer Sprachmodelle innerhalb Ihres eigenen .NET‑Prozesses ausführt. Sie erstellen eine Voreinstellung, erzeugen eine API‑Instanz und senden Eingabeaufforderungen – kein externer Dienst, kein API‑Schlüssel.

2. Benötige ich eine Internetverbindung, um es zu verwenden?

Nur beim ersten Durchlauf. Der erste Create‑Aufruf lädt die native Engine und die im Preset definierten Modelldateien herunter, und die Assets werden anschließend lokal zwischengespeichert.

3. Was sind die Voraussetzungen für die Codebeispiele?

Das Aspose.LLM NuGet-Paket, eine gültige Aspose.LLM.lic‑Datei und ausreichend freier RAM für das von Ihnen gewählte Preset – planen Sie mindestens 8 GB für Qwen25 ein.

4. Wie ändere ich das Verhalten des Modells für eine einzelne Anfrage?

Erstellen Sie ein zweites Preset, passen Sie seine Parameter (wie SamplerParameters.Temperature) an und übergeben Sie es an SendMessageAsync über das Argument preset. Spätere Aufrufe kehren zum Standard‑Preset der Instanz zurück.

5. Wie stoppe ich eine Generierung, die zu lange dauert?

Übergeben Sie ein CancellationToken an SendMessageAsync und fangen Sie OperationCanceledException ab. Der Sitzungsstatus überlebt die Abbruchoperation, sodass das Gespräch normal weiterläuft.

6. Warum ist die erste Antwort so langsam?

Der erste Create‑Aufruf lädt native Binärdateien und Modellgewichte herunter, was auf einer sauberen Maschine 5–15 Minuten dauern kann. Wärmen Sie die Instanz beim Anwendungsstart auf, anstatt sie bei der ersten Anfrage eines Benutzers zu starten.

Mehr lesen