{"id":2282,"date":"2025-02-26T11:05:00","date_gmt":"2025-02-26T10:05:00","guid":{"rendered":"https:\/\/pletzenauer.com\/?p=2282"},"modified":"2026-08-05T17:24:16","modified_gmt":"2026-08-05T15:24:16","slug":"agentic-rag-n8n-baza-wiedzy","status":"publish","type":"post","link":"https:\/\/pletzenauer.com\/pl\/2025\/02\/26\/agentic-rag-n8n-baza-wiedzy\/","title":{"rendered":"Agentic RAG w n8n: dlaczego klasyczny RAG cz\u0119sto zawodzi \u2013 i jak zrobi\u0107 to lepiej"},"content":{"rendered":"<p>Wiele firm stawia dzi\u015b na asystent\u00f3w AI, kt\u00f3rzy maj\u0105 odpowiada\u0107 na pytania o w\u0142asne dokumenty \u2013 protoko\u0142y ze spotka\u0144, tabele ze wska\u017anikami czy opinie klient\u00f3w. Powszechnie stosowana metoda nazywa si\u0119 Retrieval Augmented Generation (RAG). Jest rozpowszechniona, dobrze wspierana i szybka do wdro\u017cenia w narz\u0119dziach no-code takich jak n8n. Tyle \u017ce w praktyce klasyczny RAG zaskakuj\u0105co cz\u0119sto zwraca b\u0142\u0119dne lub niepe\u0142ne odpowiedzi. Cole Medin pokazuje w swoim filmie, z czego to wynika i jak tak zwana konfiguracja Agentic RAG omija typowe s\u0142abo\u015bci. Podsumowuj\u0119 trze\u017awo najwa\u017cniejsze punkty.<\/p>\n<div style=\"background:#FFE6D6;border-left:4px solid #F26A21;padding:16px 20px;border-radius:6px;margin:24px 0;\"><strong>Najwa\u017cniejsze w skr\u00f3cie<\/strong><\/p>\n<ul>\n<li>Klasyczny RAG zawodzi przede wszystkim z dw\u00f3ch powod\u00f3w: nie potrafi &#8220;oddali\u0107 widoku&#8221; na ca\u0142e dokumenty ani przeprowadzi\u0107 prawdziwej analizy danych na tabelach.<\/li>\n<li>Agentic RAG daje agentowi AI kilka narz\u0119dzi zamiast jednego wyszukiwania \u2013 sam decyduje, jak przeszukuje baz\u0119 wiedzy.<\/li>\n<li>Tabele (CSV\/Excel) s\u0105 zapisywane osobno, dzi\u0119ki czemu mo\u017cna je odpytywa\u0107 przez SQL \u2013 bez zak\u0142adania osobnej tabeli dla ka\u017cdego pliku.<\/li>\n<li>Agent potrafi wylistowa\u0107 dokumenty, pobra\u0107 ca\u0142e pliki, cytowa\u0107 \u017ar\u00f3d\u0142a i w razie potrzeby poprawi\u0107 zapytanie.<\/li>\n<li>Pokazana konfiguracja n8n to rozszerzalny szablon, a nie gotowy produkt \u2013 prompty i narz\u0119dzia trzeba dostosowa\u0107 do w\u0142asnego przypadku u\u017cycia.<\/li>\n<\/ul>\n<\/div>\n<figure style=\"margin:28px 0;\"><img decoding=\"async\" src=\"https:\/\/pletzenauer.com\/wp-content\/uploads\/2026\/06\/1487-1.png\" alt=\"Por\u00f3wnanie w dw\u00f3ch kolumnach klasycznego RAG i Agentic RAG, po cztery punkty\" style=\"width:100%;height:auto;border-radius:8px;border:1px solid #E5E2DE;\"\/><figcaption style=\"font-size:0.9em;color:#6b6b6b;margin-top:8px;\">Agentic RAG daje agentowi AI kilka narz\u0119dzi zamiast jednego wyszukiwania.<\/figcaption><\/figure>\n<h2>Dlaczego klasyczny RAG rozczarowuje w praktyce<\/h2>\n<p>RAG dzia\u0142a przez wyszukiwanie podobie\u0144stwa: zapytanie jest por\u00f3wnywane z zapisanymi fragmentami tekstu (&#8220;chunkami&#8221;), a najlepiej pasuj\u0105ce trafiaj\u0105 do modelu j\u0119zykowego. Problemem jest ten wyb\u00f3r. Regularnie pomija istotny kontekst.<\/p>\n<p>Medin wymienia dwie konkretne s\u0142abo\u015bci:<\/p>\n<ul>\n<li><strong>Brak spojrzenia na ca\u0142e dokumenty:<\/strong> RAG si\u0119ga tylko po pojedyncze wycinki. Kto chce analizowa\u0107 trendy w tabeli, dostanie mo\u017ce \u0107wier\u0107 wierszy \u2013 a wraz z tym b\u0142\u0119dny wynik.<\/li>\n<li><strong>Brak prawdziwej analizy danych:<\/strong> sum ani warto\u015bci maksymalnych z tabeli nie da si\u0119 wiarygodnie policzy\u0107 samym wyszukiwaniem tekstowym.<\/li>\n<\/ul>\n<p>Do tego dochodzi praktyczna uci\u0105\u017cliwo\u015b\u0107: gdy pyta si\u0119 o protok\u00f3\u0142 z okre\u015blonej daty, RAG bywa, \u017ce wyci\u0105ga dokument z niew\u0142a\u015bciwego dnia \u2013 mimo \u017ce data jest w tytule. A \u0142\u0105czenie r\u00f3\u017cnych dokument\u00f3w w szerszy kontekst udaje si\u0119 rzadko.<\/p>\n<h2>Co Agentic RAG robi inaczej<\/h2>\n<p>G\u0142\u00f3wna my\u015bl jest prosta: zamiast dawa\u0107 agentowi AI jedno jedyne narz\u0119dzie wyszukiwania, dostaje ich kilka \u2013 i sam mo\u017ce decydowa\u0107, jak si\u0119ga do bazy wiedzy. Medin definiuje Agentic RAG tak:<\/p>\n<blockquote><p>Agentic RAG oznacza danie agentowi zdolno\u015bci do zastanowienia si\u0119 nad tym, <strong>jak<\/strong> przeszukuje baz\u0119 wiedzy \u2013 zamiast przypisywa\u0107 go na sztywno do jednego narz\u0119dzia.<\/p><\/blockquote>\n<p>Konkretnie: agent mo\u017ce dzi\u0119ki temu poprawia\u0107 zapytania, w razie potrzeby wybra\u0107 inne narz\u0119dzie i wypr\u00f3bowa\u0107 kilka dr\u00f3g, a\u017c uzyska wiarygodn\u0105 odpowied\u017a. Gdy samo wyszukiwanie RAG zawiedzie, nie jest ju\u017c zablokowany.<\/p>\n<h3>Cztery narz\u0119dzia agenta<\/h3>\n<p>W workflow n8n agent ma do dyspozycji nast\u0119puj\u0105ce narz\u0119dzia:<\/p>\n<ul>\n<li><strong>Wyszukiwanie RAG<\/strong> \u2013 klasyczne wyszukiwanie podobie\u0144stwa, w ulepszonej wersji wraz z podaniem \u017ar\u00f3d\u0142a.<\/li>\n<li><strong>Listowanie dokument\u00f3w<\/strong> \u2013 agent pobiera wszystkie dokumenty wraz z tytu\u0142ami i identyfikatorami i zastanawia si\u0119, kt\u00f3re mog\u0105 by\u0107 istotne.<\/li>\n<li><strong>Pobranie tre\u015bci pliku<\/strong> \u2013 po identyfikatorze pliku pobiera pe\u0142ny tekst konkretnego dokumentu (na przyk\u0142ad protok\u00f3\u0142 z 23 lutego, rozpoznawalny po tytule).<\/li>\n<li><strong>Zapytanie SQL na tabelach<\/strong> \u2013 pliki CSV i Excel s\u0105 odpytywane jak tabele SQL, aby umo\u017cliwi\u0107 sumy, maksima i podobne analizy.<\/li>\n<\/ul>\n<p>W system promptcie agent dostaje instrukcj\u0119, by zaczyna\u0107 od RAG i si\u0119ga\u0107 po pozosta\u0142e narz\u0119dzia tylko wtedy, gdy wyszukiwanie nie zwraca w\u0142a\u015bciwych tre\u015bci. Wa\u017cna wskaz\u00f3wka z filmu: wyra\u017ane wezwanie agenta do uczciwo\u015bci \u2013 czyli do otwartego przyznania, \u017ce nie znalaz\u0142 odpowiedzi \u2013 odczuwalnie redukuje halucynacje.<\/p>\n<h2>Jak zapisywane s\u0105 dane tabelaryczne<\/h2>\n<p>Technicznie najciekawsza cz\u0119\u015b\u0107 dotyczy tabel. W Supabase zak\u0142ada si\u0119 w tym celu trzy tabele:<\/p>\n<ul>\n<li><strong>documents<\/strong> \u2013 zawiera embeddings dla RAG, metadane i tre\u015b\u0107 poszczeg\u00f3lnych chunk\u00f3w.<\/li>\n<li><strong>document_metadata<\/strong> \u2013 przechowuje informacje nadrz\u0119dne: tytu\u0142y, adresy URL do podania \u017ar\u00f3de\u0142 oraz \u2013 przy tabelach \u2013 schemat (czyli nazwy kolumn).<\/li>\n<li><strong>document_rows<\/strong> \u2013 odk\u0142ada wiersze tabeli. W\u0142a\u015bciwe dane l\u0105duj\u0105 w elastycznej kolumnie <strong>JSONB<\/strong> o nazwie <code>row_data<\/code>.<\/li>\n<\/ul>\n<p>Sztuczka: przez JSONB mo\u017cna zapisa\u0107 dowolne struktury kolumn, bez konieczno\u015bci tworzenia osobnej tabeli SQL dla ka\u017cdego pliku CSV czy Excel. Agent najpierw odczytuje schemat z metadanych, rozumie dost\u0119pne kolumny i dopiero potem formu\u0142uje zapytanie SQL na <code>row_data<\/code>. Medin wyra\u017anie zaznacza, \u017ce ta konfiguracja jest uproszczona \u2013 schemat nie m\u00f3wi na przyk\u0142ad nic o typach danych, wi\u0119c suma po kolumnie ze znakiem dolara mo\u017ce si\u0119 nie uda\u0107. Chodzi mu o koncepcj\u0119, nie o perfekcyjne wdro\u017cenie.<\/p>\n<h2>Pipeline RAG: z Google Drive do Supabase<\/h2>\n<p>Zanim agent mo\u017ce pracowa\u0107, baz\u0119 wiedzy trzeba wype\u0142ni\u0107. Pipeline przebiega przy tym w kilku krokach:<\/p>\n<ul>\n<li><strong>Wyzwalacz:<\/strong> wyzwalacz Google Drive co minut\u0119 sprawdza nowe lub zmienione pliki. Alternatywnie dzia\u0142a Dropbox albo lokalny wyzwalacz plikowy. Usuni\u0119te pliki nie s\u0105 jednak wykrywane.<\/li>\n<li><strong>Kilka plik\u00f3w naraz:<\/strong> nowo wbudowana p\u0119tla przetwarza teraz tak\u017ce kilka plik\u00f3w, kt\u00f3re trafiaj\u0105 w tym samym interwale odpytywania \u2013 znana wada poprzedniej wersji.<\/li>\n<li><strong>Usuwanie starych danych:<\/strong> przed ka\u017cdym importem usuwane s\u0105 istniej\u0105ce wpisy dla danego identyfikatora pliku. Dzi\u0119ki temu nie zostaje \u017caden nieaktualny chunk, gdy dokument si\u0119 skr\u00f3ci\u0142.<\/li>\n<li><strong>Ekstrakcja tre\u015bci:<\/strong> w\u0119ze\u0142 Switch rozga\u0142\u0119zia si\u0119 zale\u017cnie od typu pliku \u2013 PDF, Google Doc, tekst czy tabela s\u0105 odczytywane inaczej. Kolejne formaty jak JSON czy HTML mo\u017cna doda\u0107 przez dodatkowe w\u0119z\u0142y.<\/li>\n<li><strong>Podw\u00f3jne zapisywanie tabel:<\/strong> pliki CSV s\u0105 z jednej strony przygotowywane jako dokument tekstowy dla RAG, z drugiej zapisywane wierszami w <code>document_rows<\/code> na potrzeby zapyta\u0144 SQL.<\/li>\n<\/ul>\n<p>Praktyczna pu\u0142apka przy konfiguracji: do po\u0142\u0105czenia Postgres z Supabase trzeba wed\u0142ug filmu u\u017cy\u0107 <strong>transaction poolera<\/strong> (port 6543), a nie po\u0142\u0105czenia bezpo\u015bredniego. Dokumentacja n8n ma by\u0107 w tym miejscu niejasna.<\/p>\n<h3>Zastosowane modele<\/h3>\n<p>Do embedding\u00f3w u\u017cywany jest <code>text-embedding-3<\/code> od OpenAI, jako model j\u0119zykowy <code>GPT-4o mini<\/code> \u2013 \u015bwiadomie wybrany jako tani i szybki. Do bardziej wymagaj\u0105cych przypadk\u00f3w Medin poleca mocniejsze modele, jak GPT-4o czy Claude Sonnet 4. Wa\u017cne: przy wstawianiu i przy pobieraniu trzeba u\u017cywa\u0107 tego samego modelu embedding\u00f3w o tej samej liczbie wymiar\u00f3w.<\/p>\n<h2>Trzy przyk\u0142ady z filmu<\/h2>\n<p>Medin pokazuje, jak agent zale\u017cnie od pytania wybiera r\u00f3\u017cne narz\u0119dzia:<\/p>\n<ul>\n<li><strong>Pytanie o tabel\u0119:<\/strong> na &#8220;w kt\u00f3rym miesi\u0105cu mieli\u015bmy najwi\u0119cej nowych klient\u00f3w?&#8221; agent pisze zapytanie SQL i podaje poprawny wynik (grudzie\u0144, 129 nowych klient\u00f3w) \u2013 zamiast polega\u0107 na niepe\u0142nych chunkach.<\/li>\n<li><strong>Czyste pytanie RAG:<\/strong> na &#8220;gdzie mo\u017cemy by\u0107 lepsi?&#8221; wyszukiwanie podobie\u0144stwa znajduje dokument z opiniami, mimo \u017ce \u015bwiadomie nie u\u017cyto s\u0142owa &#8220;poprawa&#8221;.<\/li>\n<li><strong>Pobranie pliku ze \u017ar\u00f3d\u0142em:<\/strong> przy pobraniu kompletnego protoko\u0142u ze spotkania agent podaje action items, a na dopytanie klikalny link do \u017ar\u00f3d\u0142a.<\/li>\n<\/ul>\n<h2>Wniosek<\/h2>\n<p>Wpis pokazuje trze\u017awo, dlaczego naiwny RAG nie wystarcza w wielu zastosowaniach biznesowych: pomija kontekst i nie potrafi liczy\u0107 na tabelach. Podej\u015bcie agentowe rozwi\u0105zuje to pragmatycznie, daj\u0105c agentowi AI kilka narz\u0119dzi i pole decyzji. Dla decydent\u00f3w w M\u015aP, kt\u00f3rzy rozwa\u017caj\u0105 asystenta do dokument\u00f3w, to wa\u017cny wniosek: jako\u015b\u0107 nie stoi i nie upada wraz z samym modelem, lecz wraz z architektur\u0105 za nim. Kto przejmuje przedstawion\u0105 konfiguracj\u0119 n8n, powinien traktowa\u0107 j\u0105 jako punkt wyj\u015bcia \u2013 prompty, narz\u0119dzia i model danych nale\u017cy dostosowa\u0107 do w\u0142asnego zasobu danych. Zw\u0142aszcza zapytania SQL na tabelach i obs\u0142uga typ\u00f3w danych zostawiaj\u0105 miejsce na ulepszenia.<\/p>\n<p><strong>\u0179r\u00f3d\u0142o:<\/strong> Cole Medin \u2013 \u201eI Built the ULTIMATE n8n RAG AI Agent Template&#8221;, <a href=\"https:\/\/www.youtube.com\/watch?v=mQt1hOjBH9o\">https:\/\/www.youtube.com\/watch?v=mQt1hOjBH9o<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Klasyczny RAG cz\u0119sto pomija kontekst i dane tabelaryczne. Jak konfiguracja Agentic RAG w n8n przeszukuje bazy wiedzy pewniej \u2013 wyja\u015bnione praktycznie.<\/p>\n","protected":false},"author":0,"featured_media":1507,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2282","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-unkategorisiert"],"_links":{"self":[{"href":"https:\/\/pletzenauer.com\/pl\/wp-json\/wp\/v2\/posts\/2282","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pletzenauer.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pletzenauer.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/pletzenauer.com\/pl\/wp-json\/wp\/v2\/comments?post=2282"}],"version-history":[{"count":1,"href":"https:\/\/pletzenauer.com\/pl\/wp-json\/wp\/v2\/posts\/2282\/revisions"}],"predecessor-version":[{"id":2834,"href":"https:\/\/pletzenauer.com\/pl\/wp-json\/wp\/v2\/posts\/2282\/revisions\/2834"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pletzenauer.com\/pl\/wp-json\/wp\/v2\/media\/1507"}],"wp:attachment":[{"href":"https:\/\/pletzenauer.com\/pl\/wp-json\/wp\/v2\/media?parent=2282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pletzenauer.com\/pl\/wp-json\/wp\/v2\/categories?post=2282"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pletzenauer.com\/pl\/wp-json\/wp\/v2\/tags?post=2282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}