Przejdź do głównej treści
Wróć do bloga
Inne 5 min czytania

Pamięć konwersacji w n8n: jak zapisywać historię chatu i utrzymywać kontekst w automatyzacjach AI

21 maja 2026 Michał Kasprzyk Aktualizacja: 21 maja 2026

Pamięć konwersacji w n8n: jak zapisywać historię chatu i utrzymywać kontekst w automatyzacjach AI

Pojedyncze zapytanie do API LLM zwraca odpowiedź wyłącznie na podstawie treści przesłanej w bieżącym żądaniu. Jeśli buduję w n8n chatbota wsparcia klienta lub asystenta do zbierania leadów, model bez historii nie wie, co działo się dwie wiadomości wcześniej. Pamięć konwersacji to mechanizm zapisywania kolejnych tur rozmowy i dołączania ich do kolejnych zapytań jako kontekst. Bez tego nie da się zbudować wieloetapowej automatyzacji, która pozwala użytkownikowi doprecyzować wcześniejsze pytanie.

Dlaczego przepływy bez pamięci nie sprawdzają się w dialogu

W automatyzacjach opartych na jednym promocie każde zapytanie jest niezależne. Użytkownik musi powtarzać informacje, a model nie może nawiązać do wcześniejszych ustaleń. Próba wciskania całej hipotetycznej historii do statycznego szablonu promptu kończy się albo przekroczeniem limitu tokenów, albo generowaniem ogólnych odpowiedzi pozbawionych kontekstu. Dlatego wdrażam osobny magazyn historii, który dynamicznie buduje okno kontekstowe przed każdym wywołaniem modelu.

Jak technicznie zbudować pamięć sesji w n8n

n8n w wersji cloud i self-hosted nie oferuje gotowego bloczku „pamięć konwersacji” w rozumieniu natywnego magazynu historii chatu. Muszę zbudować tę logikę samodzielnie. Najprostszą metodą, którą stosuję w wdrożeniach, jest zapisywanie kolejnych wiadomości w zewnętrznej bazie danych, a następnie pobieranie ich przed każdym wywołaniem węzła LLM.

Identyfikacja sesji

Każda rozmowa musi mieć unikalny identyfikator sessionId. Tworzę go na podstawie ID użytkownika z zewnętrznego systemu – na przykład z Telegrama, Slacka, identyfikatora sesji z czatu na stronie lub adresu e-mail. Przy pierwszym kontakcie, gdy nie mam jeszcze identyfikatora, generuję UUID i zwracam go do frontendu lub zapisuję w polu ukrytym formularza. Bez stabilnego sessionId nie jestem w stanie rozdzielić konwersacji różnych osób i pobierać właściwego kontekstu.

Struktura zapisu w bazie danych

Zapisuję historię w bazie relacyjnej – najczęściej PostgreSQL lub MySQL, choć w prostych prototypach wystarczy SQLite lub nawet Google Sheets. Każdy rekord zawiera:

  • session_id – klucz do filtrowania,
  • roleuser albo assistant,
  • content – treść wiadomości,
  • timestamp – chronologiczne sortowanie.

Unikam zapisu całej historii jako jednego JSON-a w jednym polu, ponieważ przy dużej liczbie sesji taka struktura utrudnia filtrowanie i czyszczenie starych rekordów.

Pobieranie i sortowanie kontekstu

Przed węzłem wywołującym model LLM (np. OpenAI Chat Model lub HTTP Request do lokalnego Ollama) umieszczam węzeł bazy danych. Zapytanie SQL pobiera ostatnie N wiadomości dla konkretnego sessionId, sortuje je rosnąco według czasu i zwraca jako kolekcję obiektów. To zabezpiecza przed sytuacją, w której do modelu trafiają wiadomości w losowej kolejności.

Formatowanie historii dla API LLM

API takie jak OpenAI, Anthropic czy lokalne Ollama w trybie chat oczekują listy wiadomości z określonymi rolami: system, user, assistant. W n8n używam węzła Set lub Code, aby przekształcić wiersze z bazy w tablicę messages.

Przykład struktury, którą przekazuję do modelu:

[
  {"role": "system", "content": "Jesteś asystentem firmy usługowej z Bytomia. Odpowiadaj zwięźle po polsku."},
  {"role": "user", "content": "Czy projektujecie strony dla branży gastronomicznej?"},
  {"role": "assistant", "content": "Tak, tworzę strony dla lokali gastronomicznych, w tym z systemem rezerwacji i menu online."},
  {"role": "user", "content": "Ile trwa taka realizacja?"}
]

Dzięki temu model rozumie, że pytanie o realizację dotyczy strony dla branży gastronomicznej, a nie ogólnej usługi. Nie muszę powtarzać kontekstu w każdym zapytaniu – historia robi to za mnie.

Ograniczanie okna kontekstowego i rotacja historii

Każdy model ma twardy limit tokenów. Jeśli historia rozmowy będzie rosła w nieskończoność, przekroczę ten limit i otrzymam błąd API lub obciętą odpowiedź. Stosuję dwa sprawdzone rozwiązania.

Sliding window – pobieram stałą liczbę ostatnich tur, na przykład 5 par user-assistant (10 wiadomości). To gwarantuje przewidywalne zużycie tokenów i stabilny koszt wywołania.

Podsumowanie zamiast pełnej historii – przy długich sesjach generuję w osobnym kroku podsumowanie wcześniejszej części rozmowy. Następnie zastępuję stare wpisy tym podsumowaniem, zachowując kluczowe fakty, takie jak branża klienta, zakres usługi czy preferowana lokalizacja. Pozwala to utrzymać ciągłość dialogu bez rozdmuchiwania kontekstu.

Przykład: chatbot wsparcia klienta z pamięcią w n8n

Ostatnio budowałem przepływ, w którym chatbot na stronie firmy usługowej odpowiadał na pytania o ofertę i zbierał dane kontaktowe. Przepływ wyglądał następująco:

  1. Webhook odbierał wiadomość z frontendu wraz z sessionId.
  2. Węzeł PostgreSQL pobierał ostatnie 6 wiadomości dla tego identyfikatora.
  3. Węzeł Code łączył prompt systemowy z historią w poprawnym formacie JSON.
  4. HTTP Request wysyłał przygotowaną tablicę do API OpenAI.
  5. Odpowiedź asystenta była zapisywana do bazy jako nowy rekord z rolą assistant.
  6. Treść wracała do czatu na stronie.

Efekt? Użytkownik mógł napisać: „A czy mogę do tej wyceny dodać opiekę techniczną?” – i bot rozumiał, o którą wycenę chodzi, bo widział wcześniejszą rozmowę. Bez pamięci musiałby opisywać całe zapotrzebowanie od nowa.

Checklist przed wdrożeniem na produkcję

Przed uruchomieniem przepływu z pamięcią konwersacji weryfikuję następujące kwestie:

  • sessionId jest stabilny dla tego samego użytkownika i nie zmienia się przy odświeżeniu strony bez wyraźnej potrzeby.
  • Zapytanie SQL pobiera wiadomości wyłącznie dla bieżącej sesji i sortuje je chronologicznie.
  • Liczba zwracanych wiadomości nie przekracza 70–80% limitu kontekstu użytego modelu.
  • Zdefiniowałem politykę retencji danych – historia nie jest przechowywana w nieskończoność.
  • Przepływ obsługuje błąd niedostępności bazy (fallback do zapytania bez historii lub komunikat techniczny).
  • Przetestowałem scenariusz pierwszej wiadomości, gdy baza zwraca pusty wynik.

Jeśli planujesz wdrożyć w firmie asystenta AI z prawdziwą pamięcią rozmowy, pomogę zaprojektować architekturę przepływu w n8n – od wyboru bazy danych i formatowania kontekstu, po ograniczanie zużycia tokenów i testowanie scenariuszy brzegowych. Skontaktuj się, aby omówić szczegóły techniczne wdrożenia.

👨‍💻

Michał Kasprzyk

Tworzę nowoczesne strony internetowe dla firm z całej Polski. Specjalizuję się w szybkich, bezpiecznych i zoptymalizowanych pod SEO witrynach.

Więcej o mnie

Powiązane artykuły

Inne

Automatyczna analiza konkurencji z AI w n8n: jak monitorować strony rywali, oferty i zmiany treści

Tworzę przepływy n8n, które automatycznie monitorują konkurencję, śledzą zmiany ofert i analizują treści stron rywali bez ręcznego przeglądu.

Inne

Automatyczne tłumaczenie treści stron i ofert z AI w n8n: jak budować pipeliney lokalizacji z kontekstem branżowym i glosariuszami

Dowiedz się, jak zbudować w n8n pipeline automatycznego tłumaczenia treści stron i ofert z glosariuszem branżowym, walidacją jakości i integracją z CMS.

Inne

Czyszczenie i standaryzacja danych z AI w n8n: jak automatyzować deduplikację, formatowanie i uzupełnianie braków w bazach klientów

Jak automatyzować czyszczenie i standaryzację danych klientów w n8n z użyciem AI. Praktyczny przewodnik po deduplikacji, formatowaniu i uzupełnianiu braków w bazach CRM.

Potrzebujesz strony internetowej?

Skontaktuj się ze mną, aby omówić Twój projekt. Pierwsza konsultacja jest bezpłatna.

Zamów bezpłatną wycenę
Napisz na WhatsApp