Appearance
1.2.4 从用户提问到模型回答,中间数据流是怎么走的?
如果你已经知道 RAG 的大致流程,下一步最值得理解的就是:一条真实请求进来以后,数据到底怎么流动。
因为很多问题只有放到数据流里看,才会变得清楚。
第一步:用户输入问题
一切都从用户问题开始。系统先拿到用户原始输入,比如:
“我们产品的退款规则是什么?”
这时系统拿到的只是原始自然语言,还没有进入真正的检索阶段。
第二步:问题预处理
很多系统不会直接拿原问题去查,而是会先做一些处理,比如:
- 提取关键词
- 改写提问
- 结合对话历史补全语义
- 识别时间范围、业务范围、权限范围
这一步的输出,不一定还是用户原话,而更像一个“更适合检索的查询表达”。
第三步:检索知识库
系统拿着处理后的查询,到知识库中查找相关内容。
这一步通常会读到的数据包括:
- 文本片段
- 向量表示
- 关键词索引
- 元数据
最终会得到一批候选结果,比如若干个最相关的 Chunk。
第四步:候选结果排序和筛选
初始候选结果往往只是“可能相关”,还不是最终上下文。
系统通常会继续做一些处理:
- 去掉重复内容
- 用元数据做过滤
- 对结果重排
- 合并相邻片段
- 去掉明显无关或质量差的结果
这一步结束后,系统会留下更少但质量更高的一组内容。
第五步:构造模型输入上下文
接下来,系统会把保留下来的内容组织成模型能直接消费的输入。
这时通常会形成一份结构化输入,里面至少包含:
- 用户问题
- 检索到的资料
- 回答约束
- 可能还有引用格式要求
可以理解为:系统在这一刻把“原始材料”变成了“可回答材料”。
第六步:模型生成回答
大模型读取这份上下文以后,生成最终文本答案。
如果系统设计得比较严格,模型还可能被要求:
- 只基于提供材料作答
- 资料不足时明确说明
- 输出来源引用
所以这一步虽然是“生成”,但它并不是无约束的自由发挥。
第七步:系统返回结果
最后系统会把结果返回给用户。返回内容可能包括:
- 回答正文
- 引用来源
- 相关文档链接
- 置信提示或补充说明
有些系统还会把这次请求的中间数据记录下来,用于后续评测、诊断和优化。
为什么理解数据流很重要
因为 RAG 的很多问题,其实都能落到某个具体流转节点上。
例如:
- 回答过时,可能是知识源更新没同步
- 找不到资料,可能是查询处理或检索出错
- 资料找到了但没用上,可能是排序或上下文构造有问题
- 资料够了但模型仍乱答,可能是生成约束不够强
当你把一条请求看成一段连续数据流,就更容易理解:RAG 的问题很少只属于“模型”这一层。
如果某一步出问题,通常会表现成什么现象
把数据流理解清楚以后,一个很实用的价值是:你可以把不同问题更快定位到不同节点。
问题预处理出错,常见表现是:
- 用户换一种说法,系统就突然找不到资料
- 多轮对话里代词和上下文接不上
- 系统查出来的内容和用户真正想问的不是一回事
检索阶段出错,常见表现是:
- 明明知识库里有答案,但候选结果里没有
- 召回结果大量重复或明显不相关
- 不同相似问题召回稳定性很差
排序和筛选出错,常见表现是:
- 正确内容在候选里,但总排不进前面
- 过期内容和当前内容混在一起
- 噪声片段总是挤掉真正关键的证据
上下文构造出错,常见表现是:
- 模型答得散
- 明明给了材料,但模型抓错重点
- 长答案里出现多个来源被错误拼接
生成阶段出错,常见表现是:
- 资料不足时仍然强行补全
- 回答语气很确定,但证据其实不够
- 引用了来源,但结论并不真正忠于来源
所以这篇最重要的价值是什么
不是让你把一条请求背成流程图,而是让你以后看到问题时,能先问:
- 这件事是在哪一层开始偏的?
- 偏差是发生在找资料之前、找资料过程中,还是拿到资料之后?
只要这个视角建立起来,后面你读数据、检索、重排和生成时就会轻松很多。