一、rerank如何影响业务表现
今天聊一聊我们如何做高质量rerank。
一个常识是,无论企业知识库、电商、新闻,还是RAG、agent场景,只依靠语义相似度对检索结果进行排名,无疑都是粗暴且低效的。
一方面,元数据往往包含了语义、时间、标签、地理位置等多元信息,语义并不总是最重要的那一项; 另一方面,用户检索时,往往还需要对数据按照距离远近、好评分数、复购数量等信息进行综合排序。
比如:
- 电商:付费/旗舰店商品要更靠前,缺货商品要略微靠后;
- 内容搜索:官方内容、最近发布的内容要优先;
- 企业知识库:部分标签(如“权威文档”“最佳实践”)需要被提升或者置顶。
在很多数据库的向量插件,或者早期版本的向量数据库产品中,向量检索结果排序主要依赖向量相似度本身(距离越近/相似度越高越靠前),或者通过模型类 Reranker(如 BGE, Voyage, Cohere)进行更智能的重排。但很显然,这两种方案中的任意一种,都无法解决实际场景中复杂的rerank需求。
针对这一困境,Milvus推出了Boost Ranker功能:在 Milvus 内部,我们可以对候选结果应用一组基于元数据的“加权规则”,做到不改索引、不改向量模型,就能按照需求更新排序逻辑。
那么这个功能是如何实现的,要如何在实战中使用,本文将重点解读。
二、Boost 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:
- 使用
filter表达式(可选)在候选中筛出“需要加权”的实体; - 对这些实体的分数按
weight、random_score做缩放;
第三步,再聚合所有 segment 的候选,按新的分数排序得到最终 TopK。
需要注意的是 Boost Ranker 对候选集合生效,而不是在全量数据上跑一次新查询,因此性能开销非常小。
三、 什么情况下优先考虑 Boost Ranker
3.1 业务驱动的内容加权
典型场景:
- 电商搜索:
- 提升“旗舰店/自营/付费推广”商品的权重;
- 提升近期销量/点击高的商品;
- 内容/资讯搜索:
- 提升最近一段时间内发布的内容(结合
publish_time字段); - 提升来源为“官方账号”“认证作者”的内容;
- 企业内部文档检索:
- 提升
doctype == 'policy'或is_canonical == true的权威文档。
这些都可以通过简单的filter+weight实现,无需触碰向量模型、索引。
3.2 策略性降权与风控
另一类是温柔的隐藏而不是直接过滤:
- 低库存但仍可售的商品:
stock < 10适当降权; - 含有潜在敏感词的内容:打一点折扣,但不做硬过滤;
- 过旧的文档:例如
year < 2020适当往后排。
优势是:用户仍能在某些场景看到这些结果,但它们会自然地出现在靠后位置。
3.3 探索/多样化:利用 random_score
Boost Ranker 支持random_score字段:
"random_score": { "seed": 126, "field": "id" }seed:随机数种子,控制全局一致性;field:作为随机数生成的输入(通常用主键),保证同一条数据多次搜索随机结果一致。
可以用它来:
- 在同一相似度的多个候选中稍微“打散”顺序,避免永远只看到相同 Top;
- 配合固定权重做固定 + 小范围随机的混合排序,用于推荐系统里的探索策略。
3.4 与其它 Ranker 的关系与限制
- Boost Ranker 是通过
Function(FunctionType.RERANK, params.reranker='boost')创建的rerank 函数; - 它不能作为多向量 hybrid search(多个向量字段一起搜)的顶层 ranker,但可以作为每个
AnnSearchRequest的 ranker 使用。 - 可以与其他 Ranker 组合:
- 比如先用 RRF Ranker 融合多模态结果,再用 Boost Ranker 做基于元数据的微调;
- 或者模型 Ranker 提升语义相关性,然后 Boost Ranker 叠加业务规则。
四、核心参数与使用注意事项
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(必填)
- 对所有命中 filter 的实体,将其原始分数乘以此权重;
- 选择规则和度量有关:
如果“分数越小越好”(典型是距离类度量),要 提升 某类结果,就用 < 1 的权重; 如果“分数越大越好”,要提升就用 > 1 的权重。
(2)params.filter(可选)
一条基础的标量过滤表达式,例如
- “doctype == ‘abstract’”
- “is_premium == true”
- “views > 1000 and category == ‘tech’”
(3)params.random_score(可选)
- 结构:{“seed”: 126, “field”: “id”};
- 返回 0~1 的随机值,可与 weight 配合产生轻微扰动;
- 建议同时设置 seed 与 field,保证多次请求中结果可复现。
4.3 单 Boost Ranker vs 多 Boost Ranker
- 单 Boost Ranker:
- 适合只有一条主规则,比如“提升摘要文档”“打压过旧文档”;
- 直接在
search(..., ranker=ranker)里传入即可。
- 多 Boost Ranker 组合:
boost_mode:单个函数内部如何组合原始分数与其权重(乘法/加法);function_mode:多个 Boost Ranker 之间如何合并(乘法/加法)。当业务有多条规则(例:优先有库存 + 轻微打压低评分 + 增加一点随机探索),可以创建多个
Function,然后通过FunctionScore组合,配置:
五、实战:文档检索中提升“官方”文档权重
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 创建集合与插入示例数据
from pymilvus import ( MilvusClient, DataType, Function, FunctionType, ) # 1. 连接 Milvus client = MilvusClient(uri="http://localhost:19530") collection_name = "milvus_collection" # 如果已存在就先删除,方便反复调试 if collection_name in client.list_collections(): client.drop_collection(collection_name) # 2. 定义 schema schema = 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. 创建 Collection client.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 在 Docker Compose 下的快速部署(官方教程)", "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. 基线搜索(不加 Boost Ranker) 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("=== Baseline search (no Boost Ranker) ===") for hit in 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']}" ) # 7. 定义 Boost Ranker:给 is_official == true 的文档加权 boost_official_ranker = Function( name="boost_official", input_field_names=[], # Boost Ranker 要求必须为空列表 function_type=FunctionType.RERANK, params={ "reranker": "boost", # 指定使用 Boost Ranker "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=== Search with Boost Ranker (official boosted) ===") for hit in boosted_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']}" )查询结果
=== Baseline search (no Boost Ranker) === id=1, score=0.7351, source=official, is_official=True id=4, score=0.7017, source=ticket, is_official=False id=3, score=0.6706, source=community, is_official=False id=2, score=0.6435, source=official, is_official=True === Search with Boost Ranker (official boosted) === id=1, score=0.8821, source=official, is_official=True id=2, score=0.7722, source=official, is_official=True id=4, score=0.7017, source=ticket, is_official=False id=3, score=0.6706, source=community, is_official=False5.4 结果变化背后的逻辑
- 在原始向量相似度差距不大的前提下,is_official == true 的文档更容易出现在前几名;
- 社区 / 工单类文档仍会出现在结果中,只是相对靠后。
- 这正是 Boost Ranker 要解决的问题:把“官方优先”等业务规则叠加到语义检索结果上。
总结
Boost Ranker作为Milvus 2.6的新功能,极大地扩展了向量数据库的灵活性,让搜索不再局限于纯向量相似度,而是能融入业务逻辑,实现更精准的排名。
通过本文的介绍和更真实的实践案例,读者可以快速理解并应用这一功能。在未来,随着AI应用的深化,Boost Ranker将在RAG、推荐和检索系统中发挥更大作用。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。