AI:向量搜索
AI:向量搜索按表中向量列与查询向量的接近程度对行进行排序,并将最近的行连同据以排序的距离写入目标表。可以提供多个查询向量,每个查询向量都会得到各自的一组匹配项,全部在对源表的一次扫描中完成,并写入同一个输出表。
搜索是精确的。通过步骤筛选器的每一行都会与每个查询向量进行比较,因此匹配项是真正最近的行,而不是近似结果——工作量会随扫描的行数乘以查询向量数而增长。没有需要构建、调优或回退使用的向量索引。
- 要搜索的表——搜索其存储向量的表。
- 目标表——写入匹配项的表。
- 向量列——要搜索的表上用于测量距离的向量列。 任何其他数据类型都会被拒绝,并指明该列及其实际持有的类型。
- 距离度量——余弦或欧氏(L2)。余弦度量两个向量之间的夹角,忽略其大小,这正是文本嵌入所需要的;欧氏度量直线距离,并考虑大小。对两者而言,距离越小,行越近。默认为余弦。
- 每个查询的匹配数——为每个查询向量保留多少个最近的行。默认为 10。
查询向量选项卡接受一个 JSON 数组,每个查询一项,每项包含 id 和 vector:
[ {"id": "q1", "vector": [0.1, 0.2, 0.3]}, {"id": "q2", "vector": [0.4, 0.5, 0.6]}]每个查询都会返回各自的一组匹配项,输出中以 id 来标识它们。id 必须唯一,每个值必须是有限数,并且每个查询向量包含的值个数必须与存储向量相同——只有宽度相等的向量之间才能定义距离。不匹配时会被拒绝,并指明查询、其包含的值个数,以及该列实际持有或声明的宽度。
选择数据子集
Section titled “选择数据子集”筛选器限制哪些行可作为候选。行在排名之前被筛选,因此匹配项是通过筛选器的行中最近的行,而不是总体最近、事后再筛选的行。这是控制步骤工作量的主要手段;参见搜索规模估算。
每个匹配项写为一行,包含您在表数据选择选项卡上选择的列,外加两个名称可自行控制的计算列:
- 查询名称列——该行所对应查询向量的 id。默认为
query_id。 - 距离列——匹配项与该查询向量之间测得的距离。默认为
distance。它也是排名键。
输出中查询名称在最前,接着是您选择的列,距离在最后。输出列名必须唯一。
无法测量距离的行会从匹配项中排除,而不是被当作最近的行返回。您会遇到的情况是:向量的大小溢出了 32 位浮点数的范围——这样的向量得不到可测量的距离,而且由于没有任何机制能把无法测量的距离排在最后,纳入这样的行会让搜索最不了解的行出现在每个结果的最前面。
开启诊断模式运行工作流即可查看计数。工作流日志随后会报告每个查询排除了多少行,或说明步骤测量了其搜索的每一行。获取该计数需要对表再扫描一遍,因此只在您要求时才会产生这一开销;关闭诊断模式时,日志会说明无法测量的行是有意排除的,并提示您使用诊断模式查看数量。
数组内部含有缺失值的存储向量则是另一回事:对任何含有缺失值的数组都无法测量距离,因此搜索会被直接拒绝并指明该列,而不是悄悄返回部分结果。请更正或删除这些行后重新运行。
搜索规模估算
Section titled “搜索规模估算”一次运行的成本是候选行数乘以查询向量数,如果总数超过一百亿次距离测量,步骤会拒绝该搜索——并报告行数、查询数和上限——而不是开始无法完成的工作。有两点可使搜索远低于该上限:
- 筛选出重要的那一部分。 将候选缩小到某个实体、某个期间或某个文档集,而不是扫描整个语料库来回答只涉及其中一部分的问题。
- 按您始终用于筛选的维度拆分表,并搜索相关的表。减少候选数量比这里提供的任何其他做法都有效得多。
在该列上声明向量宽度也有帮助:声明之后,步骤直接从声明中获取宽度,而不是抽样一行来确定。参见向量数据类型。
向量列不能用于什么
Section titled “向量列不能用于什么”向量列不能用作联接键、分组列和聚合目标——在此步骤和所有其他步骤中都是如此。无论是保存步骤时,还是运行以前保存的步骤时,消息都会指明该列及其被用于的角色。请改为使用向量旁边的业务键进行联接和分组。将向量作为普通输出列传过某个步骤是可以的,统计行数和统计非重复值数量也可以。
- 向量数据类型——声明向量列、设置其宽度,并将嵌入加载到其中
- Spatial Find Nearest 步骤——针对几何而非嵌入的同一种最近邻形式
- Table Lookup 步骤——将描述性列带回匹配的行
- 导入 Parquet——从 Parquet 文件加载嵌入