一句话核心结论
检索器只能找到 “相关片段”,但不会理解问题、不会组织答案、不能直接输出通顺回答;大模型负责阅读理解、整合素材、生成最终答案。RAG 完整分工:
检索器 = 资料资料员 大模型 = 答题分析师
我们拆开讲清楚,再举《三国演义》的实例,结合你现在的项目更好理解。
1. 先搞懂:检索返回的东西长什么样
假设你提问:关羽过五关斩六将遇到了哪几个人?Retriever 检索出来的是几段原始文本:
【片段 1】关公斩孔秀…… 【片段 2】至洛阳,斩韩福、孟坦…… 【片段 3】汜水关斩卞喜……
仅仅是一堆零散原文段落,存在几个硬缺陷:
- 文本杂乱、顺序混乱;
- 里面夹杂大量无关描写;
- 不会自动提取关键人名;
- 不会按照你的问题有条理总结;
- 无法直接作为答案丢给用户。
检索器没有推理能力,它只做一件事:相似度匹配,把疑似相关文本捞出来。 它分不清:哪些内容真正能回答问题、哪些只是看起来相似。
2. 大模型拿到检索片段,要完成哪些工作?
① 过滤无关信息(去噪)
经常出现:向量搜到 “看起来相似、实则无关” 的文本。 比如问关羽,检索返回一大段刘备打仗的内容。 大模型能识别:这段上下文没用,自动忽略。
② 信息提取、归纳、重组
原始知识库是小说段落,叙事是流水账。 模型从中抽取:孔秀、韩福、孟坦、卞喜、王植、秦琪,整理成清晰清单。
③ 按照提问角度针对性作答
同样一段原文:
- 问人物 → 列出武将;
- 问地点 → 列出五关;
- 问起因 → 概括挂印封金背景。同一份素材,可以生成完全不同角度的回答,这件事检索器做不到。
④ 遵守 Prompt 规则(最重要!防脑补)
你写的约束:
只依靠上下文回答,资料没有就说【原文未记载】
大模型会执行这条规则。 如果没有大模型,单纯把检索文本直接丢给用户:
- 信息冗长;
- 用户自己要大海捞针找答案; 这不叫智能问答,只能叫 “文档搜索工具”。
3. 举一个极端对比帮助理解
方式 A:只检索,不送大模型(纯检索输出)
用户:关羽过五关斩六将斩杀了谁? 系统直接返回 3 大段小说原文…… 用户需要自己阅读几百字寻找人名。
方式 B:检索 + 送入 LLM(标准 RAG)
用户:关羽过五关斩六将斩杀了谁? 模型整理输出: 关羽先后斩杀孔秀、韩福、孟坦、卞喜、王植、秦琪六人。
差距一目了然。
4. 很多人会产生一个误区
“既然知识库里面有答案,直接关键词提取不行吗?为什么非要大模型?”
现实难点:
- 用户提问千变万化,措辞不固定;
- 问题形式多种多样:总结、对比、时间排序、原因分析;
- 手写规则 / 关键词提取,很难覆盖所有提问方式,维护成本极高。
大模型天然具备自然语言理解,是低成本实现 “开放式问答” 的方案。
5. 延伸一个关键知识点:RAG 不是 “让模型背资料”
不送入知识库的情况: 大模型依靠训练时记住的通用知识回答,容易:
- 混淆《三国演义》和《三国志》;
- 编造不存在的剧情(幻觉)。
检索送入上下文的目的:强制模型以你本地白话文《三国演义》这份资料作为唯一依据,限制它不能自由发挥。
6. 极简流程复盘(贴合你现有的 LCEL 链路)
plaintext
用户问题 ↓ Retriever【检索相关文本块】 ↓ 拼接 {context}+{question} 送入Prompt ↓ LLM【阅读素材 → 提炼 → 组织语言 → 输出回答】7. 补充一个边界场景
有没有可以不用大模型的情况? 只有最简单场景: 用户输入关键词,系统原样返回原文片段(类似站内搜索)。 一旦需要总结、归纳、推理、整理语言,就离不开大模型。
结合你的三国演义项目举个典型幻觉例子
提问:“吕布死后赤兔马去哪里了?”
- 不使用 RAG:大模型可能凭记忆随口回答;
- RAG 检索到白话文小说段落,喂给模型; 模型被约束,只能按照你本地三国演义文本作答,减少瞎编。