know-engine

解决针对非向量检索导致重排序失败问题

在 RAG 混合检索场景中,系统同时使用多种检索器: 向量/全文检索:Elasticsearch(返回带相似度分数的文本片段) 结构化查询:SQL 检索器、Cypher 检索器(返回精确的表格数据) 当这些结果进入 KnowEngi…

TL;DR

在 RAG 混合检索场景中,系统同时使用多种检索器: 向量/全文检索:Elasticsearch(返回带相似度分数的文本片段) 结构化查询:SQL 检索器、Cypher 检索器(返回精确的表格数据) 当这些结果进入 KnowEngi…

在 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
)
版本提示

模型、框架与接口会持续变化。涉及版本号、参数与生产配置时,请在实践前对照对应官方文档。

LLMentor系统化学习大模型应用工程

内容来自个人课程知识库备份,并经过结构化整理。技术版本持续演进,生产使用前请结合官方文档验证。