8
n8n ํ•œ๊ตญ์–ดamn8n.com

๐Ÿค– RAG, ์ œ๋ฏธ๋‹ˆ, Supabase๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ ์ „๋ฌธ๊ฐ€ ๋กœ๋ด‡ ์ƒ์„ฑ

๊ณ ๊ธ‰

์ด๊ฒƒ์€Internal Wiki, AI RAG๋ถ„์•ผ์˜์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ๋กœ, 54๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.์ฃผ๋กœ Set, Html, Filter, SplitOut, Supabase ๋“ฑ์˜ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ. ๐Ÿค– RAG, ์ œ๋ฏธ๋‹ˆ, Supabase๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ ์ „๋ฌธ๊ฐ€ ๋กœ๋ด‡ ์ƒ์„ฑ

์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ
  • โ€ขSupabase URL๊ณผ API Key
  • โ€ข๋Œ€์ƒ API์˜ ์ธ์ฆ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ
  • โ€ขGoogle Gemini API Key

์นดํ…Œ๊ณ ๋ฆฌ

์›Œํฌํ”Œ๋กœ์šฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
๋…ธ๋“œ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œ์‹œํ•˜๋ฉฐ, ํ™•๋Œ€/์ถ•์†Œ ๋ฐ ์ด๋™์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค
์›Œํฌํ”Œ๋กœ์šฐ ๋‚ด๋ณด๋‚ด๊ธฐ
๋‹ค์Œ JSON ๊ตฌ์„ฑ์„ ๋ณต์‚ฌํ•˜์—ฌ n8n์— ๊ฐ€์ ธ์˜ค๋ฉด ์ด ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
{
  "meta": {
    "instanceId": "e409ea34548a2afe2dffba31130cd1cf2e98ebe2afaeed2a63caf2a0582d1da0",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "3ebddde0-60d2-4795-9d30-ea4ea2f5b7b8",
      "name": "Simple Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        -1568,
        176
      ],
      "parameters": {},
      "typeVersion": 1.3
    },
    {
      "id": "aba5962f-3e74-401a-b23c-0a80cefd1d69",
      "name": "๊ณต์‹ n8n ๋ฌธ์„œ",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
      "position": [
        -1280,
        176
      ],
      "parameters": {
        "mode": "retrieve-as-tool",
        "topK": 10,
        "options": {},
        "tableName": {
          "__rl": true,
          "mode": "list",
          "value": "documents",
          "cachedResultName": "documents"
        },
        "toolDescription": "Get related chunks of the official n8n documentation.",
        "includeDocumentMetadata": false
      },
      "credentials": {
        "supabaseApi": {
          "id": "xGXZD7rRAPQj61k6",
          "name": "Test"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "e23e7f3b-dd4e-4dd9-83b6-aec430ade563",
      "name": "๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ๋กœ๋”",
      "type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
      "position": [
        144,
        -1328
      ],
      "parameters": {
        "options": {},
        "jsonData": "={{ $json.documentation }}",
        "jsonMode": "expressionData",
        "textSplittingMode": "custom"
      },
      "typeVersion": 1.1
    },
    {
      "id": "38f5ec35-3a90-4d5c-8b1c-ed4802292b86",
      "name": "์žฌ๊ท€์  ๋ฌธ์ž ํ…์ŠคํŠธ ๋ถ„ํ• ๊ธฐ",
      "type": "@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter",
      "position": [
        240,
        -1120
      ],
      "parameters": {
        "options": {
          "splitCode": "markdown"
        },
        "chunkSize": 1500,
        "chunkOverlap": 200
      },
      "typeVersion": 1
    },
    {
      "id": "aa5245e3-9af3-42f4-a2fd-22520bdb0add",
      "name": "์ค‘๋ณต ๋ฌธ์„œ ์ฝ˜ํ…์ธ  ์ œ๊ฑฐ",
      "type": "n8n-nodes-base.removeDuplicates",
      "position": [
        -480,
        -1552
      ],
      "parameters": {
        "options": {
          "scope": "node",
          "historySize": 10000
        },
        "operation": "removeItemsSeenInPreviousExecutions",
        "dedupeValue": "={{ $json.documentation }}"
      },
      "typeVersion": 2
    },
    {
      "id": "2e4d4cee-fc5d-4cbd-9772-751869e4dec3",
      "name": "๋ฌธ์„œ ๊ฒฝ๋กœ๋งŒ ์œ ์ง€",
      "type": "n8n-nodes-base.filter",
      "position": [
        -352,
        -2320
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "52b8b89a-30cd-4a0d-a428-e5d341bcebbf",
              "operator": {
                "type": "string",
                "operation": "endsWith"
              },
              "leftValue": "={{ $json.link }}",
              "rightValue": "/"
            },
            {
              "id": "d8019c4e-e1a1-43ec-93a8-dac3d8c083b6",
              "operator": {
                "type": "string",
                "operation": "notStartsWith"
              },
              "leftValue": "={{ $json.link }}",
              "rightValue": "https://"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "8e080adf-4d42-4337-8c80-23208936ace5",
      "name": "๋ฌธ์„œ ์ •๋ฆฌ",
      "type": "n8n-nodes-base.set",
      "position": [
        -912,
        -1552
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "5ed964a6-5200-454c-b983-f3dc7c8c7a48",
              "name": "documentation",
              "type": "string",
              "value": "={{ $json.data.replace(/([^#\\n]+)\\s*#/g, '# $1').trim().replace(/^\\s*https?:\\/\\/\\S+\\s*/, '') }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "f6ce099d-1c04-4cbc-a096-60eb92d09b6b",
      "name": "Gemini 2.5 Flash",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        -1920,
        176
      ],
      "parameters": {
        "options": {
          "temperature": 0
        }
      },
      "credentials": {
        "googlePalmApi": {
          "id": "AXawYbABK5aZbGBE",
          "name": "IA2S"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "98c0a22e-3cd3-4b54-945e-c236ff2cc75a",
      "name": "๊ท€ํ•˜์˜ Supabase ๋ฒกํ„ฐ ์ €์žฅ์†Œ",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
      "position": [
        32,
        -1552
      ],
      "parameters": {
        "mode": "insert",
        "options": {},
        "tableName": {
          "__rl": true,
          "mode": "list",
          "value": "documents",
          "cachedResultName": "documents"
        },
        "embeddingBatchSize": 30
      },
      "credentials": {
        "supabaseApi": {
          "id": "xGXZD7rRAPQj61k6",
          "name": "Test"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "016eb60c-0a44-4e4c-8dfd-9588a7df8bbd",
      "name": "๋ชจ๋“  n8n ๋ฌธ์„œ ๋งํฌ ๊ฐ€์ ธ์˜ค๊ธฐ",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1504,
        -2320
      ],
      "parameters": {
        "url": "https://docs.n8n.io/",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "485201fb-5711-48c3-8b18-f1637c1f800b",
      "name": "HTML์—์„œ ๋งํฌ ์ถ”์ถœ",
      "type": "n8n-nodes-base.html",
      "position": [
        -1216,
        -2320
      ],
      "parameters": {
        "options": {},
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "links",
              "attribute": "href",
              "cssSelector": "a",
              "returnArray": true,
              "returnValue": "attribute"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "02fa5563-c75a-48c1-a25c-afac49ff0a02",
      "name": "๋งํฌ ๋ถ„๋ฆฌ",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -880,
        -2320
      ],
      "parameters": {
        "options": {
          "destinationFieldName": "link"
        },
        "fieldToSplitOut": "links"
      },
      "typeVersion": 1
    },
    {
      "id": "8f9e9ec1-2aee-462a-a4e8-aecd17051ec7",
      "name": "์ค‘๋ณต ๋งํฌ ์ œ๊ฑฐ",
      "type": "n8n-nodes-base.removeDuplicates",
      "position": [
        -576,
        -2320
      ],
      "parameters": {
        "compare": "selectedFields",
        "options": {},
        "fieldsToCompare": "link"
      },
      "typeVersion": 2
    },
    {
      "id": "bfa68912-7ae6-49bf-9ee9-8300e2d7486b",
      "name": "๋ฒกํ„ฐ ์ €์žฅ์†Œ์— ๋ฌธ์„œ ํŽ˜์ด์ง€ ์ถ”๊ฐ€",
      "type": "n8n-nodes-base.executeWorkflow",
      "position": [
        160,
        -2288
      ],
      "parameters": {
        "options": {
          "waitForSubWorkflow": true
        },
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $workflow.id }}"
        },
        "workflowInputs": {
          "value": {
            "path": "={{ $json.link }}"
          },
          "schema": [
            {
              "id": "path",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "path",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "data"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": true
        }
      },
      "typeVersion": 1.2,
      "alwaysOutputData": true
    },
    {
      "id": "63a9e1df-b803-435a-b4f1-6f5fef329366",
      "name": "๋ฌธ์„œ ํŽ˜์ด์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueErrorOutput",
      "position": [
        -1440,
        -1552
      ],
      "parameters": {
        "url": "=https://docs.n8n.io/{{ $('Ingest Web Page').last().json.path }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "67227b76-3f85-47e7-9ccb-841270671190",
      "name": "๋ฌธ์„œ ์ฝ˜ํ…์ธ  ์ถ”์ถœ",
      "type": "n8n-nodes-base.html",
      "position": [
        -1136,
        -1552
      ],
      "parameters": {
        "options": {},
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "data",
              "cssSelector": "article",
              "skipSelectors": "img, footer, form"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "083db456-864c-4015-a11e-06291d837011",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2992,
        -1968
      ],
      "parameters": {
        "color": 7,
        "width": 760,
        "height": 752,
        "content": "-- Enable the pgvector extension to work with embedding vectors (REMOVE THIS LINE IF ALREADY ENABLED)\ncreate extension vector;\n\n-- Create a table to store your documents\ncreate table documents (\n  id bigserial primary key,\n  content text, -- corresponds to Document.pageContent\n  metadata jsonb, -- corresponds to Document.metadata\n  embedding vector(768) -- 768 works for Gemini embeddings, CHANGE IF OPENAI EMBEDDINGS\n);\n\n-- Create a function to search for documents\ncreate function match_documents (\n  query_embedding vector(1536),\n  match_count int default null,\n  filter jsonb DEFAULT '{}'\n) returns table (\n  id bigint,\n  content text,\n  metadata jsonb,\n  similarity float\n)\nlanguage plpgsql\nas $$\n#variable_conflict use_column\nbegin\n  return query\n  select\n    id,\n    content,\n    metadata,\n    1 - (documents.embedding <=> query_embedding) as similarity\n  from documents\n  where metadata @> filter\n  order by documents.embedding <=> query_embedding\n  limit match_count;\nend;\n$$;"
      },
      "typeVersion": 1
    },
    {
      "id": "786cf7df-251d-487c-a243-d84d255c7f2d",
      "name": "Gemini ์ฟผ๋ฆฌ ์ž„๋ฒ ๋”ฉ",
      "type": "@n8n/n8n-nodes-langchain.embeddingsGoogleGemini",
      "position": [
        -1200,
        368
      ],
      "parameters": {},
      "credentials": {
        "googlePalmApi": {
          "id": "AXawYbABK5aZbGBE",
          "name": "IA2S"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d100e805-fe39-42b7-9a6f-fb65e35c3714",
      "name": "Gemini ์ฒญํฌ ์ž„๋ฒ ๋”ฉ",
      "type": "@n8n/n8n-nodes-langchain.embeddingsGoogleGemini",
      "position": [
        16,
        -1328
      ],
      "parameters": {},
      "credentials": {
        "googlePalmApi": {
          "id": "AXawYbABK5aZbGBE",
          "name": "IA2S"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "abc78ac4-14be-4782-b4d0-ea36fae67d7a",
      "name": "Supabase ์ธ์Šคํ„ด์Šค ํ™œ์„ฑ ์ƒํƒœ ์œ ์ง€",
      "type": "n8n-nodes-base.supabase",
      "position": [
        -544,
        -672
      ],
      "parameters": {
        "limit": 1,
        "tableId": "documents",
        "operation": "getAll"
      },
      "credentials": {
        "supabaseApi": {
          "id": "xGXZD7rRAPQj61k6",
          "name": "Test"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "47045d86-4a1a-4dd7-a08e-c2f36579487e",
      "name": "6์ผ๋งˆ๋‹ค",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -768,
        -672
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "daysInterval": 6
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "f8943741-1643-4d14-b4a8-4fb40fdec37c",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2096,
        -2672
      ],
      "parameters": {
        "color": 7,
        "width": 2640,
        "height": 1760,
        "content": "## Part 1: Building the Knowledge Base (The Library)\n\n**Goal:** To read all n8n documentation, break it into small pieces, and store it in our Supabase database.\n**Action:** You only need to run this part **ONCE** by clicking the \"Execute workflow\" button on the top-left trigger.\n**Time:** This will take several minutes to complete (~15 to 20)."
      },
      "typeVersion": 1
    },
    {
      "id": "0c167669-c80c-443b-887f-479bb42297aa",
      "name": "๋ฌธ์„œ ํŽ˜์ด์ง€ ์ˆœํ™˜ ์ฒ˜๋ฆฌ",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -64,
        -2320
      ],
      "parameters": {
        "options": {},
        "batchSize": 10
      },
      "typeVersion": 3
    },
    {
      "id": "375673d7-bde0-41fd-b5fe-c7952a9c6b3e",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3056,
        -2992
      ],
      "parameters": {
        "color": 6,
        "width": 1064,
        "height": 296,
        "content": "# Tutorial: Build an AI Expert with RAG\n\nWelcome! This workflow teaches you **RAG (Retrieval-Augmented Generation)**.\n\n**The Goal:** To create an AI chatbot that is an expert on a specific topic (the n8n docs) and *never* makes up answers.\n\n**It has two parts:**\n1.  **TOP FLOW (Indexing):** You run this once manually to build the AI's knowledge base. It reads the n8n docs and stores them in a Supabase database.\n2.  **BOTTOM FLOW (Chat):** This is the live chatbot. It retrieves relevant info from the knowledge base to answer your questions accurately."
      },
      "typeVersion": 1
    },
    {
      "id": "c7b031e5-22b0-445e-80c3-9ff97d602185",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3056,
        -2672
      ],
      "parameters": {
        "color": 7,
        "width": 924,
        "height": 3228,
        "content": "# Workflow Setup"
      },
      "typeVersion": 1
    },
    {
      "id": "5e9cffe8-6fb3-4cda-9158-989182b24e0f",
      "name": "n8n ๋ฌธ์„œ AI ์—์ด์ „ํŠธ",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -1552,
        -416
      ],
      "parameters": {
        "options": {
          "systemMessage": "=<role>\nYou are a specialized AI assistant, an expert in n8n's official documentation. Your sole mission is to help users by providing accurate and factual information extracted exclusively from this documentation. You are meticulous, factual, and never deviate from your knowledge scope.\n</role>\n\n<instructions>\n<goal>\nYour primary goal is to provide precise and factual answers to user questions about the n8n automation platform, based **exclusively** on the excerpts from the official documentation provided in the context.\n</goal>\n\n<context>\nYou operate according to a RAG (Retrieval-Augmented Generation) model. For each user question, use the appropriate tool to retrieve the necessary information from the n8n documentation's vector database.\n\n**Mandatory rules:**\n\n1.  **Single source of truth:** Your answer MUST be entirely and solely derived from the information present in the provided documentation.\n2.  **Accuracy and implicit citation:** Base your answer as literally as possible on the documentation text. Rephrase for clarity and conciseness, but do not add any information not found there. Act as if the documentation is your only knowledge in the world.\n3.  **Do not mention the process:** Never mention your tool or the fact that you are a RAG system in your answer to the user. Respond as an expert who directly consults their documentation.\n</context>\n\n<output_format>\n*   **Clarity:** Provide a clear, concise, and direct answer.\n*   **Structuring:** If the context contains steps, lists, or code examples, use Markdown syntax to format them legibly (bullet points, numbered lists, code blocks for code snippets, JSON, etc.).\n*   **Tone:** Adopt a professional, helpful, and confident tone, that of a technical n8n expert.\n</output_format>\n</instructions>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "8f29b4a7-e57a-40db-b6e3-4e6fb93a5588",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1600,
        -2528
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 400,
        "content": "### Step 1.1: Find All the 'Books'\n\n**What it does:** This node visits the main n8n documentation page.\n**Analogy:** We're asking the library's front desk for a complete list of every single book they have."
      },
      "typeVersion": 1
    },
    {
      "id": "82c46efb-6daa-47fa-a969-ecfe5cb44664",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1296,
        -2528
      ],
      "parameters": {
        "color": 7,
        "width": 272,
        "height": 400,
        "content": "### Step 1.2: Read the List of Books\n\n**What it does:** It takes the HTML from the previous step and extracts every single link (`<a>` tag).\n**Analogy:** We're reading the list from the front desk and pulling out just the titles of the books (the links)."
      },
      "typeVersion": 1
    },
    {
      "id": "bf3677a9-6520-48bc-9b6b-d5f4ed6f31ea",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1008,
        -2528
      ],
      "parameters": {
        "color": 7,
        "width": 336,
        "height": 400,
        "content": "### Step 1.3: Process One Book at a Time\n\n**What it does:** It takes the big list of links and turns each link into a separate item for n8n to process.\n**Analogy:** Instead of trying to read all the books at once, we're creating a separate to-do item for each book."
      },
      "typeVersion": 1
    },
    {
      "id": "ef8a70e0-98b3-46dc-ae8c-a349de35a511",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -656,
        -2528
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 400,
        "content": "### Step 1.4: Tidy Up the To-Do List\n\n**What it does:** First, it removes any duplicate links. Then, it filters out any links that don't point to an actual documentation page (e.g., links to the homepage or external sites).\n**Analogy:** We're throwing away duplicate to-do items and any notes that aren't actually books."
      },
      "typeVersion": 1
    },
    {
      "id": "e20c2189-fe6f-4dfb-8c31-27420545574c",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -160,
        -2528
      ],
      "parameters": {
        "color": 4,
        "width": 512,
        "height": 464,
        "content": "### Step 1.5: The Librarian's Reading Loop\n\n**What it does:** This is the engine of the indexing process. It takes our clean list of pages and processes them one by one. The `Execute Workflow` node calls the \"sub-workflow\" below for each and every page.\n**Analogy:** This loop tells our librarian to pick up one book (link) at a time and go through the full process of reading and indexing it."
      },
      "typeVersion": 1
    },
    {
      "id": "af9c5996-e427-4feb-ab2d-87da254b6e9e",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1536,
        -1760
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 384,
        "content": "### Step 1.5.1: Read a Single Page\n\n**What it does:** This node takes a single URL from the loop and fetches the HTML content of that page.\n**Analogy:** The librarian opens one book to the first page."
      },
      "typeVersion": 1
    },
    {
      "id": "9066ac34-850f-4323-9865-467c3a96d3c8",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2064,
        -1904
      ],
      "parameters": {
        "color": 5,
        "width": 512,
        "height": 528,
        "content": "### Why Use a Sub-Workflow?\n\nThe main reason is **memory management**.\n\nProcessing a single web page, especially creating vector embeddings for all its chunks, uses a lot of memory (RAM). The n8n documentation has over 1,000 pages. If we tried to process all of them in a single, linear run, the memory usage would build up with each page and would likely crash your n8n instance.\n\nWhen a sub-workflow finishes its run for one item (one page), n8n **clears out the memory** (RAM) it used before starting the next one.\n\nBy using a sub-workflow, we process pages one-by-one in a memory-efficient loop, making the entire indexing process stable and reliable, even on a massive scale."
      },
      "typeVersion": 1
    },
    {
      "id": "5b11db96-f3c7-4555-952c-88001d25a544",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1232,
        -1760
      ],
      "parameters": {
        "color": 7,
        "width": 512,
        "height": 384,
        "content": "### Step 1.5.2: Get the Good Stuff\n\n**What it does:** It extracts only the main text from the article on the page, ignoring menus, footers, and images. Then, it cleans up the formatting.\n**Analogy:** The librarian tears out only the useful pages from the book and cleans up any smudges or messy handwriting."
      },
      "typeVersion": 1
    },
    {
      "id": "af202cd5-c63b-47d1-9b6b-4713e606eed1",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -704,
        -1984
      ],
      "parameters": {
        "color": 5,
        "width": 544,
        "height": 608,
        "content": "### Step 1.5.3: Avoid Re-reading\n\n**What it does:** It checks if we have already processed this exact page content in a previous run. If so, it stops here to save time and resources.\n**Analogy:** The librarian checks their \"already read\" pile to avoid reading the same book twice.\n\n**A Powerful Feature Explained:**\n\nUsually, the \"Remove Duplicates\" node only looks at the items in the *current* execution. But here, it's set to **\"Remove items seen in previous executions.\"**\n\nThis is incredibly powerful in a sub-workflow. Even though our sub-workflow only sees one page at a time, this node has a long-term memory. It remembers every single page it has *ever* processed across all previous runs.\n\nThis makes the workflow robust. You can run the indexing process again and again to update the knowledge base with new documentation, and it will never waste resources re-processing old pages and more importantly, it won't create duplicate chunks in Supabase."
      },
      "typeVersion": 1
    },
    {
      "id": "7daf22ac-ef30-41c8-a083-24c955aa2204",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ15",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -144,
        -1984
      ],
      "parameters": {
        "color": 6,
        "width": 656,
        "height": 1040,
        "content": "### Step 1.5.4: Create & Store the 'Magic Index Cards'\n\nThis is the most important step of indexing!\n\n1.  **`Recursive Character Text Splitter`:** The text is broken down into small, overlapping paragraphs (\"chunks\").\n    *   **Analogy:** The librarian breaks the book down into small, meaningful paragraphs. This is vital for finding very specific answers later.\n\n2.  **`Gemini Chunk Embedding`:** An AI model converts each chunk of text into a list of numbers (a \"vector\" or \"embedding\").\n    *   **Analogy:** The librarian uses a 'magic pen' to turn each paragraph into a unique set of numbers. Paragraphs with similar meanings get similar numbers.\n\n3.  **`Your Supabase Vector Store (Insert)`:** The original text chunk and its new vector are saved together in your Supabase database.\n    *   **Analogy:** The librarian files the original paragraph along with its magic number on an index card and puts it in a special filing cabinet (your Supabase vector store)."
      },
      "typeVersion": 1
    },
    {
      "id": "ce866531-215a-4c7c-b101-bf0d597a2938",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2096,
        -880
      ],
      "parameters": {
        "color": 7,
        "width": 1200,
        "height": 1440,
        "content": "## Part 2: The Chatbot (Talking to the Expert Librarian)\n\n**Goal:** To provide an interface where a user can ask a question, have the system find relevant information from the knowledge base, and get an accurate, AI-generated answer.\n**Action:** After running the Indexing flow, **Activate** this workflow. Then, open the `When chat message received` node and use its Public URL to chat."
      },
      "typeVersion": 1
    },
    {
      "id": "12d9065c-a020-42ef-add0-3750120f03e0",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ17",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2064,
        -720
      ],
      "parameters": {
        "color": 4,
        "width": 368,
        "height": 448,
        "content": "### The Front Desk: Ask Your Question Here\n\n**What it does:** This is the public-facing chat interface. When you send a message here, the entire RAG process begins.\n\n**Action:**\n1.  **Activate** the entire workflow.\n2.  To test directly inside n8n, click the **\"Open Chat\"** button in this node's parameter panel.\n3.  To chat publicly, copy the **Public URL** from this node and open it in a new browser tab."
      },
      "typeVersion": 1
    },
    {
      "id": "56c158b8-f24e-4500-ae12-b5d8fa4911f0",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ18",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1680,
        -608
      ],
      "parameters": {
        "color": 5,
        "width": 560,
        "height": 400,
        "content": "### The Brains: The Expert Librarian\n\n**What it does:** This is the AI agent that orchestrates the entire response. It understands your question, decides which tools to use, and formulates the final answer.\n**System Prompt:** Its instructions (in the System Message) are very strict: **\"Only use the provided documents to answer. Do not make things up.\"**"
      },
      "typeVersion": 1
    },
    {
      "id": "7b62be1a-4a5d-4f86-b7d0-a0f7a63a331e",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ19",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2064,
        -256
      ],
      "parameters": {
        "color": 7,
        "width": 368,
        "height": 576,
        "content": "### The 'Synthesizer' & 'Strategist'\n\n**What it does:** This is the Large Language Model (LLM). It has two critical jobs:\n\n1.  **The Strategist:** Based on your question and the conversation history, it decides *what information to look for* in the knowledge base (the library).\n2.  **The Synthesizer:** After getting the relevant documents, it generates the final, human-readable answer based *only* on that context.\n\n\n**Analogy:** This is the part of the librarian's brain that first decides which section of the library to search, and then reads the specific index cards to write a clear, helpful response.\n\nThe model used here is **Gemini 2.5 Flash**."
      },
      "typeVersion": 1
    },
    {
      "id": "92d49e02-306b-4a45-a47e-bb8c7b072408",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ20",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1680,
        -192
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 512,
        "content": "### Short-Term Memory\n\n**What it does:** This node stores the last few messages of your conversation.\n**Analogy:** This helps the librarian remember what you just talked about, so you can ask follow-up questions without having to repeat yourself."
      },
      "typeVersion": 1
    },
    {
      "id": "9fd0fb04-0b06-4696-8091-accc863d992a",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ21",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1376,
        -192
      ],
      "parameters": {
        "color": 6,
        "width": 448,
        "height": 720,
        "content": "### The Tool: The 'Magic Filing Cabinet' Retriever\n\nThis is the \"Retrieval\" part of RAG. When the agent gets your question, it uses this tool to find the most relevant information.\n\n1.  **`Gemini Query Embedding`:** Your question is converted into its own 'magic number' (vector of 768 dimensions).\n\n2.  **`Vector Store (Retrieve)`:** It searches the Supabase database for the stored document chunks with the most similar 'magic numbers' to your question's number.\n\n\n**Analogy:** The librarian takes your question, finds the most relevant index cards from the filing cabinet, and hands them over to the 'Synthesizer' to formulate the answer."
      },
      "typeVersion": 1
    },
    {
      "id": "9c92ee43-46f0-49ac-a269-11b7b87ea3d2",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ22",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -864,
        -880
      ],
      "parameters": {
        "color": 7,
        "width": 544,
        "height": 416,
        "content": "## Optional: Keep the Database Awake\n\n**What it does:** Free Supabase projects \"go to sleep\" after a week of inactivity. This scheduled trigger runs a tiny query every 6 days to keep your database awake and ready.\n**Action:** You can delete this if you have a paid Supabase plan or a self-hosted instance."
      },
      "typeVersion": 1
    },
    {
      "id": "260b4e38-5fa1-44ef-a233-6d322201b47a",
      "name": "์ธ๋ฑ์‹ฑ ์‹œ์ž‘",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1744,
        -2320
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "40b2b853-31fd-4961-9b0f-6927d518a833",
      "name": "RAG ์ฑ—๋ด‡",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        -1904,
        -416
      ],
      "webhookId": "e80f40f5-f8dc-4d0e-9ce5-594c61d233df",
      "parameters": {
        "public": true,
        "options": {
          "title": "",
          "subtitle": "",
          "customCss": "/* === THEME OVERRIDE: n8n Glass & Glow (Revised) === */\n\n/*\n  This theme is built upon the default n8n chat CSS variables.\n  We'll use your desired branding and layout, and then add\n  the \"glass\" effect using a semi-transparent background\n  and a backdrop-filter on the main window class.\n*/\n\n:root {\n  /* --- 1. CORE BRANDING & FONTS --- */\n  /* Your choices for font and primary color are applied here. */\n  --chat--font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n  --chat--color-primary: #EA4B71; /* n8n Red */\n  --chat--color-primary-shade-50: #D93A60;\n  --chat--color-primary-shade-100: #C82A50;\n  --chat--color-secondary: #20b69e; /* Kept default secondary for things like file uploads */\n  --chat--color-secondary-shade-50: #1ca08a;\n  --chat--color-white: #ffffff;\n  --chat--color-light: #f2f4f8;\n  --chat--color-dark: #1F2937; /* Darker, more modern text color */\n  --chat--color-disabled: #9CA3AF;\n  --chat--color-typing: #404040;\n\n  /* --- 2. WINDOW & LAYOUT --- */\n  /* Your dimensions and rounded corners. The actual glass effect is handled in the class override below. */\n  --chat--window--width: 430px;\n  --chat--window--height: 80vh;\n  --chat--window--border-radius: 16px;\n  --chat--window--border: 1px solid rgba(255, 255, 255, 0.3);\n  --chat--spacing: 1rem; /* 16px base spacing */\n  --chat--window--z-index: 9999;\n  --chat--window--bottom: var(--chat--spacing);\n  --chat--window--right: var(--chat--spacing);\n  --chat--window--margin-bottom: var(--chat--spacing);\n\n  /* --- 3. GLASSMORPHISM BACKGROUNDS --- */\n  /* We make the main sections transparent to let the glass window show through. */\n  --chat--header--background: transparent;\n  --chat--body--background: transparent;\n  --chat--footer--background: transparent;\n\n  /* --- 4. HEADER STYLING (REMOVED) --- */\n  /* The header is removed by setting its height, padding, and border to 0/none. */\n  --chat--header-height: 0;\n  --chat--header--padding: 0;\n  --chat--header--border-bottom: none;\n  /* The rest of the header variables are now irrelevant. */\n  --chat--header--color: var(--chat--color-dark);\n  --chat--heading--font-size: 1.5rem;\n  --chat--subtitle--font-size: 0.875rem;\n  --chat--subtitle--line-height: 1.4;\n  --chat--close--button--color-hover: var(--chat--color-primary);\n\n  /* --- 5. MESSAGE BUBBLES --- */\n  --chat--message--font-size: 0.875rem;\n  --chat--message--padding: 12px 16px;\n  --chat--message--border-radius: 12px;\n  --chat--message-line-height: 1.6;\n  --chat--message--margin-bottom: calc(var(--chat--spacing) * 0.75);\n  /* Adjusted padding: Top is 0, sides and bottom use the base spacing. */\n  --chat--messages-list--padding: 0 var(--chat--spacing) var(--chat--spacing);\n  --chat--message--bot--background: var(--chat--color-white);\n  --chat--message--bot--color: #111827;\n  --chat--message--bot--border: none;\n  --chat--message--user--background: var(--chat--color-primary);\n  --chat--message--user--color: var(--chat--color-white);\n  --chat--message--user--border: none;\n\n  /* --- 6. INPUT AREA --- */\n  --chat--textarea--height: 50px;\n  --chat--textarea--max-height: 10rem;\n  --chat--input--font-size: 0.9rem;\n  --chat--input--border: 0;\n  --chat--input--border-radius: 12px; /* Rounded input field */\n  --chat--input--padding: 12px 16px;\n  --chat--input--background: rgba(255, 255, 255, 0.5); /* Semi-transparent input */\n  --chat--input--text-color: #111827;\n  --chat--input--line-height: 1.5;\n  --chat--input--border-active: 0;\n\n  /* --- 7. SEND & FILE BUTTONS --- */\n  --chat--input--send--button--background: transparent;\n  --chat--input--send--button--color: var(--chat--color-primary);\n  --chat--input--send--button--background-hover: transparent;\n  --chat--input--send--button--color-hover: var(--chat--color-primary-shade-50);\n  --chat--input--file--button--background: transparent;\n  --chat--input--file--button--color: var(--chat--color-secondary);\n  --chat--input--file--button--background-hover: transparent;\n  --chat--input--file--button--color-hover: var(--chat--color-secondary-shade-50);\n\n  /* --- 8. TOGGLE BUTTON & OTHERS --- */\n  /* Using your primary brand color for the main toggle button */\n  --chat--toggle--size: 64px;\n  --chat--toggle--width: var(--chat--toggle--size);\n  --chat--toggle--height: var(--chat--toggle--size);\n  --chat--toggle--border-radius: 50%;\n  --chat--toggle--background: var(--chat--color-primary);\n  --chat--toggle--hover--background: var(--chat--color-primary-shade-50);\n  --chat--toggle--active--background: var(--chat--color-primary-shade-100);\n  --chat--toggle--color: var(--chat--color-white);\n}\n\n/* === CLASS OVERRIDES === */\n/*\n  These are essential for effects that CSS variables can't control,\n  like the glass blur, shadows, and max-height.\n*/\n\n.chat-window {\n  /* This is the magic for the glass effect! */\n  background-color: rgba(249, 243, 245, 0.6); /* A semi-transparent background color */\n  backdrop-filter: blur(20px);\n  -webkit-backdrop-filter: blur(20px); /* For Safari compatibility */\n\n  /* A subtle shadow helps lift the window off the page */\n  box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.1);\n\n  /* Here we apply the max-height you wanted */\n  max-height: 750px;\n}\n\n/* Add top margin to the first message only for initial spacing */\n.chat-messages-list .chat-message:first-child {\n  margin-top: var(--chat--spacing);\n}\n\n/* Make user messages slightly wider for better balance */\n.chat-message.is-user {\n\tmax-width: 70%;\n}\n\n.chat-message.is-bot {\n\tmax-width: 80%;\n}\n\n/* Add a subtle glow to messages on hover */\n.chat-message {\n    transition: transform 0.2s ease, box-shadow 0.2s ease;\n}\n.chat-message:hover {\n    transform: translateY(-2px);\n    box-shadow: 0 0 25px 0 rgba(234, 75, 113, 0.2);\n}\n\n/* === PAGE BACKGROUND === */\n/* Your dotted background to simulate the n8n canvas. Perfect as is! */\nbody {\n    background-color: #FDFBFF;\n    background-image:\n        radial-gradient(circle at 1px 1px, rgba(0,0,0,0.07) 1px, transparent 0),\n        linear-gradient(135deg, #F9F3F5 0%, #EFF3FB 100%);\n    background-size: 25px 25px, 100% 100%;\n}",
          "inputPlaceholder": "Type your n8n related question.."
        },
        "initialMessages": "Hello! I'm an AI assistant trained on the official n8n documentation.\nYou can ask me anything about n8n nodes, workflows, or concepts. For example:\n\"How does the IF node work?\"\n\"What is a sub-workflow?\""
      },
      "typeVersion": 1.1
    },
    {
      "id": "f475e7ae-b914-40c1-b196-ee6df3ecd84d",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ25",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3024,
        -2592
      ],
      "parameters": {
        "width": 704,
        "height": 256,
        "content": "## Setup Step 1: Create Your Supabase Project\n\nFirst, we need to create the \"library\" where your AI's knowledge will be stored.\n\n**Action:**\n1.  Go to [supabase.com](https://supabase.com/) and sign up for a free account.\n2.  Create a **New Project**. Give it a name (e.g., \"n8n-rag-tutorial\") and generate a secure password.\n\n\nYou now have an empty database ready to be configured."
      },
      "typeVersion": 1
    },
    {
      "id": "6c5f1753-2fc6-47cb-9552-28752075bc68",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ26",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3024,
        -2320
      ],
      "parameters": {
        "width": 832,
        "height": 1136,
        "content": "## Setup Step 2: Prepare the Database (SQL)\n\nNow we need to build the \"shelves\" and \"card catalog system\" for our library.\n\n**Action:**\n1.  In your Supabase project, go to the **SQL Editor**.\n2.  Find the other large sticky note on this canvas that contains the SQL code.\n3.  **Copy the entire SQL code** and paste it into the Supabase SQL Editor, then click **\"RUN\"**.\n\n\n**โš ๏ธ IMPORTANT:**\n*   If you get an error that the `pgvector` extension already exists, simply delete the first line of the code (`create extension vector;`) and run it again.\n*   This script is configured for **Gemini embeddings (dimension 768)**. If you plan to use an OpenAI model like `text-embedding-3-small`, you **MUST** change the vector dimension in the script from `vector(768)` to `vector(1536)`."
      },
      "typeVersion": 1
    },
    {
      "id": "ba6acba9-dd65-4b99-8300-fcbd60ddde22",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3024,
        208
      ],
      "parameters": {
        "width": 624,
        "height": 320,
        "content": "## Setup Step 7: Chat with Your Expert!\n\nCongratulations, the library is built! Now it's time to ask the expert librarian a question.\n\n**Action:**\n1.  **Activate** the entire workflow using the toggle switch at the top of the screen.\n2.  Open the **`RAG Chatbot`** chat trigger node (bottom-left).\n3.  To chat:\n    *   Copy its **Public URL** and open it in a new browser tab.\n    *   OR, click the **\"Open Chat\"** button in the node's panel to test it directly inside n8n.\n\n\n**Try asking:** \"How does the IF node work?\" or \"What is a sub-workflow?\""
      },
      "typeVersion": 1
    },
    {
      "id": "8f6e4c78-16b3-445f-bfdc-d1ffe3b48977",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ23",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3024,
        -1168
      ],
      "parameters": {
        "width": 720,
        "height": 272,
        "content": "## Setup Step 3: Get Your Supabase Keys\n\nTo let n8n access your new library, we need the keys.\n\n**Action:**\n1.  Go to **Project Settings > API**.\n2.  Find the **Project URL**. Copy it.\n3.  Find the **Project API Keys** section. Copy the key under the `service_role` (it's the long, secret one).\n\n\nKeep these two values ready for the next step. They are your library's address and master key."
      },
      "typeVersion": 1
    },
    {
      "id": "9c7c7005-a3f8-4608-950b-514812330059",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ24",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3024,
        -880
      ],
      "parameters": {
        "width": 656,
        "height": 400,
        "content": "## Setup Step 4: Connect Your Credentials\n\nNow, let's save those keys securely in n8n without leaving the workflow.\n\n**Action for Supabase:**\n1.  Go to the **`Your Supabase Vector Store`** node on the canvas.\n2.  Click the **Credential** dropdown and select **`+ Create New Credential`**.\n3.  In the window that opens:\n    *   Paste your **Project URL** into the `Host` field.\n    *   Paste your **Service Role Key** into the `API Key` field.\n4.  Click **Save**. Your new credential will be created and automatically selected for this node.\n\n**Action for Google AI:**\n1.  Go to the **`Gemini 2.5 Flash`** node.\n2.  Click the **Credential** dropdown and select **`+ Create New Credential`**.\n3.  Paste your **Gemini API key** and click **Save**."
      },
      "typeVersion": 1
    },
    {
      "id": "57a07053-e02c-42b3-9876-73ca3fb0a322",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ27",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3024,
        -464
      ],
      "parameters": {
        "width": 864,
        "height": 368,
        "content": "## Setup Step 5: Select Credentials for Other Nodes\n\nYour new credentials are now saved. Let's make sure all the other nodes are using them.\n\n**Action:**\nGo to the remaining Supabase and Gemini nodes. Your new credentials will now be available in their **Credential** dropdown lists. Simply select the correct one for each.\n\n**Select your Supabase credential for:**\n*   `Official n8n Documentation`\n*   `Keep Supabase Instance Alive`\n\n**Select your Google AI credential for:**\n*   `Gemini Chunk Embedding`\n*   `Gemini Query Embedding`"
      },
      "typeVersion": 1
    },
    {
      "id": "42a7ac88-c575-463a-8f7e-130106a2478f",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ28",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3024,
        -80
      ],
      "parameters": {
        "width": 784,
        "height": 272,
        "content": "## Setup Step 6: Build the Knowledge Base (Indexing)\n\nThis is the big one-time step where the \"librarian\" reads all the books.\n\n**Action:**\n1.  Find the **`Start Indexing`** manual trigger node at the top-left of the canvas.\n2.  Click its **\"Execute workflow\"** button.\n\n\n**โš ๏ธ Be Patient!** This process will take **15-20 minutes** to scrape, process, and store the entire n8n documentation. Let it run until it completes successfully. You only need to do this once."
      },
      "typeVersion": 1
    },
    {
      "id": "a3de3ea5-e159-4792-8c6e-261a6d478e1e",
      "name": "์›น ํŽ˜์ด์ง€ ์ˆ˜์ง‘",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "position": [
        -1744,
        -1552
      ],
      "parameters": {
        "workflowInputs": {
          "values": [
            {
              "name": "path",
              "type": "any"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "a778973f-24a1-40df-83e3-36e77acd1ed3",
      "name": "์Šคํ‹ฐ์ปค ๋…ธํŠธ29",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -864,
        -432
      ],
      "parameters": {
        "color": 3,
        "width": 544,
        "height": 768,
        "content": "## Was this helpful? Let me know!\n\nI really hope this template helped you understand RAG better. Your feedback is incredibly valuable and helps me create better resources for the n8n community.\n\n### **Share Your Thoughts & Ideas**\n\nWhether you have a suggestion, found a typo, or just want to say thanks, I'd love to hear from you!\nHere's a simple n8n form built for this purpose:\n\n#### โžก๏ธ **[Click here to give feedback](https://api.ia2s.app/form/templates/feedback?template=n8n%20RAG)**\n\n### **Ready to Build Something Great?**\n\nIf you're looking to take your n8n skills or business automation to the next level, I can help.\n\n**๐ŸŽ“ n8n Coaching:** Want to become an n8n pro? I offer one-on-one coaching sessions to help you master workflows, tackle specific problems, and build with confidence.\n#### โžก๏ธ **[Book a Coaching Session](https://api.ia2s.app/form/templates/coaching?template=n8n%20RAG)**\n\n**๐Ÿ’ผ n8n Consulting:** Have a complex project, an integration challenge, or need a custom workflow built for your business? Let's work together to create a powerful automation solution.\n#### โžก๏ธ **[Inquire About Consulting Services](https://api.ia2s.app/form/templates/consulting?template=n8n%20RAG)**\n\n---\n\nHappy Automating!\nLucas Peyrin"
      },
      "typeVersion": 1
    }
  ],
  "pinData": {
    "Ingest Web Page": [
      {
        "path": "integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"
      }
    ]
  },
  "connections": {
    "40b2b853-31fd-4961-9b0f-6927d518a833": {
      "main": [
        [
          {
            "node": "5e9cffe8-6fb3-4cda-9158-989182b24e0f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "47045d86-4a1a-4dd7-a08e-c2f36579487e": {
      "main": [
        [
          {
            "node": "abc78ac4-14be-4782-b4d0-ea36fae67d7a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3ebddde0-60d2-4795-9d30-ea4ea2f5b7b8": {
      "ai_memory": [
        [
          {
            "node": "5e9cffe8-6fb3-4cda-9158-989182b24e0f",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "260b4e38-5fa1-44ef-a233-6d322201b47a": {
      "main": [
        [
          {
            "node": "016eb60c-0a44-4e4c-8dfd-9588a7df8bbd",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a3de3ea5-e159-4792-8c6e-261a6d478e1e": {
      "main": [
        [
          {
            "node": "63a9e1df-b803-435a-b4f1-6f5fef329366",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "02fa5563-c75a-48c1-a25c-afac49ff0a02": {
      "main": [
        [
          {
            "node": "8f9e9ec1-2aee-462a-a4e8-aecd17051ec7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f6ce099d-1c04-4cbc-a096-60eb92d09b6b": {
      "ai_languageModel": [
        [
          {
            "node": "5e9cffe8-6fb3-4cda-9158-989182b24e0f",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "8e080adf-4d42-4337-8c80-23208936ace5": {
      "main": [
        [
          {
            "node": "aa5245e3-9af3-42f4-a2fd-22520bdb0add",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e23e7f3b-dd4e-4dd9-83b6-aec430ade563": {
      "ai_document": [
        [
          {
            "node": "98c0a22e-3cd3-4b54-945e-c236ff2cc75a",
            "type": "ai_document",
            "index": 0
          }
        ]
      ]
    },
    "2e4d4cee-fc5d-4cbd-9772-751869e4dec3": {
      "main": [
        [
          {
            "node": "0c167669-c80c-443b-887f-479bb42297aa",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d100e805-fe39-42b7-9a6f-fb65e35c3714": {
      "ai_embedding": [
        [
          {
            "node": "98c0a22e-3cd3-4b54-945e-c236ff2cc75a",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "786cf7df-251d-487c-a243-d84d255c7f2d": {
      "ai_embedding": [
        [
          {
            "node": "aba5962f-3e74-401a-b23c-0a80cefd1d69",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "63a9e1df-b803-435a-b4f1-6f5fef329366": {
      "main": [
        [
          {
            "node": "67227b76-3f85-47e7-9ccb-841270671190",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8f9e9ec1-2aee-462a-a4e8-aecd17051ec7": {
      "main": [
        [
          {
            "node": "2e4d4cee-fc5d-4cbd-9772-751869e4dec3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "485201fb-5711-48c3-8b18-f1637c1f800b": {
      "main": [
        [
          {
            "node": "02fa5563-c75a-48c1-a25c-afac49ff0a02",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "aba5962f-3e74-401a-b23c-0a80cefd1d69": {
      "ai_tool": [
        [
          {
            "node": "5e9cffe8-6fb3-4cda-9158-989182b24e0f",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "67227b76-3f85-47e7-9ccb-841270671190": {
      "main": [
        [
          {
            "node": "8e080adf-4d42-4337-8c80-23208936ace5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0c167669-c80c-443b-887f-479bb42297aa": {
      "main": [
        [],
        [
          {
            "node": "bfa68912-7ae6-49bf-9ee9-8300e2d7486b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "016eb60c-0a44-4e4c-8dfd-9588a7df8bbd": {
      "main": [
        [
          {
            "node": "485201fb-5711-48c3-8b18-f1637c1f800b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "38f5ec35-3a90-4d5c-8b1c-ed4802292b86": {
      "ai_textSplitter": [
        [
          {
            "node": "e23e7f3b-dd4e-4dd9-83b6-aec430ade563",
            "type": "ai_textSplitter",
            "index": 0
          }
        ]
      ]
    },
    "bfa68912-7ae6-49bf-9ee9-8300e2d7486b": {
      "main": [
        [
          {
            "node": "0c167669-c80c-443b-887f-479bb42297aa",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "aa5245e3-9af3-42f4-a2fd-22520bdb0add": {
      "main": [
        [
          {
            "node": "98c0a22e-3cd3-4b54-945e-c236ff2cc75a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

์ด ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋‚˜์š”?

์œ„์˜ JSON ๊ตฌ์„ฑ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ n8n ์ธ์Šคํ„ด์Šค์—์„œ ์ƒˆ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  "JSON์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ"๋ฅผ ์„ ํƒํ•œ ํ›„, ๊ตฌ์„ฑ์„ ๋ถ™์—ฌ๋„ฃ๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์ธ์ฆ ์„ค์ •์„ ์ˆ˜์ •ํ•˜์„ธ์š”.

์ด ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์–ด๋–ค ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ ํ•ฉํ•œ๊ฐ€์š”?

๊ณ ๊ธ‰ - ๋‚ด๋ถ€ ์œ„ํ‚ค, AI RAG

์œ ๋ฃŒ์ธ๊ฐ€์š”?

์ด ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์™„์ „ํžˆ ๋ฌด๋ฃŒ์ด๋ฉฐ ์ง์ ‘ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์‚ฌ ์„œ๋น„์Šค(์˜ˆ: OpenAI API)๋Š” ์‚ฌ์šฉ์ž ์ง์ ‘ ๋น„์šฉ์„ ์ง€๋ถˆํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ์›Œํฌํ”Œ๋กœ์šฐ ์ถ”์ฒœ

Gemini RAG ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ ์ „๋ฌธ๊ฐ€ ์ฑ„ํŒ… ๋กœ๋ด‡์„ ๊ตฌ์ถ•
์‚ฌ์šฉ๋ฒ• Gemini RAG ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ ์ „๋ฌธ๊ฐ€ ์ฑ„ํŒ… ๋กœ๋ด‡ ๊ตฌ์ถ•
Set
Html
Filter
+
Set
Html
Filter
48 ๋…ธ๋“œLucas Peyrin
๋‚ด๋ถ€ ์œ„ํ‚ค
๐Ÿค– Gemini RAG ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•œ ๋ฌธ์„œ ์ „๋ฌธ๊ฐ€ ์ฑ„ํŒ… ๋กœ๋ด‡ ๊ตฌ์ถ•
OpenAI RAG ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ n8n ๋ฌธ์„œ ์ „๋ฌธ๊ฐ€ ์ฑ„ํŒ… ๋กœ๋ด‡ ๊ตฌ์ถ•
Set
Html
Filter
+
Set
Html
Filter
46 ๋…ธ๋“œAyham
๋‚ด๋ถ€ ์œ„ํ‚ค
์‹œ๊ฐํ™” ์ฐธ์กฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ n8n ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰
ๅฏ่ง†ๅŒ– ์ฐธ์กฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ n8n ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰
If
Ftp
Set
+
If
Ftp
Set
113 ๋…ธ๋“œI versus AI
๊ธฐํƒ€
์ปจํ…์ŠคํŠธ ํ˜ผํ•ฉ RAG AI ์ฝ˜ํ…์ธ 
Google Drive์—์„œ Supabase ์ƒํ™ฉ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋™๊ธฐํ™”, RAG ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉ
If
Set
Code
+
If
Set
Code
76 ๋…ธ๋“œMichael Taleb
AI RAG
AI ๊ธฐ๋ฐ˜ SEO ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ๊ธฐ
์‚ฌ์šฉGemini, Scrapeless, Pinecone RAG์œผ๋กœ SEO ์ตœ์ ํ™”๋œ ๋ธ”๋กœ๊ทธ ์ฝ˜ํ…์ธ  ์ƒ์„ฑ
Set
Code
Html
+
Set
Code
Html
28 ๋…ธ๋“œscrapeless official
์ฝ˜ํ…์ธ  ์ œ์ž‘
API ์•„ํ‚คํ…์ฒ˜ ์ถ”์ถœ๊ธฐ
API ์•„ํ‚คํ…์ฒ˜ ์ถ”์ถœ๊ธฐ
If
Set
Code
+
If
Set
Code
88 ๋…ธ๋“œPolina Medvedieva
์—”์ง€๋‹ˆ์–ด๋ง
์›Œํฌํ”Œ๋กœ์šฐ ์ •๋ณด
๋‚œ์ด๋„
๊ณ ๊ธ‰
๋…ธ๋“œ ์ˆ˜54
์นดํ…Œ๊ณ ๋ฆฌ2
๋…ธ๋“œ ์œ ํ˜•21
๋‚œ์ด๋„ ์„ค๋ช…

๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ 16+๊ฐœ ๋…ธ๋“œ์˜ ๋ณต์žกํ•œ ์›Œํฌํ”Œ๋กœ์šฐ

์ €์ž
Lucas Peyrin

Lucas Peyrin

@lucaspeyrin

Innovative builder with a passion for crafting automation solutions that solve real-world challenges. From streamlining workflows to driving efficiency, my work empowers teams and individuals to achieve more with less effort. Experienced in developing scalable tools and strategies that deliver results with n8n, supabase and cline.

์™ธ๋ถ€ ๋งํฌ
n8n.io์—์„œ ๋ณด๊ธฐ โ†’

์ด ์›Œํฌํ”Œ๋กœ์šฐ ๊ณต์œ 

์นดํ…Œ๊ณ ๋ฆฌ

์นดํ…Œ๊ณ ๋ฆฌ: 34