8
n8n 中文网amn8n.com

内部文档聊天

高级

这是一个Internal Wiki, AI RAG领域的自动化工作流,包含 29 个节点。主要使用 Set, Switch, Webhook, Supabase, Aggregate 等节点。 使用Ollama、Supabase向量数据库和Google Drive与内部文档对话

前置要求
  • HTTP Webhook 端点(n8n 会自动生成)
  • Supabase URL 和 API Key
  • Google Drive API 凭证
  • PostgreSQL 数据库连接信息
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "id": "pfmUDAfMnmwHPCSC",
  "meta": {
    "instanceId": "558d88703fb65b2d0e44613bc35916258b0f0bf983c5d4730c00c424b77ca36a",
    "templateCredsSetupCompleted": true
  },
  "name": "Chat-internal-documents",
  "tags": [],
  "nodes": [
    {
      "id": "5499112e-c417-4a13-9d3f-6e1aa16ee8cd",
      "name": "默认数据加载器",
      "type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
      "position": [
        840,
        840
      ],
      "parameters": {
        "options": {
          "metadata": {
            "metadataValues": [
              {
                "name": "=file_id",
                "value": "={{ $('Set File ID').first().json.file_id }}"
              }
            ]
          }
        },
        "jsonData": "={{ $json.data || $json.text || $json.concatenated_data }}",
        "jsonMode": "expressionData"
      },
      "typeVersion": 1
    },
    {
      "id": "b780ee44-6928-4382-96d9-52d015e97fc2",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        60
      ],
      "parameters": {
        "color": 4,
        "width": 583,
        "height": 489,
        "content": "## 用于 RAG 的智能体工具"
      },
      "typeVersion": 1
    },
    {
      "id": "733c038e-5315-490f-a8f1-449aae7aa7b1",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1240,
        580
      ],
      "parameters": {
        "color": 5,
        "width": 2353,
        "height": 627,
        "content": "## 将 Google Drive 文件添加到向量数据库的工具"
      },
      "typeVersion": 1
    },
    {
      "id": "f4f6830e-e057-4817-99b6-cd1a24ef85af",
      "name": "下载文件",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -400,
        800
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Set File ID').item.json.file_id }}"
        },
        "options": {
          "googleFileConversion": {
            "conversion": {
              "docsToFormat": "text/plain"
            }
          }
        },
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "",
          "name": "Google Drive account"
        }
      },
      "executeOnce": true,
      "typeVersion": 3
    },
    {
      "id": "d6053181-12df-4ee9-98fc-5263c44cb828",
      "name": "文件已创建",
      "type": "n8n-nodes-base.googleDriveTrigger",
      "position": [
        -1160,
        700
      ],
      "parameters": {
        "event": "fileCreated",
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "triggerOn": "specificFolder",
        "folderToWatch": {
          "__rl": true,
          "mode": "list",
          "value": "1kxxE-cSJYZA1EwRohcgNL2PNFZDzAyhw",
          "cachedResultUrl": "",
          "cachedResultName": "test-folder"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "",
          "name": "Google Drive account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0ed25822-27c2-4ae3-9ec9-ff0eaeec1938",
      "name": "文件已更新",
      "type": "n8n-nodes-base.googleDriveTrigger",
      "position": [
        -1160,
        920
      ],
      "parameters": {
        "event": "fileUpdated",
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "triggerOn": "specificFolder",
        "folderToWatch": {
          "__rl": true,
          "mode": "list",
          "value": "1kxxE-cSJYZA1EwRohcgNL2PNFZDzAyhw",
          "cachedResultUrl": "",
          "cachedResultName": "test-folder"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "",
          "name": "Google Drive account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "70d053ec-b880-489c-8c20-261f0a4c148c",
      "name": "提取文档文本",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        360,
        1000
      ],
      "parameters": {
        "options": {},
        "operation": "text"
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "cb9d4b81-c74f-44e5-9cb5-f55133b737d5",
      "name": "Postgres 聊天记忆",
      "type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
      "position": [
        -480,
        360
      ],
      "parameters": {},
      "credentials": {
        "postgres": {
          "id": "",
          "name": "Postgres account"
        }
      },
      "notesInFlow": false,
      "typeVersion": 1
    },
    {
      "id": "fff92d07-0a2c-40ff-a073-b2e17d4695a3",
      "name": "删除旧文档行",
      "type": "n8n-nodes-base.supabase",
      "position": [
        -640,
        800
      ],
      "parameters": {
        "tableId": "documents",
        "operation": "delete",
        "filterType": "string",
        "filterString": "=metadata->>file_id=like.*{{ $json.file_id }}*"
      },
      "credentials": {
        "supabaseApi": {
          "id": "",
          "name": "Supabase account"
        }
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "e5ca30cc-ea70-42b1-bdce-b110a922765b",
      "name": "设置文件 ID",
      "type": "n8n-nodes-base.set",
      "position": [
        -880,
        800
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "10646eae-ae46-4327-a4dc-9987c2d76173",
              "name": "file_id",
              "type": "string",
              "value": "={{ $json.id }}"
            },
            {
              "id": "f4536df5-d0b1-4392-bf17-b8137fb31a44",
              "name": "file_type",
              "type": "string",
              "value": "={{ $json.mimeType }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "02fbed8f-592d-4380-b9b4-f129cbc052d5",
      "name": "便签2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1040,
        60
      ],
      "parameters": {
        "width": 1036,
        "height": 485,
        "content": "## 带聊天界面的 RAG AI 智能体"
      },
      "typeVersion": 1
    },
    {
      "id": "33ffec5d-1c87-42df-91a9-87f29fda4d24",
      "name": "响应 Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        -180,
        140
      ],
      "parameters": {
        "options": {},
        "respondWith": "allIncomingItems"
      },
      "typeVersion": 1.1
    },
    {
      "id": "c7cf92ba-d3b7-401f-be57-1f2ad1452fad",
      "name": "编辑字段",
      "type": "n8n-nodes-base.set",
      "position": [
        -740,
        140
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "9a9a245e-f1a1-4282-bb02-a81ffe629f0f",
              "name": "chatInput",
              "type": "string",
              "value": "={{ $json?.chatInput || $json.body.chatInput || $json.body.message }}"
            },
            {
              "id": "b80831d8-c653-4203-8706-adedfdb98f77",
              "name": "sessionId",
              "type": "string",
              "value": "={{ $json?.sessionId || $json.body.sessionId}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "28af4afe-bb57-41cf-97cd-5f5bf244ced2",
      "name": "当收到聊天消息时",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        -1000,
        140
      ],
      "webhookId": "15e4d662-3f98-48d0-9f50-68838769ecac",
      "parameters": {
        "public": true,
        "options": {
          "allowFileUploads": true
        },
        "initialMessages": "Hi there! 👋\nMy name is Laki. How can I assist you today?"
      },
      "typeVersion": 1.1
    },
    {
      "id": "172cdbdc-df5e-4126-b437-6ee87cb002e8",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -1000,
        340
      ],
      "webhookId": "9ba11544-5c4e-4f91-818a-08a4ecb596c5",
      "parameters": {
        "path": "rag-chat",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2
    },
    {
      "id": "c22851fc-54b3-4f6f-90de-1d1ee4144987",
      "name": "提取 PDF 文本",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        360,
        620
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1
    },
    {
      "id": "6cd6a07e-e401-4941-8120-0fe720138986",
      "name": "聚合",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        280,
        800
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    },
    {
      "id": "57dd71fa-6500-4e8f-b5e2-824eb8812b9a",
      "name": "字符文本分割器",
      "type": "@n8n/n8n-nodes-langchain.textSplitterCharacterTextSplitter",
      "position": [
        840,
        1060
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "af7a36dc-8a07-4b00-affc-5c01677d3dcf",
      "name": "摘要",
      "type": "n8n-nodes-base.summarize",
      "position": [
        440,
        800
      ],
      "parameters": {
        "options": {},
        "fieldsToSummarize": {
          "values": [
            {
              "field": "data",
              "aggregation": "concatenate"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "64931b9c-35d3-4eff-89f6-9fb6053325d2",
      "name": "RAG AI 代理",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -520,
        140
      ],
      "parameters": {
        "text": "={{ $json.chatInput }}\n\nContext from retrieved documents:\n{{ $json.user_documents }}\n\nInstructions:\n- Use ONLY the context above to answer the question.\n- If the context already provides the answer, respond directly with that Answer.\n- Do NOT call any tools or offer to call tools if the context already has the answer.\n- Only call tools if the context is empty or obviously incomplete.\n- Keep the answer clear and complete.\n",
        "options": {
          "systemMessage": "=You are a helpful assistant that answers user questions. Always prioritize using the provided context. Only call tools when the provided context does not contain the necessary information.\nIf you use the tool then provide the answer coming from the tool directly\n"
        },
        "promptType": "define"
      },
      "typeVersion": 1.6
    },
    {
      "id": "de90a406-592e-4c0d-9052-3e95caebf01b",
      "name": "Google Calendar MCP",
      "type": "n8n-nodes-base.switch",
      "position": [
        -180,
        800
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $('Set File ID').item.json.file_type }}",
                    "rightValue": "application/pdf"
                  }
                ]
              }
            },
            {
              "conditions": {
                "options": {
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "2ae7faa7-a936-4621-a680-60c512163034",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $('Set File ID').item.json.file_type }}",
                    "rightValue": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
                  }
                ]
              }
            },
            {
              "conditions": {
                "options": {
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "fc193b06-363b-4699-a97d-e5a850138b0e",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $('Set File ID').item.json.file_type }}",
                    "rightValue": "application/vnd.google-apps.document"
                  }
                ]
              }
            }
          ]
        },
        "options": {
          "fallbackOutput": 2
        }
      },
      "typeVersion": 3
    },
    {
      "id": "a2055d5e-a445-4706-afb7-f36f8adedb43",
      "name": "插入到 Supabase Vectorstore",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
      "position": [
        720,
        620
      ],
      "parameters": {
        "mode": "insert",
        "options": {
          "queryName": "match_documents"
        },
        "tableName": {
          "__rl": true,
          "mode": "list",
          "value": "documents",
          "cachedResultName": "documents"
        }
      },
      "credentials": {
        "supabaseApi": {
          "id": "",
          "name": "Supabase account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5d235803-705e-4366-b00f-ceef912db642",
      "name": "从 Excel 提取",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        120,
        800
      ],
      "parameters": {
        "options": {},
        "operation": "xlsx"
      },
      "typeVersion": 1
    },
    {
      "id": "0f3b9083-0510-4129-9833-215c7189148b",
      "name": "嵌入 Ollama",
      "type": "@n8n/n8n-nodes-langchain.embeddingsOllama",
      "position": [
        680,
        840
      ],
      "parameters": {
        "model": "nomic-embed-text:latest"
      },
      "credentials": {
        "ollamaApi": {
          "id": "7CIt42W14b1MCgxQ",
          "name": "Ollama account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ca178e83-d5c1-475a-b5fa-9e83f840cd19",
      "name": "Embeddings Ollama1",
      "type": "@n8n/n8n-nodes-langchain.embeddingsOllama",
      "position": [
        200,
        420
      ],
      "parameters": {
        "model": "nomic-embed-text:latest"
      },
      "credentials": {
        "ollamaApi": {
          "id": "7CIt42W14b1MCgxQ",
          "name": "Ollama account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5a3c0b2d-1a38-4a5f-b6b9-638ea50cce7d",
      "name": "Supabase Vector Store",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
      "position": [
        80,
        280
      ],
      "parameters": {
        "options": {
          "queryName": "match_documents"
        },
        "tableName": {
          "__rl": true,
          "mode": "list",
          "value": "documents",
          "cachedResultName": "documents"
        }
      },
      "credentials": {
        "supabaseApi": {
          "id": "",
          "name": "Supabase account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "aa18ff0f-e29e-453f-b637-581bbb021594",
      "name": "Ollama Model",
      "type": "@n8n/n8n-nodes-langchain.lmOllama",
      "position": [
        420,
        320
      ],
      "parameters": {
        "model": "llama3.1:latest",
        "options": {}
      },
      "credentials": {
        "ollamaApi": {
          "id": "7CIt42W14b1MCgxQ",
          "name": "Ollama account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "175164e7-4a84-48b2-a225-dea6afe1e94d",
      "name": "Ollama聊天模型",
      "type": "@n8n/n8n-nodes-langchain.lmChatOllama",
      "position": [
        -660,
        380
      ],
      "parameters": {
        "model": "llama3.1:latest",
        "options": {
          "temperature": 0.5
        }
      },
      "credentials": {
        "ollamaApi": {
          "id": "7CIt42W14b1MCgxQ",
          "name": "Ollama account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8a46d0ff-ceb9-435f-a347-d97e103cd0bc",
      "name": "User_documents",
      "type": "@n8n/n8n-nodes-langchain.toolVectorStore",
      "position": [
        200,
        120
      ],
      "parameters": {
        "name": "user_documents",
        "description": "包含用户的所有文档,您可以查阅这些文档以获取上下文来回答用户问题。"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "5e57d44f-1063-4539-bbeb-d2c65025509a",
  "connections": {
    "Switch": {
      "main": [
        [
          {
            "node": "Extract PDF Text",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Extract from Excel",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Extract Document Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate": {
      "main": [
        [
          {
            "node": "Summarize",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Summarize": {
      "main": [
        [
          {
            "node": "Insert into Supabase Vectorstore",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "RAG AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set File ID": {
      "main": [
        [
          {
            "node": "Delete Old Doc Rows",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "File Created": {
      "main": [
        [
          {
            "node": "Set File ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "File Updated": {
      "main": [
        [
          {
            "node": "Set File ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Ollama Model": {
      "ai_languageModel": [
        [
          {
            "node": "User_documents",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "RAG AI Agent": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download File": {
      "main": [
        [
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "User_documents": {
      "ai_tool": [
        [
          {
            "node": "RAG AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Extract PDF Text": {
      "main": [
        [
          {
            "node": "Insert into Supabase Vectorstore",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Embeddings Ollama": {
      "ai_embedding": [
        [
          {
            "node": "Insert into Supabase Vectorstore",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "Ollama Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "RAG AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Embeddings Ollama1": {
      "ai_embedding": [
        [
          {
            "node": "Supabase Vector Store",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "Extract from Excel": {
      "main": [
        [
          {
            "node": "Aggregate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Default Data Loader": {
      "ai_document": [
        [
          {
            "node": "Insert into Supabase Vectorstore",
            "type": "ai_document",
            "index": 0
          }
        ]
      ]
    },
    "Delete Old Doc Rows": {
      "main": [
        [
          {
            "node": "Download File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Postgres Chat Memory": {
      "ai_memory": [
        [
          {
            "node": "RAG AI Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Extract Document Text": {
      "main": [
        [
          {
            "node": "Insert into Supabase Vectorstore",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase Vector Store": {
      "ai_vectorStore": [
        [
          {
            "node": "User_documents",
            "type": "ai_vectorStore",
            "index": 0
          }
        ]
      ]
    },
    "Character Text Splitter": {
      "ai_textSplitter": [
        [
          {
            "node": "Default Data Loader",
            "type": "ai_textSplitter",
            "index": 0
          }
        ]
      ]
    },
    "When chat message received": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

高级 - 内部知识库, AI RAG 检索增强

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量29
分类2
节点类型21
难度说明

适合高级用户,包含 16+ 个节点的复杂工作流

作者
Lakindu Siriwardana

Lakindu Siriwardana

@laki99

AI Engineer | Researcher

外部链接
在 n8n.io 查看

分享此工作流