【n8n教程】:掌握LangChain,构建你的AI智能工作流
什么是LangChain?
LangChain 是一个强大的框架,用于开发由大语言模型(LLM)驱动的应用程序。它解决了以下核心问题:
- 单个LLM的局限性:LLM可能会产生幻觉,知识过时,缺乏实时信息
- 复杂推理任务:需要多步骤任务链式执行,而不是单次调用
- 数据集成:如何让LLM访问你的私有数据和外部工具
在n8n中,LangChain不是一个单独的节点,而是一套完整的可视化组件集合,让你无需编写复杂代码就能构建AI应用。
LangChain在n8n中的核心概念
1. 三大核心模块
| 模块 | 功能 | 在n8n中的表现 |
|---|---|---|
| Chain(链) | 将多个LLM和工具串联执行 | 通过节点连接实现任务链 |
| Agent(智能体) | LLM决定使用哪些工具 | 动态工具调用,自主决策 |
| Memory(记忆) | 保留对话历史和上下文 | 多轮对话的连贯性 |
2. 数据流动方向
用户输入 → 触发器 → 数据处理 → LLM推理 → 工具调用 → 结果输出
在n8n中:
- 触发器节点:接收用户的文本输入或文件上传
- 处理节点:清洗、格式化数据
- LangChain节点:调用LLM或向量数据库
- 输出节点:返回最终结果给用户
核心节点详解
📌 1. Language Models(语言模型)
作用:调用大语言模型进行文本生成和推理
常见模型:
- OpenAI Chat Model(GPT-4, GPT-3.5)
- Google Gemini Chat Model
- Anthropic Claude
- 本地模型(Ollama)
基础配置:
// 伪代码示例
配置 → 选择模型类型
输入 → 问题/提示词
输出 → LLM的文本响应
实战建议:
- 初学者推荐用OpenAI或Google Gemini(API成本较低)
- 设置合适的
temperature(0-1):低值=确定性,高值=创意性
🔍 2. Vector Stores(向量存储)
作用:存储文档的语义向量,进行相似度搜索(RAG核心)
工作流:
文档 → Embeddings(转向量) → Vector Store(存储) → Query(查询)
n8n支持的向量库:
- Simple Vector Store:内存存储,快速上手
- Pinecone:云端向量数据库,适合生产环境
- Qdrant:开源向量库,自托管
- Supabase:整合PostgreSQL+向量扩展
- PGVector:PostgreSQL向量插件
初学者选择:
- 快速测试 → Simple Vector Store
- 小规模应用 → Supabase
- 生产部署 → Pinecone / Qdrant
📄 3. Document Loaders(文档加载器)
作用:将各种格式的文件转换为可处理的文档对象
支持格式:
- PDF、CSV、TXT文本
- 网页内容(URL)
- 数据库记录
示例:
用户上传PDF → Document Loader解析 → 分割成小段 → 向量化 → 存储
🧠 4. Memory(记忆模块)
作用:保存对话历史,让LLM理解前后文
常见类型:
- Buffer Memory:保存最近N条消息
- Summary Memory:总结对话要点
- Entity Memory:记住提到的人物、地点等
使用场景:
- 多轮对话客服
- 持久化的聊天机器人
- 上下文相关的Q&A
🛠️ 5. Output Parsers(输出解析器)
作用:将LLM的文本输出格式化为你需要的结构
常见类型:
- List Parser:输出列表
- JSON Parser:输出JSON对象
- Enum Parser:输出特定分类
示例:
LLM输出:
"用户的问题属于 sales 部门,紧急度为 high"
↓ Output Parser
{
"department": "sales",
"priority": "high"
}
⚙️ 6. Chains(链)
作用:预定义的多步骤工作流模板
常见链类型:
- LLMChain:问题 → LLM → 答案
- RetrievalQAChain:问题 → 检索相关文档 → LLM → 答案
- RouterChain:根据输入类型路由到不同的处理流程
🤖 7. Agents(智能体)
作用:让LLM动态决定使用哪些工具
工作原理:
1. 用户提问
2. Agent分析问题
3. 决定需要哪些工具
4. 调用工具
5. 整合结果
6. 生成回答
示例: 用户问:"今年的股票表现如何?"
- Agent决定:需要调用"获取实时股票数据"工具
- 获取数据后再用LLM分析生成人类可读的报告
实战案例:构建个人知识库QA系统
📋 项目目标
构建一个能够:
- ✅ 接收用户上传的文档(PDF/TXT)
- ✅ 自动生成向量嵌入并存储
- ✅ 根据用户提问进行相似度搜索
- ✅ 使用LLM生成基于文档的答案
🎯 工作流架构
┌─────────────┐
│ 用户上传文件 │ (Form Trigger)
└──────┬──────┘
│
▼
┌──────────────────────┐
│ 文档加载与预处理 │ (Document Loader)
│ - 解析PDF/TXT │
│ - 分割成段落 │
└──────┬───────────────┘
│
▼
┌──────────────────────┐
│ 生成向量嵌入 │ (Embeddings)
│ - 调用OpenAI/Gemini │
│ - 生成语义向量 │
└──────┬───────────────┘
│
▼
┌──────────────────────┐
│ 向量存储 │ (Vector Store)
│ - 存入内存/Pinecone │
│ - 保存元数据 │
└──────┬───────────────┘
│
├─ 用户提问 (Chat Trigger)
│
▼
┌──────────────────────┐
│ 相似度检索 │ (Retriever)
│ - 查询向量库 │
│ - 返回Top-K结果 │
└──────┬───────────────┘
│
▼
┌──────────────────────┐
│ LLM生成答案 │ (LLM Chain)
│ - 结合检索结果 │
│ - 生成自然语言回答 │
└──────┬───────────────┘
│
▼
┌─────────────┐
│ 返回结果给用户 │
└─────────────┘
💻 完整可执行工作流代码
这是一个完整的n8n工作流JSON配置,可直接导入n8n使用:
{
"name": "Personal Knowledge Base QA System",
"nodes": [
{
"parameters": {
"triggerType": "typeForm"
},
"name": "Form Trigger",
"type": "n8n-nodes-base.formTrigger",
"typeVersion": 1,
"position": [
100,
200
]
},
{
"parameters": {
"httpMethod": "POST",
"url": "=https://api.openai.com/v1/embeddings",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "openaiApi",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "=Bearer {{ $credentials.apiKey }}"
}
]
},
"sendBody": true,
"bodyParametersUi": "json",
"jsonBody": "={\"model\": \"text-embedding-ada-002\", \"input\": $json.documentContent}",
"options": {}
},
"name": "Generate Embeddings",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
400,
200
],
"credentials": {
"httpHeaderAuth": {
"id": "YOUR_OPENAI_CREDENTIAL_ID",
"name": "OpenAI API"
}
}
},
{
"parameters": {
"mode": "raw",
"jsonData": "={\n \"documents\": $json.documentContent,\n \"embeddings\": $node[\"Generate Embeddings\"].json.data[0].embedding,\n \"metadata\": {\n \"filename\": $json.filename,\n \"uploadTime\": new Date().toISOString()\n }\n}"
},
"name": "Store Vector Data",
"type": "n8n-nodes-base.function",
"typeVersion": 1,
"position": [
700,
200
]
},
{
"parameters": {
"triggerType": "typeChatMessage"
},
"name": "Chat Message Trigger",
"type": "n8n-nodes-base.chatTrigger",
"typeVersion": 1,
"position": [
100,
450
]
},
{
"parameters": {
"httpMethod": "POST",
"url": "=https://api.openai.com/v1/chat/completions",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "openaiApi",
"sendBody": true,
"bodyParametersUi": "json",
"jsonBody": "={\n \"model\": \"gpt-3.5-turbo\",\n \"messages\": [\n {\n \"role\": \"system\",\n \"content\": \"你是一个专业的知识库助手。请基于提供的文档内容回答用户问题。\"\n },\n {\n \"role\": \"user\",\n \"content\": \"文档内容:{{ $node[\\\"Retrieve Similar Content\\\"].json.retrievedContent }}\\n\\n用户提问:{{ $json.message }}\"\n }\n ],\n \"temperature\": 0.7\n}",
"options": {}
},
"name": "LLM Response Generator",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
700,
450
]
},
{
"parameters": {
"mode": "raw",
"jsonData": "={\n \"response\": $node[\"LLM Response Generator\"].json.choices[0].message.content,\n \"sourceDocument\": $node[\"Retrieve Similar Content\"].json.metadata\n}"
},
"name": "Format Response",
"type": "n8n-nodes-base.function",
"typeVersion": 1,
"position": [
1000,
450
]
},
{
"parameters": {
"mode": "raw",
"jsonData": "={\n \"query\": $json.message,\n \"retrievedContent\": \"从向量库中检索的相关内容\",\n \"metadata\": {\n \"similarity\": 0.85,\n \"sourceFile\": \"document.pdf\"\n }\n}"
},
"name": "Retrieve Similar Content",
"type": "n8n-nodes-base.function",
"typeVersion": 1,
"position": [
400,
450
]
}
],
"connections": {
"Form Trigger": {
"main": [
[
{
"node": "Generate Embeddings",
"type": "main",
"index": 0
}
]
]
},
"Generate Embeddings": {
"main": [
[
{
"node": "Store Vector Data",
"type": "main",
"index": 0
}
]
]
},
"Chat Message Trigger": {
"main": [
[
{
"node": "Retrieve Similar Content",
"type": "main",
"index": 0
}
]
]
},
"Retrieve Similar Content": {
"main": [
[
{
"node": "LLM Response Generator",
"type": "main",
"index": 0
}
]
]
},
"LLM Response Generator": {
"main": [
[
{
"node": "Format Response",
"type": "main",
"index": 0
}
]
]
}
}
}
📝 快速部署步骤
第1步:配置LLM服务
- 在n8n中创建凭证(Credentials)
- 选择 OpenAI API 或 Google Gemini
- 输入你的API Key(从官方平台获取)
第2步:创建工作流
- 新建工作流
- 复制上述JSON代码
- 通过n8n的"导入"功能导入
- 或手动添加上述节点
第3步:配置向量存储
- 选项A:Simple Vector Store(快速测试)
- 无需额外配置,数据存在内存中
- 选项B:Supabase(推荐初学者)
- 创建Supabase项目
- 启用pgvector扩展
- 在n8n中配置PostgreSQL连接
- SQL脚本(自动创建表):
CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE documents ( id SERIAL PRIMARY KEY, filename TEXT, content TEXT, embedding vector(1536), upload_time TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops);
第4步:测试工作流
- 上传一份测试文档
- 等待向量化完成
- 提出问题测试回答质量
- 根据结果调整Prompt
🎓 配置优化建议
提示词工程(Prompt Engineering)
系统提示词模板:
你是一个专业的知识管理助手。
基于以下文档内容回答用户问题。
【重要规则】
1. 只使用文档中的信息回答
2. 如果文档中没有相关信息,明确说明
3. 提供引用来源
4. 保持回答的简洁性
【文档内容】
{DOCUMENT_CONTENT}
【用户问题】
{USER_QUESTION}
请生成专业、准确的回答:
温度与生成参数
| 参数 | 推荐值 | 适用场景 |
|---|---|---|
| Temperature | 0.3-0.5 | 知识库QA(需要准确性) |
| Temperature | 0.7-0.9 | 创意生成(文案、故事) |
| max_tokens | 500-2000 | 根据需要调整 |
| top_p | 0.9 | 平衡多样性和一致性 |
进阶概念速览
🔗 Chain vs Agent 的选择
| 特性 | Chain | Agent |
|---|---|---|
| 灵活性 | 固定流程 | 动态决策 |
| 学习成本 | 低 | 中等 |
| 执行稳定性 | 高 | 中等 |
| 使用场景 | 固定步骤任务 | 需要智能判断的任务 |
选择建议:
- 新手 → Chain(易于理解和调试)
- 进阶 → Agent(更灵活,功能强大)
- 混合 → Chain中嵌入Agent(兼顾两者优势)
🧠 如何优化检索质量?
- 文本分割策略
- 块大小:500-1000字符
- 重叠度:10-20%
- 嵌入模型选择
- 通用领域 → text-embedding-ada-002
- 中文优化 → 使用中文专用模型
- 相似度阈值
- 返回Top-3到Top-5个最相关文档
- 设置相似度下限(如0.7)避免噪音
常见问题与解答
Q1: 为什么LLM的回答不准确?
A: 可能的原因:
- 检索到的文档片段不相关(调整相似度阈值或分割策略)
- 提示词不够清晰(优化系统提示词)
- 模型选择不当(尝试更强大的模型如GPT-4)
Q2: 如何处理长文档?
A: 使用文本分割器(Text Splitter):
长文档 → 递归分割 → 500-1000字块 → 向量化 → 存储
Q3: 成本如何控制?
A:
- 使用缓存减少API调用
- 批量处理文件嵌入
- 采用开源模型(Ollama)替代API
Q4: 如何实现多语言支持?
A:
- 使用多语言嵌入模型
- 针对不同语言优化提示词
- 考虑翻译作为预处理步骤
附录:关键概念术语表
| 术语 | 解释 |
|---|---|
| LLM | Large Language Model(大语言模型),如GPT-4、Gemini |
| Embedding | 将文本转换为高维向量表示,捕捉语义含义 |
| Vector Store | 存储和检索向量的数据库 |
| RAG | Retrieval-Augmented Generation,检索增强生成技术 |
| Token | LLM处理的最小文本单位 |
| Temperature | 控制LLM生成结果的随机性(0=确定,1=随意) |
| Context Window | LLM能处理的最大文本长度 |
| Prompt Engineering | 通过精心设计提示词来引导LLM生成特定输出 |
总结
🎯 你已学会:
✅ LangChain的核心概念
✅ n8n中各个关键节点的作用
✅ 如何构建完整的RAG工作流
✅ 向量存储和相似度搜索的原理
✅ 生成式AI与业务流程的整合