这道题其实是在问,怎么让大模型在需要专业知识时,不靠死记硬背,而是能现场翻书。说白了,[[RAG]]的核心就是把大模型从闭卷考试变成开卷考试。
整个流程分三步:索引、检索、生成。索引就是把文档切碎,转成向量存进[[向量库]];检索是把用户的问题也转成向量,去库里找最像的那几段;生成是把这些段落塞进提示词,让模型基于它们回答。这里有个关键认知,检索质量决定了RAG的上限,生成质量决定了下限,所以我会把大部分精力放在检索上。
具体说下索引。文档切分不是随便按字数切,我会按语义段落,块大小与重叠窗口都作为候选变量,再用同一评测集比较边界证据完整率、召回、延迟和索引成本。向量库选型上,如果数据量上亿,我会用Milvus,它分布式做得成熟;如果是几百万级别的轻量场景,Qdrant更轻便,部署成本低。[[Embedding]]模型的话,中文场景我倾向BGE或者M3E,英文用OpenAI那套。
检索这块,我会走混合路线。纯向量检索在短文本匹配上不如关键词,纯关键词又抓不住语义,所以我会把[[稠密检索]]和[[稀疏检索]]结合起来,用RRF融合排序。举个例子,在客服退款场景里,用户说“订单异常”,向量检索能理解这是状态不对,但关键词检索能精确匹配订单号,两条路一起走,召回率能提升10到15个点。
检索完还有一步[[重排序]],很多人忽略。我会用[[Cross-Encoder]]对Top-50做精排,只留Top-5,这样能去掉噪声,保证进生成器的都是高质量片段。重排序计算量大,但值得,因为上下文窗口有限,塞入垃圾信息反而会干扰模型。
Query改写也很有用。用户的问题往往模糊,比如“怎么退款”,我会先生成几个可能的问题表述,或者用HyDE先假设一个理想答案再检索,效果提升明显。
落地中最大的挑战有三个。先看检索失效,当用户问的和文档表述差异很大时,检索就抓瞎,这点可以用Query改写或者HyDE缓解。再看知识冲突,检索到的信息跟模型参数里学到的矛盾,比如企业SOP更新了,但模型还在用旧知识,我会在提示词里明确要求“优先基于检索内容回答,忽略模型自身知识”,并在答案后标注引用来源,方便核查。还要看时效性,知识库每天更新,但向量索引重建很慢,我会做增量索引,新增数据直接插入,删除用软删除加异步重建,保证实时性。
现在很多人在做[[Agentic RAG]],就是让模型自己决定什么时候去检索、检索什么,甚至用[[ReAct]]循环多次检索。我觉得这是RAG的进化方向,但前提是[[Agent]]的决策能力要可靠,不然容易陷入死循环。
所以我的判断是,RAG不是银弹,它适合知识密集、答案可被文档支撑的场景,比如客服、合规审查;但如果是创造性写作或者需要深层推理的,RAG只能当辅助,得配合微调或者[[知识图谱]]。我倾向于把RAG当成一个工具链,而不是一个模型,它的核心是做好检索这一环,后面生成交给大模型就行。