news 2026/8/15 12:09:55

LangChain与RAG全链路

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangChain与RAG全链路

LangChain 到底在干嘛?从环境搭建到 RAG 全链路,一份能直接照抄的工程清单

摘要:本文基于某互联网平台数据分析团队的 AI 助手落地经验,从 LangChain 环境搭建讲起,完整走一遍"加载 → 切分 → 向量化 → 存储 → 检索"RAG 全链路,包含 prompt 模板化、结构化输出、向量数据库选型对比与重排优化,附可直接复制的代码与避坑要点,帮你避开"教程跑通、生产就挂"的经典陷阱。


一、先说结论:LangChain 是胶水层,不是魔法

很多同学学 LangChain 学到最后还是懵:这东西到底解决什么问题?

一句话:LangChain 是连接大模型与应用的"胶水层"。现在大模型厂商那么多,每家 API 都不一样,你要一个个适配?LangChain 帮你统一接口;你要让大模型读取文档、查数据库、多步推理?LangChain 给你标准组件。

某互联网平台数据分析团队的痛点是:分析师每天要查几十份业务文档(PDF 里的报表、Excel 里的指标口径、Markdown 里的数仓规范),格式五花八门。我们用 LangChain 搭了个文档问答助手,把"找文档 → 看内容 → 提炼结论"变成了自然语言对话。

二、环境搭建:一次配好,别让版本坑了你

这一步最容易劝退新手。三个要点:

① 用 Python 3.10/3.11,别用太新的版本,很多依赖还没跟上。

② 用 venv 建独立环境,避免和系统环境打架:

python-mvenv langchain_envsourcelangchain_env/bin/activate# Windows 用 langchain_env\Scripts\activatepipinstalllangchain==0.0.279 openai

避坑要点:LangChain 版本迭代非常快,API 说变就变。教程报错 90% 是版本问题——锁定教程同款版本号(比如上面锁0.0.279),跑通后再考虑升级。

③ API 配置:优先 OpenAI 官方 API;国内环境可用阿里千问(DashScope)替代,LangChain 已内置支持。key 和代理地址通过环境变量管理,别写死在代码里:

importosfromlangchain.llmsimportOpenAI os.environ["OPENAI_API_KEY"]="你的key"os.environ["OPENAI_API_BASE"]="代理地址(如有)"llm=OpenAI(model="gpt-3.5-turbo-instruct",temperature=0)print(llm.predict("介绍一下你自己"))

temperature=0 是生产铁律:非零值下,模型会"自由发挥"——实测让它生成 JSON 结构,temperature=0.7时经常输出错乱甚至编造内容(比如让模型自我介绍,GPT-3.5 编了个"广东大学生"身份)。结构化输出场景必须temperature=0

2.1 装好之后,先想清楚 LangChain 能干嘛

新手最容易犯的错:环境搭好就开始写代码,写完不知道自己在干嘛。LangChain 的核心能力可以概括成六大模块,对着这个清单想你的业务场景:

能力模块解决什么问题典型用法
模型 I/O统一调用各家大模型 API换模型不改代码
提示词管理模板化、版本化管理提示词PromptTemplate
链(Chains)多次调用编排成工作流SequentialChain
检索增强(RAG)让模型读取企业私有知识Loader + 向量库
智能体(Agent)自主决策、拆解、调用工具ReAct / Tools
记忆(Memory)给模型外挂上下文状态短时/长时记忆

对照这个表,你要做的业务一定能找到对应的组合——比如数据分析助手 = RAG + 链 + 记忆,客服机器人 = Agent + 工具 + 记忆。先定位再动手,代码只是最后一步。

三、Prompt 模板化 + 输出解析:把自然语言变成程序可用的数据

3.1 PromptTemplate:告别手写提示词

参数化提示词是第一个进阶点。以"起名大师"为例:

fromlangchain.promptsimportPromptTemplate template=PromptTemplate.from_template("你是一个起名大师,请模仿示例起3个{country}特色的名字,""比如男孩经常被叫做{boy},女孩经常被叫做{girl}")message=template.format(country="中国特色",boy="狗蛋",girl="翠花")print(message)

3.2 OutputParser:结构化输出,给程序消费

大模型输出是文本,程序要的是结构化数据。自定义一个输出解析器,把逗号分隔的字符串转成 Python 列表:

fromlangchain.schemaimportBaseOutputParserclassCommaSeparatedListOutputParser(BaseOutputParser):defparse(self,text:str):returntext.strip().split(", ")CommaSeparatedListOutputParser().parse("龙飞, 铁柱, 小虎")# ['龙飞', '铁柱', '小虎']

配合提示词强制约束格式:“请返回以逗号分隔的列表,仅返回列表,不要其他内容”。

避坑要点:提示词必须绑定示例(男孩叫狗蛋、女孩叫翠花)+明确输出约束(仅返回列表)。大模型是"见人说人话",约束越具体,输出越稳定。

四、RAG 全链路:加载 → 切分 → 向量化 → 存储 → 检索

RAG 解决的是大模型"知识滞后 + 幻觉"问题:把企业私有知识向量化存起来,问答时先检索相关片段,再让模型基于片段回答。下面是每个环节的落地细节。

4.1 加载(Loader):10+ 格式全覆盖

LangChain 的 Loader 组件负责把各种文件读进来:

文件类型Loader说明
MarkdownTextLoader最基础的文本加载
CSVCSVLoader表格数据
HTMLBSHTMLLoader/UnstructuredHTMLLoader后者能精准过滤标签只留文本
PDFPyPDFLoader文档场景高频使用
JSONJSONLoader配置文件、接口数据

4.2 切分(Text Splitting):固定长度切分是第一个大坑

很多人上来就chunk_size=512一刀切,这在生产里基本等于埋雷。切太大会把无关噪声带进上下文,切太小会切断语义(比如"产假制度"被拦腰截断)。按语义单元切,而不是按字符数:

fromlangchain.text_splitterimportRecursiveCharacterTextSplitter text_splitter=RecursiveCharacterTextSplitter(chunk_size=150,# 文本块大小chunk_overlap=20,# 相邻块重叠,防止语义断裂length_function=len,add_start_index=True,# 记录起点,方便溯源)texts=text_splitter.create_documents([content])

避坑要点:中文场景建议在分隔符里加入"。"和换行,按句子边界切分;chunk_overlap给 10%-20%,解决"一句话正好被切开"的问题。

4.3 向量化(Embedding):开源模型够用,不一定要烧钱

文本块要变成向量才能进向量库做相似度检索。OpenAI Embeddings 效果最好,但 HuggingFace 开源模型(如all-MiniLM-L6-v2)完全够用,还能本地部署:

fromlangchain.embeddingsimportHuggingFaceBgeEmbeddings embeddings=HuggingFaceBgeEmbeddings(model_name="all-MiniLM-L6-v2")

向量空间的语义相似性很好理解:"猫"和"狗"的向量距离近,"猫"和"汽车"的向量距离远——这就是语义检索的基础。

4.4 向量数据库选型:匹配团队工程能力,别追求纸面性能

数据库特点适合谁
Milvus高性能开源,云原生大厂、有专业运维团队
FAISSMeta 轻量级,CPU/GPU 均可单机/中小项目
Pinecone全托管 SaaS,免费版 500 万向量想省运维、快速起步的团队
ChromaPython 原生,文档完善个人/原型验证
QdrantRust 高性能,支持多模态对性能敏感的业务

避坑要点:可用性 > 理论峰值。Milvus 性能顶尖但运维门槛高,对中小团队是负担;Pinecone 全托管 + 免费额度,让业务团队把精力放在提示词和数据质量上,而不是调库。选型先看团队能不能养得起,再看性能。

4.5 检索优化:别忽视"Lost in the Middle"

长文档切分后检索有个著名现象——Lost in the Middle:Transformer 对长上下文的中间部分注意力衰减,问题相关性低的内容块放中间几乎检索不到。解决思路是重排序(Re-order):检索出 Top-N 片段后,把相关性最高的片段移到上下文头尾:

fromlangchain.document_transformersimportLongContextReorder reordering=LongContextReorder()reordered_docs=reordering.transform_documents(docs)

这一招能明显提升 RAG 问答的准确率,是低成本高收益的优化点。

4.6 进阶优化:嵌入缓存 + 文档总结,省 token 的两板斧

① 嵌入向量缓存(CacheBackedEmbeddings)。生产环境一个隐蔽成本:同一批文档反复向量化,OpenAI API 按 token 收费,重复计算全是冤枉钱。LangChain 提供缓存机制,相同文本只计算一次,落盘复用:

fromlangchain.embeddingsimportOpenAIEmbeddings,CacheBackedEmbeddingsfromlangchain.storageimportLocalFileStore underlying=OpenAIEmbeddings()fs=LocalFileStore("./cache/")cached_embeddings=CacheBackedEmbeddings.from_bytes_store(underlying,fs,namespace=underlying.model)

实测文档增量更新时,只有新增片段产生 embedding 调用,历史向量全部命中缓存,成本下降明显。

② 文档总结/翻译链。长文档直接塞进 Prompt 会爆上下文窗口。先让模型分块总结再合并,是最省 token 的做法(详见文档处理链那篇)。这里先给个最小可用的总结方式:

fromlangchain.chains.summarizeimportload_summarize_chain chain=load_summarize_chain(llm=llm,chain_type="stuff",verbose=True)chain.run(docs)# docs 为加载并切分后的文档对象

五、整体架构串起来

用一张图看全链路:

用户提问 │ ▼ Loader 加载文档 → 切分器切块 → Embedding 向量化 → 向量库存储 │ 用户问题 Embedding → 向量检索 Top-N ──► 重排序 ──► 拼接上下文 │ ▼ 大模型生成回答(temperature=0)

这张图建议存下来当检查清单:任何一环断了,整个 RAG 就哑火。我们排查线上问题时,就是按这条链路从上往下逐环节验证——Loader 加载是否成功、切分是否断句、向量化是否命中、检索召回是否为空、重排是否把关键信息挤到中间、生成阶段有没有温度参数失控。定位问题的时间从"半天靠猜"降到"半小时按图索骥"。

六、写在最后

LangChain 的价值在于把 RAG 的每个环节标准化、组件化,让你专注业务逻辑而不是造轮子。但框架只是工具,真正的竞争力在两点:数据质量(知识治理)和提示词工程。技术框架成熟之后,90% 项目失败在知识层——文档没清洗、没标注、没版本管理,再好的框架也是"垃圾进、垃圾出"。

如果你也在搭 RAG 应用,欢迎评论区聊聊:你卡在哪个环节了?下面几个方向我后续会展开写,想看哪个留言告诉我:

  1. 混合检索(BM25 + 向量)的融合策略与工程实现
  2. 企业知识库的治理体系(元数据、版本、权限)
  3. 多模态 RAG(PDF 里图片+表格的联合处理)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/15 12:08:05

深度学习模型输出解析:从Logits到最终决策的完整指南

1. 项目概述:从“可能性”到“答案”的翻译之旅 “我从来只给可能性,答案是你们翻译的”——这句话如果出自一个模型之口,听起来既傲慢又真实。在机器学习的语境里,这恰恰是模型推理过程最精炼的哲学概括。我们训练一个模型&#…

作者头像 李华
网站建设 2026/8/15 12:07:52

快捷键说没就没?三分钟揪出抢占热键的程序

快捷键说没就没?三分钟揪出抢占热键的程序 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你有没有遇到过这种情…

作者头像 李华
网站建设 2026/8/15 12:07:18

slam 建图

1.稠密地图没法计算特征点和描述子要用到极线搜索和块匹配技术假设图像块灰度不变性,进行块匹配,有点类似于直接法一些计算方法:2.1 高斯分布的深度滤波器匹配得分沿距离分布的函数2.2 均匀-高斯混合分布滤波器逆深度,块匹配前的工…

作者头像 李华
网站建设 2026/8/15 12:07:13

干了十年程序员,我不再跟AI比谁懂的多

半年前团队来了个应届生,挺机灵的。入职第三天,他拿Cursor写了个完整的CRUD模块,接口、校验、异常处理,一应俱全。代码贴出来,格式规整,命名规范。 我盯着屏幕看了几秒,说实话,心里…

作者头像 李华
网站建设 2026/8/15 12:05:41

记账App用来用去,最后不如用DeepSeek自己开发一个

我尝试过各种各样的记账应用,但发现始终绕不开两大问题:数据分散、手动填入。 就是这两个关键问题——在当今如此分散、碎片的消费模式下,用户根本不可能事无巨细地手动记账,而功能再齐全的记账软件都没能真正解决这一点。所以我…

作者头像 李华
网站建设 2026/8/15 12:04:26

N_m3u8DL-RE 下载教程:7 个问答带你玩转 MPD/M3U8/ISM 流媒体下载

N_m3u8DL-RE 下载教程:7 个问答带你玩转 MPD/M3U8/ISM 流媒体下载 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m…

作者头像 李华