第一阶段: 先用 Naive RAG 进行粗召回。
Naive RAG 在这里召回的不是一整本操作手册,也不是随意的一段话,而是知识库(Knowledge Base)中具体的条目。Naive RAG 的任务是从成百上千条故障日志中,快速筛选出一批“大概率相关”的文档。为了进行筛选,例如,系统通常会先召回相关度最高的前 20 个文档(Top-20)作为候选 。这个列表是基于向量相似度排序的,但可能包含一些不够精准的噪音数据,所以被称为“粗”召回。
粗召回的技术原理:双流编码器 (Two-stream Encoder)
为了得到这个列表,Naive RAG 使用了双流编码器架构:
Query 编码:将用户的查询(例如:“TCU2 通信故障,转换器2被隔离,可能是什么故障?”)转化成一个向量。
Document 编码:将上述清洗过的故障日志(现象+部位+类型)也转化成向量。
匹配计算:计算查询向量与文档向量之间的相似度(通常是余弦相似度)。
输出:输出相似度分数最高的那些文档(即 Top-K 列表)。
第二阶段: 引入一个重排序模型对检索回来的文档进行精细化的二次排序。
Rerank(重排序)方法随后会接过这个列表,用更精细的模型对这 20 条记录进行二次打分和排序,把真正最相关的几条排到最前面,丢弃不相关的。
Naive RAG (粗召回):Bi-Encoder 架构
在第一阶段(粗召回),系统为了快,使用的是Bi-Encoder。
机制:Query 和 Document 是独立进入模型的。模型分别算出 Query 向量和 Document 向量。
计算:最后只计算两个向量的余弦相似度。
缺点:这种方式丢失了 Query 和 Document 之间词与词的精细交互信息。模型在处理 Document 时还没见到 Query,所以只能提取一个泛泛的特征向量。
Ranking Model (精细重排):Cross-Encoder 架构
在第二阶段(重排序),数据量变少了(比如只剩 20 条),系统就可以使用更昂贵但更精准的Cross-Encoder。
机制:它将 Query 和 Document拼接在一起(通常用
[SEP]分隔),作为一个整体输入到 BERT 等模型中。深度交互:在模型内部(Transformer 层),Query 中的每一个词都能注意到 Document 中的每一个词(Full Self-Attention)。
输出:模型不输出向量,而是直接通过一个线性层(Linear Layer)输出一个0 到 1 之间的相关性分数(Score)。
按照什么“标准”排序?
精细化排序的标准不再是简单的“向量空间距离”,而是**“深层语义匹配度”**。
具体到这篇论文的故障诊断场景,重排序模型会依据以下更深层的逻辑进行打分:
精确匹配 (Exact Term Matching):
粗召回标准:只要 Query 和 Document 都包含“故障”、“TCU”等词,向量距离就很近。
精细化标准:重排序模型会看具体的修饰关系。例如,Query 问的是“TCU2 通信故障”,粗召回可能会拉回“TCU1 电源故障”(因为词重叠度高),但重排序模型通过全文注意力机制,能识别出“TCU2”和“TCU1”的不匹配,从而给“TCU1”的文档打低分。
逻辑关系 (Logical Consistency):
标准:文档内容是否真的回答了问题?
如果 Query 是“导致转换器隔离的原因是什么?”,粗召回可能拉回包含“转换器隔离”这个词的所有文档(包括描述现象的、描述结果的)。
重排序模型经过训练(通常是在 MS MARCO 等数据集上微调过),能更好地区分“原因”和“现象”的语境差异,将真正解释“原因”的文档排在前面。
实验中的具体流程
输入(Input):
Query:用户的问题。
Candidate List:Naive RAG 粗召回的Top-20个文档 3。
重排序(Reranking Process):
模型将 Query 与这 20 个文档逐一配对:(Query, Doc 1), (Query, Doc 2) ... (Query, Doc 20)。
将这 20 对文本送入 Ranking Model 进行深度推理。
模型输出 20 个新的相关性得分。
截断(Truncation/Output):
按照新得分从高到低排序。
取前8 个(对应 $k_{hr}=8$)或前10 个(对应 $k_{hr}=10$)作为最终结果,去计算命中率(Hit Rate)4。