C2-04 基于langchain和llamaindex开发框架的RAG
🎬 课前开胃:从一次"翻车"说起
💡 小王花了 8000 块给公司接入了 GPT-4,兴冲冲地问:"我们公司去年的差旅报销标准是什么?" 大模型自信满满地回了一段文字——优雅、专业、滴水不漏。全是瞎编的。
老板拍桌子:"我要的是一个会查资料的助手,不是一个会编故事的演说家!"
这就是我们今天要解决的问题。RAG(Retrieval-Augmented Generation,检索增强生成) 给大模型外挂了一个"实时图书馆",让它在回答前先去翻资料,再开口说话。
用一句话类比:
🏛️ 大模型 = 博学但记不清细节的教授
📚 RAG = 帮教授跑腿的私人图书助理
🎯 回答质量 = 教授知识 × 助理资料质量
🧠 什么是 RAG?一段话讲透
RAG = 检索 + 增强 + 生成。三个关键词分别对应:
| 步骤 | 做了什么 | 通俗解释 |
|---|---|---|
| 1. 检索 Retrieve | 从知识库找相关资料 | 助理在书架上翻找"差旅报销"相关文件 |
| 2. 增强 Augment | 把资料拼到提示词里 | 把找到的资料放在教授面前 |
| 3. 生成 Generate | LLM 基于资料回答 | 教授看着资料给答案 |
🛤️ RAG 的三段进化史
RAG 不是一蹴而就的,它经历了三个阶段,像手机从"大哥大"进化到"智能手机"一样:
① Native RAG(原始版)
类比:便利店里的速溶咖啡——能喝,但你不会想天天喝。
流程:用户问题 → 向量检索 → 拼接上下文 → LLM 回答。简单粗暴,问题也多:
- 检索结果良莠不齐,直接喂给 LLM 像"开盲盒"
- 召回多就乱,召回少就答不出
- 没有任何"精加工"步骤
② Advanced RAG(进阶版)
类比:连锁咖啡店的手冲咖啡——豆子选好,水温控好,口感稳定多了。
在 Native 基础上加了四大法宝:
- 🔍 查询改写 Query Rewrite:把"今年利润怎么样"改成"2024年利润同比增长率"
- 📊 重排序 Rerank:用模型给候选段落打分,留下最相关的
- ✂️ 上下文压缩 Compression:把长篇资料压成"重点摘要"
- 🧠 多跳推理 Multi-hop:拆解复杂问题,多次检索后综合
③ Modular RAG(模块化版)
类比:米其林餐厅的后厨——每个工种专人负责,流水线作业。
把整条链路拆成独立模块:数据清洗 → 分块 → 向量化 → 检索 → 重排 → 压缩 → 生成 → 评估。可以自由替换、组合、A/B 测试,这就是企业级 RAG 的标配。
🎯 本课目标:掌握两个最主流的开发框架——LangChain(编排之王) 和 LlamaIndex(索引之王),并能在 5 分钟内搭起一个能跑的 RAG 系统。
🧩 一个标准 RAG 系统的四阶段全景
无论用什么框架,RAG 都逃不出这四步:理解 → 检索 → 后处理 → 生成。我们用"点外卖"做类比:
| 阶段 | 类比 | 关键技术 | 常见工具 |
|---|---|---|---|
| 1. 理解 | 听清你想吃什么 | 查询改写、意图识别、Query 分解 | LLM、LangChain |
| 2. 检索 | 在菜单里找匹配 | 向量检索、BM25、混合检索 | FAISS、Weaviate、Pinecone、LlamaIndex |
| 3. 后处理 | 把菜端上来摆好 | Rerank、压缩、过滤 | BGE-Reranker、LLM 摘要 |
| 4. 生成 | 开始享用 | Prompt 模板、Self-RAG | LangChain、LlamaIndex |
下面我们进入两个开发框架的精讲。👇
Langchain
💡 LangChain 是什么? 如果大模型是乐高积木里的"动力源",LangChain 就是那一整套说明书 + 工具箱 + 传送带。它不生产大模型,而是让大模型"接得上"数据、工具和业务逻辑。
一句话定位:LangChain = 大模型时代的"Spring 框架"——你想搭一个能跑的应用,用它准没错。
🎯 LangChain 能解决什么问题?
如果直接调大模型 API,你会撞到四面墙:
- 🚧 墙 1:上下文不够长——塞不下 100 页 PDF
- 🚧 墙 2:没有记忆——每次对话从零开始
- 🚧 墙 3:流程死板——只能"输入→输出"一锤子买卖
- 🚧 墙 4:接不上工具——没法查数据库、调 API、算数学
LangChain 的回答是:给我一个能编排的瑞士军刀。它把"Prompt + LLM + 工具 + 记忆 + 流程"全部模块化,让你像搭积木一样拼出复杂应用。
🧱 核心组件六件套(必背)
| 组件 | 干什么的 | 通俗解释 |
|---|---|---|
| Models I/O | 统一接入各家大模型 | 充电接口,适配 OpenAI、Qwen、DeepSeek、Claude…… |
| Prompts | 把提示词模板化 | 填空题模板,变量可复用、可 A/B 测试 |
| Chains(LCEL) | 把多步操作串成流水线 | 工厂流水线,A 工序完成后自动传给 B |
| Retrievers | 从知识库"找资料" | 图书管理员,根据关键词/语义挑书 |
| Memory | 保存对话历史 | 顾客的"会员卡",记住他上次说了什么 |
| Agents + Tools | 让 LLM 自主决定调哪个工具 | 会思考的助理,先想"要不要查资料""要不要算数"再动手 |
👨🍳 LCEL:LangChain 的"灵魂"
LCEL(LangChain Expression Language) 用 Unix 管道符 | 把各个组件串起来。它让"链"从"配置地狱"变成了"一行代码":
1 2 3 4 5 6 7 8 9 | |
三段式管道:模板(填空) → 模型(答题) → 解析器(格式化),这就是 LCEL 的精髓。
🚀 实战 1:最小可跑的 RAG(5 行代码)
我们从最简版开始,逐步升级到工业级。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | |
✅ 看到没?不到 30 行代码就搭出一个能"查资料再回答"的助手。这就是 LangChain 的魔力——把复杂留给自己,把简单留给开发者。
🚀 实战 2:工业级 RAG(查询改写 + 重排 + 压缩 + 自评)
上面的版本只是"能跑",但容易"答得糊"。真正的工业级 RAG 需要做四件事:
- 查询改写:把口语化问题改成检索友好的查询
- 重排序:把最相关的段落排到前面
- 压缩:把上下文压成"事实要点",减少噪声
- 自评回跳:模型打分,不合格就再查一轮
🔧 LangChain 的杀手锏:可替换积木
上面这套代码里的每一个零件都能换,这是 LangChain 最大的魅力:
| 想换什么 | 换成什么 | 难度 |
|---|---|---|
| 向量库 | FAISS → Pinecone / Weaviate / Milvus | ⭐ 一行代码 |
| LLM | OpenAI → Qwen / DeepSeek / Claude / 本地 Ollama | ⭐ 一行代码 |
| Rerank | Embedding 简化版 → BAAI/bge-reranker-large | ⭐⭐ 几行代码 |
| 流程编排 | 手写循环 → LangGraph 状态机 | ⭐⭐ 几行代码 |
| 评估 | 无 → RAGAS / TruLens 自动化评估 | ⭐⭐ 几行代码 |
💡 实战技巧:3 个"坑"和 3 个"妙招"
坑 1:检索结果太大,塞爆上下文
👉 妙招:用 ContextualCompressionRetriever 让 LLM 帮你筛"重点"
1 2 3 4 5 6 7 8 9 | |
坑 2:多轮对话"失忆"
👉 妙招:用 ConversationBufferWindowMemory 记最近 N 轮
1 2 3 4 5 6 7 8 9 | |
坑 3:LLM 一本正经地胡说八道
👉 妙招:Prompt 强制"只能基于上下文回答,无依据就说不"
1 2 3 4 5 6 7 8 9 10 | |
🎁 LangChain 适合谁? 想搭综合型应用(RAG + Agent + 工具 + 多轮对话 + 评估),生态最全,几乎所有场景都"能打"。
Llamaindex
💡 LlamaIndex 是什么? 如果 LangChain 是工厂流水线,LlamaIndex 就是那个把原材料(文档)整理成"目录卡片"的图书馆编目员。它的强项只有一个字:"索"。
一句话定位:LlamaIndex = RAG 时代的"知识索引专家"——文档怎么拆、怎么存、怎么查,它做到了极致。
🎯 LlamaIndex 解决什么问题?
LangChain 也能做 RAG,但当你面对海量异构文档时,光是"怎么拆、怎么索引"就够头疼:
- 📑 1000 份 PDF 怎么分块?按章节、按段落、按 token?
- 🗂️ 表格、代码块、图片怎么单独存?
- 🧭 用户问"和 2023 年比",怎么知道要按"年份"过滤?
- 🌳 文档里的小标题要不要保留成"路标"?
LlamaIndex 的答案是:把"索引"这件事做成一套专精体系。
🧱 核心组件五件套(必背)
| 组件 | 干什么的 | 通俗解释 |
|---|---|---|
| Document | 原始文档对象 | 一张"白纸",装着一段文字 + 元数据 |
| Node | 切分后的最小检索单元 | 把白纸剪成"便利贴",每张一个意思 |
| Parser | 把文档切成 Node | 裁纸机,可按规则(句长/章节/格式)剪 |
| Index | 把 Node 组织成可检索结构 | 5 种索引:Vector / List / Tree / Keyword / Summary |
| QueryEngine | 把"问题→答案"包装成一行调用 | 把整个检索+生成流程变成"自动售货机" |
🌳 LlamaIndex 的"五种索引":从"书架"到"地图"
LlamaIndex 的最大特色是索引类型丰富,每种适合不同场景:
| 索引类型 | 类比 | 适合什么 | 适合文档 |
|---|---|---|---|
| VectorIndex | 按"意思"摆书 | 语义相似度检索 | 通用文档 |
| ListIndex | 顺序排好 | 完整按顺序读 | 剧本、合同 |
| TreeIndex | 章节大纲 | 先看摘要再展开 | 长文、书籍 |
| KeywordTableIndex | 按关键词查 | 精确词匹配 | 法规、合同条款 |
| SummaryIndex | 每段先看总结 | 长摘要+定位 | 研究报告 |
类比记忆法:想象一个图书馆——
- VectorIndex = 图书按"主题相似度"摆在一起(文学区挨着文艺区)
- TreeIndex = 馆藏目录树(文学 → 中国文学 → 古代文学 → 诗词)
- KeywordTableIndex = 倒排索引(像百度搜索,关键词直接定位)
🚀 实战 1:5 行代码搭一个问答机器人
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
对比一下 LangChain 的 30 行,你会发现 LlamaIndex 的设计哲学是:"少即是多"。它把默认值都帮你选好了,5 行就能跑。
🚀 实战 2:进阶版——分层索引 + 自定义解析
真实项目中,文档类型往往很杂(年报 PDF + 表格 + 邮件),需要更精细的"裁纸"和"摆书"策略:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | |
🎯 这个例子的亮点:同一份资料,既建了语义索引(找"意思相近"的段落),又建了关键词索引(精确匹配术语)。双管齐下,召回率飙升。
🌟 特色能力:Sub-Question Query Engine(子问题分解)
LlamaIndex 自带一个超能力:自动把复杂问题拆成子问题。
类比:你问图书管理员"我们公司 2023 和 2024 哪年的研发投入更多?",普通 RAG 只会丢一堆片段。LlamaIndex 的 Sub-Question Engine 会自动:
- 拆成"2023 研发投入"和"2024 研发投入"两个子问题
- 分别检索
- 把两个答案拼起来对比
🔗 联动大招:LlamaIndex 索引 + LangChain 编排
最佳实践不是"二选一",而是"LlamaIndex 做知识,LangChain 做编排"。LlamaIndex 负责把知识库做"干净、可控、可更新",LangChain 负责把"检索→重排→压缩→生成→自评"的复杂链路串起来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | |
🎁 LlamaIndex 适合谁? 资料源复杂、文档量大、检索质量要求高(法务/医疗/金融),或需要"分层索引"+"自动拆问题"。索引与检索是它的王牌。
⚔️ 双剑合璧:LangChain vs LlamaIndex 终极对比
学了上面两个框架,你可能会有疑问:到底该选哪个? 答案是:别二选一,看场景搭配。我们用一张表说清:
| 维度 | LangChain | LlamaIndex | 搭配使用 |
|---|---|---|---|
| 核心定位 | 编排框架(瑞士军刀) | 索引框架(目录管理员) | 知识 + 流程 |
| 最强项 | 链式编排、Agent、工具调用 | 文档加载、索引、检索 | 一个管"怎么查",一个管"怎么用" |
| 上手难度 | ⭐⭐⭐(概念多,需理解) | ⭐⭐(开箱即用,5行就跑) | 先 LlamaIndex 跑通,再上 LangChain |
| 代码量(同等功能) | 较多(30 行起) | 较少(5 行起) | LlamaIndex 索引 + LangChain 编排 ≈ 25 行 |
| 索引种类 | 主推向量索引 | 5 种(Vector/List/Tree/Keyword/Summary) | LlamaIndex 赢 |
| Agent 能力 | 原生支持(强) | 需配合 LangChain(中) | LangChain 赢 |
| 生态丰富度 | ⭐⭐⭐⭐⭐(100+ 集成) | ⭐⭐⭐(专注文档场景) | LangChain 赢 |
| 可观测性 | LangSmith、Callbacks | LlamaDebug、Phoenix | LangChain 略胜 |
| 生产部署 | LangServe 一键 REST | 需自行部署 | LangChain 赢 |
🎯 选型决策树(直接抄答案)
🌳 问自己 3 个问题:
① 我的知识库长什么样?
- 多格式、海量、要复杂索引 → LlamaIndex
- 单一文本、量不大 → LangChain 单独够用
② 我的应用流程复杂吗?
- 需要多步决策、工具调用、Agent → LangChain 必选
- 只是单轮问答 → LlamaIndex 单独够用
③ 我要快速上线还是长期演进?
- 快速上线验证 → LlamaIndex 5 行跑通
- 长期演进 + 多模块组合 → LlamaIndex + LangChain
🏆 不同业务的"最优配方"
| 业务场景 | 推荐配方 | 为什么 |
|---|---|---|
| 📄 企业知识库问答 | LlamaIndex 索引 + LangChain 编排 | 索引要稳,流程要灵活,全场景通吃 |
| 💰 金融年报分析 | LlamaIndex(多索引) + LangChain(混合检索+Rerank) | 数字精准,需要 Hybrid(语义+关键词) |
| ⚖️ 法务合同比对 | LlamaIndex(KeywordTable) + LangChain(Rerank+引用) | 关键词敏感,要溯源到具体条款 |
| 🤖 智能客服 / Agent | LangChain(主) + LlamaIndex(知识子模块) | 重点是 Agent 决策,知识库做支撑 |
| 🩺 医疗问答 | LlamaIndex(多模态) + LangChain(自评+SOP 工具) | 要严格"依据不足就说",不能幻觉 |
| 🚀 极简 MVP / Demo | LlamaIndex 单独(5 行跑通) | 快糙猛,先验证想法 |
📋 上线检查清单(Checklist)
把上面的代码用到生产前,务必确认这 7 件事:
-
[x] 数据源已经清洗(去页眉页脚、去重复、去水印)
-
[x] 分块策略已选定(规则/语义/格式),并标注元数据(source/page/section/year)
-
[x] 向量库选型完成(FAISS本地 / Pinecone托管 / Weaviate混合)
-
[x] 检索方式已配置(纯向量 / Hybrid / BM25)
-
[ ] Rerank 模型已集成(bge-reranker-large 或 Cohere)
-
[ ] Prompt 模板带"防幻觉铁律"(只基于上下文、给来源)
-
[ ] 评估闭环已搭建(RAGAS / TruLens 跑回归集)
🧪 课后动手作业(三个级别)
🥉 青铜级(必做):用 LlamaIndex 5 行代码搭一个本地问答机器人
- 选 3-5 份 PDF / Markdown 放进 ./data
- 用 VectorStoreIndex 索引,as_query_engine().query() 提问
- 记录 5 个问答结果,看哪些答得对、哪些答得糊
🥈 白银级(进阶):把上面的 RAG 加 3 个优化
- 加上 Rerank(用 bge-reranker-large 或简化版 embedding 排序)
- 加上 Metadata 过滤(只查某年份/某章节)
- 加上引用溯源(答案末尾附 [来源: 文件名 p.页码])
🥇 王者级(挑战):LangChain + LlamaIndex 联动
- LlamaIndex 负责多格式文档的索引(混合 VectorIndex + KeywordTableIndex)
- LangChain 负责编排"查询改写 → 检索 → Rerank → 压缩 → 生成 → 自评回跳"
- 用 RAGAS 跑一个 20 题的测试集,对比"只用 LangChain" vs "两者联动"的指标
📚 推荐学习资源
- 🔗 LangChain 官方文档:(版本更新快,以 v0.3+ 为准)
- 🔗 LlamaIndex 官方文档:(从 0.10 版起,API 更稳定)
- 📖 必读论文:"Retrieval-Augmented Generation for Large Language Models: A Survey"(2023)
- 🛠️ 评估工具:RAGAS() / TruLens / Phoenix
🎬 课程小结
🎓 今天我们学到了什么?
- ✅ RAG = 检索 + 增强 + 生成,给 LLM 配个"图书助理"
- ✅ RAG 三段进化:Native → Advanced → Modular
- ✅ LangChain = 编排之王,瑞士军刀,适合综合应用
- ✅ LlamaIndex = 索引之王,目录管理员,适合复杂文档
- ✅ 最佳实践:LlamaIndex 做知识,LangChain 做编排
记住一句话:不要重复造轮子,但要知道轮子是怎么转的。
框架只是工具,真正决定 RAG 质量的,是数据质量 + 检索策略 + 业务理解。祝你玩得开心!🚀