0 入门
0.1 简介
RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合了信息检索技术与语言生成模型的人工智能技术。该技术通过从外部知识库中检索相关信息,并将其作为提示(Prompt)输入给大型语言模型(LLMs),以增强模型处理知识密集型任务的能力,如问答、文本摘要、内容生成等。
RAG = 检索技术 + LLM 提示
解决大模型存在的一些问题:
- LLM的知识不是实时的,模型训练好后不具备自动更新知识的能力。
- 专业领域知识缺乏,与训练集有关
- 幻觉,一本正经的胡说八道
- 数据安全性
核心价值:
- 解决知识时效性
- 降低模型幻觉
- 无需重新训练模型
0.2 标准流程:
示意图:
[索引构建 - 离线]
原始文档 → 加载 → 切分/分块 → 向量化(嵌入) → 存储到向量数据库
[查询生成 - 在线]
用户提问 → 查询向量化 → 从向量数据库检索相关块 → 构建上下文 → 提示LLM生成 → 返回答案(附溯源)
第一阶段:索引构建(离线,预处理阶段)
此阶段的目标是准备好一个可供快速、语义化检索的知识库。
1. 数据加载
- 从各种数据源获取原始文档:如 PDF、Word、HTML、Markdown、API、数据库、企业内部知识库等。
- 工具:LangChain / LlamaIndex 的
DocumentLoader,Apache Tika 等。
2. 数据切分
- 关键步骤:将长文档分割成语义上连贯、大小合适的“块”。
- 为什么重要:文档太长会丢失细节,太短会失去上下文。分块策略(块大小、重叠区)直接影响后续检索质量。
- 方法:
- 固定大小分块:简单但可能切断语义。
- 基于语义的分块(递归式、滑动窗口)。
- 专用分块器:如按标题/段落分割。
3. 向量化(嵌入)
- 使用嵌入模型将每个文本块转换成一个高维度的向量(一列数字)。
- 这个过程捕获了文本的语义含义,使得语义相似的文本在向量空间中距离相近。
- 常用模型:OpenAI
text-embedding-3-small、BGE、M3E等。
4. 存储
- 将文本块、对应的向量以及元数据(如来源、文件名、页码等)一起存储到向量数据库中。
- 向量数据库专为高效近似最近邻搜索设计。
- 常用数据库:Pinecone、Chroma、Weaviate、Qdrant、Milvus、PGVector 等。
第二阶段:查询检索与生成(在线,实时阶段)
当用户提出问题时,系统执行以下步骤:
1. 用户查询
- 用户输入一个自然语言问题(例如:“公司今年的带薪年假政策有什么变化?”)。
2. 查询向量化
- 使用与索引阶段相同的嵌入模型,将用户查询也转换为一个查询向量。
3. 检索
- 在向量数据库中,执行 “近似最近邻”搜索 ANN,找出与“查询向量”最相似的 K 个文本块(向量)。
- 返回的不仅是文本,还包括其元数据和相似度分数。
- 进阶检索技巧:
- 重排序:使用更精细但更耗资源的模型(如 cross-encoder)对 Top K 结果进行重新排序,提升精度。
- 混合检索:结合传统的关键词搜索(如 BM25)和向量搜索,取长补短。
4. 上下文构建
- 将检索到的 Top K 个相关文本块(及其元数据)组合成一个“增强的上下文”或“提示上下文”。
- 通常需要控制总长度,以适应 LLM 的上下文窗口限制。
5. 提示工程与生成
- 构建一个结构化的提示,通常包含:
- 系统指令:定义 LLM 的角色和回答规则(例如:“你是一个专业的客服助手,请严格根据提供的上下文信息回答问题。”)。
- 上下文:上一步检索到的相关文本块。
- 用户查询:原始问题。
- 回答要求:例如“如果上下文中没有相关信息,请明确说‘我不知道’”,并引用来源。
- 将这个完整的提示发送给 LLM(如 GPT-4、Claude、Llama 等)。
- LLM 基于给定的上下文生成最终答案。
6. 响应与溯源
- 将 LLM 生成的答案返回给用户。
- 最佳实践:同时提供答案中关键信息的溯源(例如,标明引用了哪个文档的第几页),这极大增强了可信度和可验证性。
0.3 基础知识
RAG 应用核心基础知识精简版
1. 向量(向量化)
- 是什么:将文本(词、句、文档)转换成一串数字(如 [0.1, -0.3, 0.8, …]),这串数字就是向量
- 为什么需要:计算机无法直接理解文字,但可以计算数字之间的关系
- 关键特性:语义相似的文本,其向量在空间中的位置也相近
- 示例:
- “猫” → [0.2, 0.5, -0.1, …]
- “猫咪” → [0.19, 0.51, -0.09, …] (与”猫”的向量很接近)
2. 余弦相似度(核心匹配算法)
- 作用:衡量两个向量之间的相似程度
- 计算原理:计算两个向量夹角的余弦值
- 1.0 = 完全相同(方向完全一致)
- 0.0 = 不相关(垂直)
- -1.0 = 完全相反
- 为什么用余弦而不是距离:主要关注向量的”方向”(语义),忽略”长度”(文本长度影响)
- 公式简记:
相似度 = (A·B) / (|A|×|B|)
3. 嵌入模型
- 功能:执行”文本→向量”转换的AI模型
- 特点:
- 训练时学习了语言的语义关系
- 相同模型必须用于索引和查询
- 常见模型:OpenAI的text-embedding-ada-002、BGE-M3等
4. 向量数据库
- 专门做一件事:快速存储和查找相似向量
- 核心技术:ANN(近似最近邻)索引
- HNSW:像多层导航图,快速定位
- IVF:先分区,再搜索
- 示例:Pinecone、Chroma、Qdrant