Persistir uma sessão de chat permite que sua aplicação .NET sobreviva a reinicializações, fornece um backup da conversa e possibilita mover a sessão entre máquinas. Neste guia, vamos percorrer Persistir e Retomar uma Sessão de Chat em C# usando Aspose.LLM, cobrindo quando usar o padrão, como salvar e carregar sessões, quais dados são armazenados, considerações de portabilidade e as melhores práticas de segurança.
Por que Persistir e Retomar uma Sessão de Chat?
Os desenvolvedores costumam criar assistentes interativos, bots de suporte ou fluxos de trabalho de análise de dados de longa duração. Em muitos cenários, o contexto do chat deve sobreviver além da vida de um único processo:
- Uma ferramenta de suporte de desktop onde os usuários esperam que suas consultas anteriores permaneçam disponíveis após o fechamento do aplicativo.
- Automação no lado do servidor que abrange várias etapas e pode ser reiniciada devido à manutenção.
- Requisitos de auditoria ou conformidade que exigem uma captura instantânea de toda a conversa.
- Transferir uma sessão de solução de problemas do laptop de um desenvolvedor para um servidor de produção.
Ao persistir a sessão em um arquivo JSON, você captura todo o histórico de mensagens e o cache KV interno necessário para uma continuação exata, tornando os casos de uso acima simples de implementar.
Introdução ao Aspose.LLM
Primeiro, adicione o pacote Aspose.LLM ao seu projeto:
Install-Package Aspose.LLM
Você pode encontrar mais detalhes do produto na página do produto Aspose.LLM .NET. O SDK requer uma licença válida, portanto, certifique‑se de que você tem um arquivo de licença temporário ou permanente pronto.
Pré-requisitos
- Instale o pacote NuGet Aspose.LLM.
- Aplique uma licença Aspose.LLM usando
Aspose.LLM.License. - Crie uma instância
AsposeLLMApi(por exemplo, com umQwen25Preset).
Quando Usar Este Padrão
Este padrão se destaca quando você precisa que a conversa persista além do processo atual, ou quando deseja um instantâneo confiável para backup ou migração. Cenários típicos incluem:
- Aplicativos desktop ou de servidor onde os usuários esperam que o chat persista entre lançamentos.
- Fluxos de trabalho de longa duração que precisam que a conversa sobreviva ao processo.
- Finalidades de backup e auditoria ao criar um snapshot de uma conversa ativa.
- Migração do estado da sessão entre máquinas com a mesma versão do SDK e configuração pré‑definida.
Pré-requisitos
Antes de poder salvar ou restaurar uma sessão, certifique‑se de que o seguinte esteja configurado:
- Aspose.LLM NuGet package – instalado via o comando mostrado anteriormente.
- License – crie um objeto
Aspose.LLM.Licensee chameSetLicensecom seu arquivo.lic. - API instance – instancie
AsposeLLMApicom o preset desejado (por exemplo,new Qwen25Preset()).
Esses passos são demonstrados no exemplo completo mais adiante no artigo.
Salvar uma sessão
O SDK oferece três maneiras convenientes de persistir uma sessão de chat. Siga as etapas abaixo e, em seguida, veja o exemplo de código.
- Chame
SaveChatSessioncom um caminho de arquivo explícito se precisar que o arquivo esteja em um local conhecido. - Omitir o caminho para permitir que o SDK escreva
<sessionId>.jsonao lado do executável. - Construa um caminho temporário com
Path.Combine, garanta que o diretório exista e salve lá para cenários isolados ou em sandbox.
Exemplo de Código – Salvando uma Sessão
O exemplo a seguir demonstra as três abordagens:
api.SaveChatSession(sessionId, "session-42.json");
api.SaveChatSession(sessionId); // writes <sessionId>.json next to the executable
string path = Path.Combine(Path.GetTempPath(), "chats", $"{sessionId}.json");
Directory.CreateDirectory(Path.GetDirectoryName(path)!);
api.SaveChatSession(sessionId, path);
api.SaveChatSession(sessionId, "session-42.json") grava o arquivo JSON no local fornecido.
Se você chamar SaveChatSession sem um caminho, o SDK cria um arquivo com o nome do ID da sessão no diretório de trabalho atual.
Quando precisar de um local determinístico ou temporário, combine Path.GetTempPath com sua própria estrutura de pastas e crie o diretório antes de salvar.
Nota: Esses trechos são reproduzidos da documentação oficial da Aspose e não foram executados em um sandbox. Verifique-os em seu ambiente antes de usá-los em produção.
Restaurar uma Sessão
Carregar uma sessão salva anteriormente é igualmente simples. A API lê o arquivo JSON, recria o estado interno e retorna o identificador da sessão para que você possa continuar a enviar mensagens sem precisar passar o ID manualmente novamente.
- Chame
LoadChatSessioncom o caminho para o arquivo JSON. - Armazene o
sessionIdretornado. - Use
SendMessageToSessionAsynccom o ID restaurado para continuar a conversa.
Exemplo de Código – Restaurando uma Sessão
string sessionId = await api.LoadChatSession("session-42.json");
string reply = await api.SendMessageToSessionAsync(sessionId, "What did we discuss?");
LoadChatSession lê o arquivo e retorna o ID da sessão restaurada.
A sessão restaurada é automaticamente definida como a ativa, permitindo chamadas imediatas para SendMessageToSessionAsync.
Nota: Esses trechos são reproduzidos da documentação oficial da Aspose e não foram executados em um sandbox. Verifique-os em seu ambiente antes de usá-los em produção.
Exemplo Completo — Salvar, Reiniciar, Retomar
A seguir está uma demonstração completa, de ponta a ponta. O primeiro bloco inicia um chat, envia algumas mensagens e salva a sessão. O segundo bloco simula um novo processo que carrega o arquivo salvo e continua a conversa.
Exemplo de Código – Fluxo de Trabalho de Ponta a Ponta
using Aspose.LLM;
using Aspose.LLM.Abstractions.Parameters.Presets;
// ---------- First run: save ----------
{
var license = new Aspose.LLM.License();
license.SetLicense("Aspose.LLM.lic");
using var api = AsposeLLMApi.Create(new Qwen25Preset());
string sessionId = await api.StartNewChatAsync(sessionId: "support-ticket-1234");
await api.SendMessageToSessionAsync(sessionId,
"Customer reports that the migration from v25 to v26 broke their startup script.");
await api.SendMessageToSessionAsync(sessionId,
"Their environment: Windows Server 2022, .NET 8, CUDA 12.6.");
await api.SendMessageToSessionAsync(sessionId,
"What questions should I ask them next?");
api.SaveChatSession(sessionId, "support-ticket-1234.json");
Console.WriteLine("Session saved.");
}
// ---------- Second run: resume ----------
{
var license = new Aspose.LLM.License();
license.SetLicense("Aspose.LLM.lic");
using var api = AsposeLLMApi.Create(new Qwen25Preset());
string sessionId = await api.LoadChatSession("support-ticket-1234.json");
Console.WriteLine($"Resumed session: {sessionId}");
string reply = await api.SendMessageToSessionAsync(sessionId,
"They replied that they use a custom build step that copies native DLLs. How should I proceed?");
Console.WriteLine(reply);
}
O primeiro bloco cria uma licença, instancia a API com o Qwen25Preset, inicia um novo chat chamado support-ticket-1234, envia três mensagens para construir o contexto e, finalmente, grava a sessão em support-ticket-1234.json. O segundo bloco recria a licença e a API, carrega o arquivo JSON e continua o diálogo, demonstrando que o modelo mantém as mensagens anteriores.
Nota: Esses trechos são reproduzidos da documentação oficial da Aspose e não foram executados em um sandbox. Verifique-os em seu ambiente antes de usá-los em produção.
O que é salvo?
SaveChatSession produz um documento JSON com três seções essenciais:
- Session Identifier – o ID exclusivo que você forneceu ao iniciar o chat.
- Message History – uma lista ordenada de todas as mensagens de usuário e assistente, incluindo função, conteúdo e quaisquer metadados de mídia.
- KV Cache Metadata – posições internas e tamanhos do cache de chave‑valor para cada mensagem, que permite que o modelo continue exatamente de onde parou.
Como os dados de cache estão incluídos, a sessão restaurada pode continuar a geração sem recomputar a atenção anterior, tornando a operação de retomada rápida e determinística.
Restrições de Portabilidade
Embora o arquivo JSON contenha tudo o que é necessário para uma continuação perfeita, ele só é portátil sob certas condições:
- Mesma Versão Principal do SDK – o formato de arquivo pode mudar entre lançamentos principais, portanto ambos os lados devem usar a mesma versão principal do Aspose.LLM.
- Arquivo de Modelo Idêntico – o modelo subjacente do Hugging Face (incluindo quantização) deve corresponder exatamente; caso contrário, o cache KV torna‑se incompatível.
- Correspondência de BinaryManagerParameters.ReleaseTag – a versão do runtime llama.cpp usada para carregar o modelo deve ser a mesma, caso contrário os layouts de tensores de baixo nível diferem.
Se alguma dessas restrições for violada, você pode ver erros como InvalidOperationException ou saída corrompida.
Uma Nuance Conhecida no Tempo de Carregamento
Quando você chama LoadChatSession, o SDK reconstrói a conversa, mas aplica padrão ContextParameters, ChatParameters e SamplerParameters. Qualquer configuração personalizada (por exemplo, temperatura, número máximo de tokens, prompts do sistema) que você usou durante a sessão original não é restaurada automaticamente. Para manter o comportamento exato da geração, reaplique seus parâmetros personalizados após o carregamento ou reproduza a conversa em uma nova sessão com as configurações desejadas.
Erros Comuns
Abaixo está uma lista de verificação rápida para problemas típicos que você pode encontrar ao carregar uma sessão:
- FileNotFoundException – Verifique o caminho do arquivo; caminhos relativos são resolvidos em relação ao diretório de trabalho atual.
- InvalidOperationException ao carregar – Indica uma versão incompatível do SDK ou um arquivo JSON corrompido.
- Saída corrompida após o carregamento – Normalmente causado por um arquivo de modelo incompatível ou ReleaseTag. Certifique‑se de que o mesmo binário de modelo esteja presente na máquina de carregamento.
Tratar essas exceções de forma elegante e registrar diagnósticos detalhados tornará sua aplicação mais robusta.
Segurança
O arquivo JSON persistente contém cópias em texto‑plano de cada mensagem do usuário e do assistente. Armazená‑lo em um local desprotegido pode expor dados sensíveis. Considere as seguintes mitigações:
- Criptografe o arquivo antes de gravá‑lo no disco (por exemplo, Windows DPAPI, Azure Key Vault ou uma biblioteca multiplataforma como libsodium).
- Restrinja as permissões do sistema de arquivos para que somente a conta de serviço que executa a aplicação possa ler/gravar o arquivo.
- Se o arquivo precisar ser transferido pela rede, use canais criptografados TLS e considere assinar o arquivo para detectar adulteração.
Próximos passos
Agora que você pode persistir e retomar conversas, pode explorar recursos relacionados:
- Casos de uso de chat multi‑turno – mantenha diálogos mais longos ao longo de muitas interações.
- Configuração de preset personalizada – ajuste o preset do modelo ao seu domínio antes de persistir.
- Referência completa de persistência de sessão – revise a referência da API para semânticas mais aprofundadas em torno de
SaveChatSessione metadados relacionados.
Escolhendo a Abordagem Correta
O artigo apresentou três maneiras de salvar uma sessão e um método de carregamento simples. Escolha a abordagem que corresponde ao seu cenário de implantação:
- Caminho explícito – melhor quando o arquivo deve residir em um local conhecido, como uma pasta específica do usuário ou uma unidade de rede compartilhada.
- Nome de arquivo padrão – conveniente para protótipos rápidos ou quando a sessão vive ao lado do executável.
- Caminho temporário com criação de diretório – ideal para ambientes isolados, pipelines de CI ou quando você deseja que o SO gerencie a limpeza.
Todas as abordagens usam a mesma API subjacente; elas diferem apenas em como você gerencia o sistema de arquivos.
Obtenha uma Licença Gratuita
Se ainda não possui uma licença permanente, você pode obter uma licença de avaliação temporária na página de licença temporária da Aspose.
Recursos Adicionais Gratuitos
Conclusão
Persistir uma sessão de chat com Aspose.LLM oferece durabilidade, auditabilidade e flexibilidade para mover conversas entre processos ou máquinas. Você aprendeu quando aplicar esse padrão, como salvar uma sessão de três maneiras diferentes, como restaurá‑la, o que o arquivo JSON contém e as considerações de compatibilidade e segurança que você precisa ter em mente. Com o exemplo completo, agora você pode integrar a persistência de sessão em qualquer solução de chat .NET.
Perguntas Frequentes
- Quando é útil persistir uma sessão de chat?
Persistir é útil para aplicativos desktop ou de servidor que precisam manter o estado da conversa entre execuções, fluxos de trabalho de longa duração, requisitos de auditoria ou backup, e migração de sessões entre máquinas com a mesma versão do SDK. - Como posso especificar um caminho de arquivo personalizado ao salvar uma sessão?
Chameapi.SaveChatSession(sessionId, "myfolder\myfile.json");ou construa um caminho comPath.Combinee garanta que o diretório exista antes de salvar. - O que LoadChatSession retorna?
Ele retorna o identificador da sessão restaurada, permitindo que você continue enviando mensagens sem precisar fornecer o ID novamente. - Posso mover um arquivo de sessão salvo para outra máquina?
Sim, desde que a máquina de destino use a mesma versão principal do SDK, o mesmo arquivo de modelo e a mesma ReleaseTag do llama.cpp. - O arquivo JSON salvo é seguro?
O arquivo armazena dados da conversa em texto simples, portanto você deve criptografá‑lo antes de armazená‑lo em locais não confiáveis. - Por que minhas configurações personalizadas de sampler ou contexto não são restauradas após o carregamento?
LoadChatSession aplica parâmetros padrão; reaplique quaisquer configurações personalizadas após o carregamento ou reproduza o histórico em uma nova sessão.
