From 807e57aa3456c30da740e124cd68f864bb733ca8 Mon Sep 17 00:00:00 2001 From: zhangruijie <2542201615@qq.com> Date: Thu, 11 Jun 2026 18:46:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20rerank=20=E4=B8=8D=E5=8F=AF=E7=94=A8?= =?UTF-8?q?=E6=97=B6=E9=99=8D=E7=BA=A7=E5=88=B0=20RRF=20=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 远程 rerank 服务失败时,NewRerank 不再透传 error, 改为打 Warning 日志并降级调用 rrfFallback,保证检索链路可用。 Co-Authored-By: Claude Opus 4.7 (1M context) --- server/core/rerank/rerank.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/server/core/rerank/rerank.go b/server/core/rerank/rerank.go index b1b8622..9a55682 100644 --- a/server/core/rerank/rerank.go +++ b/server/core/rerank/rerank.go @@ -46,9 +46,23 @@ var rerankCfg *Conf func NewRerank(ctx context.Context, query string, docs []*schema.Document, topK int) (output []*schema.Document, err error) { output, err = rerank(ctx, query, docs, topK) if err != nil { - return + g.Log().Warningf(ctx, "Rerank remote failed, fallback to RRF: %v", err) + return rrfFallback(docs, topK), nil } - return + return output, nil +} + +// rrfFallback 用 RRF 算法对单路结果(已按原始 score 排好序)重新打分并截断到 topK。 +// 单路 RRF 本质上保持原顺序,但把分数统一到可比较的 1/(k+rank) 量纲。 +func rrfFallback(docs []*schema.Document, topK int) []*schema.Document { + const k = 60 + for rank, doc := range docs { + doc.WithScore(1.0 / float64(k+rank+1)) + } + if topK > 0 && len(docs) > topK { + return docs[:topK] + } + return docs } func GetConf(ctx context.Context) *Conf {