czyli jak uczyć swoją AI przeszłości i przewidywać przyszłość
W poprzednich wpisach z tej serii poznaliśmy już Semantic Kernel od strony pluginów, planowania zadań i nawet tworzenia własnych agentów. Ale…
żaden z tych elementów nie miałby sensu bez kontekstu.
To właśnie kontekst i pamięć sprawiają, że nasz agent nie zaczyna od zera za każdym razem, tylko może się czegoś nauczyć, zapamiętać i wrócić do wcześniejszych tematów.
Kontekst to nie tylko ostatnie pytanie użytkownika.
To:
przeszłe interakcje (historia rozmowy)
zapamiętane fakty
chwilowe dane (np. aktualny czas, lokalizacja)
wiedza systemowa (np. osobowość agenta)
W Semantic Kernel reprezentuje go obiekt KernelArguments
– czyli coś jak plecak z danymi, które przekazujesz każdej funkcji.
var context = new KernelArguments(); context["userName"] = "Piotrek"; context["topic"] = "Semantic Kernel memory";
Kernel domyślnie działa w kontekście jednej sesji.
Ale gdy dodasz pamięć semantyczną, możesz zapisywać fakty i przeszłe interakcje, które zostają z Twoim agentem na stałe.
To dane przekazane w KernelArguments
— wygasają po zakończeniu wywołania.
To dane zapisywane do indeksu (np. w RAM, pliku, Redisie, Azure Search).
Można je potem przeszukiwać za pomocą wektorów!
await kernel.Memory.SaveInformationAsync( collection: "project-notes", text: "Użytkownik pracuje nad agentem w Semantic Kernel", id: "user-agent-project" );
To właśnie tu Semantic Kernel pokazuje pazur.
var results = kernel.Memory.SearchAsync( collection: "project-notes", query: "agent AI", limit: 2 );
Dostajesz trafienia na podstawie podobieństwa semantycznego (embeddingów), a nie słów kluczowych.
To działa nawet gdy użyjesz innych słów!
Dodaj odpowiedni provider pamięci:
var memoryBuilder = new MemoryBuilder() .WithMemoryStore(new VolatileMemoryStore()) // lub np. Redis/Azure .WithTextEmbeddingGeneration(new AzureOpenAITextEmbeddingGeneration(...)); kernel.UseMemory(memoryBuilder.Build());
Zapisuj dane przy każdej rozmowie lub akcji:
await kernel.Memory.SaveInformationAsync("chat-history", "Zapytano o pluginy", Guid.NewGuid().ToString());
Wyszukuj przy rozpoczęciu rozmowy lub przy potrzebie:
var contextItems = await kernel.Memory.SearchAsync("chat-history", "pluginy", limit: 1);
W większych systemach nie chcesz trzymać wszystkiego w pamięci 1:1.
Możesz:
automatycznie podsumowywać starsze fragmenty rozmowy (np. co 10 interakcji)
grupować dane wg tematów
zapisywać metadane (np. data, ważność)
Przykład użycia pamięci jako wejścia do funkcji:
var memoryItems = await kernel.Memory.SearchAsync("chat-history", "tokeny", 3); var context = new KernelArguments { ["userHistory"] = string.Join("\n", memoryItems.Select(m => m.Metadata.Text)) };
Zastosowanie | Opis |
---|---|
🤖 Agent rozmowny | pamięta imię użytkownika, poprzednie pytania |
📋 Task manager | pamięta kontekst zadań, statusy, notatki |
🧠 Base wiedzy | agreguje odpowiedzi z dokumentacji, kodu, bazy wiedzy |
🧾 Asystent dokumentowy | zapamiętuje przetworzone pliki, streszczenia i komentarze |
Co? | Dlaczego? |
---|---|
📌 Nazwy kolekcji pamięci | Trzymaj strukturę: chat-history , docs-summary , user-facts |
📏 Limituj dane | Używaj limit i podsumowań |
🔄 Pamięć vs kontekst | Przechowuj w pamięci tylko to, co może się przydać w przyszłości |
📜 Taguj dane | Dodawaj metadane – np. ID użytkownika, czas, temat |
W kolejnym wpisie pokażę, jak nauczyć AI ogarniać Outlooka, Teamsy i pliki z OneDrive.