一句话定义:局部敏感哈希(Locality-Sensitive Hashing, LSH)是一类哈希函数的设计思路——它不追求把数据打散,而是让原本相近的数据以高概率落进同一个桶,让距离很远的数据大概率分开,从而把“找相似”变成“查表”。
原理:故意制造“撞车”
普通哈希(散列表用的那类)追求均匀分散:两个键哪怕只差一个字符,也尽量散到不同桶,冲突是坏事。LSH 反着来:冲突反而是信号,关键是“谁和谁能撞”。
打个比方:要把一屋子人按身高分组。普通哈希相当于按身份证尾号分房间,随机但毫无规律;LSH 相当于随机问几道判断题——“你身高超过 175 吗”“超过 170 吗”。身高接近的人,每道题大概率答得一样,于是被分进同一个房间;身高差很多的人很少全部一致。多问几道、多轮随机提问,同一个房间里的人就是“候选相似集”。
落到向量检索上,常见做法是随机投影(random projection):随机取一个方向,看向量落在它哪一侧,记一个 0 或 1;重复 k 次就得到一个 k 位签名。两个向量夹角越小(AI 词典:余弦相似度">余弦相似度越高),签名完全相同的概率越大。建多张随机哈希表,查询时把查询向量也算出签名,只在对应桶里做精确距离计算——这就是“先召回候选、再精排”的两段式检索。
和相邻概念的区别
LSH 属于近似最近邻(Approximate Nearest Neighbor, ANN)检索的经典路线:它用概率保证召回,不保证一定找到真正的最近邻,是有意放弃一部分召回换速度。
| 对比项 | LSH | 精确最近邻 | 图索引(如 HNSW 类) |
|---|---|---|---|
| 找相似的机制 | 哈希碰撞概率 | 逐个算距离 | 邻居逐跳逼近 |
| 结果 | 大概率相似,可能漏 | 一定准确 | 召回高,可调 |
| 成本 | 多张哈希表,建表快,内存可控 | 高维下代价大 | 图结构占内存,构建慢 |
对从业者与普通人的意义
向量规模到百万、上亿时,逐条算余弦距离不现实。LSH 用极便宜的哈希把候选集缩到千百分之一,再精算,适合以图搜图、相似商品推荐、海量文本去重(如 MinHash 这类变体)等场景。对用户体验来说,代价是偶尔漏掉一两个真正相似的结果——用少量召回换取数量级的速度提升,这就是 LSH 长期存在的原因。桶数、签名长度等参数要按数据分布调,效果以官方文档和自己的实测为准。
