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.
| Conceito | Tipo | Função |
|---|---|---|
| Licença | Aspose.LLM.License | Ativa a biblioteca. Chame SetLicense antes de qualquer outro uso da API. |
| Predefinição | e.g. Qwen25Preset | Agrupa os arquivos do modelo com parâmetros de geração, como a temperatura do sampler. |
| Instância da API | AsposeLLMApi | O 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:
- Instale o pacote -
Install-Package Aspose.LLM - Coloque sua licença - coloque
Aspose.LLM.licem algum lugar que o executável possa ler em tempo de execução. - 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
- Cria uma
Licensee a aponta para o seu arquivo de licença. - Instancia um
Qwen25Presetcom sua configuração padrão. - Cria uma instância
AsposeLLMApia partir desse preset. - 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
- Cria o preset padrão e a instância da API como de costume.
- Constrói
strictPresetcom uma temperatura de amostragem baixa. - Passa‑o para
SendMessageAsyncatravés do argumentopreset. - 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
- Cria um
CancellationTokenSourcecom um orçamento de 30 segundos. - Passa
cts.TokenparaSendMessageAsync. - Captura
OperationCanceledExceptione 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
- Configura a licença e o preset padrão uma vez, na inicialização.
- Cria uma única instância
AsposeLLMApipara todo o programa. - Faz loop na entrada do usuário até que ele digite
quit. - Envia cada linha e imprime a resposta.
- 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
| Erro | Causa típica | Solução |
|---|---|---|
Not licensed for this method | Arquivo de licença ausente ou o caminho está errado | Confirme 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 time | Duas instâncias vivas ao mesmo tempo, frequentemente de uma fábrica por requisição | Registre a instância como singleton, ou descarte a anterior antes de criar outra. |
| First response takes minutes | O mecanismo está baixando binários nativos e pesos do modelo | Espere 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.
