范叶亮写智能体、模型和数据系统时,习惯先把定义和边界钉死。把「最近邻搜索」整理成可落地的中文笔记:问题在哪、默认做法会踩什么坑、该怎么选。原站导航和广告已去掉。
精确搜索
最近邻搜索 (Nearest Neighbor Search)是指在一个确定的距离度量和一个搜索空间内寻找与给定查询项距离最小的元素。更精确地,对于一个包含 $N$ 个元素的集合 $\mathcal{X} = \left\{\mathbf{x}_1, \mathbf{x}_2, \cdots, \mathbf{x}_n\right\}$ ,给定查询项 $\mathbf{q}$ 的最近邻 $NN \left(\mathbf{q}\right) = \arg\min_{\mathbf{x} \in \mathcal{X}} dist \left(\mathbf{q}, \mathbf{x}\right)$ ,其中 $dist \left(\mathbf{q}, \mathbf{x}\right)$ 为 $\mathbf{q}$ 和 $\mathbf{x}$ 之间的距离。由于 维数灾难 ,我们很难在高维欧式空间中以较小的代价找到精确的最近邻。 近似最近邻搜索 (Approximate Nearest Neighb
最简单的最邻近搜索便是遍历整个点集,计算它们和目标点之间的距离,同时记录目前的最近点。这样的算法较为初级,可以为较小规模的点集所用,但是对于点集的尺寸和空间的维数稍大的情况则不适用。对于 $D$ 维的 $N$ 个样本而言,暴力查找方法的复杂度为 $O \left(DN\right)$ 。
暴力查找(Brute-force Search)
k-D 树(k-Dimesion Tree) 1 是一种可以高效处理 $k$ 维空间信息的数据结构。k-D 树具有二叉搜索树的形态,二叉搜索树上的每个结点都对应 $k$ 维空间内的一个点。其每个子树中的点都在一个 $k$ 维的超长方体内,这个超长方体内的所有点也都在这个子树中。k-D 树的构建过程如下:
构建 k-D 树目前最优方法的时间复杂度为 $O \left(n \log n\right)$ 。对于单次查询,当 $2$ 维时,查询时间复杂度最优为 $O \left(\log n\right)$ ,最坏为 $O \left(\sqrt{n}\right)$ ,扩展至 $k$ 维,最坏为 $O \left(n^{1 – \frac{1}{k}}\right)$ 。k-D 树对于低维度最近邻搜索比较好,但当 $k$ 增长到很大时,搜索的效率就变得很低,这也是“维数灾难”的一种体现。
k-D 树
为了解决 k-D 树在高维数据上的问题,Ball 树 2 结构被提了出来。k-D 树是沿着笛卡尔积(坐标轴)方向迭代分割数据,而 Ball 树是通过一系列的超球体分割数据而非超长方体。Ball 树的构建过程如下:
每个点必须只能隶属于一个簇,但不同簇的超球体之间是可以相交的。在利用 Ball 树进行查询时,首先自上而下的找到包含查询点的叶子簇 $\left(c, r\right)$ ,在这个簇中找到距离查询点最近的观测点,这两个点的距离 $d_{upper}$ 即为 最近邻的距离上界 。之后检查该叶子簇的所有兄弟簇是否包含比这个上界更小的观测点,在检查时,如果查询节点距离兄弟簇圆心的距离大于兄弟簇的半径与之前计算的上界 $d_{upper}$ 之和,则这个兄弟节点不可能包含所需要的最近邻。
Ball 树
构建 Ball 树的时间复杂度为 $O \left(n \left(\log n\right)^2\right)$ ,查询时间复杂度为 $O \left(\log \left(n\right)\right)$ 。
基于哈希的算法的目标是将一个高维数据点转换为哈希编码的表示方式,主要包含两类方法: 局部敏感哈希 (Local Sensitive Hash, LSH)和 哈希学习 (Learning to Hash, L2H)。
近似搜索
局部敏感哈希采用的是与数据无关的哈希函数,也就是说整个学习处理过程不依赖于任何的数据内容信息。LSH 通过一个局部敏感哈希函数将相似的数据点以更高的概率映射到相同的哈希编码上去。这样我们在进行查询时就可以先找到查询样本落入那个哈希桶,然后再在这个哈希桶内进行遍历比较就可以找到最近邻了。
其中, $x, y \in \mathbb{R}^n$ 表示 $n$ 维度数据点, $d \left(x, y\right)$ 表示 $x, y$ 之间的距离, $h$ 为哈希函数。满足上述两个条件的哈希函数称为是 $\left(d_1, d_2, p_1, p_2\right)$ 敏感的。
基于哈希的算法
MinHash 算法的思路是:采用一种哈希函数将元素的位置均匀打乱,然后在新顺序下每个集合的第一个元素作为该集合的特征值。我们以 $s_1 = \left\{a, d\right\}$ , $s_2 = \left\{c\right\}$ , $s_3 = \left\{b, d, e\right\}$ , $s_4 = \left\{a, c, d\right\}$ 为例,集合中可能的元素为 $\left\{a, b, c, d, e\right\}$ ,则这四个集合可以表示为:
我们利用每个集合的第一个元素作为该集合的特征值,则有 $h \left(s_1\right) = a$ , $h \left(s_2\right) = c$ , $h \left(s_3\right) = b$ , $h \left(s_4\right) = a$ ,可以看出 $h \left(s_1\right) = h \left(s_4\right)$ 。MinHash 能够保证在哈希函数均匀分布的情况下,哈希值相等的概率等于两个集合的 Jaccard 相似度,即:
值得单独记下的点
- 选择一个维度,将当前超长方体按照这个维度分割为两个超长方体。
- 选择一个切割点,将小于这个点的归入其中一个超长方体(左子树),其余归入另一个超长方体(右子树)。
- 定义所有点的质心为 $c$ ,离质心 $c$ 最远的点为 $c_1$ ,离 $c_1$ 最远的点为 $c_2$ 。
- 将 $c_1$ 和 $c_2$ 作为聚类中心对数据点进行聚类得到两个簇 $\left(c_1, r_1\right), \left(c_2, r_2\right)$ ,将其归入左子树和右子树,其中 $r$ 为超球的半径。
- 如果 $d \left(x, y\right) \leq d_1$ ,则 $Pr \left[h \left(x\right), h \left(y\right)\right] \geq p_1$ 。
- 如果 $d \left(x, y\right) \geq d_2$ ,则 $Pr \left[h \left(x\right), h \left(y\right)\right] \leq p_2$ 。
- 对文本进行特征抽取(例如:分词),并为每个特征赋予一定的权重(例如:词频)。
- 计算加权后的哈希值,当哈希值为 1 时,则对应位置为 $w_i$ ,否则为 $-w_i$ ,其中 $w_i$ 为该特征对应的权重。
落地时建议先做的 5 件事
- 先写清任务能不能被自动验证:能验证的交给系统和评测,不能验证的留给人审。
- 本地部署先算显存、延迟和失败回滚,不要只看能跑通一次。
- 多智能体只在单智能体触到上下文或专业边界时再拆。
- Token、微调和压缩都要有对照数字,避免口号式优化。
- 结论写成可检查清单:接口、超时、评测集、回滚版本。
和智能体产品怎么接
龙虾PRO做 OpenClaw 落地时,最该拿走的是「单智能体先做好工具和提示,再谈编排」。数字员工、技能市场和网关应共用同一套评测与权限,而不是各写一套角色人设。
本文侧重全链路风控方法论。落地时请用自身业务单据做回放验证,不要把示例阈值直接当生产策略。 相关:风控体检 · 方案资源
常见问题 FAQ
什么是AI智能系统?
「AI智能系统」可概括为:最近邻搜索 (Nearest Neighbor Search)是指在一个确定的距离度量和一个搜索空间内寻找与给定查询项距离最小的元素。更精确地,对于一个包含 $N$ 个元素的集合 $\mathcal{X} = \left\{\mathbf{x}_1, \mathbf{x}_2, \cdots, \mathbf{x}_n\right\}$ ,给定查询项 $\m 本文从定义、方法与实践要点展开说明。
为什么要关注AI智能系统?
关注AI智能系统,是因为它直接影响效率、风险与可复制性。文中指出:最近邻搜索 (Nearest Neighbor Search)是指在一个确定的距离度量和一个搜索空间内寻找与给定查询项距离最小的元素。更精确地,对于一个包含 $N$ 个元素的集合 $\mathcal{X} = \left\{\mathbf{x}_1, \mathbf{x}_2, \cdots, \mathbf{x}_n\right\}$ ,给定查询项 $\mathbf{q}$ 的最近邻 $NN \left(\mathbf{q}\right) = \arg\min_{\mathbf{x} …
如何落地AI智能系统?有哪些关键步骤?
建议按以下路径推进AI智能系统:1) 选择一个维度,将当前超长方体按照这个维度分割为两个超长方体。;2) 选择一个切割点,将小于这个点的归入其中一个超长方体(左子树),其余归入另一个超长方体(右子树)。;3) 定义所有点的质心为 $c$ ,离质心 $c$ 最远的点为 $c_1$ ,离 $c_1$ 最远的点为 $c_2$ 。;4) 将 $c_1$ 和 $c_2$ 作为聚类中心对数据点进行聚类得到两个簇 $\left(c_1, r_1\right), \left(c_2, r_2\righ…;5) 如果 $d \left(x, y\right) \leq d_1$ ,则 $Pr \left[h \left(x\right), h \l…
AI智能系统适合哪些人或团队?
AI智能系统更适合:产品/技术负责人、运营与增长团队、需要落地智能体或自动化的中小团队、关注「AI智能系统」方向的读者。若你只需要单次聊天式问答,可先读概念;若要上生产,请重点看步骤、权限与风控相关段落。
关于「精确搜索」,本文给出了什么结论?
在「精确搜索」部分,要点是:n\right\}$ ,给定查询项 $\mathbf{q}$ 的最近邻 $NN \left(\mathbf{q}\right) = \arg\min_{\mathbf{x} \in \mathcal{X}} dist \left(\mathbf{q}, \mathbf{x}\right)$ ,其中 $dist \left(\mathbf{q}, \mathbf{x}\right)$ 为 $\mathbf{q}$ 和 $\mathbf{x
关于「暴力查找(Brute-force Search)」,本文给出了什么结论?
在「暴力查找(Brute-force Search)」部分,要点是:最近邻的距离上界 。之后检查该叶子簇的所有兄弟簇是否包含比这个上界更小的观测点,在检查时,如果查询节点距离兄弟簇圆心的距离大于兄弟簇的半径与之前计算的上界 $d_{upper}$ 之和,则这个兄弟节点不可能包含所需要的最近邻。 Ball 树 构建 Ball 树的时间复杂度为 $O \left(n \left(\log n\right)^2\right)$ ,查询时间复杂度为 $O \left(\log \left(n\right)\ri