Elasticsearch 9.3 增加 bfloat16 向量 支持

作者:Simon Cooper

探索新的 Elasticsearch element_type: bfloat16,可以将你的向量数据存储减半。

从向量搜索到强大的 REST APIs, Elasticsearch 为开发者提供了最全面的搜索工具包。深入探索 Elasticsearch Labs repo 中的示例 notebooks,尝试一些新的东西。你也可以现在就开始你的 free trial,或者在本地运行 Elasticsearch。


Elasticsearch 9.3 带来了多项针对向量数据的重要改进,包括一个新的 element_type: bfloat16。这有可能将你的向量数据存储减半,并且在大多数使用场景下,对召回率和运行时性能的影响都非常小。

Dense_vector 字段中的存储格式

在 9.3 之前, dense_vector 字段支持单比特向量、 1-byte 整数以及 4-byte 浮点数。我们在用于索引的任何量化和/或分层可导航小世界( HNSW )图之上存储原始向量,而原始向量占据了向量索引所需磁盘空间的绝大部分。如果你的向量是浮点数,那么在 9.3 之前的 Elasticsearch 版本中,唯一的选择是每个向量值存储 4 bytes:对于一个 1024 维向量来说,就是 4kB。

当然,还有其他可用的浮点大小: IEEE-754 规定了多种不同长度的浮点格式,包括 Java 的 float 和 double 类型所使用的 4-byte float32 和 8-byte float64。它还定义了一种 float16 格式,每个值只使用 2 bytes。然而,它的最大值只有 65,504,相比之下 4-byte float32 的最大值是 3.4x10^38,并且在两者之间进行转换需要多次算术运算。

作为一种替代方案,许多机器学习(machine learning - ML)应用现在使用 bfloat16,它是对 IEEE-754 float32 的一种修改,只使用 2 bytes。它通过丢弃数值小数部分的最低 2 bytes 来实现,从而保留符号位和指数位不变。这在不相应降低取值范围的情况下,有效降低了浮点值的精度。从 float32 转换为 bfloat16 只是对 float32 值进行一次简单的按位截断,并通过少量处理来实现正确的舍入。
Source: Wikipedia

Elasticsearch 9.3 中的 bfloat16

Elasticsearch 9.3 现在支持将向量元素类型存储为 bfloat16。在内存中,它仍然会将每个向量值处理为 4-byte 的 float32,因为 Java 并没有内置对 bfloat16 的支持。当将向量数据写入磁盘时,它会简单地将每个 float32 值截断并舍入为 2-byte 的 bfloat16,并在将值读入内存时把每个 bfloat16 值零扩展回 float32。

这实际上将你的向量索引大小减半,因为每个值使用 2 bytes 而不是 4 bytes。在读取和写入数据时, Elasticsearch 在执行必要的转换过程中可能会有一些小的性能开销,但这通常会被 I/O 需求的大幅减少所抵消,因为 OS 现在只需要读取一半的数据。而且对于大多数数据集来说,对搜索召回率的影响是最小的。

作为一个示例,这是在我们的 dense_vector 数据集上使用 bfloat16 时的大小差异:

所以,如果你的输入向量已经是 bfloat16 精度,那就太好了! Elasticsearch 接受以 float 值形式以及 Base64 编码向量形式提供的原始 bfloat16 向量。这些向量会以与你原始源数据相同的精度持久化到磁盘,从而立即将你的数据存储需求减半。

如果你的输入向量是 4-byte 精度,你同样可以使用 bfloat16 格式来将索引数据大小减半。 Elasticsearch 会将每个值截断并舍入为 2-byte 精度,丢弃小数部分中最低有效的比特。这意味着你从 Elasticsearch 取回的向量值将不会与最初索引时的值完全相同,因此如果你需要保持 float32 的完整 4-byte 精度,就不要使用 bfloat16。

从 Elasticsearch 9.3 开始,以及在 Elasticsearch Serverless 上,你可以在任何新创建的索引中,为所有 dense_vector 索引类型指定 element_type: bfloat16。如果你希望在现有索引中使用 bfloat16,可以重新索引到一个 element_type: bfloat16 的索引中, Elasticsearch 会自动将你现有的 float 向量转换为 bfloat16。

原文:https://www.elastic.co/search-labs/blog/bfloat16-vector-support-elasticsearch

相关推荐
MimCyan6 小时前
面向开发者的 LLM 入门课程(个人笔记记录-2026.03.30)
笔记·ai
Slow菜鸟6 小时前
AI学习篇(三) | AI效率工具指南(2026年)
人工智能·学习
数据库小组6 小时前
2026 年,MySQL 到 SelectDB 同步为何更关注实时、可观测与可校验?
数据库·mysql·数据库管理工具·数据同步·ninedata·selectdb·迁移工具
华科易迅6 小时前
MybatisPlus增删改查操作
android·java·数据库
北京软秦科技有限公司6 小时前
AI审核如何助力合规取证?IACheck打造环境检测报告电子存证与法律风险防控新路径
大数据·人工智能
Kethy__6 小时前
计算机中级-数据库系统工程师-计算机体系结构与存储系统
大数据·数据库·数据库系统工程师·计算机中级
SHoM SSER6 小时前
MySQL 数据库连接池爆满问题排查与解决
android·数据库·mysql
蜘蛛侠..7 小时前
Skills 和 Prompt、MCP、Function Calling 有什么区别?
ai·prompt·agent·skill·functioncalling·mcp·skills
qq_359716237 小时前
openpi使用过程中相关问题
人工智能·深度学习·机器学习
熬夜的咕噜猫7 小时前
MySQL备份与恢复
数据库·oracle