{"id":2326,"date":"2024-09-04T10:30:00","date_gmt":"2024-09-04T08:30:00","guid":{"rendered":"https:\/\/pletzenauer.com\/?p=2326"},"modified":"2026-08-05T17:24:42","modified_gmt":"2026-08-05T15:24:42","slug":"agente-rag-n8n-supabase","status":"publish","type":"post","link":"https:\/\/pletzenauer.com\/pt-pt\/2024\/09\/04\/agente-rag-n8n-supabase\/","title":{"rendered":"Agente RAG sem c\u00f3digo: combinar n8n e Supabase de forma produtiva"},"content":{"rendered":"<p>A maior parte dos tutoriais de RAG na internet mostra sempre o mesmo brinquedo: \u00abconverse com o seu PDF\u00bb. O que raramente se refere \u00e9 que estas demonstra\u00e7\u00f5es est\u00e3o muito longe de uma utiliza\u00e7\u00e3o produtiva. Assim que a base de conhecimento cresce, que os documentos s\u00e3o atualizados ou que os utilizadores fazem perguntas que ningu\u00e9m testou, come\u00e7am os problemas. \u00c9 exatamente aqui que entra a abordagem descrita a seguir.<\/p>\n<p>No seu v\u00eddeo, Cole Medin mostra como construir com as duas ferramentas <strong>n8n<\/strong> (automatiza\u00e7\u00e3o de fluxos de trabalho, compar\u00e1vel ao Make.com ou ao Zapier) e <strong>Supabase<\/strong> (plataforma de base de dados com suporte vetorial atrav\u00e9s de PG Vector) um agente de IA RAG mais pr\u00f3ximo da pr\u00e1tica do que muitos outros guias. A promessa: nenhum c\u00f3digo, esfor\u00e7o control\u00e1vel e uma montagem que cresce com a base de conhecimento. Para quem decide numa PME isto \u00e9 interessante sobretudo porque permite tornar pesquis\u00e1veis documentos internos, atas ou manuais sem ter de manter uma equipa de desenvolvimento.<\/p>\n<div style=\"background:#FFE6D6;border-left:4px solid #F26A21;padding:16px 20px;border-radius:6px;margin:24px 0;\">\n<strong>O essencial em poucas linhas<\/strong><\/p>\n<ul>\n<li>O RAG (Retrieval Augmented Generation) liga um modelo de linguagem a uma base de conhecimento pr\u00f3pria, de modo que o agente aceda aos seus documentos e n\u00e3o apenas ao que aprendeu no treino.<\/li>\n<li>O n8n encarrega-se da automatiza\u00e7\u00e3o; o Supabase serve ao mesmo tempo de mem\u00f3ria de conversa e de base de dados vetorial.<\/li>\n<li>Toda a montagem funciona sem programa\u00e7\u00e3o e, segundo o v\u00eddeo, fica pronta em menos de 15 minutos.<\/li>\n<li>Dois detalhes distinguem esta abordagem dos tutoriais superficiais: um armazenamento escal\u00e1vel para o hist\u00f3rico da conversa e a elimina\u00e7\u00e3o de vetores desatualizados, para evitar duplicados.<\/li>\n<li>Segundo o v\u00eddeo, o escal\u00e3o gratuito do Supabase chega perfeitamente para come\u00e7ar.<\/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=\"Compara\u00e7\u00e3o em duas colunas: \u00e0 esquerda os tutoriais de RAG t\u00edpicos, focados na demonstra\u00e7\u00e3o e com armazenamento local; \u00e0 direita a abordagem utiliz\u00e1vel na pr\u00e1tica, com mem\u00f3ria no Supabase e elimina\u00e7\u00e3o de vetores desatualizados.\" style=\"width:100%;height:auto;border-radius:8px;border:1px solid #E5E2DE;\"\/><figcaption style=\"font-size:0.9em;color:#6b6b6b;margin-top:8px;\">Dois detalhes muitas vezes ignorados decidem se um agente RAG continua utiliz\u00e1vel \u00e0 medida que a base de conhecimento cresce.<\/figcaption><\/figure>\n<h2>O que o agente faz na pr\u00e1tica<\/h2>\n<p>O funcionamento \u00e9 mostrado no v\u00eddeo com um exemplo simples. No in\u00edcio a base de conhecimento est\u00e1 vazia e a tabela correspondente no Supabase n\u00e3o tem registos. Como seria de esperar, o agente n\u00e3o consegue responder a uma pergunta de teste sobre as tarefas sa\u00eddas de uma reuni\u00e3o.<\/p>\n<p>De seguida, coloca-se numa pasta vigiada um documento com notas de reuni\u00e3o, sob a forma de Google Doc. Ao fim de cerca de um minuto corre em segundo plano um fluxo de trabalho n8n que processa o ficheiro e o insere na base de conhecimento. Depois disso surge no Supabase um novo registo com o conte\u00fado da p\u00e1gina, os metadados (entre outros, o ID do ficheiro no Google Drive) e o chamado vetor de embedding. Se voltar a fazer a mesma pergunta, o agente d\u00e1 agora a resposta correta a partir do documento. As atualiza\u00e7\u00f5es do ficheiro s\u00e3o igualmente detetadas e refletidas.<\/p>\n<h2>A montagem em s\u00edntese<\/h2>\n<p>O fluxo de trabalho tem duas partes: o agente de conversa propriamente dito e um percurso separado que insere documentos automaticamente na base de conhecimento. Segundo o v\u00eddeo, \u00e9 poss\u00edvel descarregar de um reposit\u00f3rio GitHub um template JSON j\u00e1 pronto e carreg\u00e1-lo na pr\u00f3pria inst\u00e2ncia de n8n atrav\u00e9s de &#8220;Import from file&#8221;. Depois disso, basta acrescentar as pr\u00f3prias credenciais e a pasta pretendida.<\/p>\n<h3>Preparar o Supabase<\/h3>\n<p>O Supabase \u00e9 configurado com uma conta GitHub. Duas \u00e1reas das defini\u00e7\u00f5es do projeto fornecem as credenciais necess\u00e1rias:<\/p>\n<ul>\n<li><strong>Database:<\/strong> host, nome da base de dados, porta, utilizador e palavra-passe para a liga\u00e7\u00e3o Postgres. Estes dados s\u00e3o usados para a mem\u00f3ria de conversa.<\/li>\n<li><strong>API:<\/strong> o URL espec\u00edfico do projeto e o service role secret. Estes dados s\u00e3o necess\u00e1rios para a base de dados vetorial.<\/li>\n<\/ul>\n<p>Para a pesquisa vetorial, o n8n disponibiliza na sua documenta\u00e7\u00e3o c\u00f3digo SQL j\u00e1 pronto. Executa-se uma \u00fanica vez no editor SQL do Supabase e cria automaticamente a extens\u00e3o PG Vector, a tabela de documentos e a fun\u00e7\u00e3o de correspond\u00eancia para RAG. N\u00e3o \u00e9 preciso escrever c\u00f3digo pr\u00f3prio.<\/p>\n<h3>O agente de conversa<\/h3>\n<p>O agente \u00e9 iniciado por um acionador &#8220;When a chat message is received&#8221;. Este disponibiliza ao mesmo tempo uma janela de conversa dentro do pr\u00f3prio n8n, com a qual se pode testar o agente sem qualquer deployment. Se necess\u00e1rio, a mesma interface pode ser integrada num site atrav\u00e9s de c\u00f3digo de incorpora\u00e7\u00e3o j\u00e1 pronto. Ao agente est\u00e3o ligados tr\u00eas blocos:<\/p>\n<ul>\n<li><strong>Modelo de conversa:<\/strong> no exemplo, GPT-4o mini, ligado atrav\u00e9s da chave de API da OpenAI. Em alternativa, tamb\u00e9m \u00e9 poss\u00edvel usar a Anthropic.<\/li>\n<li><strong>Mem\u00f3ria de conversa:<\/strong> aqui usa-se deliberadamente Postgres atrav\u00e9s do Supabase, em vez do armazenamento local em janela tantas vezes recomendado. O armazenamento local sobrecarrega o servidor n8n e escala mal. A tabela necess\u00e1ria \u00e9 criada pelo pr\u00f3prio n8n quando \u00e9 preciso.<\/li>\n<li><strong>Ferramenta RAG:<\/strong> a ferramenta &#8220;retrieve documents&#8221; com o Supabase como armazenamento vetorial, configurada atrav\u00e9s do nome da tabela e da fun\u00e7\u00e3o de consulta.<\/li>\n<\/ul>\n<h3>Inserir documentos automaticamente<\/h3>\n<p>A segunda parte do fluxo de trabalho mant\u00e9m a base de conhecimento atualizada. Um acionador do Google Drive verifica regularmente numa pasta definida se h\u00e1 ficheiros novos ou alterados. O resto do processo:<\/p>\n<ul>\n<li>O ID do ficheiro \u00e9 extra\u00eddo e passado aos passos seguintes.<\/li>\n<li>Os vetores existentes com o mesmo ID de ficheiro s\u00e3o eliminados no Supabase (mais sobre isto abaixo).<\/li>\n<li>O ficheiro \u00e9 descarregado; os documentos s\u00e3o convertidos em texto e as folhas do Google Sheets em CSV, para obter o conte\u00fado textual puro.<\/li>\n<li>O texto \u00e9 inserido na base de dados vetorial. Em ficheiros pequenos dispensa-se a divis\u00e3o em blocos; caso contr\u00e1rio, usa-se um simples divisor de texto recursivo.<\/li>\n<\/ul>\n<h2>Dois detalhes que decidem a utilidade na pr\u00e1tica<\/h2>\n<p>O artigo destaca dois pontos que faltam em muitos tutoriais e que causam problemas precisamente quando a coisa fica s\u00e9ria.<\/p>\n<h3>Mem\u00f3ria de conversa escal\u00e1vel<\/h3>\n<p>O hist\u00f3rico de uma conversa \u00e9 muitas vezes guardado localmente na inst\u00e2ncia de n8n, por ser o mais simples. \u00c9 precisamente isso que sobrecarrega o servidor \u00e0 medida que a utiliza\u00e7\u00e3o cresce. Pass\u00e1-lo para uma base de dados Postgres no Supabase \u00e9 o passo que torna o agente verdadeiramente robusto.<\/p>\n<h3>Eliminar vetores desatualizados<\/h3>\n<p>O ponto mais importante diz respeito \u00e0s atualiza\u00e7\u00f5es. As op\u00e7\u00f5es de vetores do n8n n\u00e3o funcionam como &#8220;upsert&#8221;: ao ser inserido de novo, um vetor existente n\u00e3o \u00e9 substitu\u00eddo, mas duplicado, porque o ID do ficheiro n\u00e3o serve de ID do vetor. Se atualizar v\u00e1rias vezes o mesmo ficheiro, acumulam-se duplicados e a qualidade das respostas sofre. A solu\u00e7\u00e3o no fluxo de trabalho: antes de cada inser\u00e7\u00e3o s\u00e3o eliminados todos os vetores cujos metadados cont\u00eam o ID do ficheiro do documento atual do Google Drive. S\u00f3 depois \u00e9 inserida a vers\u00e3o nova e atualizada. Assim mant\u00e9m-se exatamente um registo atual por documento.<\/p>\n<h2>Enquadramento para quem decide<\/h2>\n<p>A montagem apresentada \u00e9 explicitamente pensada como um ponto de partida s\u00f3lido, n\u00e3o como solu\u00e7\u00e3o final acabada. Extens\u00f5es como uma melhor pesquisa sem\u00e2ntica ou uma pesquisa adicional por palavras-chave s\u00e3o poss\u00edveis, mas ficam deliberadamente em aberto. Ainda assim, para uma primeira base de conhecimento pr\u00f3xima da produ\u00e7\u00e3o, a abordagem aguenta-se.<\/p>\n<p>Digno de nota \u00e9 o lado dos custos: segundo o v\u00eddeo, o escal\u00e3o gratuito do Supabase chega para come\u00e7ar, e a mudan\u00e7a para o plano pago s\u00f3 compensa quando se escala. Quem j\u00e1 trabalha com n8n consegue montar o agente com os seus pr\u00f3prios documentos em pouco tempo, sem encomendar desenvolvimento externo.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>O artigo mostra de forma s\u00f3bria e compreens\u00edvel como implementar um agente de IA RAG com n8n e Supabase sem programa\u00e7\u00e3o. O verdadeiro valor n\u00e3o est\u00e1 no efeito r\u00e1pido de demonstra\u00e7\u00e3o, mas em dois detalhes muitas vezes ignorados: uma mem\u00f3ria de conversa escal\u00e1vel e a remo\u00e7\u00e3o consequente de vetores desatualizados. S\u00e3o precisamente estes pontos que decidem se um agente continua utiliz\u00e1vel \u00e0 medida que a base de conhecimento cresce ou se se torna pouco fi\u00e1vel com o tempo. Quem quiser tornar documentos internos pesquis\u00e1veis recebe aqui um plano pragm\u00e1tico, que pode ser alargado passo a passo.<\/p>\n<p><strong>Fonte:<\/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>Como construir com n8n e Supabase um agente de IA RAG pronto para produ\u00e7\u00e3o, sem c\u00f3digo: base de conhecimento, pesquisa vetorial e atualiza\u00e7\u00e3o autom\u00e1tica de documentos explicadas.<\/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-2326","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-unkategorisiert"],"_links":{"self":[{"href":"https:\/\/pletzenauer.com\/pt-pt\/wp-json\/wp\/v2\/posts\/2326","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pletzenauer.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pletzenauer.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/pletzenauer.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=2326"}],"version-history":[{"count":1,"href":"https:\/\/pletzenauer.com\/pt-pt\/wp-json\/wp\/v2\/posts\/2326\/revisions"}],"predecessor-version":[{"id":2916,"href":"https:\/\/pletzenauer.com\/pt-pt\/wp-json\/wp\/v2\/posts\/2326\/revisions\/2916"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pletzenauer.com\/pt-pt\/wp-json\/wp\/v2\/media\/1506"}],"wp:attachment":[{"href":"https:\/\/pletzenauer.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=2326"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pletzenauer.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=2326"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pletzenauer.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=2326"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}