{"id":2413,"date":"2024-09-04T10:30:00","date_gmt":"2024-09-04T08:30:00","guid":{"rendered":"https:\/\/pletzenauer.com\/?p=2413"},"modified":"2026-08-05T17:25:25","modified_gmt":"2026-08-05T15:25:25","slug":"rag-agent-n8n-supabase","status":"publish","type":"post","link":"https:\/\/pletzenauer.com\/da\/2024\/09\/04\/rag-agent-n8n-supabase\/","title":{"rendered":"RAG-agent uden kode: n8n og Supabase kombineret i produktion"},"content":{"rendered":"<p>De fleste RAG-tutorials p\u00e5 nettet viser det samme leget\u00f8j igen og igen: &#8220;chat med din PDF&#8221;. Hvad der sj\u00e6ldent n\u00e6vnes: de demoer er langt fra en produktiv anvendelse. S\u00e5 snart videngrundlaget vokser, dokumenter opdateres, eller brugere stiller sp\u00f8rgsm\u00e5l, ingen har testet, begynder problemerne. Pr\u00e6cis d\u00e9r s\u00e6tter den tilgang ind, der beskrives her.<\/p>\n<p>I sin video viser Cole Medin, hvordan man med de to v\u00e6rkt\u00f8jer <strong>n8n<\/strong> (workflow-automatisering, sammenligneligt med Make.com eller Zapier) og <strong>Supabase<\/strong> (databaseplatform med vektorunderst\u00f8ttelse via PG Vector) kan bygge en RAG-AI-agent, der ligger t\u00e6ttere p\u00e5 praksis end mange andre vejledninger. L\u00f8ftet: ingen kode, overskuelig indsats og en opbygning, der vokser med videngrundlaget. For beslutningstagere i SMV&#8217;er er det is\u00e6r interessant, fordi man derved kan g\u00f8re interne dokumenter, referater eller manualer s\u00f8gbare uden at ans\u00e6tte et udviklingsteam.<\/p>\n<div style=\"background:#FFE6D6;border-left:4px solid #F26A21;padding:16px 20px;border-radius:6px;margin:24px 0;\">\n<strong>Det vigtigste kort fortalt<\/strong><\/p>\n<ul>\n<li>RAG (Retrieval Augmented Generation) forbinder en sprogmodel med en egen videnbase, s\u00e5 agenten tilg\u00e5r dine dokumenter i stedet for kun sin tr\u00e6ningsviden.<\/li>\n<li>n8n st\u00e5r for automatiseringen, Supabase fungerer p\u00e5 \u00e9n gang som chat-hukommelse og som vektordatabase.<\/li>\n<li>Hele opbygningen fungerer uden programmering og er if\u00f8lge videoen sat op p\u00e5 under 15 minutter.<\/li>\n<li>To detaljer h\u00e6ver tilgangen over overfladiske tutorials: et skalerbart lager til chatforl\u00f8bet og sletning af for\u00e6ldede vektorer for at undg\u00e5 dubletter.<\/li>\n<li>Supabases gratis niveau er if\u00f8lge videoen fuldt tilstr\u00e6kkeligt til at komme i gang.<\/li>\n<\/ul>\n<\/div>\n<figure style=\"margin:28px 0;\"><img decoding=\"async\" src=\"https:\/\/pletzenauer.com\/wp-content\/uploads\/2026\/06\/1486-1.png\" alt=\"Sammenligning i to spalter: til venstre typiske RAG-tutorials med demofokus og lokalt lager, til h\u00f8jre den praksisegnede tilgang med Supabase-hukommelse og sletning af for\u00e6ldede vektorer.\" style=\"width:100%;height:auto;border-radius:8px;border:1px solid #E5E2DE;\"\/><figcaption style=\"font-size:0.9em;color:#6b6b6b;margin-top:8px;\">To ofte oversete detaljer afg\u00f8r, om en RAG-agent forbliver brugbar, n\u00e5r videngrundlaget vokser.<\/figcaption><\/figure>\n<h2>Hvad agenten pr\u00e6sterer i praksis<\/h2>\n<p>Funktionsm\u00e5den vises i videoen med et enkelt eksempel. I begyndelsen er videnbasen tom, den tilh\u00f8rende tabel i Supabase indeholder ingen poster. Et testsp\u00f8rgsm\u00e5l om opgaverne fra et m\u00f8de kan agenten f\u00f8lgelig ikke besvare.<\/p>\n<p>Derefter l\u00e6gges et dokument med m\u00f8denoter som Google-dokument i en overv\u00e5get mappe. Inden for cirka et minut k\u00f8rer et n8n-workflow i baggrunden, som behandler filen og inds\u00e6tter den i videnbasen. Bagefter dukker der en ny post op i Supabase med sideindholdet, metadataene (blandt andet Google Drive-fil-id&#8217;et) og den s\u00e5kaldte embedding-vektor. Stiller man det samme sp\u00f8rgsm\u00e5l igen, leverer agenten nu det korrekte svar fra dokumentet. Opdateringer af filen bliver ogs\u00e5 registreret og fulgt op.<\/p>\n<h2>Opbygningen i overblik<\/h2>\n<p>Workflowet best\u00e5r af to dele: selve chat-agenten og en separat str\u00e6kning, der automatisk l\u00e6gger dokumenter ind i videngrundlaget. En f\u00e6rdig JSON-skabelon kan if\u00f8lge videoen hentes fra et GitHub-repository og indl\u00e6ses i ens egen n8n-instans via &#8220;Import from file&#8221;. Derefter skal blot ens egne adgangsoplysninger og den \u00f8nskede mappe tilf\u00f8jes.<\/p>\n<h3>Forbered Supabase<\/h3>\n<p>Supabase s\u00e6ttes op med en GitHub-konto. To omr\u00e5der i projektindstillingerne leverer de n\u00f8dvendige adgangsoplysninger:<\/p>\n<ul>\n<li><strong>Database:<\/strong> host, databasenavn, port, bruger og adgangskode til Postgres-forbindelsen. De oplysninger bruges til chat-hukommelsen.<\/li>\n<li><strong>API:<\/strong> den projektspecifikke URL samt service role-secret. De oplysninger er n\u00f8dvendige for vektordatabasen.<\/li>\n<\/ul>\n<p>Til vektors\u00f8gningen stiller n8n f\u00e6rdig SQL-kode til r\u00e5dighed i sin dokumentation. Den k\u00f8res \u00e9n gang i Supabases SQL-editor og opretter automatisk PG Vector-udvidelsen, dokumenttabellen og matching-funktionen til RAG. Egen programkode er ikke n\u00f8dvendig.<\/p>\n<h3>Chat-agenten<\/h3>\n<p>Agenten startes af en trigger &#8220;When a chat message is received&#8221;. Den giver samtidig et chatvindue direkte i n8n, hvor agenten kan testes uden deployment. Ved behov kan den samme brugerflade integreres p\u00e5 et website med f\u00e6rdig indlejringskode. Til agenten er der koblet tre byggeklodser:<\/p>\n<ul>\n<li><strong>Chatmodel:<\/strong> i eksemplet GPT-4o mini, tilkoblet via OpenAI-API-n\u00f8glen. Alternativt er Anthropic ogs\u00e5 muligt.<\/li>\n<li><strong>Chat-hukommelse:<\/strong> her bruges bevidst Postgres via Supabase i stedet for det ofte anbefalede lokale vindueslager. Det lokale lager belaster n8n-serveren og skalerer d\u00e5rligt. n8n opretter selv den n\u00f8dvendige tabel ved behov.<\/li>\n<li><strong>RAG-v\u00e6rkt\u00f8j:<\/strong> v\u00e6rkt\u00f8jet &#8220;retrieve documents&#8221; med Supabase som vektorlager, konfigureret via tabelnavn og foresp\u00f8rgselsfunktion.<\/li>\n<\/ul>\n<h3>L\u00e6g dokumenter ind automatisk<\/h3>\n<p>Anden del af workflowet holder videngrundlaget opdateret. En Google Drive-trigger tjekker regelm\u00e6ssigt en fastlagt mappe for nye eller \u00e6ndrede filer. Det videre forl\u00f8b:<\/p>\n<ul>\n<li>Fil-id&#8217;et udtr\u00e6kkes og gives videre til de f\u00f8lgende trin.<\/li>\n<li>Eksisterende vektorer med samme fil-id slettes i Supabase (mere om det nedenfor).<\/li>\n<li>Filen hentes, dokumenter konverteres til tekst og Google Sheets til CSV for at f\u00e5 det rene tekstindhold.<\/li>\n<li>Teksten inds\u00e6ttes i vektordatabasen. Ved sm\u00e5 filer falder opdelingen i afsnit bort; ellers bruges en simpel rekursiv tekst-splitter.<\/li>\n<\/ul>\n<h2>To detaljer, der afg\u00f8r praksisegnetheden<\/h2>\n<p>Indl\u00e6gget fremh\u00e6ver to punkter, som mangler i mange tutorials og f\u00f8rer til problemer netop d\u00e9r, hvor det bliver alvor.<\/p>\n<h3>Skalerbar chat-hukommelse<\/h3>\n<p>Forl\u00f8bet i en samtale gemmes ofte lokalt p\u00e5 n8n-instansen, fordi det er nemmest. Netop det overbelaster serveren, efterh\u00e5nden som brugen vokser. At flytte det ud i en Postgres-database hos Supabase er det skridt, der virkelig g\u00f8r agenten robust.<\/p>\n<h3>Slet for\u00e6ldede vektorer<\/h3>\n<p>Det vigtigere punkt handler om opdateringer. Vektormulighederne i n8n arbejder ikke som &#8220;upsert&#8221;: en eksisterende vektor bliver ikke erstattet ved fornyet inds\u00e6ttelse, men duplikeret, fordi fil-id&#8217;et ikke bruges som vektor-id. Opdaterer man den samme fil flere gange, hober dubletterne sig op, og svarkvaliteten lider. L\u00f8sningen i workflowet: f\u00f8r hver inds\u00e6ttelse slettes alle vektorer, hvis metadata b\u00e6rer fil-id&#8217;et p\u00e5 det aktuelle Google Drive-dokument. F\u00f8rst derefter inds\u00e6ttes den nye, opdaterede version. S\u00e5dan bliver der pr\u00e6cis \u00e9n aktuel post pr. dokument.<\/p>\n<h2>Vurdering for beslutningstagere<\/h2>\n<p>Den viste opbygning er udtrykkeligt t\u00e6nkt som et solidt udgangspunkt, ikke som en f\u00e6rdig slutl\u00f8sning. Udvidelser som bedre semantisk s\u00f8gning eller en yderligere n\u00f8gleordss\u00f8gning er mulige, men bevidst ladt \u00e5bne. Til en f\u00f8rste produktionsn\u00e6r videnbase er tilgangen alligevel b\u00e6redygtig.<\/p>\n<p>Bem\u00e6rkelsesv\u00e6rdig er omkostningssiden: Supabases gratis niveau er if\u00f8lge videoen nok til at komme i gang, et skift til den betalte plan betaler sig f\u00f8rst ved skalering. Arbejder du alligevel med n8n, kan du s\u00e6tte agenten op med dine egne dokumenter p\u00e5 kort tid uden at hyre ekstern udvikling.<\/p>\n<h2>Konklusion<\/h2>\n<p>Indl\u00e6gget viser n\u00f8gternt og forst\u00e5eligt, hvordan en RAG-AI-agent kan bygges med n8n og Supabase uden programmering. Den egentlige merv\u00e6rdi ligger ikke i den hurtige demoeffekt, men i to ofte oversete detaljer: en skalerbar chat-hukommelse og den konsekvente fjernelse af for\u00e6ldede vektorer. Pr\u00e6cis de punkter afg\u00f8r, om en agent forbliver brugbar, n\u00e5r videngrundlaget vokser, eller med tiden bliver up\u00e5lidelig. Vil du g\u00f8re interne dokumenter s\u00f8gbare, f\u00e5r du her en pragmatisk skabelon, der kan udvides skridt for skridt.<\/p>\n<p><strong>Kilde:<\/strong> Cole Medin, &#8220;This RAG AI Agent with n8n + Supabase is the Real Deal&#8221;, <a href=\"https:\/\/www.youtube.com\/watch?v=PEI_ePNNfJQ\">https:\/\/www.youtube.com\/watch?v=PEI_ePNNfJQ<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>S\u00e5dan bygger du en produktionsklar RAG-AI-agent med n8n og Supabase uden kode: videnbase, vektors\u00f8gning og automatiske dokumentopdateringer forklaret.<\/p>\n","protected":false},"author":0,"featured_media":1506,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2413","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\/2413","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=2413"}],"version-history":[{"count":1,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/posts\/2413\/revisions"}],"predecessor-version":[{"id":3081,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/posts\/2413\/revisions\/3081"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/media\/1506"}],"wp:attachment":[{"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/media?parent=2413"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/categories?post=2413"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pletzenauer.com\/da\/wp-json\/wp\/v2\/tags?post=2413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}