Paweł Łukasiewicz: programista blogger
Paweł Łukasiewicz
2025-05-18
Paweł Łukasiewicz
2025-05-18
Udostępnij Udostępnij Kontakt
🧠 Zarządzanie kontekstem i pamięcią w Semantic Kernel

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.


🧩 Czym jest "kontekst” w Semantic Kernel?

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"; 

🧠 Pamięć: krótkoterminowa vs. długoterminowa

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.

🔄 Krótkoterminowa pamięć (context only)

To dane przekazane w KernelArguments — wygasają po zakończeniu wywołania.

💾 Długoterminowa pamięć (Memory Store)

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

🔍 Przeszukiwanie pamięci semantycznej

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!


🏗️ Jak zintegrować pamięć w aplikacji

  1. Dodaj odpowiedni provider pamięci:

    var memoryBuilder = new MemoryBuilder() 
        .WithMemoryStore(new VolatileMemoryStore()) // lub np. Redis/Azure 
        .WithTextEmbeddingGeneration(new AzureOpenAITextEmbeddingGeneration(...)); 
    
    kernel.UseMemory(memoryBuilder.Build()); 
    
  2. Zapisuj dane przy każdej rozmowie lub akcji:

    await kernel.Memory.SaveInformationAsync("chat-history", "Zapytano o pluginy", Guid.NewGuid().ToString()); 
    
  3. Wyszukuj przy rozpoczęciu rozmowy lub przy potrzebie:

    var contextItems = await kernel.Memory.SearchAsync("chat-history", "pluginy", limit: 1); 
    

🧠 Advanced: memory chaining + summarization

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

🗂️ Praktyczne zastosowania pamięci

ZastosowanieOpis
🤖 Agent rozmownypamięta imię użytkownika, poprzednie pytania
📋 Task managerpamięta kontekst zadań, statusy, notatki
🧠 Base wiedzyagreguje odpowiedzi z dokumentacji, kodu, bazy wiedzy
🧾 Asystent dokumentowyzapamiętuje przetworzone pliki, streszczenia i komentarze

✅ Rady końcowe

Co?Dlaczego?
📌 Nazwy kolekcji pamięciTrzymaj strukturę: chat-history, docs-summary, user-facts
📏 Limituj daneUżywaj limit i podsumowań
🔄 Pamięć vs kontekstPrzechowuj w pamięci tylko to, co może się przydać w przyszłości
📜 Taguj daneDodawaj metadane – np. ID użytkownika, czas, temat

🔚 Co dalej?

W kolejnym wpisie pokażę, jak nauczyć AI ogarniać Outlooka, Teamsy i pliki z OneDrive.