楔子 闹市中的古刹 001
开篇 RAG三问 003
一问 从实际项目展示到底何为RAG 003
文档的导入和解析 005
文档的分块 005
文本块的嵌入 006
向量数据库的选择 006
文本块的检索 007
回答的生成 008
二问 如何快速搭建RAG系统 008
使用框架:LangChain的RAG实现 011
使用框架:通过LCEL链进行重构 016
使用框架:通过LangGraph进行重构 018
不使用框架:自选Embedding模型、向量数据库和大模型 020
使用coze、Dify、FastGPT等可视化工具 023
三问 从何处入手优化RAG系统 025
第 1章 数据导入 028
1.1 用数据加载器读取简单文本 030
1.1.1 借助LangChain读取TXT文件,以生成Document对象 030
1.1.2 LangChain中的数据加载器 031
1.1.3 用LangChain读取目录中的所有文件 032
1.1.4 用LlamaIndex读取目录中的所有文档 034
1.1.5 用LlamaHub连接Reader并读取数据库条目 036
1.1.6 用Unstructured工具读取各种类型的文档 038
1.2 用JSON加载器解析特定元素 040
1.3 用UnstructuredLoader读取图片中的文字 042
1.3.1 读取图片中的文字 042
1.3.2 读取PPT中的文字 043
1.4 用大模型整体解析图文 044
1.5 导入CSV格式的表格数据 048
1.5.1 使用CSVLoader导入数据 048
1.5.2 比较CSVLoader和UnstructuredCSVLoader 050
1.6 网页文档的爬取和解析 051
1.6.1 用WebBaseLoader快速解析网页 051
1.6.2 用UnstructuredLoader细粒度解析网页 052
1.7 Markdown文件标题和结构 054
1.8 PDF文件的文本格式、布局识别及表格解析 057
1.8.1 PDF文件加载工具概述 057
1.8.2 用PyPDFLoader进行简单文本提取 059
1.8.3 用Marker工具把PDF文档转换为Markdown格式 060
1.8.4 用UnstructuredLoader进行结构化解析 063
1.8.5 用PyMuPDF和坐标信息可视化布局 069
1.8.6 用UnstructuredLoader解析PDF页面中的表格 072
1.8.7 用ParentID整合同一标题下的内容 073
1.9 小结 075
第 2章 文本分块 082
2.1 为什么分块非常重要 083
2.1.1 上下文窗口限制了块最大长度 084
2.1.2 分块大小对检索精度的影响 086
2.1.3 分块大小对生成质量的影响 088
2.1.4 不同的分块策略 088
2.1.5 用ChunkViz工具可视化分块 089
2.2 按固定字符数分块 090
2.2.1 LangChain中的CharacterTextSplitter工具 090
2.2.2 在LlamaIndex中设置块大小参数 092
2.3 递归分块 092
2.4 基于特定格式(如代码)分块 093
2.5 基于文件结构或语义分块 095
2.5.1 使用Unstructured工具基于文档结构分块 095
2.5.2 使用LlamaIndex的SemanticSplitterNodeParser进行语义分块 096
2.6 与分块相关的高级索引构建技巧 097
2.6.1 带滑动窗口的句子切分 097
2.6.2 分块时混合生成父子文本块 098
2.6.3 分块时为文本块创建元数据 100
2.6.4 在分块时形成有级别的索引 101
2.7 小结 103
第3章 嵌入生成 104
3.1 嵌入是对外部信息的编码 104
3.2 从早期词嵌入模型到大模型嵌入 107
3.2.1 早期词嵌入模型 108
3.2.2 上下文相关的词嵌入模型 108
3.2.3 句子嵌入模型和SentenceTransformers框架 109
3.2.4 多语言嵌入模型 111
3.2.5 图像和音频嵌入模型 112
3.2.6 图像与文本联合嵌入模型 112
3.2.7 图嵌入模型和知识图谱嵌入模型 113
3.2.8 大模型时代的嵌入模型 114
3.3 现代嵌入模型:OpenAI、Jina、Cohere、Voyage 114
3.3.1 用OpenAI的text-embedding-3-small进行产品推荐 114
3.3.2 用jina-embeddings-v3模型进行跨语言数据集聚类 116
3.3.3 MTEB:海量文本嵌入基准测试 118
3.3.4 各种嵌入模型的比较及选型考量 120
3.4 稀疏嵌入、密集嵌入和BM25 121
3.4.1 利用BM25实现稀疏嵌入 122
3.4.2 BGE-M3模型:稀疏嵌入和密集嵌入的结合 124
3.5 多模态嵌入模型:Visualized_BGE 125
3.6 通过LangChain、LlamaIndex等框架使用嵌入模型 126
3.6.1 LangChain提供的嵌入接口 127
3.6.2 LlamaIndex提供的嵌入接口 127
3.6.3 通过LangChain的Caching缓存嵌入 128
3.7 微调嵌入模型 129
3.8 小结 133
第4章 向量存储 134
4.1 向量究竟是如何被存储的 135
4.1.1 从LlamaIndex的设计看简单的向量索引 135
4.1.2 向量数据库的组件 141
4.2 向量数据库中的索引 144
4.2.1 FLAT 144
4.2.2 IVF 145
4.2.3 量化索引 146
4.2.4 图索引 147
4.2.5 哈希技术 148
4.2.6 向量的检索(相似度度量) 148
4.3 主流向量数据库 149
4.3.1 Milvus 150
4.3.2 Weaviate 150
4.3.3 Qdrant 150
4.3.4 Faiss 151
4.3.5 Pinecone 151
4.3.6 Chroma 151
4.3.7 Elasticsearch 151
4.3.8 PGVector 152
4.4 向量数据库的选型与测评 152
4.4.1 向量数据库的选型 152
4.4.2向量数据库的测评 154
4.5 向量数据库中索引和搜索的设置 155
4.5.1 Milvus向量操作示例 155
4.5.2 选择合适的索引类型 159
4.5.3 选择合适的度量标准 167
4.5.4 在执行搜索时度量标准要与索引匹配 171
4.5.5 Search和Query:两种搜索方式 172
4.6 利用Milvus实现混合检索 173
4.6.1 浮点向量、稀疏浮点向量和二进制向量 174
4.6.2 混合检索策略实现 175
4.6.3 使用Milvus实现混合检索系统 176
4.7 向量数据库和多模态检索 180
4.7.1 用Visualized BGE模型实现多模态检索 181
4.7.2 使用ResNet-34提取图像特征并检索 186
4.8 RAG系统的数据维护及向量存储的增删改操作 189
4.8.1 RAG系统中的数据流维护与管理 189
4.8.2 Milvus中向量的增删改操作 190
4.8.3 向量数据库的集合操作 191
4.9 小结 192
第5章 检索前处理 194
5.1 查询构建——Text-to-SQL和Text-to-Cypher 196
5.1.1 Text-to-SQL——自然语言到SQL的转换 196
5.1.2 Text-to-Cypher——从自然语言到图数据库查询 206
5.1.3 Self-query Retriever——自动从查询中生成元数据过滤条件 210
5.2 查询翻译——更好地阐释用户问题 216
5.2.1 查询重写——将原始问题重构为合适的形式 216
5.2.2 查询分解——将查询拆分成多个子问题 218
5.2.3 查询澄清——逐步细化和明确用户的问题 221
5.2.4 查询扩展——利用HyDE生成假设文档 226
5.3 查询路由——找到正确的数据源 229
5.3.1 逻辑路由——决定查询的路径 231
5.3.2 语义路由——选择相关的提示词 232
5.4 小结 234
第6章 索引优化 236
6.1 从小到大:节点-句子滑动窗口和父子文本块 237
6.1.1 节点-句子滑动窗口检索 238
6.1.2 父子文本块检索 240
6.2 粗中有细:利用IndexNode和RecursiveRetriever构建从摘要到细节的索引 243
6.3 分层合并:HierarchicalNodeParser和RAPTOR 246
6.3.1 使用HierarchicalNodeParser生成分层索引 247
6.3.2 使用RAPTOR递归生成多层级索引 249
6.4 前后串联:通过前向/后向扩展链接相关节点 252
6.5 混合检索:提高检索准确性和扩大覆盖范围 255
6.5.1 使用Ensemble Retriever结合BM25和语义搜索 255
6.5.2 使用MultiVectorRetriever实现多表示检索 259
6.5.3 混合查询和查询路由 261
6.6 小结 262
第7章 检索后处理 263
7.1 重排 264
7.1.1 RRF重排 264
7.1.2 Cross-Encoder重排 269
7.1.3 ColBERT重排 271
7.1.4 Cohere重排和Jina重排 273
7.1.5 RankGPT和RankLLM 276
7.1.6 时效加权重排 277
7.2 压缩 279
7.2.1 Contextual Compression Retriever 280
7.2.2 利用LLMLingua压缩提示词 281
7.2.3 RECOMP方法 285
7.2.4 Sentence Embedding Optimizer 287
7.2.5 通过Prompt Caching记忆长上下文 288
7.3 校正 288
7.4小结 296
第8章 响应生成 298
8.1 通过改进提示词来提高模型输出质量 299
8.1.1 通过模板和示例引导生成结果 299
8.1.2 增强生成的多样性和全面性 300
8.1.3 引入事实核查机制以提升真实性 301
8.2 通过输出解析来控制生成内容的格式 302
8.2.1 LangChain输出解析机制 302
8.2.2 LlamaIndex输出解析机制 302
8.2.3 Pydantic解析 303
8.2.4 Function Calling解析 304
8.3 通过选择大模型来提高输出质量 304
8.4 生成过程中的检索结果集成方式 306
8.4.1 输入层集成 308
8.4.2 输出层集成 309
8.4.3 中间层集成 309
8.5 Self-RAG 310
8.6 RRR:动态生成优化 312
8.7 小结 315
第9章 系统评估 316
9.1 RAG系统的评估体系 317
9.1.1 RAG的评估数据集 317
9.1.2 检索评估和响应评估 318
9.1.3 RAG TRIAD:整体评估 319
9.2 检索评估指标 320
9.2.1 精确度 321
9.2.2 召回率 321
9.2.3 F1分数 322
9.2.4 平均倒数排名 322
9.2.5 平均精确度 322
9.2.6 逆文档频率加权精确度 323
9.2.7 文档精确度和页面精确度 323
9.3 响应评估指标 325
9.3.1 基于n-gram匹配程度的指标 325
9.3.2 基于语义相似性的指标 327
9.3.3 基于忠实度或扎实性的指标 328
9.4 RAG系统的评估框架 329
9.4.1 使用RAGAS评估RAG系统 329
9.4.2 使用TruLens实现RAG TRIAD评估 332
9.4.3 DeepEval:强大的开源大模型评估框架 333
9.4.4 Phoenix:交互式模型诊断分析平台 335
9.5 小结 335
第 10章 复杂RAG范式 337
10.1 GraphRAG:RAG和知识图谱的整合 338
10.2 上下文检索:突破传统RAG的上下文困境 339
10.3 ModularRAG:从固定流程到灵活架构的跃迁 340
10.4 AgenticRAG:自主代理驱动的RAG系统 343
10.5 Multi-Modal RAG:多模态检索增强生成技术 344
10.6 小结 345
参考文献 346
后记 一期一会 348