LlamaIndex RAG 原理及源码分析
| 字段 | 内容 |
|---|---|
| 作者/整理 | 基于公开课程资料整理 |
| 来源 | 五道口纳什 |
| 日期 | 2025 |

RAG 基本概念
RAG 整体框架
RAG(Retrieval-Augmented Generation)是一个非常实用、非常基础的现代框架,无论工程还是科研都极为必要。
RAG 核心流程
- 用户发出一个 Query(问题)
- Query 与外部数据的 Index 进行匹配——外部数据指非语言模型之外的、存在硬盘上的数据(结构化数据库、非结构化文档等)
- 对外部数据进行 Chunking(分块),每个 Chunk 创建一个 Embedding Vector
- 对 Query 也创建 Embedding Vector
- 计算 Query 与各 Chunk 之间的相似度(点积/余弦),取 Top-K 最相关的 Chunk
- 将相关 Chunk 作为 Context,与 Query 一起送入 LLM,生成回答
两个核心 Model
RAG 系统中需要两个模型:
- Embedding Model:将文本转换为向量表示(默认 text-embedding-ada-002,1536 维)
- Language Model:基于 Context 生成回答(默认 GPT-3.5 Turbo)
RAG 的核心价值
RAG 要求 LLM 仅基于检索出的 Context Information 回答问题,而非使用模型自身已有的知识——降低幻觉,提高对事实性要求高的场景的可靠性。
本章小结
RAG 的本质是"检索增强生成":先从外部数据中检索最相关的信息,再让 LLM 基于这些信息回答问题,从而减少幻觉、提高准确性。
LlamaIndex 源码分析:Indexing 流程
文档加载与 Chunking
- 从 Data 目录加载所有文档(返回 Document 列表)
- 对每个文档进行 Split——Chunk Size 为 1024(实际约 997,减去文档路径的 token 数),Overlap 为 200
- Split 过程先按自身规则切分(产生约 759 个 split),再进行 Merge 合并为最终的 Chunk(约 22 个)
Node 创建与 Embedding
- 每个 Chunk 创建一个 Node(具有唯一 node_id 和对应的文本内容)
- 使用 Embedding Model(text-embedding-ada-002,Batch Size 2048)为每个 Node 计算 Embedding Vector
- 最终得到 22 个 Node,每个 Node 有一个 1536 维的 Embedding Vector(\(512 \times 3\))
本章小结
Indexing 流程:文档 \(\rightarrow\) Split \(\rightarrow\) Merge \(\rightarrow\) Chunk \(\rightarrow\) Node \(\rightarrow\) Embedding Vector。每一步都在源码中有清晰的实现。
LlamaIndex 源码分析:Query 流程
检索过程
- 对用户 Query 计算 Embedding Vector(同样 1536 维)
- 计算 Query Embedding 与所有 Node Embedding 的相似度
- 默认取 Top-2 最相关的 Node
相似度计算支持多种度量:欧式距离、点积、余弦相似度等。
Prompt Template
QA Template(源码中提取)
核心模板:
Context information is below. {context} Given the context information and not prior knowledge, answer the query. Query: {query}
关键约束:仅基于 Context Information 回答,不使用模型已有知识。
此外还有 Refine Template(基于新 Context 优化已有答案)和 Summarize Template 等。
消息构建与 API 调用
最终构建的消息包含:
- System Message:角色设定——"你是一个值得信赖的 QA 专家,永远基于 Context Information 回答,不使用已有知识"
- User Message:包含 Context Information(Top-K 相关文档)+ Query
默认 Response Mode 为 Compact(紧凑型)。
本章小结
Query 流程:Query Embedding \(\rightarrow\) 相似度匹配 \(\rightarrow\) Top-K Node \(\rightarrow\) Prompt Template 组装 \(\rightarrow\) LLM 生成回答。整个过程只有约五行框架代码,但内部源码非常精细。
总结与延伸
- RAG 是一个非常基础且实用的技术,LlamaIndex 提供了高度封装的实现,框架层面仅需约五行代码即可完成全流程。
- 理解源码是掌握框架的关键:LlamaIndex 封装得非常高级,但理解内部的 Split/Merge/Node/Embedding/Retrieve/Template 流程才能真正掌握。
- 核心组件:Embedding Model 负责向量化,Language Model 负责生成,Prompt Template 负责组织输入,相似度计算负责检索。
- 可扩展方向:自定义 Embedding Model、调整 Chunk Size 和 Overlap、修改 Response Mode、引入更复杂的 Retrieval 策略等。