La maggior parte dei team .NET che aggiungono funzionalità AI oggi finisce per scrivere la stessa infrastruttura: un client HTTP, una politica di retry, la gestione dei segreti per una chiave API e una voce di fatturazione per token sulla carta di credito di qualcuno. Aspose.LLM prende una strada diversa. È un pacchetto NuGet che esegue l’inferenza di grandi modelli linguistici all’interno del proprio processo - nessun servizio da chiamare, nessuna chiave da ruotare e nessuna richiesta che lasci la macchina.

Questo articolo presenta la libreria, spiega i tre concetti su cui si basa la sua API e ti guida attraverso un’applicazione di chat funzionante. Se puoi aggiungere un riferimento al pacchetto, puoi inviare prompt in poche decine di righe.

Perché un modello locale è importante

L’esecuzione del modello in-process cambia ciò che puoi costruire.

  • I dati rimangono al loro posto. I prompt non lasciano mai l’host, il che è importante quando si lavora con contratti, note mediche, codice sorgente o qualsiasi altra cosa coperta da una politica di residenza dei dati.
  • Nessun costo per token. Una volta che il modello è su disco, l’inferenza è un costo CPU o GPU che possiedi già, non una chiamata API a consumo.
  • Nessuna dipendenza di rete a runtime. Strumenti desktop, servizi on‑premise e ambienti isolati funzionano tutti allo stesso modo.
  • Un unico artefatto di distribuzione. La configurazione del modello viene fornita con la tua applicazione invece di vivere nella dashboard di un account separato.

Il compromesso è onesto e vale la pena dichiararlo fin dall’inizio: fornisci l’hardware. Un modello che gira localmente richiede memoria locale, e la prima esecuzione necessita di scaricare diversi gigabyte.

Aspose.LLM for .NET in tre concetti

La superficie è deliberatamente piccola. Quasi tutto ciò che fai con Aspose.LLM coinvolge questi tre tipi.

ConcettoTipoRuolo
LicenzaAspose.LLM.LicenseAttiva la libreria. Chiama SetLicense prima di qualsiasi altro utilizzo dell’API.
Presete.g. Qwen25PresetRaggruppa i file del modello con i parametri di generazione, come la temperatura del campionatore.
Istanza APIAsposeLLMApiIl punto di ingresso. Creata da un preset, mantiene la conversazione, espone SendMessageAsync.

Un preset è quello interessante. Piuttosto che farti configurare manualmente i percorsi del modello, le impostazioni del tokenizer e i valori del campionatore, un preset raggruppa una combinazione già collaudata. Qwen25Preset è il punto di partenza predefinito e puoi modificare i suoi parametri o sostituirlo con un preset diverso in seguito senza toccare il resto del tuo codice.

Prerequisiti

Prima di scrivere qualsiasi codice:

  1. Installa il pacchetto - Install-Package Aspose.LLM
  2. Posiziona la tua licenza - metti Aspose.LLM.lic da qualche parte dove l’eseguibile possa leggerla a runtime.
  3. Verifica il tuo budget di memoria - il preset Qwen25 richiede almeno 8 GB di RAM libera.

Per i dettagli del prodotto, vedere la Aspose.LLM for .NET pagina del prodotto.

La tua prima chat

Ecco il programma più breve che mantiene una conversazione reale. Nota le seconde e terze chiamate: l’istanza API tiene traccia del contesto da sola, quindi il modello sa ancora chi è Alice.

Cosa fa il codice

  1. Crea una License e la punta al tuo file di licenza.
  2. Istanzia un Qwen25Preset con la sua configurazione predefinita.
  3. Crea un’istanza AsposeLLMApi da quel preset.
  4. Invia diversi prompt, tutti condividendo la stessa conversazione.
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) restituisce un client consapevole della sessione. Ogni chiamata a SendMessageAsync aggiunge il prompt alla conversazione in corso, così ottieni un comportamento a più turni senza gestire alcuno stato da solo. La dichiarazione using è importante - l’istanza possiede risorse native e deve essere rilasciata.

Nota: questi esempi seguono la documentazione ufficiale di Aspose e non sono stati eseguiti in un sandbox. Verificali nel tuo ambiente prima di distribuirli.

Ottimizzazione del comportamento per una singola richiesta

Le risposte conversazionali beneficiano di un po’ di casualità. L’aritmetica no. Invece di riconfigurare l’istanza, crea un secondo preset e passalo alla chiamata che ne ha bisogno.

Cosa fa il codice

  1. Crea il preset predefinito e l’istanza API come al solito.
  2. Costruisce strictPreset con una temperatura di campionamento bassa.
  3. Lo passa a SendMessageAsync tramite l’argomento preset.
  4. Lascia le chiamate successive sul preset predefinito originale.
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 controlla quanto casualità introduce il campionatore. Valori vicino a 0.1 producono un output quasi deterministico; valori più alti producono frasi più variegate. Poiché il preset è limitato alla chiamata, la sovrascrittura non trapela nel resto della conversazione.

Annullamento e timeout

La lunghezza della generazione non è completamente prevedibile e una richiesta che dura a lungo bloccherà tutto ciò che la sta attendendo. SendMessageAsync accetta un CancellationToken, quindi fornisci uno.

Cosa fa il codice

  1. Crea un CancellationTokenSource con un budget di 30 secondi.
  2. Passa cts.Token a SendMessageAsync.
  3. Cattura OperationCanceledException e gestisce il degrado in modo elegante.
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.");
}

La cancellazione lascia intatto lo stato della sessione, quindi la conversazione continua normalmente nella chiamata successiva. In un handler ASP.NET Core, inoltra qui anche il token RequestAborted della richiesta stessa – non c’è motivo di continuare a generare per un client che si è già disconnesso.

Un’applicazione console completa

Mettendo tutto insieme: un REPL che mantiene una sessione attiva per l’intera durata del processo e si riprende dagli errori per messaggio.

Cosa fa il codice

  1. Imposta la licenza e il preset predefinito una sola volta, all’avvio.
  2. Crea una singola istanza di AsposeLLMApi per l’intero programma.
  3. Esegue un ciclo sull’input dell’utente finché l’utente non digita quit.
  4. Invia ogni riga e stampa la risposta.
  5. Cattura le eccezioni per messaggio in modo che un errore non termini la sessione.
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}");
            }
        }
    }
}

Due punti di progettazione valgono la pena di essere portati nelle applicazioni reali. Prima, l’istanza viene creata una volta e riutilizzata – la creazione è costosa e, come spiega la sezione successiva, le istanze concorrenti non sono consentite. Secondo, il try-catch è inserito all’interno del ciclo anziché intorno ad esso, così un singolo messaggio errato ti costa un turno invece dell’intera sessione.

Valuta la libreria con una licenza temporanea dalla pagina di licenza temporanea di Aspose.

Errori che è probabile incontrare per primi

ErroreCausa tipicaRimedio
Not licensed for this methodFile di licenza mancante o percorso erratoVerificare che Aspose.LLM.lic sia leggibile dalla directory di lavoro e che SetLicense venga eseguito prima di qualsiasi altra chiamata API.
Only one AsposeLLMApi instance can be created at a timeDue istanze attive contemporaneamente, spesso a causa di una factory per richiestaRegistrare l’istanza come singleton, oppure eliminare la precedente prima di crearne un’altra.
First response takes minutesIl motore sta scaricando binari nativi e i pesi del modelloPrevedere 5‑15 minuti su una macchina pulita. Avviare Create durante l’avvio in modo che il costo non sia sostenuto da un utente.

Quella seconda riga merita enfasi negli scenari di servizio. Se stai collegando Aspose.LLM a un contenitore DI, registra AsposeLLMApi come singleton e serializza l’accesso ad esso - una registrazione scoped o transient fallirà non appena due richieste si sovrappongono.

Risorse aggiuntive

Conclusione

Aspose.LLM riduce “aggiungere un LLM a questa applicazione .NET” a tre tipi e un metodo. Una licenza attiva la libreria, un preset definisce il modello e come genera, e un’istanza AsposeLLMApi gestisce la conversazione. Da lì, SendMessageAsync gestisce una singola domanda, una sessione a più turni, una sovrascrittura dei parametri per chiamata e una generazione a lungo termine annullabile.

Inizia con l’esempio della console, conferma che il modello si comporta come richiede la tua funzionalità, quindi passa al lavoro su multi‑sessione e persistenza una volta che le basi sono solide.

FAQs

1. Cos’è Aspose.LLM for .NET?

Una libreria NuGet che esegue l’inferenza di modelli di linguaggio di grandi dimensioni all’interno del tuo processo .NET. Crei un preset, crei un’istanza API e invii prompt – nessun servizio esterno, nessuna chiave API.

2. Ho bisogno di una connessione a Internet per usarlo?

Solo per la prima esecuzione. La chiamata iniziale Create scarica il motore nativo e i file modello definiti dal preset, e le risorse vengono memorizzate nella cache localmente in seguito.

3. Quali sono i prerequisiti per gli esempi di codice?

Il pacchetto NuGet Aspose.LLM, un file Aspose.LLM.lic valido e sufficiente RAM libera per il preset scelto – prevedi almeno 8 GB per Qwen25.

4. Come posso modificare il comportamento del modello per una singola richiesta?

Crea un secondo preset, regola i suoi parametri (ad esempio SamplerParameters.Temperature) e passalo a SendMessageAsync tramite l’argomento preset. Le chiamate successive tornano al preset predefinito dell’istanza.

5. Come faccio a interrompere una generazione che sta impiegando troppo tempo?

Passa un CancellationToken a SendMessageAsync e intercetta OperationCanceledException. Lo stato della sessione sopravvive alla cancellazione, quindi la conversazione continua normalmente.

6. Perché la prima risposta è così lenta?

La prima chiamata Create scarica i binari nativi e i pesi del modello, operazione che può richiedere 5‑15 minuti su una macchina pulita. Riscalda l’istanza all’avvio dell’applicazione anziché alla prima richiesta dell’utente.

Leggi di più