首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >教你如何用n8n实现一个知识库

教你如何用n8n实现一个知识库

原创
作者头像
一只牛博
修改2025-11-18 11:24:20
修改2025-11-18 11:24:20
1370
举报
文章被收录于专栏:AIAI

本文档详细介绍如何使用n8n搭建一个完整的知识库系统,包括文档索引、向量化存储和智能检索功能。通过本指南,你将学会:

  • 如何配置ModelScope的Embedding API
  • 如何使用Pinecone存储向量数据
  • 如何在n8n中构建完整的RAG(检索增强生成)流程
  • 常见问题的排查和解决方法

一、系统架构

1.1 技术选型

组件

技术方案

用途

工作流引擎

n8n

编排整个数据处理流程

Embedding服务

ModelScope (Qwen3-Embedding-0.6B)

将文本转换为1024维向量

向量数据库

Pinecone

存储和检索向量数据

安全认证

API Key

保护Webhook接口

1.2 数据流程

节点结构
节点结构

二、准备工作

2.1 所需账号

ModelScope
  1. 注册账号:可从官网直达
  2. 获取API Token:
    • 进入个人中心 → API Token
    • 创建新Token
  3. 记录Token(格式如 ms-xxxxxxxx
image-20251027204811184
image-20251027204811184
Pinecone
  1. 注册账号:可从官网找到
  2. 获取API Key:
    • 进入 API Keys 页面
    • 创建新Key或复制现有Key
  3. 记录API Key
image-20251027204901920
image-20251027204901920
n8n
  • 已部署的n8n实例
  • 公网可访问的域名(用于Webhook)

2.2 创建Pinecone索引

关键配置:维度必须设置为1024!

  1. 登录Pinecone控制台
  2. 点击 Create Index
  3. 配置参数:
代码语言:txt
复制
   Index Name:    knowledge-base
   Dimensions:    1024          ← 重要!必须匹配Embedding模型输出维度
   Metric:        cosine
   Region:        选择离你最近的区域
  1. 点击 Create Index
  2. 等待索引创建完成(通常1-2分钟)
  3. 记录索引的Host URL(格式如:knowledge-base-xxx.svc.xxx.pinecone.io
Pinecone索引创建成功
Pinecone索引创建成功

常见错误

  • ❌ 维度设置为768 → 会导致 dimension mismatch 错误
  • ✅ 维度设置为1024 → 匹配Qwen3-Embedding-0.6B的输出

三、配置n8n凭据

3.1 配置ModelScope API凭据

  1. 进入n8n管理界面
  2. 点击右上角头像 → SettingsCredentials
  3. 点击 Add Credential
  4. 搜索并选择 Header Auth
  5. 填写信息:
代码语言:txt
复制
   Credential name:  ModelScope API
   Name:             Authorization
   Value:            Bearer ms-your-token-here

注意:Bearer 后面有一个空格

  1. 点击 Save

3.2 配置Pinecone API凭据

  1. 继续添加新凭据,选择 Header Auth
  2. 填写信息:
代码语言:txt
复制
   Credential name:  Pinecone API
   Name:             Api-Key
   Value:            your-pinecone-api-key
  1. 点击 Save
image-20251027210757208
image-20251027210757208

四、创建工作流

4.1 工作流概览

创建新工作流:知识库-文档索引

4.2 节点详细配置

节点1:文档上传 (Webhook)

节点类型Webhook

节点名称文档上传

配置参数

参数

HTTP Method

POST

Path

knowledge/upload

Response Mode

When Last Node Finishes

Webhook URL格式

代码语言:txt
复制
https://your-n8n-domain.com/webhook/knowledge/upload

测试示例

代码语言:bash
复制
curl -X POST https://your-n8n-domain.com/webhook/knowledge/upload \
  -H "Content-Type: application/json" \
  -H "x-api-key: your-custom-api-key-here" \
  -d '{
    "content": "这是一个测试文档内容。",
    "filename": "test-document.txt"
  }'
image-20251027211142278
image-20251027211142278
节点2:验证API Key (IF)

节点类型IF

节点名称验证API Key

配置参数

代码语言:txt
复制
Conditions > String
  Value 1:  ={{ $json.headers['x-api-key'] }}
  Operation: equal
  Value 2:  your-custom-api-key-here

用途:防止未授权访问,保护Webhook安全。

节点3:文本分块 (Code)

节点类型Code

节点名称文本分块

代码实现

代码语言:javascript
复制
const text = $input.first().json.body.content || '';
const filename = $input.first().json.body.filename || 'unknown';
const chunkSize = 800;       // 每块800字符
const overlap = 200;          // 重叠200字符,避免语义断裂

function chunkText(text, size, overlap) {
  const chunks = [];
  let chunkIndex = 0;
  const paragraphs = text.split(/\n\n+/);  // 按段落分割
  let currentChunk = '';
  
  for (const para of paragraphs) {
    // 如果当前块+新段落超过限制,且当前块不为空
    if ((currentChunk + para).length > size && currentChunk.length > 0) {
      chunks.push({ 
        content: currentChunk.trim(), 
        index: chunkIndex++ 
      });
      
      // 保留部分重叠内容(直接按字符数截取,支持中英文)
      const overlapText = currentChunk.slice(-overlap);
      currentChunk = overlapText + '\n\n' + para;
    } else {
      currentChunk += (currentChunk ? '\n\n' : '') + para;
    }
  }
  
  // 添加最后一块
  if (currentChunk.trim()) {
    chunks.push({ 
      content: currentChunk.trim(), 
      index: chunkIndex 
    });
  }
  
  return chunks;
}

const chunks = chunkText(text, chunkSize, overlap);

// 返回多个item,每个item代表一个文本块
return chunks.map(chunk => ({
  json: {
    text: chunk.content,
    metadata: {
      source: filename,
      chunkIndex: chunk.index,
      totalChunks: chunks.length,
      uploadTime: new Date().toISOString()
    }
  }
}));

分块策略说明

参数

说明

分块大小

800字符

适配ModelScope Embedding模型的最佳输入长度

重叠大小

200字符

约25%重叠率,平衡上下文连续性与存储成本

分割方式

段落优先

\n\n分割,保持语义完整性

元数据

source, chunkIndex, totalChunks, uploadTime

支持溯源和分块顺序重建

重叠处理逻辑

  • 使用 slice(-overlap) 直接截取最后N个字符
  • 支持中英文混合文本,避免按空格分词的局限性
  • 确保相邻块之间有足够的上下文衔接
image-20251027212332540
image-20251027212332540
节点4:生成Embedding (HTTP Request)

节点类型HTTP Request

节点名称生成Embedding

基础配置

参数

Method

POST

URL

https://api-inference.modelscope.cn/v1/embeddings

Authentication

Predefined Credential Type

Credential Type

Header Auth

选择凭据

ModelScope API

Headers配置

代码语言:txt
复制
Name:   Content-Type
Value:  application/json

Body配置

  • Body Content Type: JSON
  • Specify Body: 点击 fx 图标切换到表达式模式
  • 表达式内容:
代码语言:javascript
复制
  {{ JSON.stringify({ 
    model: 'Qwen/Qwen3-Embedding-0.6B', 
    input: $json.text, 
    encoding_format: 'float' 
  }) }}
生成Embedding节点Body配置
生成Embedding节点Body配置

重要提示

  • ⚠️ 表达式必须以 ={{ 开头,不能有多余空格
  • ⚠️ encoding_format: 'float' 确保返回浮点数数组
  • ⚠️ 模型ID必须完整:Qwen/Qwen3-Embedding-0.6B

API响应格式

代码语言:json
复制
{
  "data": {
    "data": [{
      "embedding": [
        -0.0172576904296875,
        -0.0867919921875,
        ...  // 共1024个浮点数
      ],
      "index": 0,
      "object": "embedding"
    }],
    "model": "Qwen/Qwen3-Embedding-0.6B",
    "object": "list",
    "usage": {
      "prompt_tokens": 12,
      "total_tokens": 12
    }
  }
}

关键字段说明

  • data.data[0].embedding: 1024维浮点数数组,每个值范围在 -1, 1
  • data.data[0].index: 文本块在请求中的索引(单文本为0)
  • usage.prompt_tokens: 消耗的token数,用于计费和监控
节点5:格式化数据 (Code)

节点类型Code

节点名称格式化数据

代码实现

代码语言:javascript
复制
// 解析ModelScope返回的数据
const responseData = JSON.parse($input.first().json.data);
const embedding = responseData.data[0].embedding;

// 获取上游节点的元数据
const metadata = $('文本分块').first().json.metadata;
const text = $('文本分块').first().json.text;

// 生成ASCII安全的ID(Pinecone不支持中文ID)
const safeId = `doc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}_${metadata.chunkIndex}`;

// 返回Pinecone标准格式
return [{
  json: {
    id: safeId,                    // 唯一ID,纯ASCII字符
    values: embedding,              // 1024维向量数组
    metadata: {                     // 元数据(可包含中文)
      text: text,                   // 原始文本
      source: metadata.source,      // 文件名
      chunkIndex: metadata.chunkIndex,
      totalChunks: metadata.totalChunks,
      uploadTime: metadata.uploadTime
    }
  }
}];
image-20251027212713939
image-20251027212713939

数据格式转换说明

字段

说明

示例

id

向量唯一标识,必须ASCII

doc_1730012345_abc123def_0

values

向量数组

[0.123, -0.456, ...] (1024维)

metadata.text

原始文本,用于检索后展示

"如何重置密码..."

metadata.source

文档来源

"用户手册.pdf"

metadata.chunkIndex

块索引

0, 1, 2...

Pinecone向量数据结构

为什么需要生成随机ID?

  • ❌ 错误:id: "测试文档.txt_0" → Pinecone报错(不支持中文)
  • ✅ 正确:id: "doc_1730012345_abc123_0" → 纯ASCII,安全可用
节点6:存储到Pinecone (HTTP Request)

节点类型HTTP Request

节点名称存储到Pinecone

基础配置

参数

Method

POST

URL

https://knowledge-base-xxx.svc.xxx.pinecone.io/vectors/upsert

Authentication

Predefined Credential Type

Credential Type

Header Auth

选择凭据

Pinecone API

注意:URL需要替换为你的Pinecone索引Host,并添加 /vectors/upsert 路径

Headers配置

代码语言:txt
复制
Name:   Content-Type
Value:  application/json

Body配置

  • Send Body: ✓ 启用
  • Body Content Type: Raw
  • Content Type: application/json
  • Specify Body: 点击 fx 切换到表达式模式
  • Body表达式:
代码语言:javascript
复制
  {{ JSON.stringify({ vectors: [$json] }) }}
存储到Pinecone节点完整配置
存储到Pinecone节点完整配置

关键注意事项

问题

错误示例

正确示例

Body表达式格式

= {{ JSON.stringify...

={{ JSON.stringify...

URL路径缺失

https://xxx.pinecone.io

https://xxx.pinecone.io/vectors/upsert

Content-Type缺失

未添加Header

必须添加 application/json

成功返回示例

代码语言:json
复制
{
  "upsertedCount": 1
}
节点7:返回成功 (Respond to Webhook)

节点类型Respond to Webhook

节点名称返回成功

配置参数

代码语言:txt
复制
Respond With: JSON
Response Body: (使用表达式)

响应Body表达式

代码语言:javascript
复制
{{ { 
  success: true, 
  message: '文档索引完成', 
  chunks: $('文本分块').all().length, 
  filename: $('文本分块').first().json.metadata.source,
  timestamp: new Date().toISOString()
} }}

成功响应示例

代码语言:json
复制
{
  "success": true,
  "message": "文档索引完成",
  "chunks": 3,
  "filename": "product-manual.pdf",
  "timestamp": "2025-10-27T12:30:45.123Z"
}

响应字段说明

  • success: 操作状态标识
  • message: 人类可读的操作结果描述
  • chunks: 文档被分割成的块数,用于验证处理完整性
  • filename: 原始文件名,用于客户端确认
  • timestamp: ISO 8601格式的完成时间,便于日志追踪
节点8:返回401 (Respond to Webhook)

节点类型Respond to Webhook

节点名称返回401

配置参数

代码语言:txt
复制
Respond With: JSON
Response Code: 401

响应Body表达式

代码语言:javascript
复制
{{ { 
  error: 'Unauthorized', 
  message: '无效的API Key',
  timestamp: new Date().toISOString()
} }}

错误响应示例

代码语言:json
复制
{
  "error": "Unauthorized",
  "message": "无效的API Key",
  "timestamp": "2025-10-27T12:30:45.123Z"
}

HTTP状态码说明

  • 401 Unauthorized: 表示请求缺少有效的身份认证凭据
  • 客户端应检查 x-api-key 请求头是否正确
  • 建议配合日志记录,监控未授权访问尝试

五、测试工作流

5.1 完整调用时序

5.2 保存并激活

  1. 点击右上角 Save 保存工作流
  2. 确保 Active 开关处于开启状态(蓝色)
  3. 复制Webhook URL(在"文档上传"节点中显示)

5.3 使用curl测试

测试命令

代码语言:bash
复制
curl -X POST https://your-n8n-domain.com/webhook/knowledge/upload \
  -H "Content-Type: application/json" \
  -H "x-api-key: your-custom-api-key-here" \
  -d '{
    "content": "产品特点:支持多语言、实时翻译、智能推荐。\n\n使用方法:登录系统,选择语言,输入内容即可自动翻译。\n\n常见问题:如何切换语言?点击右上角设置按钮,选择目标语言。",
    "filename": "product-guide.txt"
  }'

成功响应(HTTP 200):

代码语言:json
复制
{
  "success": true,
  "message": "文档索引完成",
  "chunks": 1,
  "filename": "product-guide.txt",
  "timestamp": "2025-10-27T12:30:45.123Z"
}

认证失败响应(HTTP 401):

代码语言:json
复制
{
  "error": "Unauthorized",
  "message": "无效的API Key",
  "timestamp": "2025-10-27T12:30:45.123Z"
}

响应分析

  • chunks: 1: 文本被分为1块,说明长度在800字符以内
  • 如果文本较长,chunks 值会相应增加
  • timestamp: 用于日志追踪和性能分析

5.4 验证Pinecone存储

  1. 登录Pinecone控制台
  2. 进入 knowledge-base 索引
  3. 查看 Total vector count,应该增加了对应的数量
  4. 点击 Query 标签,可以测试向量检索
Pinecone记录数增加
Pinecone记录数增加

5.5 调试技巧

查看节点输出

  1. 点击任意节点
  2. 查看右侧 OUTPUT 标签
  3. 检查JSON数据是否符合预期

查看执行历史

  1. 点击工作流名称下方的 Executions
  2. 查看每次执行的详细日志
  3. 红色表示失败,绿色表示成功

浏览器开发者工具

  1. 按 F12 打开开发者工具
  2. 切换到 Network 标签
  3. 执行工作流,查看实际HTTP请求和响应

六、常见问题与解决方案

6.0 问题排查流程

6.1 维度不匹配错误

错误信息

代码语言:txt
复制
Bad request - please check your parameters
Vector dimension 1024 does not match the dimension of the index 768

原因分析

  • Pinecone索引创建时,维度设置错误
  • ModelScope的 Qwen3-Embedding-0.6B 输出1024维
  • 索引设置为768维(OpenAI默认维度)

解决方案

  1. 删除现有Pinecone索引
  2. 重新创建索引,Dimensions设置为1024
  3. 更新n8n中的Pinecone URL
  4. 重新测试
维度不匹配错误
维度不匹配错误

6.2 Vector ID包含非ASCII字符

错误信息

代码语言:txt
复制
Bad request - please check your parameters
Vector ID must be ASCII, but got '产品手册.pdf_0'

原因分析

  • Pinecone的ID字段仅支持ASCII字符(a-z, A-Z, 0-9, -, _)
  • 中文文件名直接用作ID导致错误

解决方案

在"格式化数据"节点中,使用随机生成的ASCII ID:

代码语言:javascript
复制
// ❌ 错误写法
const id = `${metadata.source}_${metadata.chunkIndex}`;  // 包含中文

// ✅ 正确写法
const safeId = `doc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}_${metadata.chunkIndex}`;

中文文件名保存在 metadata.source 字段中,检索时可以使用。

Vector ID中文错误
Vector ID中文错误

七、检查清单

部署前请确认以下事项:

账号和凭据

  • 已注册ModelScope并获取API Token
  • 已注册Pinecone并获取API Key
  • 已在n8n中配置两个Header Auth凭据

Pinecone索引

  • 索引维度设置为 1024
  • Metric设置为 cosine
  • 已复制索引Host URL

n8n节点配置

  • "生成Embedding"节点Body表达式无多余 =
  • "存储到Pinecone"节点URL包含 /vectors/upsert
  • "格式化数据"节点使用ASCII安全的ID生成
  • "验证API Key"节点配置了自定义密钥
  • 所有节点正确连接

测试验证

  • Webhook已激活(Active开关打开)
  • curl测试返回成功响应
  • Pinecone控制台显示向量数增加
  • 检查每个节点的OUTPUT数据格式

十二、参考资源

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、系统架构
    • 1.1 技术选型
    • 1.2 数据流程
  • 二、准备工作
    • 2.1 所需账号
      • ModelScope
      • Pinecone
      • n8n
    • 2.2 创建Pinecone索引
  • 三、配置n8n凭据
    • 3.1 配置ModelScope API凭据
    • 3.2 配置Pinecone API凭据
  • 四、创建工作流
    • 4.1 工作流概览
    • 4.2 节点详细配置
      • 节点1:文档上传 (Webhook)
      • 节点2:验证API Key (IF)
      • 节点3:文本分块 (Code)
      • 节点4:生成Embedding (HTTP Request)
      • 节点5:格式化数据 (Code)
      • 节点6:存储到Pinecone (HTTP Request)
      • 节点7:返回成功 (Respond to Webhook)
      • 节点8:返回401 (Respond to Webhook)
  • 五、测试工作流
    • 5.1 完整调用时序
    • 5.2 保存并激活
    • 5.3 使用curl测试
    • 5.4 验证Pinecone存储
    • 5.5 调试技巧
  • 六、常见问题与解决方案
    • 6.0 问题排查流程
    • 6.1 维度不匹配错误
    • 6.2 Vector ID包含非ASCII字符
  • 七、检查清单
    • 账号和凭据
    • Pinecone索引
    • n8n节点配置
    • 测试验证
  • 十二、参考资源
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档