切块(Chunking)
在 AI 应用开发圈子里,有一句被无数工程师用血泪验证过的铁律:"Garbage In, Garbage Out(垃圾进,垃圾出)"。
很多团队在搭建 RAG(检索增强生成)系统时,一上来就疯狂追求大模型的参数规模,却忽略了最底层的"数据工程"。大模型再聪明,Embedding 模型再精准,如果喂给它们的数据本身就是一团乱麻,最后吐出来的答案绝对是灾难。
今天,我们就来聊聊 RAG 系统的地基------文本分块(Chunking)。
1. 痛点场景:为什么不能把整本书塞给 AI?
假设你有一份 500 页的《企业员工手册》,你想让 AI 助手回答里面的问题。最暴力的做法是直接把 500 页文本全塞给大模型。但这会带来两个致命问题:
- 上下文溢出(Context Window Limit):大模型有输入长度限制,就像浏览器的内存限制。一次性塞入 50 万字,系统会直接 OOM(内存溢出)崩溃。
- 迷失在中间(Lost in the Middle):这是大模型的一个已知缺陷。当输入文本过长时,模型往往能记住开头和结尾,却会"遗忘"中间的关键信息,导致检索和回答极其不准。
前端类比 :这就像你在前端渲染一个包含 10 万条数据的列表,如果你直接用 innerHTML 一次性塞进去,浏览器绝对会卡死。你必须使用**虚拟列表(Virtual List)**或分页加载。RAG 的 Chunking,就是给大模型做"虚拟列表"。
2. 切块策略实战:从青铜到王者
在企业级开发中,我们绝对不是随便按字数瞎切。根据数据类型的不同,业界有以下几种主流策略:
策略一:递归语义切块(Recursive Chunking)------ 业界最主流
- 做法 :按文章的"自然结构"来切。比如优先按换行符
\n\n切,如果切出来还是太大,就按\n切,再大就按句号.切。 - 避坑指南(Chunk Overlap) :切块时,必须设置重叠区(Overlap)。比如每 500 字切一刀,重叠 50 字。这就好比前端分页,第 1 页的最后一条数据,也是第 2 页的第一条。这样能保证跨块边界的上下文不断裂,防止一句话被拦腰截断。
策略二:父子索引切块(Parent-Child / Small-to-Big)------ 高阶架构师的必杀技
- 痛点:切得太小(100字),检索很准,但丢给大模型时上下文不够;切得太大(1000字),上下文够了,但检索时被其他无关内容干扰,搜不准。
- 实战举例:假设有一份 10 页的法律合同。我们把它切成 200 字的"小块(Child)"用于 Embedding 和精准检索。当系统命中某个小块后,不是把这块 200 字给大模型,而是去数据库里把它对应的整个章节(2000 字的"大块 Parent")捞出来喂给大模型。
- 前端类比 :这就像前端的"懒加载"。你在目录(索引)里只存一个简短的摘要,用户点击后,再去请求完整的详情数据。这样既保证了检索的精准,又保证了大模型有足够的上下文!
3. 架构师避坑:元数据(Metadata)是灵魂
-
很多新手在切块时,只关注文本内容,却忘了给数据打标签。
在企业真实场景中,数据是有权限和分类的。在 Chunking 阶段,你必须把"这篇文章叫什么"、"作者是谁"、"属于哪个部门"这些信息(Metadata)跟 Chunk 死死绑定。
为什么这么重要?
因为这是后续实现数据隔离的基石。如果入库时不打标签,等用户提问时再去过滤,不仅性能极差,还容易发生越权访问的严重生产事故。
chunking记忆口诀
切块要留重叠区,元数据里藏权限。
递归切分保语义,父子索引最精细。
翻译(Embedding)和向量数据库
在上边,我们把长篇大论切成了一个个精致的文本块(Chunk)。但这时候,这些文本块对计算机来说,依然只是一堆毫无意义的字符。
计算机不懂什么是"红烧肉",也不懂什么是"红烧排骨"。为了让计算机能理解人类的语言,我们需要一个"翻译官",以及一个专门存放翻译结果的"超级仓库"。这就是本篇的主角:Embedding(嵌入模型) 与 向量数据库。
1. Embedding 翻译官:把文字变成"语义指纹"
原理:它就是一个"纯函数"
前端类比: 你平时传参给后端,是不是经常用 JSON.stringify() 把 JS 对象变成字符串?Embedding 本质上就是一个高级的序列化函数。你传进去一段文本,它给你吐出来一个包含几百上千个浮点数的数组(比如 [0.12, -0.56, 0.89...])。这串数字,就是这段文本的**"语义指纹"**。
超能力:自带"距离感"的多维空间
Embedding 最牛的地方在于,它翻译出来的坐标,自带物理距离。在这个拥有上千个坐标轴的"高维空间(Latent Space)"里,意思越相近的话,坐标离得就越近。
- 实战举例:"怎么做红烧肉?" 和 "红烧肉的烹饪步骤是啥?" 这两个句子在多维空间里会紧紧挨在一起。而 "怎么修电脑?" 会离它们十万八千里。
- 前端类比 :这就好比你在写 CSS 绝对定位(
position: absolute),Embedding 会自动帮你把"意思相似"的 DOM 元素,精准地叠放在一起!
2. 向量数据库:不讲字面,只认"距离"
有了语义指纹,我们该把它们存在哪?传统的 MySQL 肯定不行,因为 MySQL 玩的是 WHERE title LIKE '%红烧肉%' 这种字面匹配。
痛点:传统搜索的"死脑筋"
如果你搜"如何缓解焦虑",MySQL 绝对搜不出标题叫"怎样让心情变好"的文档,因为它不懂这两个词是一个意思。
向量数据库的"感性"逻辑
向量数据库(如 Milvus)就是个"感性"的数据库。它不认字,只算距离。当你提问时,它会把你的问题也翻译成坐标,然后在库里找离你最近的几个坐标。哪怕文档里没有一个字跟你的问题重合,只要"意思相近",它就能给你揪出来。
3. 企业级实战选型(直接抄作业)
既然是为了找工作,咱们就按目前大厂的标准来:
- Embedding 模型首选:BAAI/BGE-M3
- 为什么? 它是目前企业级中文 RAG 的"当红炸子鸡"。开源免费(Apache 2.0 协议,企业商用无风险),支持超长文本(8192 tokens),而且对中文语义的理解在开源界是顶级的。
- 向量数据库首选:Milvus
- 为什么? 面试企业级,千万别提 ChromaDB 或者 FAISS 了,那都是写 Demo 用的。Milvus 是目前中大型企业生产环境的默认首选,支持分布式、百亿级向量、高并发,是真正的工业级产品。
4. 架构师避坑:翻译官绝对不能换!
前端类比: 这就像你加密密码用的 Hash 算法。你存数据的时候用的是 MD5,查数据的时候换成了 SHA256,那算出来的哈希值根本对不上,直接报 404!
在 RAG 系统里,入库时用的 Embedding 模型,和检索时用的 Embedding 模型,必须是同一个版本! 否则多维空间的坐标系全乱了,搜出来的结果绝对是牛头不对马嘴。
embedding记忆口诀
翻译全靠 Embedding,语义空间算距离。
纯函数里藏指纹,模型千万别换替。
向量库里找相似,Milvus 扛把子最无敌!
混合检索与 Rerank 重排序
1. 痛点场景:单一检索的"偏科生"
在企业级开发中,如果你只用一种检索方式,绝对会被用户骂得狗血淋头。为什么?因为它们都是"偏科生":
- 向量检索(懂语义,但瞎) :用户问"
SLB-20250101设备的故障码是什么?",向量库可能会给你搜出一堆"设备维修记录"、"常见故障排查"。它懂意思,但对精确的字母数字组合极其不敏感。 - 关键词检索(认死理,但傻):传统搜索引擎(如 Elasticsearch 的 BM25)只认字面匹配。用户问"怎么让心情变好?",文档里写的是"如何缓解焦虑",它一个字都搜不出来,因为它不懂同义词。
前端类比 :这就好比你在淘宝买东西,如果淘宝只按"商品名"搜,你搜"解渴神器"绝对搜不出"矿泉水";如果淘宝只按"猜你喜欢(语义)"搜,你搜精确型号 iPhone 15 Pro Max,它可能会给你推一堆"苹果手机壳"。
2. 企业级解法:混合检索(Hybrid Search)
大厂的标准解法是:小孩子才做选择,成年人全都要! 我们把向量检索和关键词检索结合起来。
第一步:双路召回(并发请求)
用户提问后,系统同时发起两个请求:
- 去 Milvus 向量库搜"语义相似"的 Top 20。
- 去 Elasticsearch 搜"精确关键词"的 Top 20。
前端类比: 就像前端发请求,千万别用 await 串行去查,必须用 Promise.all() 并发执行,榨干服务器性能!
第二步:RRF 融合打分(Reciprocal Rank Fusion)
两路都返回了 20 条数据,怎么合并?向量库返回的是余弦相似度(0到1),ES 返回的是词频得分(可能是 5.6),量纲都不一样,怎么比?
业界标准算法是 RRF(倒数排名融合) 。它不看具体分数,只看排名。公式很简单:RRF分数 = 1 / (k + 排名)。
如果一篇文档在两路搜索里都排在前面,它的 RRF 分数就会极高。
前端类比: 这就像选秀节目的"双导师制"。A 导师给了高分,B 导师没转身,这选手不一定行;但如果 A 导师和 B 导师都给了高分,那绝对是实力派!RRF 就是那个综合打分器。
3. 终极杀手锏:Rerank(重排序)
经过混合检索和 RRF 融合,我们拿到了 40 个候选结果。但这里面肯定还有凑数的。这时候,必须请出重量级裁判------Rerank 模型。
Rerank 为什么这么准?
前端类比:
Embedding 就像是前端做模糊搜索(Fuzzy Search) ,把两个组件分别算个 Hash 值比一比,速度快,但容易有误差。
Rerank 就像是前端的精确校验(Validation) 。它会把"用户提问"和"文档片段"拼接在一起 (比如:[问题: 怎么做红烧肉?] [文档: 第一步切肉,第二步焯水...]),当成一个整体扔进模型里做深度阅读理解。它不追求速度,只追求极致的准确率!
架构师避坑:Rerank 极其消耗算力!
因为它是"深度阅读理解",所以绝对不能拿它去搜 10 万条数据,那样服务器会直接冒烟。它只能放在最后一步,对 RRF 融合后的 Top 20~50 条数据进行"精排",最后只挑出最靠谱的 Top 3 喂给大模型。
企业级选型(直接抄作业)
- 开源首选 :
BAAI/bge-reranker-v2-m3。跟前面讲的 Embedding 是一对亲兄弟,中文效果极好。 - API 首选:如果不想自己部署,直接调 Cohere 的 Rerank API,或者阿里云/百度的 Rerank 接口。
检索记忆口诀
双路召回加精排,混合检索最无敌。
向量语义加关键词,RRF 来合并。
Rerank 精读做裁判,Top3 喂给大模型!
权限前置与性能优化
经过上边的了解,咱们的 RAG 系统已经能搜出极其精准的答案了。但如果想把它部署到真实的企业生产环境,我们还必须跨过两道生死线:安全合规 与性能体验。
1. 安全篇:权限前置过滤(Pre-filtering)
痛点场景:大模型是个"大漏勺"
如果你把全公司的文档(包括高管薪酬表、核心源代码)一股脑全塞进向量数据库,普通员工提问:"公司明年的战略规划是什么?" 向量数据库是个"死脑筋",它不管你是谁,只要意思相近,就会把机密文档捞出来,大模型还会傻乎乎地念给员工听。这在企业里叫**"越权访问"**,是极其严重的生产事故!
企业级解法:权限继承与前置过滤
前端类比: 这就像咱们做前端路由守卫(Router Guard)。你不能等页面全渲染完了,再在页面上盖个黑框说"您无权查看"。你必须在发请求之前,就把用户的 Token 带上,让后端直接拦截!
实战架构怎么做?
- 入库时打标签(Metadata) :文档在切块(Chunking)后,必须绑定权限标签。比如
role: "manager",或者department: "HR"。 - 检索时带 Token:用户提问时,系统获取他的身份信息。
- 向量库过滤(Pre-filtering) :去 Milvus 向量数据库查询时,带上过滤条件。比如:
Search(向量, filter="role='employee'")。这样,向量数据库在算距离的时候,连高管文档的坐标看都不看一眼,直接过滤掉!
2. 性能篇:把 10 秒压缩到 2 秒的"大厂绝学"
在真实环境里,RAG 系统最大的敌人就是"慢"。用户问个问题,经历 Embedding、混合检索、Rerank、大模型生成,这一套连招下来如果没做优化,用户等个 15 秒,早就把浏览器关了。
绝招一:语义缓存(Semantic Cache)------ 终极提速大招
前端类比: 这不就是咱们前端天天用的 HTTP 缓存或者 Redis 缓存嘛!
如果用户 A 问了"怎么请假?",系统花 10 秒给出了完美答案。五分钟后,用户 B 又问了"请假流程是什么?"。这两个问题字面不一样,但意思(语义)一样 !
这时候,我们直接在 Redis 里把刚才的答案返回,根本不需要再去走那一套极其耗时的检索和大模型生成流程!接口响应时间直接从 10 秒降到 50 毫秒!
(老哥敲黑板:语义缓存完美融合了安全与性能,在算距离前带上用户的权限 Tag,既保证了缓存速度,又保证了数据不越权!)
绝招二:流式输出(Streaming)------ 体验优化的魔法
前端类比: 就像咱们用 fetch 请求大文件时用的 ReadableStream,或者 SSE(Server-Sent Events)。
大模型生成答案是一个字一个字往外吐的。如果等它全部生成完再返回给前端,用户会盯着白屏发呆。我们必须让大模型开启流式接口,前端像打字机一样把字"啪啪啪"渲染出来。用户看着字在动,心理上就不会觉得慢了。
绝招三:并行计算(Concurrency)------ 榨干服务器性能
前端类比: 就像 Promise.all()!
在混合检索阶段,向量检索和传统关键词检索是互不依赖的。千万别用 await 串行去查!必须用并发,让两个请求同时飞,谁先回来等谁,最后合并结果。这能直接省下一半的检索时间。
记忆口诀
权限前置做过滤,越权访问要杜绝。
语义缓存加流式,并发请求性能优!
极简总结:企业级 RAG 到底是个啥?
一句话解释:
RAG 就是给大模型配了一个**"懂权限、会查资料的开卷助理"** 。它不靠死记硬背,而是通过**"先查资料,再写答案"**,彻底解决 AI 胡说八道(幻觉)和知识过期的问题。
核心架构 5 步走:
- 切块(Chunking):把长篇大论切成小块,带上权限标签(Metadata),就像给数据发"门禁卡"。
- 翻译(Embedding):把文字翻译成高维数字坐标(语义指纹),存进向量数据库。
- 混合检索(Hybrid Search) :用户提问时,向量检索(懂语义) + 关键词检索(认死理) 双管齐下,并发捞数据。
- 精排(Rerank):请出"铁面裁判"对捞出的数据进行深度阅读理解,只挑最准的 Top 3。
- 生成(Generation) :把精准资料喂给大模型,配合流式输出(打字机效果) 和语义缓存(秒回高频问题),给出完美答案。
终极记忆口诀:
切块要留重叠区,元数据里藏权限。
翻译全靠 Embedding,语义空间算距离。
双路召回加精排,混合检索最无敌。
缓存流式齐上阵,企业落地没问题!