A maioria das equipes .NET que adicionam recursos de IA hoje acabam escrevendo a mesma infraestrutura: um cliente HTTP, uma política de repetição, gerenciamento de segredos para uma chave de API e uma cobrança por token no cartão de crédito de alguém. Aspose.LLM segue um caminho diferente. É um pacote NuGet que executa inferência de modelo de linguagem grande dentro do seu próprio processo - sem serviço para chamar, sem chave para rotacionar e sem requisição deixando a máquina.

Este artigo apresenta a biblioteca, explica os três conceitos nos quais sua API se baseia e guia você através de um aplicativo de chat funcional. Se você puder adicionar uma referência de pacote, poderá enviar prompts em algumas dezenas de linhas.

Por que um modelo local importa

Executar o modelo no processo altera o que você pode criar.

  • Os dados permanecem no lugar. Os prompts nunca deixam o host, o que é importante quando você está trabalhando com contratos, notas médicas, código-fonte ou qualquer outra coisa coberta por uma política de residência de dados.
  • Sem custo por token. Uma vez que o modelo está no disco, a inferência é um custo de CPU ou GPU que você já possui, não uma chamada de API medida.
  • Sem dependência de rede em tempo de execução. Ferramentas de desktop, serviços on-premises e ambientes air-gapped funcionam da mesma forma.
  • Um artefato de implantação. A configuração do modelo é enviada com sua aplicação em vez de viver no painel de uma conta separada.

A compensação é honesta e vale a pena declarar desde o início: você fornece o hardware. Um modelo que roda localmente precisa de memória local, e a primeira execução precisa baixar vários gigabytes.

Aspose.LLM for .NET em três conceitos

A área de superfície é deliberadamente pequena. Quase tudo o que você faz com Aspose.LLM envolve esses três tipos.

ConceitoTipoFunção
LicençaAspose.LLM.LicenseAtiva a biblioteca. Chame SetLicense antes de qualquer outro uso da API.
Predefiniçãoe.g. Qwen25PresetAgrupa os arquivos do modelo com parâmetros de geração, como a temperatura do sampler.
Instância da APIAsposeLLMApiO ponto de entrada. Criado a partir de uma predefinição, mantém a conversa, expõe SendMessageAsync.

Um preset é o mais interessante. Em vez de fazer você configurar manualmente caminhos de modelo, configurações de tokenizador e valores de amostrador, um preset empacota uma combinação comprovada. Qwen25Preset é o ponto de partida padrão, e você pode ajustar seus parâmetros ou trocar por um preset diferente mais tarde sem tocar no resto do seu código.

Pré-requisitos

Antes de escrever qualquer código:

  1. Instale o pacote - Install-Package Aspose.LLM
  2. Coloque sua licença - coloque Aspose.LLM.lic em algum lugar que o executável possa ler em tempo de execução.
  3. Verifique seu orçamento de memória - a predefinição Qwen25 requer pelo menos 8 GB de RAM livre.

Para obter detalhes do produto, veja a página do produto Aspose.LLM for .NET.

Seu primeiro chat

Aqui está o programa mais curto que mantém uma conversa real. Observe as segunda e terceira chamadas: a instância da API rastreia o contexto por conta própria, portanto o modelo ainda sabe quem é Alice.

O que o código faz

  1. Cria uma License e a aponta para o seu arquivo de licença.
  2. Instancia um Qwen25Preset com sua configuração padrão.
  3. Cria uma instância AsposeLLMApi a partir desse preset.
  4. Envia várias prompts, todas compartilhando a mesma conversa.
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) retorna um cliente com consciência de sessão. Cada chamada SendMessageAsync adiciona o prompt à conversa em andamento, permitindo comportamento de múltiplas interações sem que você precise gerenciar nenhum estado. A declaração using é importante – a instância possui recursos nativos e precisa ser descartada.

Nota: Estas amostras seguem a documentação oficial da Aspose e não foram executadas em um sandbox. Verifique-as em seu próprio ambiente antes de enviá‑las.

Ajustando o comportamento para uma única solicitação

Respostas conversacionais se beneficiam de alguma aleatoriedade. A aritmética não. Em vez de reconfigurar a instância, crie um segundo preset e passe‑o para a chamada que precisa dele.

O que o código faz

  1. Cria o preset padrão e a instância da API como de costume.
  2. Constrói strictPreset com uma temperatura de amostragem baixa.
  3. Passa‑o para SendMessageAsync através do argumento preset.
  4. Deixa chamadas posteriores no padrão original.
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 controla quanta aleatoriedade o sampler introduz. Valores próximos de 0.1 produzem saída quase determinística; valores mais altos produzem frases mais variadas. Como o preset está limitado à chamada, a substituição não vaza para o resto da conversa.

Cancelamento e tempos limite

A duração da geração não é totalmente previsível, e uma solicitação que demorar muito bloqueará o que estiver aguardando por ela. SendMessageAsync aceita um CancellationToken, então forneça um.

O que o código faz

  1. Cria um CancellationTokenSource com um orçamento de 30 segundos.
  2. Passa cts.Token para SendMessageAsync.
  3. Captura OperationCanceledException e regride graciosamente.
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.");
}

A cancelamento deixa o estado da sessão intacto, portanto a conversa continua normalmente na próxima chamada. Em um manipulador ASP.NET Core, encaminhe aqui também o token RequestAborted da própria requisição – não há razão para continuar gerando para um cliente que já se desconectou.

Um aplicativo de console completo

Juntando tudo: um REPL que mantém uma sessão ativa durante a vida do processo e se recupera de falhas por mensagem.

O que o código faz

  1. Configura a licença e o preset padrão uma vez, na inicialização.
  2. Cria uma única instância AsposeLLMApi para todo o programa.
  3. Faz loop na entrada do usuário até que ele digite quit.
  4. Envia cada linha e imprime a resposta.
  5. Captura exceções por mensagem para que uma falha não encerre a sessão.
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}");
            }
        }
    }
}

Dois pontos de design valem a pena ser levados para aplicações reais. Primeiro, a instância é criada uma vez e reutilizada – a criação é cara e, como explica a próxima seção, instâncias concorrentes não são permitidas. Segundo, o try-catch fica dentro do loop em vez de ao redor dele, de modo que uma única mensagem ruim custa apenas uma rodada em vez de toda a sessão.

Avalie a biblioteca com uma licença temporária a partir da página de licença temporária da Aspose.

Erros que você provavelmente encontrará primeiro

ErroCausa típicaSolução
Not licensed for this methodArquivo de licença ausente ou o caminho está erradoConfirme que Aspose.LLM.lic pode ser lido a partir do diretório de trabalho e que SetLicense é executado antes de qualquer outra chamada de API.
Only one AsposeLLMApi instance can be created at a timeDuas instâncias vivas ao mesmo tempo, frequentemente de uma fábrica por requisiçãoRegistre a instância como singleton, ou descarte a anterior antes de criar outra.
First response takes minutesO mecanismo está baixando binários nativos e pesos do modeloEspere de 5 a 15 minutos em uma máquina limpa. Acione Create durante a inicialização para que o custo não seja pago por um usuário.

Essa segunda linha merece ênfase em cenários de serviço. Se você estiver integrando o Aspose.LLM em um contêiner DI, registre AsposeLLMApi como singleton e serialize o acesso a ele - um registro scoped ou transient falhará assim que duas solicitações se sobreporem.

Recursos adicionais

Conclusão

Aspose.LLM reduz “add an LLM to this .NET application” a três tipos e um método. Uma licença ativa a biblioteca, um preset define o modelo e como ele gera, e uma instância AsposeLLMApi conduz a conversa. A partir daí, SendMessageAsync lida com uma única pergunta, uma sessão de múltiplas interações, uma substituição de parâmetro por chamada e uma geração de longa duração cancelável.

Comece com o exemplo de console, confirme se o modelo se comporta da maneira que sua funcionalidade necessita e, então, passe para o trabalho de multi‑sessão e persistência assim que os fundamentos estiverem sólidos.

Perguntas Frequentes

1. O que é Aspose.LLM for .NET?

Uma biblioteca NuGet que executa inferência de modelo de linguagem grande dentro do seu próprio processo .NET. Você cria um preset, cria uma instância da API e envia prompts - sem serviço externo, sem chave de API.

2. Preciso de uma conexão com a internet para usá-lo?

Somente na primeira execução. A chamada inicial Create baixa o mecanismo nativo e os arquivos de modelo definidos pelo preset, e os recursos são armazenados em cache localmente depois.

3. Quais são os pré-requisitos para os exemplos de código?

O pacote NuGet Aspose.LLM, um arquivo Aspose.LLM.lic válido e RAM livre suficiente para o preset escolhido – planeje pelo menos 8 GB para o Qwen25.

4. Como altero o comportamento do modelo para uma única solicitação?

Crie um segundo preset, ajuste seus parâmetros (como SamplerParameters.Temperature) e passe‑o para SendMessageAsync via o argumento preset. Chamadas posteriores retornam ao preset padrão da instância.

5. Como interromper uma geração que está demorando muito?

Passe um CancellationToken para SendMessageAsync e capture OperationCanceledException. O estado da sessão sobrevive ao cancelamento, portanto a conversa continua normalmente.

6. Por que a primeira resposta é tão lenta?

A primeira chamada Create baixa binários nativos e pesos do modelo, o que pode levar de 5 a 15 minutos em uma máquina limpa. Aqueça a instância na inicialização da aplicação em vez de na primeira solicitação do usuário.

Leia Mais