package rag import "sort" // rrfK 是 RRF 的平滑常数(业界常用 60)。 const rrfK = 60.0 // rrf 用 Reciprocal Rank Fusion 融合多路检索的排序列表,按文本去重。 // 每路对一个文档的贡献 = 1/(k + 该路中的名次);累加后重排。 func rrf(lists [][]Hit, topK int) []Hit { score := map[string]float64{} for _, list := range lists { for rank, h := range list { score[h.Text] += 1.0 / (rrfK + float64(rank+1)) } } fused := make([]Hit, 0, len(score)) for text, s := range score { fused = append(fused, Hit{Text: text, Score: float32(s)}) } sort.Slice(fused, func(i, j int) bool { return fused[i].Score > fused[j].Score }) if topK > 0 && len(fused) > topK { fused = fused[:topK] } return fused }