在 RAG 混合检索场景中,系统同时使用多种检索器: - 向量/全文检索:Elasticsearch(返回带相似度分数的文本片段) - 结构化查询:SQL 检索器、Cypher 检索器(返回精确的表格数据) 当这些结果进入 KnowEngineReRankingContentAggregator 进行 RRF 融合和 BGE 重排序时,结构化查询结果会导致重排序失败或效果异常,原因包括: - 评分模型不适用:BGE scoring model 是为文本相似度设计的,对 SQL/Cypher 返回的结构化表格数据评分不准确 - RRF 融合不合理:结构化查询结果是精确匹配,不需要与向量检索结果做倒数秩融合 - 代码中基于chunk的embedding_id做去重,而结构化查询没这个字段,会报错。 于是,我们设计了一个基于元数据标记的混合聚合架构,让结构化结果跳过重排序/融合,直接透传给 LLM。
定义 skipRerank 标记常量
MetadataKeyConstant.java
public
SQL/Cypher 检索器为成功结果打标记
KnowEngineNeo4jContentRetriever.java、KnowEngineSqlDatabaseContentRetriever.java
@Override
public
results
}
创建混合聚合器,分离两类结果
KnowEngineHybridContentAggregator.java
public
structuredContents
unstructured
unstructuredLists
unstructuredQueryToContents
unstructuredAggregator
structuredContents
combined
combined
}
在 ChatApplicationService 中组装聚合器链
// 使用带进度通知的聚合器包装原始聚合器
// 混合聚合器:SQL/Cypher 结构化结果直接透传,仅对向量/全文检索结果做 RRF 融合和重排序
ContentAggregator
processCallback
)