Sentence Transformers

Stars

Hugging Face 维护的嵌入、语义检索与重排序框架,统一支持 Sentence Transformer、Cross Encoder、Sparse Encoder 与 Multi-Vector Encoder,并提供量化向量搜索和多种后端集成。

VECTOR SEARCH · BINARY QUANTIZATION

候选越多,排序不该越差

量化重排只有在字节域和向量维度都被准确还原时才有意义;一个最高位翻转或几位 padding,就足以让更多候选带来更差的召回。

SIGNED BINARY · BYTE DOMAIN
PACKED01101101uint8 · 109STORED11101101int8 · −19
BEFOREastype(uint8)237 · MSB FLIPPEDAFTERint16 + 128109 · BITS RESTORED
NON-BYTE-ALIGNED DIMENSIONquery_dim = 10
12345678910PPPPPP
QUERY[10]UNPACKED[16]
unpackbits(...)[..., :query_dim]
RECALL@5 · 200 DOCUMENTS
BEFOREAFTER
×20.480.66
×80.280.98
×400.241.00
MORE CANDIDATES → CORRECT RANKING
排序反转

Signed Byte 被当成原始位串解包

`binary` 量化会把 `np.packbits` 生成的无符号字节减去 128,以 `int8` 存入 Usearch;重排阶段却直接把取回的有符号字节转换为 `uint8`,相当于翻转每个字节的最高位,点积分数和最终排序都会被改写。同时,`packbits` 会把维度补齐到整字节,未裁掉的填充位会让非 8 倍数维度在重排时发生形状不匹配。

表示边界

存储偏移与填充位必须分别还原

Usearch 返回的是索引中真实存储的 `int8`,并不会自动恢复量化前的字节域;解包前必须先在更宽的整数类型中加回 128,避免 NumPy 对 `int8 + 128` 的溢出限制。位解包后还必须以原始查询维度为唯一边界裁剪尾部 padding,否则候选向量与查询不再属于同一向量空间。

重排修复

恢复字节域,再裁回查询维度

在 Usearch 重排路径中先执行 `int8 → int16 → +128 → uint8`,恢复原始 packed bytes,再用 `[..., :query_dim]` 裁掉解包后的尾部填充位。新增真实索引回归,分别验证 signed binary 的排序正确性和非字节对齐维度;合并版本同时把 padding 修复扩展到 FAISS,并为量化 EmbeddingSimilarityEvaluator 补齐浮点转换与精度覆盖。

检索结果

高倍重排 Recall@5 恢复到 1.00

修复前,候选池越大反而越容易得到错误排序:维护者对 200 条语料实测,`rescore_multiplier` 从 2、8 增至 40 时,Recall@5 由 0.48、0.28 降到 0.24;修复后分别恢复为 0.66、0.98 和 1.00,并与暴力点积排序完全一致。非 8 倍数维度也不再因 padding 导致广播错误。