8
n8n 中文网amn8n.com

使用Paul Essays、Milvus和OpenAI构建带引用的RAG问答系统

高级

这是一个AI领域的自动化工作流,包含 25 个节点。主要使用 Set, Code, Html, Limit, SplitOut 等节点,结合人工智能技术实现智能自动化。 使用Paul Essays、Milvus和OpenAI构建带引用的RAG问答系统

前置要求
  • 可能需要目标 API 的认证凭证
  • OpenAI API Key
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "id": "Hjyv9FkH5Oh6Yxw4",
  "meta": {
    "instanceId": "2c4c1e23e7b067270c08aab616bada21d0c384d16f212b23cf1143c6baa09219"
  },
  "name": "插入和检索文档",
  "tags": [
    {
      "id": "msnDWKHQmwMDxWQH",
      "name": "Milvus",
      "createdAt": "2025-04-16T12:48:14.539Z",
      "updatedAt": "2025-04-16T12:48:14.539Z"
    },
    {
      "id": "tnCpo8hq8uKrdASK",
      "name": "AI",
      "createdAt": "2025-04-16T12:47:57.976Z",
      "updatedAt": "2025-04-16T12:47:57.976Z"
    }
  ],
  "nodes": [
    {
      "id": "52044ccd-4e0d-4353-b612-cf8db1b55331",
      "name": "当点击\"执行工作流\"时",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -500,
        -100
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "b6993775-d21b-4ae8-a59c-43aef2b7002b",
      "name": "获取文章列表",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -220,
        -100
      ],
      "parameters": {
        "url": "http://www.paulgraham.com/articles.html",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "cbaeb236-5c93-4b34-a06b-ff0e5de8525f",
      "name": "提取文章名称",
      "type": "n8n-nodes-base.html",
      "position": [
        -20,
        -100
      ],
      "parameters": {
        "options": {},
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "essay",
              "attribute": "href",
              "cssSelector": "table table a",
              "returnArray": true,
              "returnValue": "attribute"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "d92b6692-4a02-4519-b113-8a9172c71de9",
      "name": "拆分为项目",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        180,
        -100
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "essay"
      },
      "typeVersion": 1
    },
    {
      "id": "d16ba71b-10fc-454f-8bfc-a6826280a4e7",
      "name": "获取文章文本",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        580,
        -100
      ],
      "parameters": {
        "url": "=http://www.paulgraham.com/{{ $json.essay }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "c4fa74ea-6af5-410c-bf5c-9d8d3decf31b",
      "name": "限制为前 3 个",
      "type": "n8n-nodes-base.limit",
      "position": [
        380,
        -100
      ],
      "parameters": {
        "maxItems": 3
      },
      "typeVersion": 1
    },
    {
      "id": "3da8495b-62df-475d-b99d-e0f3c64266e3",
      "name": "仅提取文本",
      "type": "n8n-nodes-base.html",
      "position": [
        900,
        -100
      ],
      "parameters": {
        "options": {},
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "data",
              "cssSelector": "body",
              "skipSelectors": "img,nav"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "4a9b5d5d-fc94-40b7-af0c-13d992bc1eb9",
      "name": "便签3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -300,
        -220
      ],
      "parameters": {
        "width": 1071.752021563343,
        "height": 285.66037735849045,
        "content": "## 抓取最新的 Paul Graham 文章"
      },
      "typeVersion": 1
    },
    {
      "id": "b8a7a288-186f-4444-b0de-33ed90009c0a",
      "name": "便签5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        820,
        -220
      ],
      "parameters": {
        "width": 625,
        "height": 607,
        "content": "## 加载到 Milvus 向量存储"
      },
      "typeVersion": 1
    },
    {
      "id": "c9e7b166-cc65-47e2-a437-9c00017b492a",
      "name": "递归字符文本分割器1",
      "type": "@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter",
      "position": [
        1240,
        240
      ],
      "parameters": {
        "options": {},
        "chunkSize": 6000
      },
      "typeVersion": 1
    },
    {
      "id": "e1a75f27-7c8c-4d0d-9b0f-33fe9ec96fc6",
      "name": "生成响应",
      "type": "n8n-nodes-base.set",
      "position": [
        1240,
        560
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "11396286-0378-4c3a-86e1-c9ef51afbfc7",
              "name": "text",
              "type": "string",
              "value": "={{ $json.answer }} {{ $if(!$json.citations.isEmpty(), \"\\n\" + $json.citations.join(\"\"), '') }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "8b3497ad-5bc8-44b3-bdf4-3a028fe265ce",
      "name": "组合引用",
      "type": "n8n-nodes-base.set",
      "position": [
        1040,
        560
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "ace6185e-8b3d-4f89-ae36-dfe0c391a0a9",
              "name": "citations",
              "type": "array",
              "value": "={{ $json.citations.map(i => '[' + $('Get top chunks matching query').all()[$json.citations].json.document.metadata.file_name + ', lines ' + $('Get top chunks matching query').all()[$json.citations].json.document.metadata['loc.lines.from'] + '-' + $('Get top chunks matching query').all()[$json.citations].json.document.metadata['loc.lines.to'] + ']') }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "0452cf15-145c-49dd-8803-4c8b8a7adbea",
      "name": "基于块回答查询",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        680,
        560
      ],
      "parameters": {
        "text": "={{ $json.context }}\n\nQuestion: {{ $('When chat message received').first().json.chatInput }}\nHelpful Answer:",
        "options": {
          "systemPromptTemplate": "=Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer. Important: In your response, also include the the indexes of the chunks you used to generate the answer."
        },
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"required\": [\"answer\", \"citations\"],\n  \"properties\": {\n    \"answer\": {\n      \"type\": \"string\"\n    },\n    \"citations\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"number\"\n      }\n    }\n  }\n}"
      },
      "typeVersion": 1
    },
    {
      "id": "d385ac35-6f94-4101-99de-5ce1991f40c4",
      "name": "准备块",
      "type": "n8n-nodes-base.code",
      "position": [
        480,
        560
      ],
      "parameters": {
        "jsCode": "let out = \"\"\nfor (const i in $input.all()) {\n  let itemText = \"--- CHUNK \" + i + \" ---\\n\"\n  itemText += $input.all()[i].json.document.pageContent + \"\\n\"\n  itemText += \"\\n\"\n  out += itemText\n}\n\nreturn {\n  'context': out\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "379837f2-4f96-43ff-8e87-722cbe6d652f",
      "name": "设置发送到模型的最大块数",
      "type": "n8n-nodes-base.set",
      "position": [
        -300,
        560
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "33f4addf-72f3-4618-a6ba-5b762257d723",
              "name": "chunks",
              "type": "number",
              "value": 4
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "9bc391bb-df47-41df-b170-9df47a6b5e87",
      "name": "嵌入 OpenAI2",
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "position": [
        -100,
        780
      ],
      "parameters": {
        "model": "text-embedding-ada-002",
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "hH2PTDH4fbS7fdPv",
          "name": "OpenAi account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "efb030f4-445b-4ba0-b5c9-95e4e5893664",
      "name": "当收到聊天消息时",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        -540,
        560
      ],
      "webhookId": "cd2703a7-f912-46fe-8787-3fb83ea116ab",
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "c74943be-0008-4d4c-9dea-598a648a97a2",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -380,
        440
      ],
      "parameters": {
        "color": 7,
        "width": 1594,
        "height": 529,
        "content": "确保您的表名与实际知识库结构匹配"
      },
      "typeVersion": 1
    },
    {
      "id": "2e27f3d8-e8a2-4647-80dd-f2643b224cb5",
      "name": "检索中的 Milvus 向量存储",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreMilvus",
      "position": [
        0,
        560
      ],
      "parameters": {
        "mode": "load",
        "topK": 2,
        "prompt": "answer the question",
        "milvusCollection": {
          "__rl": true,
          "mode": "list",
          "value": "my_collection",
          "cachedResultName": "my_collection"
        }
      },
      "credentials": {
        "milvusApi": {
          "id": "8tMHHoLiWXIAXa7S",
          "name": "Milvus account"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "a3cf7e0e-f681-4880-9ccf-5c42d5457c0f",
      "name": "Milvus 向量存储",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreMilvus",
      "position": [
        1120,
        -100
      ],
      "parameters": {
        "mode": "insert",
        "options": {
          "clearCollection": true
        },
        "milvusCollection": {
          "__rl": true,
          "mode": "list",
          "value": "my_collection",
          "cachedResultName": "my_collection"
        }
      },
      "credentials": {
        "milvusApi": {
          "id": "8tMHHoLiWXIAXa7S",
          "name": "Milvus account"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "4c4cc5a5-e880-466f-a298-4af53a2acbec",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -700,
        -260
      ],
      "parameters": {
        "width": 280,
        "height": 180,
        "content": "## 步骤 1"
      },
      "typeVersion": 1
    },
    {
      "id": "18f42da4-42ea-4eb0-9c43-ef8bd31ab7ff",
      "name": "便签2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -680,
        460
      ],
      "parameters": {
        "height": 120,
        "content": "## Step 2\nChat and get citations in response"
      },
      "typeVersion": 1
    },
    {
      "id": "0af427ed-d901-4192-9fdc-986a63fd585b",
      "name": "Embeddings OpenAI",
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "position": [
        1020,
        140
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "hH2PTDH4fbS7fdPv",
          "name": "OpenAi account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "3603852a-bf12-4289-9733-dcd29d12a4f6",
      "name": "Default Data Loader",
      "type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
      "position": [
        1160,
        120
      ],
      "parameters": {
        "options": {},
        "jsonData": "={{ $('Extract Text Only').item.json.data }}",
        "jsonMode": "expressionData"
      },
      "typeVersion": 1
    },
    {
      "id": "b49eb3ae-82cb-4d87-8f22-0789b3a14d83",
      "name": "OpenAI 聊天模型",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        680,
        780
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "hH2PTDH4fbS7fdPv",
          "name": "OpenAi account"
        }
      },
      "typeVersion": 1.2
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "5dc48a1d-aaf0-4052-9666-28f9e76d198c",
  "connections": {
    "d385ac35-6f94-4101-99de-5ce1991f40c4": {
      "main": [
        [
          {
            "node": "0452cf15-145c-49dd-8803-4c8b8a7adbea",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b6993775-d21b-4ae8-a59c-43aef2b7002b": {
      "main": [
        [
          {
            "node": "cbaeb236-5c93-4b34-a06b-ff0e5de8525f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c4fa74ea-6af5-410c-bf5c-9d8d3decf31b": {
      "main": [
        [
          {
            "node": "d16ba71b-10fc-454f-8bfc-a6826280a4e7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8b3497ad-5bc8-44b3-bdf4-3a028fe265ce": {
      "main": [
        [
          {
            "node": "e1a75f27-7c8c-4d0d-9b0f-33fe9ec96fc6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0af427ed-d901-4192-9fdc-986a63fd585b": {
      "ai_embedding": [
        [
          {
            "node": "a3cf7e0e-f681-4880-9ccf-5c42d5457c0f",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "3da8495b-62df-475d-b99d-e0f3c64266e3": {
      "main": [
        [
          {
            "node": "a3cf7e0e-f681-4880-9ccf-5c42d5457c0f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d16ba71b-10fc-454f-8bfc-a6826280a4e7": {
      "main": [
        [
          {
            "node": "3da8495b-62df-475d-b99d-e0f3c64266e3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b49eb3ae-82cb-4d87-8f22-0789b3a14d83": {
      "ai_languageModel": [
        [
          {
            "node": "0452cf15-145c-49dd-8803-4c8b8a7adbea",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "9bc391bb-df47-41df-b170-9df47a6b5e87": {
      "ai_embedding": [
        [
          {
            "node": "2e27f3d8-e8a2-4647-80dd-f2643b224cb5",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "3603852a-bf12-4289-9733-dcd29d12a4f6": {
      "ai_document": [
        [
          {
            "node": "a3cf7e0e-f681-4880-9ccf-5c42d5457c0f",
            "type": "ai_document",
            "index": 0
          }
        ]
      ]
    },
    "cbaeb236-5c93-4b34-a06b-ff0e5de8525f": {
      "main": [
        [
          {
            "node": "d92b6692-4a02-4519-b113-8a9172c71de9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d92b6692-4a02-4519-b113-8a9172c71de9": {
      "main": [
        [
          {
            "node": "c4fa74ea-6af5-410c-bf5c-9d8d3decf31b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "379837f2-4f96-43ff-8e87-722cbe6d652f": {
      "main": [
        [
          {
            "node": "2e27f3d8-e8a2-4647-80dd-f2643b224cb5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0452cf15-145c-49dd-8803-4c8b8a7adbea": {
      "main": [
        [
          {
            "node": "8b3497ad-5bc8-44b3-bdf4-3a028fe265ce",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2e27f3d8-e8a2-4647-80dd-f2643b224cb5": {
      "main": [
        [
          {
            "node": "d385ac35-6f94-4101-99de-5ce1991f40c4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "52044ccd-4e0d-4353-b612-cf8db1b55331": {
      "main": [
        [
          {
            "node": "b6993775-d21b-4ae8-a59c-43aef2b7002b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c9e7b166-cc65-47e2-a437-9c00017b492a": {
      "ai_textSplitter": [
        [
          {
            "node": "3603852a-bf12-4289-9733-dcd29d12a4f6",
            "type": "ai_textSplitter",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

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

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

高级 - 人工智能

需要付费吗?

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

工作流信息
难度等级
高级
节点数量25
分类1
节点类型15
难度说明

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

作者
Cheney Zhang

Cheney Zhang

@zc277584121

Algorithm engineer at Zilliz, dedicating to the application of vector databases in the AI ecosystem.

外部链接
在 n8n.io 查看

分享此工作流

分类

分类: 34