返回 AI大模型从0到1——理论与实操

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 管道符 | 把各个组件串起来。它让"链"从"配置地狱"变成了"一行代码":

Plain Text
1
2
3
4
5
6
7
8
9
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_template("用一句话解释{topic}")
chain = prompt | ChatOpenAI(model="gpt-4o-mini") | StrOutputParser()

print(chain.invoke({"topic": "RAG"}))
# 输出: RAG 是把外部知识检索和大模型生成结合的技术,让回答更准确。

三段式管道:模板(填空) → 模型(答题) → 解析器(格式化),这就是 LCEL 的精髓。

🚀 实战 1:最小可跑的 RAG(5 行代码)

我们从最简版开始,逐步升级到工业级。

Plain Text
 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
import os
os.environ["OPENAI_API_KEY"] = "sk-xxx"  # 或读环境变量

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_core.documents import Document
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

# 1) 准备"知识库"(实际可换成 PDF 加载)
docs = [
    Document(page_content="RAG 是检索增强生成,先检索后回答。"),
    Document(page_content="Advanced RAG 加入查询改写、Rerank、压缩等优化。"),
    Document(page_content="LangChain 是大模型应用编排框架,支持 LCEL 链式调用。"),
]

# 2) 建向量库
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(docs, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})

# 3) 用 LCEL 串起"检索 → 提示 → 生成"三步
prompt = ChatPromptTemplate.from_template(
    "你是RAG讲师。基于以下资料回答问题,分点列出。\n"
    "资料:{context}\n问题:{question}"
)
def format_docs(docs):
    return "\n".join(d.page_content for d in docs)

chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt | ChatOpenAI(model="gpt-4o-mini") | StrOutputParser()
)

# 4) 试跑
print(chain.invoke("什么是RAG?"))
# 输出示例:
# - RAG 是检索增强生成技术。
# - LangChain 是大模型应用编排框架,支持 LCEL 链式调用。

看到没?不到 30 行代码就搭出一个能"查资料再回答"的助手。这就是 LangChain 的魔力——把复杂留给自己,把简单留给开发者。

🚀 实战 2:工业级 RAG(查询改写 + 重排 + 压缩 + 自评)

上面的版本只是"能跑",但容易"答得糊"。真正的工业级 RAG 需要做四件事:

  1. 查询改写:把口语化问题改成检索友好的查询
  2. 重排序:把最相关的段落排到前面
  3. 压缩:把上下文压成"事实要点",减少噪声
  4. 自评回跳:模型打分,不合格就再查一轮

🔧 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 帮你筛"重点"

Python
1
2
3
4
5
6
7
8
9
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor

compressor = LLMChainExtractor.from_llm(llm)
smart_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=retriever,
)
# 以后用 smart_retriever 代替 retriever 即可

坑 2:多轮对话"失忆"

👉 妙招:用 ConversationBufferWindowMemory 记最近 N 轮

Plain Text
1
2
3
4
5
6
7
8
9
from langchain.memory import ConversationBufferWindowMemory
from langchain.chains import ConversationChain

memory = ConversationBufferWindowMemory(k=3, return_messages=True)
chat = ConversationChain(llm=llm, memory=memory)

print(chat.run("我叫小李"))           # 记住名字
print(chat.run("我最关心RAG优化"))    # 记住偏好
print(chat.run("我刚才说我关心什么?"))  # 答:RAG 优化

坑 3:LLM 一本正经地胡说八道

👉 妙招:Prompt 强制"只能基于上下文回答,无依据就说不"

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
prompt = ChatPromptTemplate.from_template("""
你是严谨的企业知识助手。
【铁律】
1. 只能基于"以下资料"回答,不要用任何外部知识;
2. 每条结论后必须标注 [来源: {source}];
3. 资料里没有的信息,直接说"依据不足"。

【问题】{question}
【资料】{context}
""")

🎁 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 行代码搭一个问答机器人

Plain Text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import os
os.environ["OPENAI_API_KEY"] = "sk-xxx"

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.settings import Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding

# 1) 配模型(全局生效)
Settings.llm = OpenAI(model="gpt-4o-mini", temperature=0)
Settings.embed_model = OpenAIEmbedding()

# 2) 一行加载目录里的所有文档
docs = SimpleDirectoryReader("./data", recursive=True).load_data()

# 3) 一行建索引
index = VectorStoreIndex.from_documents(docs)

# 4) 一行变问答引擎
query_engine = index.as_query_engine(similarity_top_k=3)

# 5) 直接问!
print(query_engine.query("我们公司去年的差旅报销标准是什么?"))

对比一下 LangChain 的 30 行,你会发现 LlamaIndex 的设计哲学是:"少即是多"。它把默认值都帮你选好了,5 行就能跑。

🚀 实战 2:进阶版——分层索引 + 自定义解析

真实项目中,文档类型往往很杂(年报 PDF + 表格 + 邮件),需要更精细的"裁纸"和"摆书"策略:

Python
 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
import os
os.environ["OPENAI_API_KEY"] = "sk-xxx"

from llama_index.core import (
    VectorStoreIndex, KeywordTableIndex, SimpleDirectoryReader,
    Settings, StorageContext
)
from llama_index.core.node_parser import SentenceSplitter
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding

# ============ 1) 全局配置 ============
Settings.llm = OpenAI(model="gpt-4o-mini", temperature=0)
Settings.embed_model = OpenAIEmbedding()
Settings.chunk_size = 512
Settings.chunk_overlap = 50

# ============ 2) 加载文档(支持 PDF/Word/HTML/MD) ============
docs = SimpleDirectoryReader(
    input_dir="./data",
    recursive=True,
    required_exts=[".pdf", ".docx", ".md", ".txt"]  # 只看这些
).load_data()
print(f"📚 加载了 {len(docs)} 份文档")

# ============ 3) 自定义分块(按"句号"切) ============
parser = SentenceSplitter(chunk_size=512, chunk_overlap=50)
nodes = parser.get_nodes_from_documents(docs)
print(f"✂️ 切成了 {len(nodes)} 个 Node")

# ============ 4) 给 Node 贴"标签"(元数据) ============
for i, node in enumerate(nodes):
    node.metadata["chunk_id"] = i
    node.metadata["source"] = node.metadata.get("file_name", "unknown")

# ============ 5) 建"双索引":语义 + 关键词 ============
storage_context = StorageContext.from_defaults()
storage_context.docstore.add_documents(nodes)

# 5.1 语义索引(按"意思"找)
vector_index = VectorStoreIndex(
    nodes, storage_context=storage_context, show_progress=True
)

# 5.2 关键词索引(按"术语"找)
keyword_index = KeywordTableIndex(
    nodes, storage_context=storage_context, show_progress=True
)

# ============ 6) 配置 QueryEngine(返回 Top5 相似片段) ============
vector_engine = vector_index.as_query_engine(
    similarity_top_k=5,
    response_mode="tree_summarize",  # 长答案汇总
)

# ============ 7) 试跑 ============
question = "公司去年在新能源板块投入了多少研发资金?"
response = vector_engine.query(question)
print(f"\n❓ 问题: {question}")
print(f"✅ 答案: {response}\n")
print("📎 参考资料:")
for i, src in enumerate(response.source_nodes, 1):
    print(f"  [{i}] {src.metadata.get('source', 'unknown')} - {src.text[:80]}...")

🎯 这个例子的亮点:同一份资料,既建了语义索引(找"意思相近"的段落),又建了关键词索引(精确匹配术语)。双管齐下,召回率飙升。

🌟 特色能力:Sub-Question Query Engine(子问题分解)

LlamaIndex 自带一个超能力:自动把复杂问题拆成子问题

类比:你问图书管理员"我们公司 2023 和 2024 哪年的研发投入更多?",普通 RAG 只会丢一堆片段。LlamaIndex 的 Sub-Question Engine 会自动:

  1. 拆成"2023 研发投入"和"2024 研发投入"两个子问题
  2. 分别检索
  3. 把两个答案拼起来对比

🔗 联动大招:LlamaIndex 索引 + LangChain 编排

最佳实践不是"二选一",而是"LlamaIndex 做知识,LangChain 做编排"。LlamaIndex 负责把知识库做"干净、可控、可更新",LangChain 负责把"检索→重排→压缩→生成→自评"的复杂链路串起来。

Plain Text
 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
# ====== 第 1 步:LlamaIndex 负责"做索引" ======
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

docs = SimpleDirectoryReader("./kb").load_data()
index = VectorStoreIndex.from_documents(docs)

# 把 LlamaIndex 的检索器导出
li_retriever = index.as_retriever(similarity_top_k=6)

# ====== 第 2 步:套个壳,变 LangChain 能用的 Retriever ======
from langchain_core.documents import Document as LCDoc
class LIRetrieverAsLC:
    def __init__(self, li_retriever):
        self.li_retriever = li_retriever
    def get_relevant_documents(self, query):
        results = self.li_retriever.retrieve(query)
        return [LCDoc(page_content=r.get_text(), metadata=r.metadata)
                for r in results]

lc_retriever = LIRetrieverAsLC(li_retriever)

# ====== 第 3 步:LangChain 负责"做编排" ======
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import RetrievalQA

llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是企业知识助手。仅基于提供的上下文回答,列出引用出处。"),
    ("user", "问题:{query}\n上下文:{context}")
])

qa = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=lc_retriever,  # 关键:这里塞的是 LlamaIndex 的检索器
    chain_type="stuff",
)

print(qa.run("解释Advanced RAG的关键组成,并给出处"))

🎁 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 个优化

  1. 加上 Rerank(用 bge-reranker-large 或简化版 embedding 排序)
  2. 加上 Metadata 过滤(只查某年份/某章节)
  3. 加上引用溯源(答案末尾附 [来源: 文件名 p.页码])

🥇 王者级(挑战):LangChain + LlamaIndex 联动

  1. LlamaIndex 负责多格式文档的索引(混合 VectorIndex + KeywordTableIndex)
  2. LangChain 负责编排"查询改写 → 检索 → Rerank → 压缩 → 生成 → 自评回跳"
  3. 用 RAGAS 跑一个 20 题的测试集,对比"只用 LangChain" vs "两者联动"的指标

📚 推荐学习资源

🎬 课程小结

🎓 今天我们学到了什么?

  • ✅ RAG = 检索 + 增强 + 生成,给 LLM 配个"图书助理"
  • ✅ RAG 三段进化:Native → Advanced → Modular
  • LangChain = 编排之王,瑞士军刀,适合综合应用
  • LlamaIndex = 索引之王,目录管理员,适合复杂文档
  • ✅ 最佳实践:LlamaIndex 做知识,LangChain 做编排

记住一句话:不要重复造轮子,但要知道轮子是怎么转的。

框架只是工具,真正决定 RAG 质量的,是数据质量 + 检索策略 + 业务理解。祝你玩得开心!🚀