通俗解释了 RAG 的向量检索原理,提供了用 n8n + OpenAI + Pinecone 搭建 RAG 流水线的完整步骤与成本估算。
RAG 是一种将大语言模型(LLM)与嵌入式文本块的向量存储相结合的技术,在查询时从外部知识库中检索相关上下文。实际流程是:用户输入 prompt 后,先从外部知识库中拉取最相关的段落,再让模型基于这些段落生成回答。这一机制意义重大——它能显著减少幻觉、无需昂贵的微调即可保持模型知识更新,还可以通过一次 API 调用回答领域相关问题。
预计构建时间:最小可验证原型 2-3 小时,生产级 pipeline (含监控)1-2 天。
将所有文本文件(PDF、markdown、HTML)放入 ./docs 文件夹。使用简单的 Python 脚本(或 n8n 的 "Read Binary File" 节点)提取原始文本。
将每个文档拆分为约 200 token 的块,以保持在 LLM 的上下文窗口限制内。在 n8n 中,添加一个 Function 节点,运行 JavaScript:
// This node receives `content` as a string and returns an array of chunks
const maxTokens = 200;
const words = $json["content"].split(/\s+/);
const chunks = [];
for (let i = 0; i < words.length; i += maxTokens) {
chunks.push(words.slice(i, i + maxTokens).join(' '));
}
return [{ json: { chunks } }];
添加一个 HTTP Request 节点,调用 OpenAI 的 embedding 端点。
{
"method": "POST",
"url": "https://api.openai.com/v1/embeddings",
"headers": {
"Authorization": "Bearer {{ $env.OPENAI_API_KEY }}",
"Content-Type": "application/json"
},
"body": {
"model": "text-embedding-ada-002",
"input": "{{$json.chunk}}"
},
"responseFormat": "json"
}
作用:将每个 200 token 的块发送给 OpenAI,获取一个 1536 维向量。
使用另一个 HTTP Request 节点,指向 Pinecone 的 upsert 端点(https://{index}.svc.{region}.pinecone.io/vectors/upsert)。Payload 示例:
{
"vectors": [
{
"id": "doc-{{ $json.docId }}-{{ $json.chunkIdx }}",
"values": {{ $json.response.data[0].embedding }},
"metadata": { "text": "{{ $json.chunk }}" }
}
]
}
触发器:HTTP Webhook 节点(暴露 /query 端点)。
步骤 A - 对用户查询进行嵌入:与步骤 3 相同的 HTTP Request 节点,但输入为用户的 prompt。
步骤 B - 检索 top-k 个相似块:向 Pinecone 的查询端点发送 HTTP 请求,请求 topK=5。
{
"method": "POST",
"url": "https://{index}.svc.{region}.pinecone.io/query",
"headers": {
"Authorization": "Bearer {{ $env.PINECONE_API_KEY }}",
"Content-Type": "application/json"
},
"body": {
"vector": {{ $json.response.data[0].embedding }},
"topK": 5,
"includeMetadata": true
},
"responseFormat": "json"
}
作用:根据用户的问题找到五个最相关的文档块。
使用 Set 节点将检索到的文本拼接成系统 prompt:
You are an assistant that answers using only the provided context. Context:
{{ $json.results.map(r => r.metadata.text).join('\n---\n') }}
Question: {{ $json.question }}
添加一个 HTTP Request 节点,向 OpenAI 的 chat completion 端点(https://api.openai.com/v1/chat/completions)发送请求。
{
"method": "POST",
"url": "https://api.openai.com/v1/chat/completions",
"headers": {
"Authorization": "Bearer {{ $env.OPENAI_API_KEY }}",
"Content-Type": "application/json"
},
"body": {
"model": "gpt-4",
"messages": [
{ "role": "system", "content": "{{ $json.composedPrompt }}" }
],
"temperature": 0.2,
"max_tokens": 500
},
"responseFormat": "json"
}
将响应连接到 Webhook 节点的返回 JSON:
{
"answer": "{{ $json.choices[0].message.content }}",
"sources": {{ $json.results.map(r => r.id) }}
}
本地运行工作流(docker compose up -d n8n)或使用 n8n Cloud。
向 https://your-n8n-instance.com/webhook/query POST 一个 JSON payload:{"question":"What is rag ai?"}。
验证回答是否引用了检索到的块(sources 数组)。
结果:你现在拥有一个可用的端点,可以通过基于自有知识库的内容来回答 "what is rag ai"(或任何领域问题),显著减少幻觉。
关键事实:RAG 不会完全消除幻觉,但当检索到的上下文质量较高时,可以减少约 30-40% 的幻觉(见 OpenAI 最佳实践指南)。
更深入的技术参考见 n8n 的文档。
RAG(检索增强生成)是一种方法:先从向量数据库中查找相关的文本片段,然后将那些片段输入 LLM,使回答锚定在真实内容上。
分块创建了大小均匀的片段,能够适配 LLM 的上下文窗口。更小、定义更明确的块能提升相似度匹配效果,因为每个向量代表一个连贯的思想,减少了 top-k 结果中的噪音。
可以。Weaviate、Milvus 或 Qdrant 等开源方案可以在 Docker 中免费运行。将 Pinecone HTTP 节点替换为你所选数据库的等价端点即可,其余工作流完全相同。
理论上,任何接受 prompt 的模型都可以使用。只需一个与向量存储兼容的嵌入模型(如 Cohere、HuggingFace 的 sentence-transformers),并调整 chat-completion 请求格式。
将嵌入向量存储在私有 VPC 隔离的 Pinecone 索引中,或防火墙后的自托管向量 DB 中。确保 webhook 进行了身份验证(API key 或 OAuth),并定期审计查询日志。
查看 RAG Support Agent 获取现成的 n8n 模板和分步指南,或领取免费指南深入了解高级分块策略和监控实践。
准备好上线生产级 RAG 服务了吗?从 RAG Support Agent 获取模板,立即开始扩展。
24/7 AI Support Agent (RAG)
How to automate lead generation with AI: Build a lead-enrichment pipeline that writes your icebreaker
How to automate customer support with AI: Build a RAG-powered chatbot that knows when to escalate