RAG笔记
RAG(Retrieval Augmented Generation)检索增强生成
先从资料库里检索相关内容,再基于这些内容生成答案。
提问前:分片,索引;提问后:召回,重排,生成。
核心
知识库 <-> 用户query 的双向奔赴,构建私有知识库,提升对话能力。
Agentic RAG: RAG之前,有小的agent识别用户的query,是否要改写,以及要改写成几条query。
知识库:大段大段文字,描述某种信息和知识。
数据库:商品数据库,例如找500元钱以下的商品。
知识库
对场景的理解:理解用户会怎么问问题,问什么问题
对技术的理解:不同类型的问题
由知识切片生成问题
知识切片:每取1000个字,由LLM判断讲的主题的文字范围,以此切分为“知识切片”。合理范围:一条知识切片为500到800字。迭代提示词,可以切得更顺畅。
Function Call:根据用户的问题,大语言模型有一种能力,自主判断是否自己可以回答,或者是否调用某些工具,以及参数是什么。一个工作流或skill都是工具。
流程图
RAG 可以拆分为两条流水线
1. 离线索引(Indexing Pipeline)
原始文档
↓
Document Parsing(OCR/Layout Analysis/VLM)
↓
Structure-Aware Chunking
↓
Metadata构建
↓
Embedding
↓
Save to Vector Database
2. 在线检索(Serving Pipeline)
用户Query
↓
Query理解/改写(可选)
↓
Hybrid Retrieval(BM25 + Vector Search)
↓
Reranker
↓
Prompt Assembly(Context + Metadata)
↓
LLM
↓
Answer + Citation
脏文档输入->解析层(结构解析->多模态处理->结构感知切片)->检索层(多路召回/向量入库->重排)->溯源组装LLM
解析难题
Word(DOCX)本质是 XML,天然具有树状语义结构,标题层级明确,表格边界明确,阅读顺序明确,因此解析难度相对较低。
PDF 本质上不是文档结构,而是一张带有文字坐标的二维画布。它只记录:文字内容+文字位置,而不记录:阅读顺序/章节结构/段落关系。因此 PDF 是企业知识库建设中的最大难点之一。
陷阱:双栏排版,跨页表格,表格中有合并单元格
历史档案与扫描件:直接用多模态(MultiModal)兜底,VLM(Visual Language Model)
防止翻车兜底思维:如果置信度评估(Confidence Check)小于阈值,说明文档识别率低/乱码,设置防线,进入人工审核池/高成本多模态兜底。
切片(Chunking)
大模型上下文有限,无法直接把整份文档送进去,因此需要切片。
目标:保持语义完整,不要把一句话拆断。保持逻辑完整,不要把同一段内容拆散。提高检索效果,确保检索到的Chunk能独立表达完整信息。
1.递归切片(Recursive Chunking)
基于字符与层级规则,使用一组预定义的分隔符(如段落、句子、空格等)按层级递归切分,直到块大小达标。速度快,纯字符串处理,不依赖模型。
但是:分隔符是写死的,碰到不规范排版容易翻车,且只看语法结构,不理解内容。
2.语义切片(Semantic Chunking)
基于内容与意义。通过计算句子embedding之间的语义相似度,在主题发生“跳变”的自然边界处切分。块大小不固定,但能完整保留语义,显著提升检索准确度,但成本极高。
步骤:切句子 -> 逐句Embedding -> 计算相邻句子语义距离 -> 确定断点阈值 -> 合并句子形成chunk。
如果:similarity突然下降,例如:0.92,0.90,0.88,0.32←语义断点,0.89,就在这里切分。这种位置称为:Semantic Breakpoint(语义断点)。
阈值设置方法:例如百分位法(Percentile),把所有相邻句子的距离排序,取第95百分位当阈值,超了就切。最常用,因为它能自适应不同文档的距离分布。文档主题切换频繁就调低到90甚至85。
3.结构感知切片(Structure-Aware Chunking)
利用文档的结构(标题、章节、表格、代码块)切分,是现代企业 RAG 的首选。顺应标题层级以及段落边界,其中代码表格绝对不能拆分,即顺藤摸瓜,根据文档本身的排版逻辑(如一级标题、二级标题、表格、代码块)进行切分。
例如,识别到
标签或markdown表格语法,完整提取整个表格作为一个独立的 Chunk,并自动把上层的“一季度财报”标题作为元数据(metadata)挂载在这个chunk上。Core Definitions:
- Recursive Chunking: Blind Splitting. It splits text purely based on a hierarchy of separators (like paragraphs, sentences, and spaces) until the chunk size falls under a fixed token limit.
- Semantic Chunking: Content-Driven Splitting. It uses an embedding model to calculate the semantic similarity between adjacent sentences. It cuts the text only when the topic changes.
- Structure-Aware Chunking: Layout-Driven Splitting. It parses the structural elements of a document (such as Markdown headers, HTML tags, PDF sections, or tables) and splits text along those natural boundaries.
Recursive Chunking 是按照文档结构和长度递归切分,不理解内容;Semantic Chunking 是利用 Embedding 检测语义变化,在主题切换处切分,因此语义完整性更好,但计算成本更高。
Embedding
索引:通过Embedding将片段文本转换为向量,将片段文本和片段向量存入向量数据库中。
向量数据库:包含原始文本和对应的向量。
召回
- 召回:搜索与用户问题相关片段的过程,初步筛选。
- 重排:再从召回的片段中选取top k最相似的,精挑细选。
多路召回,混合检索(Hybrid Retrieval)
常见方案:
-
向量检索(Vector Search / Dense Retrieval)
- 基于 Embedding 相似度搜索
- 擅长语义匹配、近义表达、模糊查询,即使关键词不一致,也能命中。
-
关键词检索(BM25 / Sparse Retrieval)
- 基于关键词匹配
- 擅长专有名词、编号、条款、错误码等精确匹配
-
Metadata Filtering(可选)
- 根据部门、时间、文档类型等元数据先过滤,再进行检索
重排(Reranking)
目标:提高 Precision,从召回的 Top-K 候选中筛选最相关的内容。
常见模型:
- BGE-Reranker
- bge-reranker-v2
- Cohere Rerank
Reranker采用Cross-Encoder对Query和Chunk成对计算相关性得分,再重新排序,最终保留Top-K(例如 Top10)送入 LLM。
召回率(Recall)与准确率(Precision)
- 高 Recall(召回率):宁可错杀一千,不放过一个(多召回切片,依赖后面的 Reranker 去噪)。
- 高 Precision(准确率):宁缺毋滥(降低大模型被噪点干扰/上下文污染的风险)。
工业界常见做法:前级放开Recall抓取50100个chunk,后级重排精筛出Precision最高的35个chunk喂给LLM。
- Recall(召回率)- 希望不要漏掉真正相关文档。
- Precision(准确率)- 希望返回的文档都是最相关的。
总结:实际工程中通常先提高Recall,再通过Reranker提升Precision。因为:漏召回无法补救,错误召回还能重排。
Prompt Assembly(上下文组装)
检索结果并不能直接送给LLM,需要组装Prompt。包括:用户问题+检索内容+Metadata+回答规则。
例如:“仅依据提供内容回答。若无法确定,请明确说明。禁止编造答案。”
Chunk中保存Metadata(文档名、页码、章节、URL等),Prompt组装时携带这些信息,方便LLM生成带Citation的回答。降低幻觉、提高可追溯性和可信度。
来源
[1] https://www.quanxiaoha.com/java-interview/recursive-vs-semantic-chunking

浙公网安备 33010602011771号