LangChain: LEDVR工作流详解
LangChain 1.0+ 官方文档和路线图中没有直接定义或描述“LEDVR” 这个术语。
目前 LEDVR 这个词主要出现在一些中文社区博客和技术文章中,是对RAG(检索增强生成)流程节点的概述。而官方的英文术语中,一般用 RAG(检索增强生成)来描述从文档加载到向量检索的端到端数据预处理流程。
核心概念
在LangChain开发体系中,”LEDVR”实际上指向两个不同的核心工作流概念,它们服务于不同的开发层次:
数据处理工作流
数据处理工作流:L→E→D→V→R,这是最常被提及的LEDVR定义——一个用于构建RAG(检索增强生成)知识库的标准化数据处理流程:
| 步骤 | 字母 | 含义 | LangChain 1.0+ 核心组件 |
|---|---|---|---|
| 1 | L | Load(加载数据) | PyPDFLoader、WebBaseLoader、TextLoader等 |
| 2 | E | Extract(提取内容) | 由加载器内部完成, 从原始文件中提取纯文本 |
| 3 | D | Divide(分割文档) | RecursiveCharacterTextSplitter(LangChain 1.0+仍广泛使用) |
| 4 | V | Vectorize(向量化) | OpenAIEmbeddings、HuggingFaceEmbeddings等嵌入模型 |
| 5 | R | Retrieve(检索) | Chroma、FAISS、Pinecone等向量数据库 + as_retriever() |
数据增强检索
数据增强检索:Loader → Embedding → Document Transformers → VectorStore → Retriever
此视角下的LEDVR同样是LangChain数据增强模块的功能集成工具,各字母对应:
| 步骤 | 字母 | 含义 | 功能说明 |
|---|---|---|---|
| 1 | L | Loader(加载器) | 从PDF、网页、数据库 等20+种来源加载原始数据 |
| 2 | E | Embedding Model(嵌入模型) | 将文本转换为向量表示, 如OpenAI、HuggingFace模型 |
| 3 | D | Document Transformers(文档转换器) | 文档分割、过滤、格式化等转换操作 |
| 4 | V | VectorStore(向量存储器) | 存储嵌入向量,支持相似度检索 |
| 5 | R | Retriever(检索器) | 针对查询匹配最相关的文档片段并返回 |
理解这两个概念的关系:
- 前者(L-E-D-V-R)是从业务逻辑角度描述构建RAG应用的5步操作流程。
- 后者(Loader-Embedding-Document-VectorStore-Retriever)是从框架组件角度描述数据增强模块的5个功能组件。
两者虽字母对应略有不同,核心目标一致——将外部文档转化为可供LLM检索和生成的知识资源。实践中开发者通常将二者混用,重点在于掌握各组件在RAG流水线中的具体用法。
官方术语
在阅读官方文档时,若想获得更权威的设计思路和最佳实践,仍建议使用:
Loader → Transform → Embed → Store → Retrieve 等官方术语。
在 LangChain 官方文档和 RAG 指南中,Loader → Transform → Embed → Store → Retrieve 描述了构建检索增强生成(RAG)系统的核心数据流水线。以下是每个步骤的精确含义及对应的 LangChain 组件:
| 步骤 | 官方术语 | 含义 | 对应 LangChain 组件 | 作用 |
|---|---|---|---|---|
| 1 | Loader | 从不同数据源(文件、网页、数据库等)加载原始文档 | BaseLoader 及其子类:PyPDFLoader, TextLoader, WebBaseLoader, DirectoryLoader |
将外部数据读取为 Document 对象列表 |
| 2 | Transform | 对加载后的文档进行转换处理,最常见的是文本分割(splitting),也可包括过滤、清洗、元数据增强等 | TextSplitter:RecursiveCharacterTextSplitter, TokenTextSplitter以及 DocumentTransformer |
将长文档切分成适合嵌入模型的短块(chunk),保证语义完整性和检索精度 |
| 3 | Embed | 将文本块(chunk)转换为稠密向量(embedding vector) | Embeddings 接口:OpenAIEmbeddings, HuggingFaceEmbeddings, CohereEmbeddings |
将文本映射到向量空间,用于语义相似度计算 |
| 4 | Store | 将生成的向量连同原始文本块存入向量数据库,支持高效检索 | VectorStore:Chroma, FAISS, Pinecone, Milvus, Weaviate |
持久化存储向量,提供 similarity_search、max_marginal_relevance_search 等接口 |
| 5 | Retrieve | 根据用户查询,从向量存储中检索最相关的文档块 | VectorStoreRetriever:通过 vectorstore.as_retriever() 获得也可用 ParentDocumentRetriever, MultiVectorRetriever 等 |
封装检索逻辑,返回相关文档列表供 LLM 生成最终回答 |
官方推荐流程图:
1 | [Data Source] → Loader → [Document] → Transform → [Chunks] → Embed → [Vectors] → Store → [Vector DB] → Retrieve → [Relevant Chunks] → LLM → Answer |
理解这五个官方术语后,就能在阅读 LangChain 1.0+ 文档时快速定位到对应的 API 和最佳实践。例如:
- Transform 阶段的
RecursiveCharacterTextSplitter参数调优是 RAG 性能的关键 - Store 阶段可选择支持元数据过滤的向量库(如 Chroma 的
where参数) - Retrieve 阶段可结合
as_retriever(search_type="mmr")提升结果多样性
LEDVR工作流示例
要为一家电商公司开发一个智能客服机器人,它能够自动回答用户关于产品、订单、退货政策等问题。这些答案都存在于公司的产品手册、FAQ 文档和内部知识库中。
LEDVR 工作流就是为这个机器人“武装”知识库的完美方案。
场景拆解
- 目标: 构建一个能基于公司私有文档回答用户问题的智能客服。
- 数据源: 产品PDF手册、FAQ网页、包含退货政策的Word文档。
- 流程: 使用 LEDVR 工作流处理所有文档,构建一个专属的向量知识库。当用户提问时,机器人从这个知识库中检索相关信息,再生成准确的回答。
代码示例
下面是一个简化的代码示例(LangChain 1.0+ 风格),展示如何使用 LangChain 1.0+ 的模块化组件来实现这个智能客服的知识库构建。
1 | # 1. Load (加载) |
LangChain 1.0 Agent工作流
从Chain到ReAct的架构跃迁
LangChain 1.0的发布标志着框架定位的根本转变——从大语言模型”调用工具集”升级为”生产级Agent系统开发框架”。
团队通过创造性地放弃早期的Chain设计,全面拥抱ReAct(Reasoning + Acting)模式,解决了0.x版本的核心缺陷:
| 0.x版本Chain问题 | 1.0版本ReAct解决方案 |
|---|---|
| 僵化的线性流程,偏离模板时陷入两难 | 灵活的推理→工具调用→观察→判断闭环,动态决策 |
| 生产级控制缺失,上下文溢出、敏感信息泄露 | 中间件机制注入PII检测、人工审批、自动重试 |
| 模型切换时需重写适配代码 | Content Block统一内容规范,跨模型兼容 |
ReAct核心执行循环
ReAct模式是LangChain 1.0 Agent工作流的底层运行时引擎,其核心逻辑为一个标准化闭环:
模型推理(Thought) → 工具选择(Action) → 工具执行(Observation) → 任务判断(Decision) → 未完成则循环执行
LangChain 1.0将ReAct循环设为核心架构,使其成为构建可靠、可解释和可投入生产的智能体的默认架构。LangGraph 作为底层执行引擎,提供显式状态管理、动态分支控制和可恢复执行等能力。
分层策略:从简单到复杂
LangChain 1.0采用**”标准—扩展—复杂”**三级分层策略,实现从简单到复杂的开发路径,覆盖80%的通用场景与20%的定制化需求:
| 层级 | 适用场景 | 核心API | 特点 |
|---|---|---|---|
| 标准场景(~90%的任务) | 常规推理与工具调用 | create_agent() |
10行代码完成Agent构建,内置工具选择、状态管理、异常处理 |
| 扩展场景 | 需PII检测、人工审批、自动重试等生产级控制 | Middleware |
洋葱模型,在模型调用前/工具执行时/输出后插入自定义逻辑 |
| 复杂场景 | 多Agent协作、复杂状态机、长周期执行 | LangGraph + 自定义工作流 |
图的节点和边,完全控制执行流程 |
构建智能体方式
1 | # v1.0(官方推荐写法) |
典型应用场景
电商客服智能体
以下示例将完整演示:LEDVR数据处理工作流构建RAG知识库 + LangChain 1.0 Agent工作流实现自主推理与工具调用,两者结合搭建一个可投入生产的电商客服智能体。
场景背景
电商客服需同时处理三类任务:
- 知识查询:物流政策、退换货流程(需要RAG检索)
- 订单操作:查询订单状态、取消订单、修改地址(需要工具调用)
- 综合规划:面对”这个订单还能取消吗?取消后我重新下单有什么影响?”等问题时,需要多步推理和任务拆解
代码示例
代码示例:LangChain 1.0+ API
1 | #!/usr/bin/env python3 |
代码说明
- 环境准备:安装依赖,
pip install langchain langchain-openai langchain-community chromadb pypdf python-dotenv。 - 配置API密钥:在项目根目录创建
.env文件,填入OPENAI_API_KEY="your-key"。 - 知识库准备:在
./knowledge_base/目录放置客服政策文档(如return_policy.txt、shipping_guide.txt等)。 - RAG 检索工具未完整接入:代码中构建了
retriever并将它包装成 Agent 可调用的工具,然后将retrieve_knowledge加入tools列表。 - 中间件执行顺序:声明顺序为
[PIIRedactionMiddleware, ApprovalMiddleware],执行顺序为:before_model(脱敏)→before_tool(审批)→ 实际工具调用 →after_tool→after_model
- 状态持久化:
MemorySaver仅用于演示,生产环境建议使用RedisSaver或PostgresSaver支持跨进程恢复。 - 异步支持:中间件中的
before_model/before_tool方法是异步的,Agent 的ainvoke方法支持异步调用。
工作流总结
两条工作流的协同关系
在完整的电商客服智能体中,两条工作流层次分明地协同运作:
| 工作流类型 | 执行角色 | 核心机制 | 运行位置 |
|---|---|---|---|
| LEDVR数据工作流 | 离线/定时 | 文档加载→分割→向量化→入库 | 构建阶段运行, 知识库可定期更新 |
| Agent工作流(ReAct) | 在线/实时 | 推理→工具调用→观察→判断 | 每次用户请求触发, 实时执行 |
实际运行中:当用户提出请求时,Agent通过ReAct循环自行判断——若为知识类问题,通过检索器访问已构建的向量知识库;若为订单/商品操作,直接调用工具函数;若问题复杂,则拆解为多个子任务逐一处理,最后整合答案。
实践总结
- 系统提示词设计至关重要:它决定了Agent的行为边界和决策质量,需清晰定义角色、能力和约束条件。
- 中间件逐层递进:从基础安全控制(PII检测)开始,逐步叠加审计日志、人工审批等企业级能力。
- 分层策略是开发路径:从
create_agent()快速构建MVP,通过中间件解决生产级控制需求,遇到复杂多Agent场景再转向LangGraph定制工作流。
LangChain: LEDVR工作流详解

