基于大模型的RAG应用开发与优化——构建企业级LLM应用
严灿平著,2024年版 [文件格式: PDF - 27MB]内容简介
《基于大模型的RAG应用开发与优化——构建企业级LLM应用》是一本全面介绍基于大语言模型的RAG应用开发的专业图书。本书共分为3篇:预备篇、基础篇和高级篇。预备篇旨在帮助你建立起对大模型与RAG的基本认识,并引导你搭建起RAG应用开发的基础环境;基础篇聚焦于经典RAG应用开发的核心要素与阶段,介绍关键模块的开发过程,剖析相关的技术原理,为后面的深入学习打下坚实的基础;高级篇聚焦于RAG应用开发的高阶模块与技巧,特别是在企业级RAG应用开发中的优化策略与技术实现,并探索了一些新型的RAG工作流与范式,旨在帮助你了解最新的RAG应用技术发展,掌握RAG应用的全方位开发能力。 《基于大模型的RAG应用开发与优化——构建企业级LLM应用》适合对大模型及RAG技术感兴趣的开发者、研究人员、产品经理及希望了解并掌握RAG应用开发能力的人阅读。无论你是进入AI领域的初学者,还是已经有一定基础的进阶者,都能从本书中找到适合自己的内容。
作者简介
严灿平
毕业于南京理工大学计算机系,南京大学工商管理硕士。先后就职于联创(后与亚信科技合并)担任软件工程师与设计师,甲骨文中国(Oracle)担任中国区企业架构部首席架构师,上海慧问信息科技有限公司担任合伙人兼技术总监。现为独立IT咨询顾问,公众号“AI大模型应用实践”主理人。拥有超过20年的企业软件从业经验,专注于企业软件架构设计、互联网时代传统行业的IT转型、人工智能与大数据技术在企业应用的创新等。
曾担任多项大型企业级软件系统核心架构师与咨询师,参与包括中国移动、中国电信等通信行业客户的核心业务运营支撑系统建设、智慧城市与政务行业互联网转型的IT咨询与规划。精通多种计算机软件开发技术与IT架构方法论,对移动互联网、大数据、人工智能在企业领域应用有深入的研究与实施经验。
目录
- 预 备 篇
- 第1章 了解大模型与RAG 3
- 1.1 初识大模型 3
- 1.1.1 大模型时代:生成式AI应用的爆发 3
- 1.1.2 大模型应用的持续进化 4
- 1.1.3 大模型是无所不能的吗 7
- 1.2 了解RAG 11
- 1.2.1 为什么需要RAG 11
- 1.2.2 一个简单的RAG场景 12
- 1.3 RAG应用的技术架构 14
- 1.3.1 RAG应用的经典架构与流程 14
- 1.3.2 RAG应用面临的挑战 17
- 1.3.3 RAG应用架构的演进 18
- 1.4 关于RAG的两个话题 20
- 1.4.1 RAG与微调的选择 21
- 1.4.2 RAG与具有理解超长上下文能力的大模型 24
- 1.1 初识大模型 3
- 第2章 RAG应用开发环境搭建 27
- 2.1 开发RAG应用的两种方式 27
- 2.1.1 使用低代码开发平台 27
- 2.1.2 使用大模型应用开发框架 29
- 2.2 RAG应用开发环境准备 33
- 2.2.1 硬件环境建议 33
- 2.2.2 基础大模型 34
- 2.2.3 嵌入模型 41
- 2.2.4 Python虚拟运行环境 44
- 2.2.5 Python IDE与开发插件 45
- 2.2.6 向量库 47
- 2.2.7 LlamaIndex框架 51
- 2.3 关于本书开发环境的约定 51
- 2.1 开发RAG应用的两种方式 27
- 第1章 了解大模型与RAG 3
- 基 础 篇
- 第3章 初识RAG应用开发 55
- 3.1 开发一个最简单的RAG应用 55
- 3.1.1 使用原生代码开发 56
- 3.1.2 使用LlamaIndex框架开发 64
- 3.1.3 使用LangChain框架开发 68
- 3.2 如何跟踪与调试RAG应用 70
- 3.2.1 借助LlamaDebugHandler 70
- 3.2.2 借助第三方的跟踪与调试平台 73
- 3.3 准备:基于LlamaIndex框架的RAG应用开发核心组件 77
- 3.1 开发一个最简单的RAG应用 55
- 第4章 模型与Prompt 78
- 4.1 大模型 78
- 4.1.1 大模型在RAG应用中的作用 79
- 4.1.2 大模型组件的统一接口 80
- 4.1.3 大模型组件的单独使用 82
- 4.1.4 大模型组件的集成使用 83
- 4.1.5 了解与设置大模型的参数 84
- 4.1.6 自定义大模型组件 85
- 4.1.7 使用LangChain框架中的大模型组件 87
- 4.2 Prompt 87
- 4.2.1 使用Prompt模板 87
- 4.2.2 更改默认的Prompt模板 88
- 4.2.3 更改Prompt模板的变量 91
- 4.3 嵌入模型 92
- 4.3.1 嵌入模型在RAG应用中的作用 92
- 4.3.2 嵌入模型组件的接口 93
- 4.3.3 嵌入模型组件的单独使用 95
- 4.3.4 嵌入模型组件的集成使用 97
- 4.3.5 了解与设置嵌入模型的参数 97
- 4.3.6 自定义嵌入模型组件 98
- 4.1 大模型 78
- 第5章 数据加载与分割 100
- 5.1 理解两个概念:Document与Node 100
- 5.1.1 什么是Document与Node 100
- 5.1.2 深入理解Document与Node 102
- 5.1.3 深入理解Node对象的元数据 103
- 5.1.4 生成Document对象 106
- 5.1.5 生成Node对象 107
- 5.1.6 元数据的生成与抽取 111
- 5.1.7 初步了解IndexNode类型 115
- 5.2 数据加载 116
- 5.2.1 从本地目录中加载 117
- 5.2.2 从网络中加载数据 123
- 5.3 数据分割 129
- 5.3.1 如何使用数据分割器 129
- 5.3.2 常见的数据分割器 131
- 5.4 数据摄取管道 145
- 5.4.1 什么是数据摄取管道 145
- 5.4.2 用于数据摄取管道的转换器 147
- 5.4.3 自定义转换器 149
- 5.4.4 使用数据摄取管道 150
- 5.5 完整认识数据加载阶段 155
- 5.1 理解两个概念:Document与Node 100
- 第6章 数据嵌入与索引 156
- 6.1 理解嵌入与向量 156
- 6.1.1 直接用模型生成向量 157
- 6.1.2 借助转换器生成向量 157
- 6.2 向量存储 158
- 6.2.1 简单向量存储 159
- 6.2.2 第三方向量存储 161
- 6.3 向量存储索引 164
- 6.3.1 用向量存储构造向量存储索引对象 165
- 6.3.2 用Node列表构造向量存储索引对象 166
- 6.3.3 用文档直接构造向量存储索引对象 169
- 6.3.4 深入理解向量存储索引对象 172
- 6.4 更多索引类型 175
- 6.4.1 文档摘要索引 175
- 6.4.2 对象索引 177
- 6.4.3 知识图谱索引 180
- 6.4.4 树索引 186
- 6.4.5 关键词表索引 187
- 6.1 理解嵌入与向量 156
- 第7章 检索、响应生成与RAG引擎 190
- 7.1 检索器 191
- 7.1.1 快速构造检索器 191
- 7.1.2 理解检索模式与检索参数 192
- 7.1.3 初步认识递归检索 197
- 7.2 响应生成器 199
- 7.2.1 构造响应生成器 200
- 7.2.2 响应生成模式 201
- 7.2.3 响应生成器的参数 210
- 7.2.4 实现自定义的响应生成器 212
- 7.3 RAG引擎:查询引擎 214
- 7.3.1 构造内置类型的查询引擎的两种方法 214
- 7.3.2 深入理解查询引擎的内部结构和运行原理 217
- 7.3.3 自定义查询引擎 218
- 7.4 RAG引擎:对话引擎 221
- 7.4.1 对话引擎的两种构造方法 221
- 7.4.2 深入理解对话引擎的内部运行和运行原理 224
- 7.4.3 理解不同的对话模式 227
- 7.5 结构化输出 239
- 7.5.1 使用output_cls参数 240
- 7.5.2 使用输出解析器 241
- 7.1 检索器 191
- 第3章 初识RAG应用开发 55
- 高 级 篇
- 第8章 RAG引擎高级开发 247
- 8.1 检索前查询转换 247
- 8.1.1 简单查询转换 248
- 8.1.2 HyDE查询转换 249
- 8.1.3 多步查询转换 251
- 8.1.4 子问题查询转换 254
- 8.2 检索后处理器 259
- 8.2.1 使用节点后处理器 259
- 8.2.2 实现自定义的节点后处理器 260
- 8.2.3 常见的预定义的节点后处理器 261
- 8.2.4 Rerank节点后处理器 266
- 8.3 语义路由 272
- 8.3.1 了解语义路由 272
- 8.3.2 带有路由功能的查询引擎 274
- 8.3.3 带有路由功能的检索器 276
- 8.3.4 使用独立的选择器 277
- 8.3.5 可多选的路由查询引擎 278
- 8.4 SQL查询引擎 280
- 8.4.1 使用NLSQLTableQueryEngine组件 281
- 8.4.2 基于实时表检索的查询引擎 283
- 8.4.3 使用SQL检索器 285
- 8.5 多模态文档处理 286
- 8.5.1 多模态文档处理架构 286
- 8.5.2 使用LlamaParse解析文档 288
- 8.5.3 多模态文档中的表格处理 294
- 8.5.4 多模态大模型的基础应用 297
- 8.5.5 多模态文档中的图片处理 303
- 8.6 查询管道:编排基于Graph的RAG工作流 308
- 8.6.1 理解查询管道 309
- 8.6.2 查询管道支持的两种使用方式 310
- 8.6.3 深入理解查询管道的内部原理 313
- 8.6.4 实现并插入自定义的查询组件 315
- 8.1 检索前查询转换 247
- 第9章 开发Data Agent 321
- 9.1 初步认识Data Agent 322
- 9.2 构造与使用Agent的工具 323
- 9.2.1 深入了解工具类型 324
- 9.2.2 函数工具 325
- 9.2.3 查询引擎工具 326
- 9.2.4 检索工具 327
- 9.2.5 查询计划工具 328
- 9.2.6 按需加载工具 330
- 9.3 基于函数调用功能直接开发Agent 331
- 9.4 用框架组件开发Agent 335
- 9.4.1 使用OpenAIAgent 335
- 9.4.2 使用ReActAgent 336
- 9.4.3 使用底层API开发Agent 338
- 9.4.4 开发带有工具检索功能的Agent 340
- 9.4.5 开发带有上下文检索功能的Agent 341
- 9.5 更细粒度地控制Agent的运行 343
- 9.5.1 分步可控地运行Agent 344
- 9.5.2 在Agent运行中增加人类交互 346
- 第10章 评估RAG应用 349
- 10.1 为什么RAG应用需要评估 349
- 10.2 RAG应用的评估依据与指标 350
- 10.3 RAG应用的评估流程与方法 351
- 10.4 评估检索质量 352
- 10.4.1 生成检索评估数据集 352
- 10.4.2 运行评估检索过程的程序 354
- 10.5 评估响应质量 356
- 10.5.1 生成响应评估数据集 356
- 10.5.2 单次响应评估 358
- 10.5.3 批量响应评估 360
- 10.6 基于自定义标准的评估 362
- 第11章 企业级RAG应用的常见优化策略 364
- 11.1 选择合适的知识块大小 364
- 11.1.1 为什么知识块大小很重要 364
- 11.1.2 评估知识块大小 365
- 11.2 分离检索阶段的知识块与生成阶段的知识块 369
- 11.2.1 为什么需要分离 369
- 11.2.2 常见的分离策略及实现 369
- 11.3 优化对大文档集知识库的检索 378
- 11.3.1 元数据过滤 + 向量检索 378
- 11.3.2 摘要检索+ 内容检索 383
- 11.3.3 多文档Agentic RAG 390
- 11.4 使用高级检索方法 397
- 11.4.1 融合检索 398
- 11.4.2 递归检索 406
- 11.1 选择合适的知识块大小 364
- 第12章 构建端到端的企业级RAG应用 429
- 12.1 对生产型RAG应用的主要考量 429
- 12.2 端到端的企业级RAG应用架构 430
- 12.2.1 数据存储层 431
- 12.2.2 AI模型层 432
- 12.2.3 RAG工作流与API模块 432
- 12.2.4 前端应用模块 433
- 12.2.5 后台管理模块 434
- 12.3 端到端的全栈RAG应用案例 436
- 12.3.1 简单的全栈RAG查询应用 436
- 12.3.2 基于多文档Agent的端到端对话应用 455
- 第13章 新型RAG范式原理与实现 478
- 13.1 自纠错RAG:C-RAG 478
- 13.1.1 C-RAG诞生的动机 478
- 13.1.2 C-RAG的原理 479
- 13.1.3 C-RAG的实现 480
- 13.2 自省式RAG:Self-RAG 485
- 13.2.1 Self-RAG诞生的动机 485
- 13.2.2 Self-RAG的原理 486
- 13.2.3 Self-RAG的实现 493
- 13.2.4 Self-RAG的优化 506
- 13.3 检索树RAG:RAPTOR 507
- 13.3.1 RAPTOR诞生的动机 507
- 13.3.2 RAPTOR的原理 508
- 13.3.3 RAPTOR的实现 510
- 13.1 自纠错RAG:C-RAG 478
- 第8章 RAG引擎高级开发 247