01rerank如何影响业务表现今天聊一聊我们如何做高质量rerank。一个常识是,无论企业知识库、电商、新闻,还是RAG、Agent场景,只依靠语义相似度对检索结果进行排名,无疑都是粗暴且低效的。一方面,元数据往往包含了语义、时间、标签、地理位置等多元信息,语义并不总是最重要的那一项;另一方面,用户检索时,往往还需要对数据按照距离远近、好评分数、复购数量等信息进行综合排序。比如:在很多数据库的向量插件,或者早期版本的向量数据库产品中,向量检索结果排序主要依赖向量相似度本身(距离越近/相似度越高越靠前),或者通过模型类 Reranker(如 BGE, Voyage, Cohere)进行更智能的重排。但很显然,这两种方案中的任意一种,都无法解决实际场景中复杂的rerank需求。 针对这一困境,Milvus推出了Boost Ranker功能:在 Milvus 内部,我们可以对候选结果应用一组基于元数据的“加权规则”,做到不改索引、不改向量模型,就能按照需求更新排序逻辑。 那么这个功能是如何实现的,要如何在实战中使用,本文将重点解读。 02Boost Ranker 是什么2.1 核心能力概览Boost Ranker 是 Milvus 2.6.2 引入的一种 rerank 策略,通过 Function API 配置: 在向量检索返回的候选集合上,再执行一轮基于过滤表达式的匹配; 对命中的实体按照配置的weight(权重)重新缩放分数; 引入random_score,在 0~1 范围内生成一个随机因子,做轻量的“打散”。
相比模型类Reranker(调用外部 LLM / rerank 模型),Boost Ranker完全基于已有的标量字段 + 简单规则,不需要外部服务,代价低,实时性强。 2.2 内部工作机制Boost Ranker 在 Milvus 内部的工作流程大致为:第一步,向量检索阶段:每个 segment 独立返回一批候选结果(包含 id、原始 score、相关元数据); 第二步,应用 Boost Ranker: 第三步,再聚合所有 segment 的候选,按新的分数排序得到最终 TopK。
需要注意的是 Boost Ranker 对候选集合生效,而不是在全量数据上跑一次新查询,因此性能开销非常小。 3 什么情况下优先考虑 Boost Ranker3.1 业务驱动的内容加权典型场景: 电商搜索: 提升“旗舰店/自营/付费推广”商品的权重; 提升近期销量/点击高的商品;
内容/资讯搜索: 企业内部文档检索:
这些都可以通过简单的filter+weight实现,无需触碰向量模型、索引。 3.2 策略性降权与风控另一类是温柔的隐藏而不是直接过滤: 优势是:用户仍能在某些场景看到这些结果,但它们会自然地出现在靠后位置。 3.3 探索/多样化:利用 random_scoreBoost Ranker 支持random_score字段: "random_score":{"seed":126,"field":"id"}可以用它来: 3.4 与其它 Ranker 的关系与限制Boost Ranker 是通过Function(FunctionType.RERANK, params.reranker='boost')创建的rerank 函数; 它不能作为多向量 hybrid search(多个向量字段一起搜)的顶层 ranker,但可以作为每个AnnSearchRequest的 ranker 使用。 可以与其他 Ranker 组合:
4
核心参数与使用注意事项Boost Ranker 是通过Function和FunctionScore(可选)配置的。 4.1 创建 Boost Ranker 所需的字段Python 里一般这么创建(后面实战会给完整代码): name:这个 Function 的名字;
input_field_names:Boost Ranker 必须是空列表[];
function_type:固定使用FunctionType.RERANK;
params.reranker:固定字符串"boost",告诉 Milvus 使用 Boost Ranker。
4.2 重点参数:weight、filter、random_score(1)params.weight(必填)
如果“分数越小越好”(典型是距离类度量),要 提升 某类结果,就用 < 1 的权重; 如果“分数越大越好”,要提升就用 > 1 的权重。 (2)params.filter(可选) 一条基础的标量过滤表达式,例如 (3)params.random_score(可选) 结构:{"seed": 126, "field": "id"}; 返回 0~1 的随机值,可与 weight 配合产生轻微扰动; 建议同时设置 seed 与 field,保证多次请求中结果可复现。
4.3 单 Boost Ranker vs 多 Boost Ranker单 Boost Ranker: 多 Boost Ranker 组合:
05实战:文档检索中提升“官方”文档权重5.1 场景设定与数据建模假设我们有一个集合milvus_collection,字段如下: id: INT64 主键;
embedding: FLOAT_VECTOR,content字段的embeddding数据;
content: VARCHAR,文档内容;
source: VARCHAR,取值如"official","community","ticket"等。
is_official: BOOL, 官方文档(即source是official)为True,否则是False。
5.2 创建集合与插入示例数据frompymilvusimport(MilvusClient,DataType,Function,FunctionType,)#1.连接Milvusclient=MilvusClient(uri="http://localhost:19530")collection_name="milvus_collection"#如果已存在就先删除,方便反复调试ifcollection_nameinclient.list_collections():client.drop_collection(collection_name)#2.定义schemaschema=MilvusClient.create_schema(auto_id=False,enable_dynamic_field=False,)schema.add_field(field_name="id",datatype=DataType.INT64,is_primary=True,)schema.add_field(field_name="content",datatype=DataType.VARCHAR,max_length=512,)schema.add_field(field_name="source",datatype=DataType.VARCHAR,max_length=32,)schema.add_field(field_name="is_official",datatype=DataType.BOOL,)schema.add_field(field_name="embedding",datatype=DataType.FLOAT_VECTOR,dim=3072,)text_embedding_function=Function(name="openai_embedding",function_type=FunctionType.TEXTEMBEDDING,input_field_names=["content"],output_field_names=["embedding"],params={"provider":"openai","model_name":"text-embedding-3-large"})schema.add_function(text_embedding_function)#3.创建Collectionclient.create_collection(collection_name=collection_name,schema=schema,)#4.创建索引index_params=client.prepare_index_params()index_params.add_index(field_name="embedding",index_type="IVF_FLAT",metric_type="COSINE",params={"nlist":16},)client.create_index(collection_name=collection_name,index_params=index_params,)#5.加载Collection到内存client.load_collection(collection_name=collection_name)docs=[{"id":1,"content":"如何在Kubernetes上部署Milvus(官方手册)","source":"official","is_official":True},{"id":2,"content":"Milvus在DockerCompose下的快速部署(官方教程)","source":"official","is_official":True},{"id":3,"content":"社区经验:Milvus部署经验之谈","source":"community","is_official":False},{"id":4,"content":"工单记录:Milvus部署问题","source":"ticket","is_official":False},]client.insert(collection_name=collection_name,data=docs,)5.3 定义 Boost Ranker 并执行搜索我们希望:在语义相关性相近的情况下,Milvus官方文档优先出现。 #6.基线搜索(不加BoostRanker)query_vector="如何部署milvus"search_params={"metric_type":"COSINE","params":{"nprobe":2},}results=client.search(collection_name=collection_name,data=[query_vector],anns_field="embedding",search_params=search_params,limit=4,output_fields=["content","source","is_official"],)print("===Baselinesearch(noBoostRanker)===")forhitinresults[0]:entity=hit["entity"]print(f"id={hit['id']},"f"score={hit['distance']:.4f},"f"source={entity['source']},"f"is_official={entity['is_official']}")#7.定义BoostRanker:给is_official==true的文档加权boost_official_ranker=Function(name="boost_official",input_field_names=[],#BoostRanker要求必须为空列表function_type=FunctionType.RERANK,params={"reranker":"boost",#指定使用BoostRanker"filter":"is_official==true",#对于COSINE/IP(分数越大越好),使用>1的权重进行提升"weight":1.2},)boosted_results=client.search(collection_name=collection_name,data=[query_vector],anns_field="embedding",search_params=search_params,limit=4,output_fields=["content","source","is_official"],ranker=boost_official_ranker,)print("\n===SearchwithBoostRanker(officialboosted)===")forhitinboosted_results[0]:entity=hit["entity"]print(f"id={hit['id']},"f"score={hit['distance']:.4f},"f"source={entity['source']},"f"is_official={entity['is_official']}")查询结果 ===Baselinesearch(noBoostRanker)===id=1,score=0.7351,source=official,is_official=Trueid=4,score=0.7017,source=ticket,is_official=Falseid=3,score=0.6706,source=community,is_official=Falseid=2,score=0.6435,source=official,is_official=True===SearchwithBoostRanker(officialboosted)===id=1,score=0.8821,source=official,is_official=Trueid=2,score=0.7722,source=official,is_official=Trueid=4,score=0.7017,source=ticket,is_official=Falseid=3,score=0.6706,source=community,is_official=False 5.4 结果变化背后的逻辑在原始向量相似度差距不大的前提下,is_official == true 的文档更容易出现在前几名; 社区 / 工单类文档仍会出现在结果中,只是相对靠后。 这正是 Boost Ranker 要解决的问题:把“官方优先”等业务规则叠加到语义检索结果上。
总结Boost Ranker作为Milvus 2.6的新功能,极大地扩展了向量数据库的灵活性,让搜索不再局限于纯向量相似度,而是能融入业务逻辑,实现更精准的排名。 通过本文的介绍和更真实的实践案例,读者可以快速理解并应用这一功能。在未来,随着AI应用的深化,Boost Ranker将在RAG、推荐和检索系统中发挥更大作用。 |