你是否曾想让AI能够理解和引用你的专有文档?RAG(检索增强生成) 技术可以做到这一点。通过RAG,AI不再依赖训练数据中的知识,而是可以实时从你的知识库中检索信息。
RAG(Retrieval-Augmented Generation) 是一种让AI更聪明的技术:
| 传统AI的问题 | RAG如何解决 |
|---|---|
| 知识过时(基于旧的训练数据) | 实时从最新文档检索信息 |
| 无法访问专有知识(公司内部信息) | 可以访问你的私有文档库 |
| 容易产生幻觉(编造信息) | 基于真实文档生成,减少幻觉 |
| 无法解释答案来源 | 返回引用的源文档 |

向量存储是一个特殊的数据库,它做三件事:
你的文档:
"公司提供健康保险"
"员工享受年假"
向量化后(简化示例):
向量1: [0.12, 0.85, 0.33, ...]
向量2: [0.14, 0.82, 0.35, ...]
用户问题:"假期政策是什么?"
问题向量: [0.15, 0.83, 0.34, ...] ← 与向量2最相似!
↓ 检索出 → "员工享受年假"例子:
在n8n中,首先需要连接你的知识源:
支持的数据源:
n8n节点选择:
文件上传 → Google Drive → 数据库查询 → HTTP请求大文档需要分割成小块。n8n提供三种方式:
| 方式 | 特点 | 适用场景 |
|---|---|---|
| 字符分割 | 按固定字符数分割 | 结构简单的纯文本 |
| 递归分割✅ | 按Markdown/代码块/HTML结构分割 | 📌 推荐:适合大多数文档 |
| Token分割 | 按Token数分割 | 精确控制API成本 |
最佳实践:
将文本转换为计算机能理解的向量。选择合适的模型是关键:
| 模型 | 维度 | 速度 | 成本 | 最适用 |
|---|---|---|---|---|
text-embedding-ada-002 | 1536 | ⚡⚡⚡ 最快 | 💰 最便宜 | 简短文本、原型、成本敏感 |
text-embedding-3-large | 3072 | ⚡ 较慢 | 💰💰 较贵 | 长文档、复杂主题、高精度需求 |
开源模型(如all-MiniLM-L6-v2) | 384 | ⚡⚡⚡ 很快 | 💰 免费 | 本地部署、无成本 |
如何选择:
项目规模 → 文档类型 → 预算
↓ ↓ ↓
小规模 + 短文本 + 有限 → ada-002
大规模 + 长文本 + 充足 → 3-large
本地 + 任何 + 无成本 → 开源模型选择合适的向量存储解决方案:
| 存储方案 | 特点 | 成本 | 最适用 |
|---|---|---|---|
| Simple Vector Store | 内存存储,快速原型,n8n内置 | 🆓 免费 | 学习、小规模演示 |
| Pinecone | 托管云服务,完全可扩展,持久化 | 💰 按使用量计费 | 生产环境、企业应用 |
| Qdrant | 开源、功能完整、可自建 | 🆓 开源免费 | 隐私敏感、自主控制 |
| Milvus | 开源向量数据库,高性能 | 🆓 开源免费 | 大规模数据、学术研究 |
用户提问时的完整流程:
┌─────────────┐
│ 文档上传 │
│ (PDF/TXT) │
└──────┬──────┘
↓
┌──────────────────┐
│ 文本分割 │
│(递归分割: 500t) │
└──────┬───────────┘
↓
┌──────────────────┐
│ 生成嵌入 │
│ (OpenAI API) │
└──────┬───────────┘
↓
┌──────────────────┐ 用户问题
│ 向量存储 │ ↓
│(Simple/Pinecone)│ ┌─────────────┐
└──────┬───────────┘ │ 问题向量化 │
│ └─────┬───────┘
└──────→ 搜索 ←────┘
↓
┌──────────────┐
│ 相似性搜索 │
│ (返回Top 5) │
└──────┬───────┘
↓
┌──────────────────┐
│ LLM生成答案 │
│ (基于检索结果) │
└──────┬───────────┘
↓
┌──────────────────┐
│ 返回结果 │
│ (答案+源文档) │
└──────────────────┘rag嵌入模型:OpenAI text-embedding-ada-002
文本分割器:递归字符分割
块大小:500
块重叠:100"你是公司知识库助手。
根据提供的文档内容回答问题。
如果文档中没有答案,说明你无法从文档找到相关信息。"将以下JSON代码复制到n8n中:
导入方法:
{
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "chat",
"responseMode": "responseNode",
"authentication": "none"
},
"id": "webhook_trigger",
"name": "Chat Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [50, 300]
},
{
"parameters": {
"operation": "insertDocuments",
"memoryKey": "rag_knowledge_base",
"dataLoader": "default",
"textSplitter": "recursiveCharacter",
"chunkSize": 500,
"chunkOverlap": 100
},
"id": "vector_store",
"name": "Vector Store - Insert",
"type": "n8n-nodes-langchain.vectorStoreLancedb",
"typeVersion": 1,
"position": [300, 300],
"credentials": {
"openAIApi": "openai_api_key"
}
},
{
"parameters": {
"operation": "getMany",
"query": "={{ $json.question }}",
"limit": 5,
"memoryKey": "rag_knowledge_base"
},
"id": "vector_search",
"name": "Search Vector Store",
"type": "n8n-nodes-langchain.vectorStoreLancedb",
"typeVersion": 1,
"position": [550, 300],
"credentials": {
"openAIApi": "openai_api_key"
}
},
{
"parameters": {
"model": "gpt-4",
"temperature": 0.5,
"systemMessage": "你是一个有帮助的AI助手。基于提供的文档内容精准回答问题。如果文档中没有相关信息,请说'根据提供的文档,我找不到相关答案'。",
"messages": [
{
"role": "user",
"content": "={{ '问题:' + $json.question + '\\n\\n相关文档内容:\\n' + ($json.documents || '无') }}"
}
]
},
"id": "llm_response",
"name": "Generate Answer - GPT-4",
"type": "n8n-nodes-base.openAI",
"typeVersion": 1,
"position": [800, 300],
"credentials": {
"openAIApi": "openai_api_key"
}
},
{
"parameters": {
"responseData": "={{ { answer: $json.choices[0].message.content } }}"
},
"id": "response",
"name": "Return Response",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1,
"position": [1050, 300]
}
],
"connections": {
"webhook_trigger": {
"main": [[{"node": "vector_search", "output": 0}]]
},
"vector_search": {
"main": [[{"node": "llm_response", "output": 0}]]
},
"llm_response": {
"main": [[{"node": "response", "output": 0}]]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
}
}A: 这取决于你的具体需求:
预算有限? → 使用 text-embedding-ada-002
↓ (快速、便宜)
需要高精度? → 使用 text-embedding-3-large
↓ (准确度最高)
隐私敏感? → 使用开源模型
↓ (本地部署,无数据泄露风险)成本对比(约):
A: 推荐的黄金配置:
{
"分割方式": "递归字符分割",
"块大小": 500,
"块重叠": 100,
"优先级": "Markdown结构 > 代码块 > 段落"
}为什么这个配置好:
A: 三个关键因素决定检索效果:
{
"text": "文档内容",
"metadata": {
"source": "员工手册 v2.1",
"date": "2024-01-15",
"category": "HR",
"importance": "high"
}
}A: n8n支持的主要向量存储(按推荐顺序):
选择建议:
开发/学习阶段 → Simple Vector Store
小规模生产 → Qdrant (自建)
大规模企业 → Pinecone (托管)
隐私至上 → Qdrant/Milvus (自建)A: 通常:
加快学习的建议:
策略A:缓存常见问题
缓存热问题答案 → 减少60%的API调用
策略B:批量处理
不要逐个处理 → 批量发送文档
结果:成本可降低50-70%原始速度:3-5秒/查询
优化1:使用更快的嵌入模型 → 1-2秒
优化2:减少返回块数(5→3) → 0.5秒
优化3:添加缓存层 → 0.1秒
最终速度:0.5-1秒 ✅不同方法效果对比:
基础RAG 准确度:70%
↓
添加元数据 准确度:78%
↓
多步检索 准确度:82%
↓
人工验证反馈 准确度:88%+// 在工作流中添加监控节点
{
"query": "用户问题",
"retrieved_docs_count": 5,
"response_time_ms": 1250,
"answer_quality": "high", // manual or ML scored
"user_satisfaction": true/false
}⚠️ 在生产环境部署RAG系统时,注意:
| 方面 | 建议 |
|---|---|
| 数据安全 | 对敏感信息进行加密存储 |
| 访问控制 | 只让授权用户查询特定文档 |
| API密钥 | 使用n8n的凭证管理,不要暴露 |
| 隐私 | 考虑使用自建向量存储(Qdrant) |
| 合规性 | 确保符合GDPR、行业规范等 |
原因可能:
解决方案:
1. 尝试调整块大小:400-600 tokens
2. 切换嵌入模型测试
3. 清理文档(移除无关内容)
4. 添加元数据帮助过滤解决方案:
1. 检查API密钥是否有效
2. 减少并发请求数
3. 增加超时时间
4. 使用错误处理节点捕获异常原因可能:
优化建议:
1. 改用更便宜的模型(ada-002)
2. 启用请求缓存
3. 批量处理文档
4. 定期审查使用情况通过本教程,你已经学会了:
[1] 官方文档: https://docs.n8n.io/advanced-ai/rag-in-n8n/
[2] n8n系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#