无论提示词(Prompt)写得多么天花乱坠,大模型依然有两个无法凭借算力解决的死穴:记忆停滞(只记得训练截止 日期前发生的事),以及私有壁垒(绝对不可能读过你们公司内网的财报)。
如果你问一个不在它预训练数据里的问题,它就会一本正经地胡说八道(产生幻觉)。怎么破?那就不要让它去靠死记硬背猜答案,而是把参考书翻开摆在它面前,让它做阅读理解。
这就是 RAG (Retrieval-Augmented Generation,检索增强生成)。
1. 什么是 RAG?(开卷考试范式)
RAG 的逻辑极其朴素,它就像是一个外包客服的工作流程:
- 用户提问:“我们公司这个月的报销标准降了吗?”
- 检索 (Retrieve):客服一愣(因为他没背过公司财报),转身冲进公司的资料档案室,通过电脑系统检索搜出了包含“报销标准”的相关规定。
- 增强 (Augment):客服把这些规定和用户的问题拼在一起:“根据这篇文档显示,这个月差旅报销降了50块钱。现在用户的原问题是:报销标准降了吗?”
- 生成 (Generate):大模型发挥它卓越的总结能力,输出最终答案:“您好,根据最新规定,本月报销标准已下调。”
这就是 RAG:让大模型停止猜测,强制它转为进行严格带引用的阅读理解。
[图片占位:(A clean, minimalist technical diagram on a solid white background. Use simple, crisp vector line art, monochrome or with very subtle minimal color accents. Flat design, no 3D effects, no clutter. Abstract visual.)]
2. 第一道关卡:文本切分 (Chunking)
在 4.1 章节中,我们讲过 Embedding 模型能把文本转成坐标。但在把公司的知识变坐标存进库之前,你必须面临一个极其现实的物理难题。
你绝不能把一整本厚达 1000 页的《员工手册》直接打包存成一个单独的向量坐标。大模型的注意力机制在面对过量信息时容易失焦,且向量维度有限,几万字挤在一个坐标点里,其特征信息会被彻底稀释成一锅粥。你必须把它切碎(Chunking)。
切碎文本远不是用刀一分为二那么简单,目前工程落地中有几种截然不同的切分哲学。
最粗暴的做法是固定大小切分。比如设定每 500 个字无情地切一刀。这种方法写代码最快,但也最容易酿成惨剧:它极有可能把一句重要的话从中间拦腰斩断,导致前半截留在上一个区块,后半截落在下一个区块,让检索系统捞出来的全是残暴的断头语的垃圾数据。
为了避免断章取义,聪明一点的做法是重叠切分 (Overlap)。在切的时候设定 50 个字的重合区,就像铺瓦片一样,上一片和下一片叠在一起,从而拼死保住关键概念在边界处不丢失。
而目前真正考究的方案则是语义树切分。它放弃了死板的字数限制,而是让脚本去精准识别文章里的 Markdown 标题层级(比如 ## 或是段落换行符),顺着作者原生的逻辑脉络一刀一刀剥离,保证切下来的每一块肉都是语义连贯、有头有尾的独立章节。