Utilização de memória com agentes

Aviso

A funcionalidade de Memória do Agente kernel semântico é experimental, está sujeita a alterações e só será finalizada com base em comentários e avaliação.

Geralmente, é importante que um agente se lembre de informações importantes. Essas informações podem ser mantidas durante uma conversa ou a longo prazo para abranger várias conversas. As informações podem ser aprendidas interagindo com um usuário e podem ser específicas para esse usuário.

Chamamos essas memórias de informação.

Para capturar e reter memórias, damos suporte a componentes que podem ser usados com um AgentThread para extrair memórias de todas as mensagens que são adicionadas ao thread e fornecemos essas memórias ao agente conforme necessário.

Usando o Mem0 para memória do agente

O Mem0 é uma camada de memória auto-aprimorada para aplicativos LLM, habilitando experiências personalizadas de IA.

A Microsoft.SemanticKernel.Memory.Mem0Provider integração com o serviço Mem0 permite que os agentes se lembrem das preferências e do contexto do usuário em vários threads, permitindo uma experiência de usuário perfeita.

Cada mensagem adicionada ao thread é enviada ao serviço Mem0 para extrair memórias. Para cada invocação de agente, o Mem0 é consultado quanto a memórias correspondentes à solicitação de usuário fornecida e todas as memórias são adicionadas ao contexto do agente para essa invocação.

O provedor de memória Mem0 pode ser configurado com uma ID de usuário para permitir o armazenamento de memórias sobre o usuário, a longo prazo, em vários threads. Ele também pode ser configurado com um identificador de thread ou para usar o identificador de thread do agente, permitindo que a memória de curto prazo esteja anexada apenas a um único thread.

Aqui está um exemplo de como usar esse componente.

// Create an HttpClient for the Mem0 service.
using var httpClient = new HttpClient()
{
    BaseAddress = new Uri("https://api.mem0.ai")
};
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Token", "<Your_Mem0_API_Key>");

// Create a Mem0 provider for the current user.
var mem0Provider = new Mem0Provider(httpClient, options: new()
{
    UserId = "U1"
});

// Clear any previous memories (optional).
await mem0Provider.ClearStoredMemoriesAsync();

// Add the mem0 provider to the agent thread.
ChatHistoryAgentThread agentThread = new();
agentThread.AIContextProviders.Add(mem0Provider);

// Use the agent with mem0 memory.
ChatMessageContent response = await agent.InvokeAsync("Please retrieve my company report", agentThread).FirstAsync();
Console.WriteLine(response.Content);

Opções do Mem0Provider

O Mem0Provider pode ser configurado com várias opções para personalizar seu comportamento. As opções são fornecidas usando a Mem0ProviderOptions classe para o Mem0Provider construtor.

Opções de escopo

O Mem0 fornece a capacidade de definir o escopo de memórias por aplicativo, agente, thread e usuário.

Estão disponíveis opções para fornecer IDs para esses escopos, para que as memórias possam ser armazenadas em mem0 sob essas IDs. Veja as propriedades ApplicationId, AgentId, ThreadId e UserId em Mem0ProviderOptions.

Em alguns casos, talvez você queira usar o identificador de thread do agente do servidor quando se utiliza um agente baseado em serviço. No entanto, o thread pode não ter sido criado ainda quando o Mem0Provider objeto está sendo construído. Nesse caso, você pode definir a opção ScopeToPerOperationThreadId como true, e o Mem0Provider usará o ID do AgentThread quando ele estiver disponível.

Solicitação de Contexto

ContextPrompt A opção permite substituir o prompt padrão incorporado às memórias. O prompt é usado para contextualizar as memórias fornecidas para o modelo de IA, para que o modelo de IA saiba o que são e como usá-las.

Usando a memória do quadro branco para contexto de Short-Term

O recurso de memória do quadro branco permite que os agentes capturem e mantenham as informações mais relevantes de uma conversa, mesmo quando o histórico de chat é truncado.

Cada mensagem adicionada à conversa é processada pelo Microsoft.SemanticKernel.Memory.WhiteboardProvider para extrair requisitos, propostas, decisões e ações. Eles são armazenados em um quadro branco e fornecidos ao agente como contexto adicional em cada chamada.

Aqui está um exemplo de como configurar a Memória de Quadro:

// Create a whiteboard provider.
var whiteboardProvider = new WhiteboardProvider(chatClient);

// Add the whiteboard provider to the agent thread.
ChatHistoryAgentThread agentThread = new();
agentThread.AIContextProviders.Add(whiteboardProvider);

// Simulate a conversation with the agent.
await agent.InvokeAsync("I would like to book a trip to Paris.", agentThread);

// Whiteboard should now contain a requirement that the user wants to book a trip to Paris.

Benefícios da memória do quadro branco

  • Short-Term Contexto: retém informações importantes sobre as metas das conversas em andamento.
  • Permite truncamento do histórico de chat: dá suporte à manutenção do contexto crítico se o histórico de chat for truncado.

Opções do WhiteboardProvider

O WhiteboardProvider pode ser configurado com várias opções para personalizar seu comportamento. As opções são fornecidas usando a WhiteboardProviderOptions classe para o WhiteboardProvider construtor.

MaxWhiteboardMessages

Especifica um número máximo de mensagens a serem retidas no quadro branco. Quando o máximo for atingido, mensagens menos valiosas serão removidas.

ContextPrompt

Ao fornecer o conteúdo do quadro branco para o modelo de IA, é importante descrever qual o propósito das mensagens. Essa configuração permite substituir o sistema de mensagens padrão que é integrado ao WhiteboardProvider.

WhiteboardEmptyPrompt

Quando o quadro branco estiver vazio, a WhiteboardProvider gera uma mensagem dizendo que está vazio. Essa configuração permite substituir o sistema de mensagens padrão que é integrado ao WhiteboardProvider.

MaintenancePromptTemplate

O WhiteboardProvider utiliza um modelo de IA para adicionar, atualizar ou remover mensagens no quadro branco. Ele tem um prompt interno para fazer essas atualizações. Essa configuração permite substituir esse prompt embutido.

Os seguintes parâmetros podem ser usados no modelo:

  • {{$maxWhiteboardMessages}}: o número máximo de mensagens permitidas no quadro.
  • {{$inputMessages}}: as mensagens de entrada a serem adicionadas ao quadro branco.
  • {{$currentWhiteboard}}: o estado atual do quadro branco.

Combinando Memória do Mem0 e do Quadro Branco

Você pode usar tanto o Mem0 quanto a memória de quadro branco no mesmo agente para obter um equilíbrio entre capacidades de memória de longo e curto prazo.

// Add both Mem0 and whiteboard providers to the agent thread.
agentThread.AIContextProviders.Add(mem0Provider);
agentThread.AIContextProviders.Add(whiteboardProvider);

// Use the agent with combined memory capabilities.
ChatMessageContent response = await agent.InvokeAsync("Please retrieve my company report", agentThread).FirstAsync();
Console.WriteLine(response.Content);

Combinando esses recursos de memória, os agentes podem fornecer uma experiência mais personalizada e com reconhecimento de contexto para os usuários.

Próximas etapas

Em breve

Mais informações em breve.

Em breve

Mais informações em breve.