Jotform、SupabaseでのRAG、Together AI、Geminiを使ってナレッジベースチャットボットを構築

中級

これは自動化ワークフローで、15個のノードを含みます。主にCode, Supabase, Aggregate, HttpRequest, JotFormTriggerなどのノードを使用。 Jotform、Supabase上のRAG、Together AI、Geminiを使ってナレッジベースチャットボットを構築

前提条件
  • Supabase URL と API Key
  • ターゲットAPIの認証情報が必要な場合あり
  • Google Gemini API Key

カテゴリー

-
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
  "meta": {
    "instanceId": "93f396852104089b8670e7494b0f3668b420464668ae4a8c1d6b4b5799f8e3ef",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "1c57da69-7af2-47c8-8bc2-92e49449bd81",
      "name": "チャンク分割",
      "type": "n8n-nodes-base.code",
      "position": [
        2192,
        -496
      ],
      "parameters": {
        "jsCode": "const text = $input.first().json.text;\nconst chunkSize = 1000;\n\nlet chunks = [];\nfor (let i = 0; i < text.length; i += chunkSize) {\n  chunks.push({\n    json: { chunk: text.slice(i, i + chunkSize) }\n  });\n}\n\nreturn chunks;\n\n"
      },
      "typeVersion": 2
    },
    {
      "id": "d5ed1aaf-6089-4731-980d-b5c356b22403",
      "name": "アップロード文書の埋め込み",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2416,
        -496
      ],
      "parameters": {
        "url": "https://api.together.xyz/v1/embeddings",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "model",
              "value": "BAAI/bge-large-en-v1.5"
            },
            {
              "name": "input",
              "value": "={{ $json.chunk }}"
            }
          ]
        },
        "genericAuthType": "httpBearerAuth",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "ePx2TlbqIiRjDGfW",
          "name": "Together API"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "0b1c609f-e335-4541-8dae-e3517ec4bb63",
      "name": "埋め込みをDBに保存",
      "type": "n8n-nodes-base.supabase",
      "position": [
        2624,
        -496
      ],
      "parameters": {
        "tableId": "RAG",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "chunk",
              "fieldValue": "={{ $('Splitting into Chunks').item.json.chunk }}"
            },
            {
              "fieldId": "embeddings",
              "fieldValue": "={{ JSON.stringify($json.data[0].embedding) }}"
            }
          ]
        }
      },
      "credentials": {
        "supabaseApi": {
          "id": "sNLLVD1n1FkMp81B",
          "name": "abhi.vaar"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "3a39d174-434e-4c81-921c-8a354fad5ebe",
      "name": "集約",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        2064,
        64
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "chunk"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4ce2ab5b-bb1e-46ce-9dd8-2cfdee5510a2",
      "name": "埋め込み検索",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1840,
        64
      ],
      "parameters": {
        "url": "https://enter-your-supabase-host/rest/v1/rpc/matchembeddings1",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "=query_embedding",
              "value": "={{ $json.data[0].embedding }}"
            },
            {
              "name": "match_count",
              "value": "5"
            }
          ]
        },
        "nodeCredentialType": "supabaseApi"
      },
      "credentials": {
        "supabaseApi": {
          "id": "sNLLVD1n1FkMp81B",
          "name": "abhi.vaar"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "76c8df3f-cf64-4848-b077-d04e9de88d12",
      "name": "ユーザーメッセージの埋め込み",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1616,
        64
      ],
      "parameters": {
        "url": "https://api.together.xyz/v1/embeddings",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "model",
              "value": "BAAI/bge-large-en-v1.5"
            },
            {
              "name": "input",
              "value": "={{ $json.chatInput }}"
            }
          ]
        },
        "genericAuthType": "httpBearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "ePx2TlbqIiRjDGfW",
          "name": "Together API"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "d8dba80c-597e-470b-852b-6d53363238bc",
      "name": "Google Gemini チャットモデル",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        2272,
        288
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "id": "qsaK3VMNWQDWLweQ",
          "name": "Google Gemini(PaLM) Api account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f74c0006-15e0-4f48-8c02-b0b765154c5b",
      "name": "AIエージェント",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2272,
        64
      ],
      "parameters": {
        "text": "=You are a helpful and professional customer support agent. Use the following context to answer the user's question. \n\nHandle greetings without the need of the context...\n\nContext:\n{{ $json.chunk }}\n\nUser's message:\n{{ $('When chat message received').item.json.chatInput }}\n\nFormat your reply in WhatsApp style:\n- Use _italics_ for emphasis\n- Use *bold* for key points\n- Use • for bullet lists (no markdown dashes or hashes)\n- Keep responses short, clear, and conversational, like real WhatsApp support\n- Avoid markdown headers or code blocks\n\nGive a clear, accurate, and friendly response based only on the context.  \nIf the answer cannot be found in the context, reply: _\"I don't know based on the provided information.\"_\n",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "81c63733-c5c8-4a4d-b634-e3d93d9bb1c6",
      "name": "PDFファイルからのテキスト抽出",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        2000,
        -496
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1
    },
    {
      "id": "490c541e-fae8-4965-9840-9e13d562acdd",
      "name": "チャットメッセージ受信時",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        1392,
        64
      ],
      "webhookId": "2032c492-7d92-4d79-b545-5e0b9807253f",
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "8add4f5e-d2f8-4ea8-a6e1-6d4912d60393",
      "name": "付箋",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1296,
        -768
      ],
      "parameters": {
        "width": 1584,
        "height": 512,
        "content": "### Part 1: Feeding the AI Knowledge (The \"Librarian\" part)\n\nThis part of the workflow runs whenever someone uploads a new PDF contract using your Jotform form. Its only job is to read, understand, and store the information from that document.\n\n* A user uploads a PDF contract through a JotForm, which is then downloaded.\n* The system extracts the raw text and splits it into smaller, more manageable chunks.\n* Each text chunk is converted into a numerical representation, called an embedding, that captures its semantic meaning.\n* These embeddings and their original text are stored in a Supabase vector database, effectively creating a searchable knowledge library.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d764c67f-cca8-476e-8d63-78d2733f6b64",
      "name": "付箋1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1296,
        -208
      ],
      "parameters": {
        "width": 1600,
        "height": 656,
        "content": "---\n\n### Part 2: Asking the AI a Question (The \"Researcher\" part)\n\nThis part of the workflow runs whenever a user sends a message in a chat interface. Its job is to find the right information from the library and generate an answer.\n\n* A user asks a question, which the system converts into a numerical embedding to understand its meaning.\n* This embedding is used to search a vector database, retrieving the most relevant chunks of text from the stored documents.\n* The retrieved text chunks are then provided to an AI agent as the sole context for answering the question.\n* The AI generates a precise and accurate answer based only on the provided context, ensuring it doesn't invent information."
      },
      "typeVersion": 1
    },
    {
      "id": "d1f68d16-6baa-4420-8606-dbc7ca5791c7",
      "name": "JotFormトリガー",
      "type": "n8n-nodes-base.jotFormTrigger",
      "position": [
        1376,
        -496
      ],
      "webhookId": "52c8e2e7-7277-4dfd-8336-c3857f945102",
      "parameters": {
        "form": "252862840518058",
        "onlyAnswers": false
      },
      "credentials": {
        "jotFormApi": {
          "id": "4612J1BsqtC505ac",
          "name": "secondary"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8f035b6b-c3c0-449a-acb4-0c359c309e32",
      "name": "新規ナレッジベース取得",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1584,
        -496
      ],
      "parameters": {
        "url": "=https://api.jotform.com/submission/{{ $json.submissionID }}?apiKey=enter-your-jotfomr-api",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "b826edc5-d97f-498c-bea1-b3f3d1430635",
      "name": "アップロードされたナレッジベースファイルリンク取得",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1792,
        -496
      ],
      "parameters": {
        "url": "={{ $json.content.answers['6'].answer[0] }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        },
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "APIKEY",
              "value": "enter-your-jotfomr-api"
            }
          ]
        }
      },
      "typeVersion": 4.2
    }
  ],
  "pinData": {},
  "connections": {
    "f74c0006-15e0-4f48-8c02-b0b765154c5b": {
      "main": [
        []
      ]
    },
    "3a39d174-434e-4c81-921c-8a354fad5ebe": {
      "main": [
        [
          {
            "node": "f74c0006-15e0-4f48-8c02-b0b765154c5b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d1f68d16-6baa-4420-8606-dbc7ca5791c7": {
      "main": [
        [
          {
            "node": "8f035b6b-c3c0-449a-acb4-0c359c309e32",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4ce2ab5b-bb1e-46ce-9dd8-2cfdee5510a2": {
      "main": [
        [
          {
            "node": "3a39d174-434e-4c81-921c-8a354fad5ebe",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "76c8df3f-cf64-4848-b077-d04e9de88d12": {
      "main": [
        [
          {
            "node": "4ce2ab5b-bb1e-46ce-9dd8-2cfdee5510a2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1c57da69-7af2-47c8-8bc2-92e49449bd81": {
      "main": [
        [
          {
            "node": "d5ed1aaf-6089-4731-980d-b5c356b22403",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8f035b6b-c3c0-449a-acb4-0c359c309e32": {
      "main": [
        [
          {
            "node": "b826edc5-d97f-498c-bea1-b3f3d1430635",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d8dba80c-597e-470b-852b-6d53363238bc": {
      "ai_languageModel": [
        [
          {
            "node": "f74c0006-15e0-4f48-8c02-b0b765154c5b",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "81c63733-c5c8-4a4d-b634-e3d93d9bb1c6": {
      "main": [
        [
          {
            "node": "1c57da69-7af2-47c8-8bc2-92e49449bd81",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "490c541e-fae8-4965-9840-9e13d562acdd": {
      "main": [
        [
          {
            "node": "76c8df3f-cf64-4848-b077-d04e9de88d12",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d5ed1aaf-6089-4731-980d-b5c356b22403": {
      "main": [
        [
          {
            "node": "0b1c609f-e335-4541-8dae-e3517ec4bb63",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b826edc5-d97f-498c-bea1-b3f3d1430635": {
      "main": [
        [
          {
            "node": "81c63733-c5c8-4a4d-b634-e3d93d9bb1c6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
よくある質問

このワークフローの使い方は?

上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。

このワークフローはどんな場面に適していますか?

中級

有料ですか?

このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。

関連ワークフロー

RAG、Gemini、Supabase、Google Docsを使ってナレッジベースWhatsAppアシスタントを構築
RAG、Gemini、Supabase、Google Docsを使って知識ベースWhatsAppアシスタントを構築
If
Code
Supabase
+
If
Code
Supabase
15 ノードiamvaar
コンテンツ作成
AI駆動のNDA審査と即時アラートシステム - JotForm、Gemini、Telegram
JotForm、Gemini、Telegramを基盤としたAI駆動のNDA審査と即時アラートシステム
Telegram
Http Request
Jot Form Trigger
+
Telegram
Http Request
Jot Form Trigger
13 ノードiamvaar
n8nノードの探索(可視化リファレンスライブラリ内)
n8nノードを可視化リファレンスライブラリで探索
If
Ftp
Set
+
If
Ftp
Set
113 ノードI versus AI
その他
コンテキスト・ハイブリッドRAG AIコピー
RAGアプリケーション向けのGoogle DriveからSupabaseコンテキストベクトルデータベースへの同期
If
Set
Code
+
If
Set
Code
76 ノードMichael Taleb
AI RAG検索拡張
Gemini AI を使用した不具合レポートの自動化:Jotform から GitHub へ、そして Telegram への通知送信
Gemini AIを使用したバグレポートの自動化:JotformからGitHubへとTelegram投稿を送信
Code
Telegram
Github Tool
+
Code
Telegram
Github Tool
10 ノードiamvaar
Supabase ストレージ内のファイルと対話する AI エージェント
Supabaseストレージ内のファイルと対話するAIエージェント
If
Merge
Switch
+
If
Merge
Switch
33 ノードMark Shcherbakov
エンジニアリング
ワークフロー情報
難易度
中級
ノード数15
カテゴリー-
ノードタイプ10
難易度説明

経験者向け、6-15ノードの中程度の複雑さのワークフロー

外部リンク
n8n.ioで表示

このワークフローを共有

カテゴリー

カテゴリー: 34