Korzystanie z pamięci w pracy z agentami

Ostrzeżenie

Funkcja pamięci agenta jądra semantycznego jest eksperymentalna, może ulec zmianie i zostanie sfinalizowana tylko na podstawie opinii i oceny.

Często ważne jest, aby agent zapamiętał ważne informacje. Te informacje mogą być przechowywane na czas rozmowy lub przez dłuższy czas, aby objąć wiele rozmów. Informacje mogą być wyciągane z interakcji z użytkownikiem i mogą być specyficzne dla tego użytkownika.

Nazywamy te informacje wspomnieniami.

Aby przechwytywać i przechowywać wspomnienia, obsługujemy składniki, których można używać z elementem AgentThread do wyodrębniania wspomnień ze wszystkich komunikatów dodawanych do wątku i dostarczać te wspomnienia agentowi zgodnie z potrzebami.

Używanie Mem0 dla pamięci agenta

Mem0 to samowznosząca się warstwa pamięci dla aplikacji LLM, umożliwiająca spersonalizowane środowiska sztucznej inteligencji.

Integracja Microsoft.SemanticKernel.Memory.Mem0Provider z usługą Mem0 umożliwia agentom zapamiętanie preferencji użytkownika i kontekstu w wielu wątkach, co umożliwia bezproblemowe środowisko użytkownika.

Każdy komunikat dodany do wątku jest wysyłany do usługi Mem0 w celu wyodrębnienia pamięci. Dla każdego wywołania agenta, Mem0 jest odpytywany o wspomnienia pasujące do podanego żądania użytkownika, a wszystkie wspomnienia są dodawane do kontekstu agenta dla tego wywołania.

Dostawcę pamięci Mem0 można skonfigurować przy użyciu identyfikatora użytkownika, aby umożliwić długoterminowe przechowywanie pamięci o użytkowniku w wielu wątkach. Można również skonfigurować go z identyfikatorem wątku lub użyć identyfikatora wątku agenta, aby umożliwić krótkotrwałe wspomnienia przypisane tylko do jednego wątku.

Oto przykład użycia tego składnika.

// 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);

Opcje Mem0Provider

Można skonfigurować Mem0Provider przy użyciu różnych opcji, aby dostosować jego działanie. Opcje są udostępniane poprzez użycie klasy Mem0ProviderOptions w konstruktorze Mem0Provider.

Opcje określania zakresu

Mem0 umożliwia określanie zakresu pamięci według aplikacji, agenta, wątku i użytkownika.

Dostępne są opcje umożliwiające podanie identyfikatorów dla tych zakresów, dzięki czemu pamięci mogą być przechowywane w mem0 pod tymi identyfikatorami. Zobacz właściwości ApplicationId, AgentId, ThreadId i UserId na Mem0ProviderOptions.

W niektórych przypadkach warto skorzystać z identyfikatora wątku agenta po stronie serwera, gdy używasz agenta opartego na usłudze. Może się jednak zdarzyć, że wątek nie zostanie utworzony w momencie, gdy obiekt Mem0Provider jest konstruowany. W takim przypadku można ustawić opcję ScopeToPerOperationThreadId na true, a Mem0Provider skorzysta z identyfikatora z AgentThread, gdy będzie dostępny.

Podpowiedź kontekstowa

Opcja ContextPrompt umożliwia zastąpienie domyślnego monitu, który ma prefiks pamięci. Monit służy do określania kontekstu pamięci dostarczonych do modelu sztucznej inteligencji, dzięki czemu model sztucznej inteligencji wie, czym są i jak z nich korzystać.

Używanie pamięci tablicy dla kontekstu Short-Term

Funkcja pamięci tablicy umożliwia agentom przechwytywanie i przechowywanie najbardziej odpowiednich informacji z konwersacji, nawet gdy historia czatu jest obcięta.

Każda wiadomość dodawana do konwersacji jest przetwarzana przez Microsoft.SemanticKernel.Memory.WhiteboardProvider w celu wyodrębnienia wymagań, propozycji, decyzji, działań. Są one przechowywane na tablicy i udostępniane agentowi jako dodatkowy kontekst dla każdego wywołania.

Oto przykład, jak skonfigurować pamięć tablicy.

// 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.

Zalety technologii pamięci tablicy interaktywnej

  • Short-Term Kontekst: zachowuje kluczowe informacje o celach trwających konwersacji.
  • Zezwala na obcinanie historii czatów: obsługuje utrzymywanie kontekstu krytycznego, jeśli historia czatu jest obcięta.

Opcje whiteboardProvider

WhiteboardProvider można skonfigurować przy użyciu różnych opcji, aby dostosować jego zachowanie. Opcje są przekazywane do konstruktora WhiteboardProvider za pomocą klasy WhiteboardProviderOptions.

MaksymalnaLiczbaWiadomościNaTablicy

Określa maksymalną liczbę komunikatów do zachowania na tablicy. Po osiągnięciu maksymalnej wartości zostaną usunięte mniej cenne komunikaty.

ContextPrompt

Podczas udostępniania zawartości tablicy do modelu sztucznej inteligencji ważne jest, aby opisać, do czego służą komunikaty. To ustawienie umożliwia zastąpienie domyślnych komunikatów wbudowanych w element WhiteboardProvider.

WhiteboardEmptyPrompt

Gdy tablica jest pusta, WhiteboardProvider wyświetla komunikat informujący, że tablica jest pusta. To ustawienie umożliwia zastąpienie domyślnego przekazu wiadomości wbudowanego w WhiteboardProvider.

MaintenancePromptTemplate

Metoda WhiteboardProvider używa modelu sztucznej inteligencji do dodawania/aktualizowania/usuwania komunikatów na tablicy. Ma wbudowany monit o wprowadzenie tych aktualizacji. To ustawienie umożliwia zastąpienie tego wbudowanego monitu.

W szablonie można użyć następujących parametrów:

  • {{$maxWhiteboardMessages}}: maksymalna liczba komunikatów dozwolonych na tablicy.
  • {{$inputMessages}}: komunikaty wejściowe, które mają zostać dodane do tablicy.
  • {{$currentWhiteboard}}: bieżący stan tablicy.

Łączenie pamięci Mem0 i pamięci tablicy

Możesz użyć zarówno pamięci Mem0, jak i pamięci tablicowej w tym samym agencie, aby osiągnąć równowagę między długoterminowymi i krótkoterminowymi zdolnościami pamięciowymi.

// 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);

Łącząc te funkcje pamięci, agenci mogą zapewnić użytkownikom bardziej spersonalizowane i kontekstowe środowisko.

Dalsze kroki

Wkrótce

Więcej informacji można znaleźć wkrótce.

Wkrótce

Więcej informacji można znaleźć wkrótce.