Elasticsearch「kNN Retriever」把向量检索装进一条 \_search 管线

1. kNN retriever 是什么?

kNN retriever 是 Retriever 框架中的首阶段召回器,负责对一个向量字段做近邻搜索,返回 Top-K 文档。相比早期的 knn 顶级语法,Retriever 让我们能在一个请求里组合多种策略(如 RRF/Rescorer/Linear/Rule 等),把复杂的检索流程收敛到单次 API 调用

最小示例:

GET /restaurants/_search
{"retriever": {"knn": {"field": "vector",          // dense_vector 且开启 indexing"query_vector": [10, 22, 77],"k": 10,                    // 返回的近邻数量"num_candidates": 10        // 每个分片候选集大小(≥ k)}}
}

2. 必备前提

  • field 必须是 dense_vector 且开启 indexing(支持近似向量检索)。
  • query_vector 维度必须与字段一致;
    或者用 query_vector_builder(由模型在线生成查询向量),二者不可同用
  • 适配 Serverless/Stack 的 Retriever 语法(8.16+ 普遍 GA,细节随版本演进)。

3. 核心参数详解与实战建议

3.1 field(必填)

向量字段名。
建议:为该字段单独配置合适的近似索引(例如 HNSW 的 M/efConstruction),以平衡召回率与延迟。

3.2 query_vector / query_vector_builder(二选一)

  • query_vector:直接传浮点数组或十六进制字节(与字段维度一致)。
  • query_vector_builder:在查询期由模型构建向量(适合服务化 embedding)。

选择指南:

  • 线上 RAG/检索场景通常预先 embed,性能更稳;
  • 想用统一模型推理与多模态输入时,考虑 query_vector_builder

3.3 k(必填)

最终返回的 Top-K。
经验值:终端排序/重排还会继续“洗牌”,k 设得略大于展示位(如展示 10,可取 50~100)更稳。

3.4 num_candidates(必填/有默认)

每分片候选集大小,≥ k(或当未显式 k≥ size),且 ≤ 10000
默认:min(1.5 * k, 10_000)

调优要点

  • 更大num_candidates更高召回更准 Top-K,但延迟与内存占用上升;
  • 多分片时是分片级采样:每个分片都先取 num_candidates,合并后再出全局 Top-K。

3.5 filter(可选:单个或数组)

在向量检索前先用结构化/倒排过滤

  • 限定类目、状态、时间、地理范围等;
  • 只有通过过滤的文档才进入 kNN 候选与排序。

建议:尽量把能过滤的条件都放进来,先减集合后做向量检索,性能与相关性都会更好。

3.6 similarity(可选:浮点)

直接作用于“向量相似度”本体的阈值,不同度量解释不同:

  • l2_norm(欧氏距离):半径阈值,仅返回在“半径=similarity”的超球体内的向量;值越小越严格
  • cosine / dot_product / max_inner_product:只返回相似度 ≥ similarity 的向量;值越大越严格

和最终 _score 的区别:similarity原始向量相似度的门槛;命中后文档还会按 similarity 计分并应用 boost,然后进入 Top-K。

调参技巧

  • 若召回太多噪声,适当提高 cosine/dot_product 的阈值;
  • l2_norm 时注意尺度(embedding 是否归一化)。

4. 进阶:量化向量的重排(rescore_vector

版本:Stack 9.1.0(9.0.0 为 preview)
仅对量化后的 dense_vector 有意义;非量化字段会忽略该项。

动机:量化索引的近似搜索极快,但初始得分可能受量化误差影响。
方案:先用近似索引取候选,再用原始向量更小集合做精排。

配置项:

  • oversample(必填,浮点):对 k 做过采样倍率。工作流:

    1. 按近似索引取 num_candidates
    2. 选出 k * oversample 个候选,用原始向量重算相似度;
    3. 重算后的 Top-K 作为最终结果。

经验值oversample2.0~4.0 常见。过大提升有限但开销明显;建议压测找平衡点。

5. 组合示例

5.1 kNN + 过滤(类目 & 地理)

GET /poi/_search
{"retriever": {"knn": {"field": "embedding","query_vector": [/* 768 dims */],"k": 50,"num_candidates": 500,"filter": [{ "term":  { "category": "restaurant" } },{ "range": { "rating": { "gte": 4.0 } } },{ "geo_distance": { "distance": "5km", "location": { "lat": 37.78, "lon": -122.42 } } }],"similarity": 0.7  // 仅对 cosine/dot_product 有意义;举例值}}
}

5.2 量化向量 + 过采样重排

GET /docs/_search
{"retriever": {"knn": {"field": "emb_q8",            // 量化后的 dense_vector"query_vector": "0A0B0C...",  // 也可用 hex 向量"k": 20,"num_candidates": 400,"rescore_vector": {"oversample": 3.0           // 先取 60 再用原始向量精排出最终 20}}}
}

5.3 与其他 Retriever 组合(示意)

  • 首阶段:knn 召回语义近邻
  • 另一支:standard 倒排匹配(BM25 / multi_match)
  • 融合:rrf / linear
  • 二阶段:rescorer(可接 LTR / 语义 re-ranker)

组合写法见 Retriever 文档,这里不赘述。把 kNN 放进统一管线的收益,就是一次请求完成多路召回与融合。

6. 调优清单(Checklist)

  1. 字段准备dense_vector + 索引参数合理(HNSW 的 M/ef*)。
  2. 维度一致query_vector 与字段维度严格对齐。
  3. 候选规模num_candidates = k 的 10~30 倍起步,根据延迟预算逐步调大。
  4. 过滤优先:能过滤先过滤(类目/状态/时间/地理/安全域),缩小向量检索集合。
  5. 相似度阈:合理用 similarity 做噪声门槛(尤其 cosine/dot_product)。
  6. 量化精排:量化场景开启 rescore_vector,用 oversample 控误差。
  7. 多分片意识:Top-K 是全局合并num_candidates分片级采样。
  8. 观测:记录 took、候选规模、最终 k、命中率与点击/转化,形成离线-在线闭环。

7. 常见报错与排查

  • illegal_argument_exception: dimensions mismatch
    → 检查向量维度;embedding 模型升级后维度变化是高频来源。
  • num_candidates too small / k > num_candidates
    → 调整参数,满足约束(且 ≤ 10000)。
  • 结果偏“飘”(语义不稳)
    → 提高 num_candidates、设置 similarity、或在量化场景开启 rescore_vector
  • 延迟过高
    → 降低 num_candidates、先做更严格 filter、或优化向量索引参数(M/efConstruction)。

8. 小结

  • kNN retriever 把向量近邻召回收敛进统一的检索管线,与倒排、RRF/LTR/Rescorer 等协同非常自然;
  • 三要素:候选规模(num_candidates)过滤(filter)相似度阈(similarity)
  • 量化场景配上 rescore_vector.oversample,在准确度与延迟之间找最优点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93515.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第四天~在CANFD或CAN2.0的ARXML文件中实现Multiplexor多路复用信号实战

【ARXML专题】-解锁CAN信号超能力:Multiplexor多路复用技术深度解析 "当你的CAN帧需要传输100种信号却只有64字节时,就像试图用行李箱装下一整个衣橱——Multiplexor就是你的真空压缩袋" 信号拥堵时代的救世主 现代豪华汽车中,单个ECU可能需处理500+信号,而传统…

JavaScript 基础入门:从零开始学 JS

一、JavaScript 简介JavaScript(简称 JS)是一种高级的、解释型的编程语言,由 Netscape 公司的 Brendan Eich 在 1995 年开发,最初命名为 LiveScript,后因与 Java 的合作关系而改名为 JavaScript。作为 Web 开发的三大核…

pytest中使用loguru的问题及解决

引语 上一篇文章,我们向大家推荐了python语言的一个第三方日志库loguru,使用非常简单且功能完备。 但对于我们做自动化测试,经常使用 pytest 框架的小伙伴来说,却有点小问题。就是 Pytest 内建的日志捕获机制是在标准库 logging 的基础上进行优化过的。 这样我们在使用 p…

Qt异步编程:QFuture与QPromise深度解析

在现代GUI应用中,异步操作是保证界面流畅性的关键。本文将深入探讨Qt框架中强大的异步工具——QFuture和QPromise,揭示它们如何简化多线程编程并提升应用性能。 为什么需要QFuture/QPromise? 在Qt开发中,我们经常面临这样的挑战&a…

基于Python的电影评论数据分析系统 Python+Django+Vue.js

本文项目编号 25008 ,文末自助获取源码 \color{red}{25008,文末自助获取源码} 25008,文末自助获取源码 目录 一、系统介绍1.1 用户功能1.2 管理员功能 二、系统录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状 六、…

数据结构:在二叉搜索树中插入元素(Insert in a BST)

目录 插入的本质是什么? 如何寻找“合法”的位置?—— 模拟查找过程 递归插入(Recursive Insert)—— 优雅的实现 代码逐步完善 总结 上一节我们从第一性原理搞清楚了二叉搜索树(BST)是什么&#xff0…

【论文阅读】美 MBSE 方法发展分析及启示(2024)

文章目录 论文摘要 论文框架 1. MBSE 方法概述 2. 美国防部的 MBSE 方法政策要求 在这里插入图片描述 3. 美军兵种的 MBSE 方法政策要求 4. 启示 5.总结 参考文献 论文摘要 本文梳理了美国防部基于模型的系统工程(MBSE)方法的发展历程,并剖析 其技术原理;跟踪《数字工程战略…

人工智能训练师复习题目实操题1.1.1 - 1.1.5

列出所有的python 库和 apiimport pandas as pd import numpy as np就这两个库pandas 库 - apinumpy 库 - apimatplotlib.pyplot - apipd.read_csv()np.where(condition,x,y)fillna(methodffill,inplaceTrue)methodbfill,pd.read_excel()np返回结果 series 对象 data[A列].valu…

旅游管理实训室:旅游教育实践育人的关键支撑

在中等职业教育旅游服务与管理专业教学中,旅游管理实训室并非简单的教学场所,而是落实专业教学标准、实现 “理实一体化” 育人的核心阵地。它通过模拟真实职业场景、配置专业实训设备、设计实践教学活动,将抽象的专业知识转化为具体的操作技…

http工作流程

HTTP(Hypertext Transfer Protocol,超文本传输协议)是互联网中客户端与服务器之间传输超文本(如HTML、图片、JSON等)的核心协议,基于请求-响应模型和TCP/IP协议族工作。其完整工作流程可拆解为以下9个核心步…

正则表达式实用面试题与代码解析专栏

正则表达式是前端表单验证、字符串匹配的核心工具,简洁高效的正则能大幅提升代码性能。本专栏整理了7道高频面试题,包含核心正则表达式、代码实现及关键知识点解析,帮你快速掌握正则实用技巧。 一、正则基础:核心概念与语法 在学习面试题前,先明确几个高频基础语法,这是…

【数据可视化-89】基孔肯雅热病例数据分析与可视化:Python + pyecharts洞察疫情动态

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

云智智慧停充一体云-allnew全新体验-路内停车源码+路外停车源码+充电桩源码解决方案

采用Java主流的微服务技术栈,基于 Spring Cloud Alibaba 的微服务解决方案进行封装的快速开发平台,包含多种常用开箱即用功能的模块,通用技术组件与服务、微服务治理,具备RBAC功能、网关统一鉴权、Xss防跨站攻击、自动生成前后端代…

利用pypy加速pyxlsbwriter生成xlsb文件

上文介绍了python通过DuckDB和pyxlsbwriter模块生成xlsb文件,因为python是解释执行,它的速度有点慢,pypy是另一种python解释器,它使用即时编译(JIT)技术来提高执行速度。 因为DuckDB与pypy不兼容&#xff0…

【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略

Spring Boot 集成 MyBatis-Plus 全攻略 1. 为什么选择 MyBatis-Plus 零侵入:在 MyBatis 基础上增强,不影响现有功能。内置 CRUD:无需写 XML/SQL,直接调用 BaseMapper 方法。强大插件:分页插件、性能分析、乐观锁、多租…

LangChain 多任务应用开发

Q: LangChain dify coze是竞品关系 都是AI Agent搭建平台,dify和coze 属于低代码,langChain属于高代码,coze优于dify Q:向量数据库是存储向量,做相似度检索的,可以用faiss milvus chromdb Q:使用…

实用技巧:Oracle中精准查看表占用空间大小

目录实用技巧:Oracle中精准查看表占用空间大小一、为什么需要精准统计表空间占用?二、完整查询SQL:覆盖表、LOB、索引三、SQL语句关键逻辑解析1. 基础表:dba_tables 与 dba_tablespaces2. 子查询1:统计表段空间&#x…

openEuler等Linux系统中如何复制移动硬盘的数据

在 openEuler 系统中,提示 “You should mount volume first” ,意思是需要先挂载移动硬盘的分区才能访问: 安装必要软件(针对特殊文件系统) 如果移动硬盘是 NTFS 等非 Linux 原生支持的文件系统格式,需要安装对应的支持软件,以挂载 NTFS 格式移动硬盘为例,需要安装 …

java如何把字符串数字转换成数字类型

在Java中将字符串数字转换为数字类型有多种方法,以下是详细说明和示例代码: 一、基础转换方法 Integer.parseInt() String str "123"; int num Integer.parseInt(str); // 转换为intDouble.parseDouble() String str "3.14"; dou…

WPFC#超市管理系统(6)订单详情、顾客注册、商品销售排行查询和库存提示、LiveChat报表

WPF&C#超市管理系统10. 订单详情10.1 页面布局10.2 功能实现11. 顾客注册12. 商品销售排行查询与库存提示14. LiveChart报表总结10. 订单详情 10.1 页面布局 页面分三行布置,第一行复用OutstorageView界面的第一行,将属性和命令修改为顾客相关第二…