{"id":2422,"date":"2025-02-26T11:05:00","date_gmt":"2025-02-26T10:05:00","guid":{"rendered":"https:\/\/pletzenauer.com\/?p=2422"},"modified":"2026-08-05T17:25:30","modified_gmt":"2026-08-05T15:25:30","slug":"agentic-rag-n8n-videnbase","status":"publish","type":"post","link":"https:\/\/pletzenauer.com\/da\/2025\/02\/26\/agentic-rag-n8n-videnbase\/","title":{"rendered":"Agentic RAG i n8n: hvorfor klassisk RAG ofte fejler \u2013 og hvordan det g\u00f8res bedre"},"content":{"rendered":"<p>Mange virksomheder satser i dag p\u00e5 AI-assistenter, der skal besvare sp\u00f8rgsm\u00e5l om egne dokumenter \u2013 m\u00f8dereferater, n\u00f8gletalstabeller eller kundefeedback. Den g\u00e6ngse metode bag hedder Retrieval Augmented Generation (RAG). Den er udbredt, godt underst\u00f8ttet og hurtigt implementeret i no-code-v\u00e6rkt\u00f8jer som n8n. Men: i praksis leverer klassisk RAG forbl\u00f8ffende ofte forkerte eller ufuldst\u00e6ndige svar. Cole Medin viser i sin video, hvad det skyldes, og hvordan en s\u00e5kaldt Agentic RAG-ops\u00e6tning kommer uden om de typiske svagheder. Jeg sammenfatter de vigtigste punkter n\u00f8gternt.<\/p>\n<div style=\"background:#FFE6D6;border-left:4px solid #F26A21;padding:16px 20px;border-radius:6px;margin:24px 0;\"><strong>Det vigtigste kort fortalt<\/strong><\/p>\n<ul>\n<li>Klassisk RAG fejler is\u00e6r p\u00e5 to ting: den kan ikke &#8220;zoome ud&#8221; til hele dokumenter, og den kan ikke lave rigtig dataanalyse p\u00e5 tv\u00e6rs af tabeller.<\/li>\n<li>Agentic RAG giver AI-agenten flere v\u00e6rkt\u00f8jer i stedet for kun \u00e9n s\u00f8gning \u2013 den bestemmer selv, hvordan den gennems\u00f8ger videnbasen.<\/li>\n<li>Tabeller (CSV\/Excel) gemmes s\u00e6rskilt, s\u00e5 de kan foresp\u00f8rges med SQL \u2013 uden at der skal oprettes en egen tabel til hver fil.<\/li>\n<li>Agenten kan liste dokumenter, hente hele filer, citere kilder og forbedre s\u00f8gningen ved behov.<\/li>\n<li>Den viste n8n-ops\u00e6tning er en udvidelig skabelon, ikke et f\u00e6rdigt produkt \u2013 prompts og v\u00e6rkt\u00f8jer skal tilpasses ens eget anvendelsestilf\u00e6lde.<\/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=\"Sammenligning i to spalter af klassisk RAG og Agentic RAG med fire punkter hver\" 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 giver AI-agenten flere v\u00e6rkt\u00f8jer i stedet for kun \u00e9n s\u00f8gning.<\/figcaption><\/figure>\n<h2>Hvorfor klassisk RAG skuffer i praksis<\/h2>\n<p>RAG fungerer via en lighedss\u00f8gning: foresp\u00f8rgslen sammenholdes med gemte tekststykker (&#8220;chunks&#8221;), og de bedst passende gives videre til sprogmodellen. Problemet er udv\u00e6lgelsen. Den overser j\u00e6vnligt vigtig kontekst.<\/p>\n<p>Medin n\u00e6vner to konkrete svagheder:<\/p>\n<ul>\n<li><strong>Intet blik p\u00e5 hele dokumenter:<\/strong> RAG tr\u00e6kker kun enkelte uddrag ind. Vil du analysere tendenser i en tabel, f\u00e5r du m\u00e5ske kun en fjerdedel af r\u00e6kkerne \u2013 og dermed et forkert resultat.<\/li>\n<li><strong>Ingen egentlig dataanalyse:<\/strong> summer eller maksimumv\u00e6rdier p\u00e5 tv\u00e6rs af en tabel kan ikke beregnes p\u00e5lideligt med en ren teksts\u00f8gning.<\/li>\n<\/ul>\n<p>Dertil kommer en praktisk irritation: sp\u00f8rger man efter referatet fra en bestemt dato, henter RAG undertiden dokumentet fra den forkerte dag \u2013 selvom datoen st\u00e5r i titlen. Og det lykkes sj\u00e6ldent at knytte forskellige dokumenter sammen for at skabe en bredere sammenh\u00e6ng.<\/p>\n<h2>Hvad Agentic RAG g\u00f8r anderledes<\/h2>\n<p>Kernid\u00e9en er enkel: i stedet for at give AI-agenten \u00e9t enkelt s\u00f8gev\u00e6rkt\u00f8j f\u00e5r den flere \u2013 og m\u00e5 selv bestemme, hvordan den \u00e5bner videnbasen. Medin definerer Agentic RAG s\u00e5dan:<\/p>\n<blockquote><p>Agentic RAG betyder at give agenten evnen til at t\u00e6nke over, <strong>hvordan<\/strong> den gennems\u00f8ger videnbasen \u2013 i stedet for at binde den til \u00e9t enkelt v\u00e6rkt\u00f8j.<\/p><\/blockquote>\n<p>Konkret kan agenten dermed forbedre sine s\u00f8geforesp\u00f8rgsler, v\u00e6lge et andet v\u00e6rkt\u00f8j ved behov og pr\u00f8ve flere veje, indtil den har et holdbart svar. Sl\u00e5r den rene RAG-s\u00f8gning fejl, er den ikke l\u00e6ngere blokeret.<\/p>\n<h3>Agentens fire v\u00e6rkt\u00f8jer<\/h3>\n<p>I n8n-workflowet har agenten f\u00f8lgende v\u00e6rkt\u00f8jer til r\u00e5dighed:<\/p>\n<ul>\n<li><strong>RAG-s\u00f8gning<\/strong> \u2013 den klassiske lighedss\u00f8gning, i den forbedrede version inklusive kildeangivelse.<\/li>\n<li><strong>Liste dokumenter<\/strong> \u2013 agenten henter alle dokumenter med titler og id&#8217;er og overvejer, hvilke der kunne v\u00e6re relevante.<\/li>\n<li><strong>Hent filindhold<\/strong> \u2013 via fil-id&#8217;et henter den den fulde tekst i et bestemt dokument (f.eks. referatet fra 23. februar, genkendeligt p\u00e5 titlen).<\/li>\n<li><strong>SQL-foresp\u00f8rgsel p\u00e5 tabeller<\/strong> \u2013 CSV- og Excel-filer foresp\u00f8rges som SQL-tabeller for at muligg\u00f8re summer, maksima og lignende udregninger.<\/li>\n<\/ul>\n<p>I system-prompten f\u00e5r agenten besked p\u00e5 at begynde med RAG og kun g\u00e5 over til de \u00f8vrige v\u00e6rkt\u00f8jer, n\u00e5r s\u00f8gningen ikke leverer det rigtige. Et vigtigt r\u00e5d fra videoen: udtrykkeligt at bede agenten om at v\u00e6re \u00e6rlig \u2013 alts\u00e5 \u00e5bent sige, n\u00e5r der ikke blev fundet et svar \u2013 reducerer hallucinationer m\u00e6rkbart.<\/p>\n<h2>Hvordan tabeldata gemmes<\/h2>\n<p>Den teknisk mest interessante del handler om tabeller. I Supabase oprettes der tre tabeller til form\u00e5let:<\/p>\n<ul>\n<li><strong>documents<\/strong> \u2013 indeholder embeddings til RAG, metadata og indholdet i de enkelte chunks.<\/li>\n<li><strong>document_metadata<\/strong> \u2013 gemmer overordnet information: titel, URL&#8217;er til kildeangivelser og \u2013 ved tabeller \u2013 skemaet (alts\u00e5 kolonnenavnene).<\/li>\n<li><strong>document_rows<\/strong> \u2013 lagrer tabelr\u00e6kkerne. Selve dataene havner i en fleksibel <strong>JSONB<\/strong>-kolonne ved navn <code>row_data<\/code>.<\/li>\n<\/ul>\n<p>Fidusen: via JSONB kan vilk\u00e5rlige kolonnestrukturer gemmes, uden at der skal oprettes en egen SQL-tabel til hver CSV- eller Excel-fil. Agenten l\u00e6ser f\u00f8rst skemaet fra metadataene, forst\u00e5r de tilg\u00e6ngelige kolonner og formulerer s\u00e5 en SQL-foresp\u00f8rgsel mod <code>row_data<\/code>. Medin g\u00f8r udtrykkeligt opm\u00e6rksom p\u00e5, at denne ops\u00e6tning er forenklet \u2013 skemaet r\u00f8ber f.eks. intet om datatyper, s\u00e5 en sum over en kolonne med dollartegn kan sl\u00e5 fejl. Han er ude efter konceptet, ikke en perfekt implementering.<\/p>\n<h2>RAG-pipelinen: fra Google Drive til Supabase<\/h2>\n<p>F\u00f8r agenten kan arbejde, skal videnbasen fyldes. Pipelinen forl\u00f8ber i flere trin:<\/p>\n<ul>\n<li><strong>Udl\u00f8ser:<\/strong> en Google Drive-trigger tjekker hvert minut for nye eller \u00e6ndrede filer. Alternativt virker Dropbox eller en lokal fil-trigger. Slettede filer registreres dog ikke.<\/li>\n<li><strong>Flere filer p\u00e5 \u00e9n gang:<\/strong> en nyindbygget l\u00f8kke behandler nu ogs\u00e5 flere filer, der ankommer i samme polling-interval \u2013 en kendt mangel ved den tidligere version.<\/li>\n<li><strong>Slet gamle data:<\/strong> f\u00f8r hver import fjernes eksisterende poster for det p\u00e5g\u00e6ldende fil-id. S\u00e5dan bliver der ingen for\u00e6ldet chunk tilbage, hvis et dokument er blevet kortere.<\/li>\n<li><strong>Udtr\u00e6k indhold:<\/strong> en switch-node forgrener efter filtype \u2013 PDF, Google-dokument, tekst eller tabel l\u00e6ses forskelligt. Yderligere formater som JSON eller HTML kan tilf\u00f8jes med ekstra noder.<\/li>\n<li><strong>Gem tabeller to gange:<\/strong> CSV-filer forberedes p\u00e5 den ene side som tekstdokument til RAG, p\u00e5 den anden side gemmes de r\u00e6kkevis i <code>document_rows<\/code> til SQL-foresp\u00f8rgsler.<\/li>\n<\/ul>\n<p>En praktisk faldgrube ved ops\u00e6tningen: til Postgres-forbindelsen til Supabase skal if\u00f8lge videoen <strong>transaction pooleren<\/strong> bruges (port 6543), ikke den direkte forbindelse. n8n-dokumentationen skulle v\u00e6re uklar p\u00e5 det punkt.<\/p>\n<h3>Anvendte modeller<\/h3>\n<p>Til embeddings bruges OpenAIs <code>text-embedding-3<\/code>, som sprogmodel <code>GPT-4o mini<\/code> \u2013 bevidst valgt billig og hurtig. Til mere kr\u00e6vende tilf\u00e6lde anbefaler Medin kraftigere modeller som GPT-4o eller Claude Sonnet 4. Vigtigt: ved inds\u00e6ttelse og ved hentning skal den samme embedding-model med samme antal dimensioner bruges.<\/p>\n<h2>Tre eksempler fra videoen<\/h2>\n<p>Medin demonstrerer, hvordan agenten v\u00e6lger forskellige v\u00e6rkt\u00f8jer alt efter sp\u00f8rgsm\u00e5let:<\/p>\n<ul>\n<li><strong>Tabelsp\u00f8rgsm\u00e5l:<\/strong> p\u00e5 &#8220;I hvilken m\u00e5ned havde vi flest nye kunder?&#8221; skriver agenten en SQL-foresp\u00f8rgsel og leverer det korrekte resultat (december, 129 nye kunder) \u2013 i stedet for at forlade sig p\u00e5 ufuldst\u00e6ndige chunks.<\/li>\n<li><strong>Rent RAG-sp\u00f8rgsm\u00e5l:<\/strong> p\u00e5 &#8220;Hvor kan vi blive bedre?&#8221; finder lighedss\u00f8gningen feedback-dokumentet, selvom ordet &#8220;forbedring&#8221; bevidst ikke blev brugt.<\/li>\n<li><strong>Filhentning med kilde:<\/strong> ved hentning af et komplet m\u00f8dereferat leverer agenten action items og p\u00e5 foresp\u00f8rgsel et klikbart link til kilden.<\/li>\n<\/ul>\n<h2>Konklusion<\/h2>\n<p>Indl\u00e6gget viser n\u00f8gternt, hvorfor naiv RAG ikke r\u00e6kker til mange forretningsanvendelser: den overser kontekst og kan ikke regne p\u00e5 tabeller. Den agentiske tilgang l\u00f8ser det pragmatisk ved at give AI-agenten flere v\u00e6rkt\u00f8jer og r\u00e5derum. For SMV-beslutningstagere, der overvejer en dokumentassistent, er det en vigtig erkendelse: kvaliteten st\u00e5r og falder ikke med modellen alene, men med arkitekturen bag. Overtager du den viste n8n-ops\u00e6tning, b\u00f8r du forst\u00e5 den som et udgangspunkt \u2013 prompts, v\u00e6rkt\u00f8jer og datamodel skal tilpasses din egen datam\u00e6ngde. Netop SQL-foresp\u00f8rgslen p\u00e5 tabeller og h\u00e5ndteringen af datatyper rummer plads til forbedringer.<\/p>\n<p><strong>Kilde:<\/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>Klassisk RAG overser ofte kontekst og tabeldata. Hvordan en Agentic RAG-ops\u00e6tning i n8n gennems\u00f8ger videnbaser mere p\u00e5lideligt \u2013 forklaret praksisn\u00e6rt.<\/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-2422","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-unkategorisiert"],"_links":{"self":[{"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/posts\/2422","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/comments?post=2422"}],"version-history":[{"count":1,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/posts\/2422\/revisions"}],"predecessor-version":[{"id":3090,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/posts\/2422\/revisions\/3090"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/media\/1507"}],"wp:attachment":[{"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/media?parent=2422"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/categories?post=2422"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/tags?post=2422"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}