【n8n教程】:掌握LangChain,构建你的AI智能工作流

59 阅读8分钟

【n8n教程】:掌握LangChain,构建你的AI智能工作流

什么是LangChain?

LangChain 是一个强大的框架,用于开发由大语言模型(LLM)驱动的应用程序。它解决了以下核心问题:

  • 单个LLM的局限性:LLM可能会产生幻觉,知识过时,缺乏实时信息
  • 复杂推理任务:需要多步骤任务链式执行,而不是单次调用
  • 数据集成:如何让LLM访问你的私有数据和外部工具

在n8n中,LangChain不是一个单独的节点,而是一套完整的可视化组件集合,让你无需编写复杂代码就能构建AI应用。


点击获取最新AI资讯、n8n工作流、开发经验分享

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系统

📋 项目目标

构建一个能够:

  1. ✅ 接收用户上传的文档(PDF/TXT)
  2. ✅ 自动生成向量嵌入并存储
  3. ✅ 根据用户提问进行相似度搜索
  4. ✅ 使用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服务
  1. 在n8n中创建凭证(Credentials)
  2. 选择 OpenAI API 或 Google Gemini
  3. 输入你的API Key(从官方平台获取)
第2步:创建工作流
  1. 新建工作流
  2. 复制上述JSON代码
  3. 通过n8n的"导入"功能导入
  4. 或手动添加上述节点
第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步:测试工作流
  1. 上传一份测试文档
  2. 等待向量化完成
  3. 提出问题测试回答质量
  4. 根据结果调整Prompt

🎓 配置优化建议

提示词工程(Prompt Engineering)

系统提示词模板

你是一个专业的知识管理助手。
基于以下文档内容回答用户问题。

【重要规则】
1. 只使用文档中的信息回答
2. 如果文档中没有相关信息,明确说明
3. 提供引用来源
4. 保持回答的简洁性

【文档内容】
{DOCUMENT_CONTENT}

【用户问题】
{USER_QUESTION}

请生成专业、准确的回答:
温度与生成参数
参数推荐值适用场景
Temperature0.3-0.5知识库QA(需要准确性)
Temperature0.7-0.9创意生成(文案、故事)
max_tokens500-2000根据需要调整
top_p0.9平衡多样性和一致性

进阶概念速览

🔗 Chain vs Agent 的选择

特性ChainAgent
灵活性固定流程动态决策
学习成本中等
执行稳定性中等
使用场景固定步骤任务需要智能判断的任务

选择建议

  • 新手 → Chain(易于理解和调试)
  • 进阶 → Agent(更灵活,功能强大)
  • 混合 → Chain中嵌入Agent(兼顾两者优势)

🧠 如何优化检索质量?

  1. 文本分割策略
    • 块大小:500-1000字符
    • 重叠度:10-20%
  2. 嵌入模型选择
    • 通用领域 → text-embedding-ada-002
    • 中文优化 → 使用中文专用模型
  3. 相似度阈值
    • 返回Top-3到Top-5个最相关文档
    • 设置相似度下限(如0.7)避免噪音

常见问题与解答

Q1: 为什么LLM的回答不准确?

A: 可能的原因:

  • 检索到的文档片段不相关(调整相似度阈值或分割策略)
  • 提示词不够清晰(优化系统提示词)
  • 模型选择不当(尝试更强大的模型如GPT-4)

Q2: 如何处理长文档?

A: 使用文本分割器(Text Splitter):

长文档 → 递归分割 → 500-1000字块 → 向量化 → 存储

Q3: 成本如何控制?

A:

  • 使用缓存减少API调用
  • 批量处理文件嵌入
  • 采用开源模型(Ollama)替代API

Q4: 如何实现多语言支持?

A:

  • 使用多语言嵌入模型
  • 针对不同语言优化提示词
  • 考虑翻译作为预处理步骤

附录:关键概念术语表

术语解释
LLMLarge Language Model(大语言模型),如GPT-4、Gemini
Embedding将文本转换为高维向量表示,捕捉语义含义
Vector Store存储和检索向量的数据库
RAGRetrieval-Augmented Generation,检索增强生成技术
TokenLLM处理的最小文本单位
Temperature控制LLM生成结果的随机性(0=确定,1=随意)
Context WindowLLM能处理的最大文本长度
Prompt Engineering通过精心设计提示词来引导LLM生成特定输出

总结

🎯 你已学会:

✅ LangChain的核心概念
✅ n8n中各个关键节点的作用
✅ 如何构建完整的RAG工作流
✅ 向量存储和相似度搜索的原理
✅ 生成式AI与业务流程的整合


官方文档

n8n系列教程