相似性搜索:选择正确的匹配算法 📅 发布时间:2026/9/16 9:10:12 👁 浏览次数: 智能体 A → 总结文档智能体 B → 生成文档字符串智能体 C → 添加到任务板和事件对于身为读者的人类而言, 确切无误的智能体明显是智能体A——接下来所要进行的演练其价值之处在于, 能够明晰每个算法在何种程度上认同这一点, 以及朴素算法有可能在哪些地方出现差错。1. 什么是相似性搜索从一组项目里找出跟给定查询最为“相似”的项目的过程, 被称作相似性搜索, 这一过程是基于模糊逻辑的, 并非要求精确匹配, 它是推荐引擎的支柱, 是语义搜索的支柱, 是记录去重的支柱, 是拼写检查器的支柱, 也是这里智能体/工具路由的支柱。广义上每种相似性搜索技术都归结为两件事表示要进行比较的项目, 把文本转化为标记、字符或者向量。对两个表示的接近程度予以评分, 运用距离度量, 越低意味着越相似, 比如编辑距离, 或者使用相似性分数, 越高意味着越相似, 比如余弦相似性、Dice系数。步骤2有两种主要的算法族本文重点聚焦于词汇/模糊匹配族, 这是一种在您明确不期望LLM或者嵌入模型作验证时所使用的办法, 然而与此同时, 它们也将嵌入的位置涵盖其中, 目的在于能让您清楚晓得究竟何时应当去运用它们。2. 步骤1预处理在任何相似性算法之前在对任意两个字符串展开比较之前, 您差不多一直都期望将它们加以标准化, 比较那种原始的、未曾处理的文本, 往往会由于停用词、大小写或者单词变形, 而在语义相近的短语方面遭受惩罚。使用 spaCy ()典型的预处理管道执行将其应用于我们的运行示例查询我想总结这个文档→ 预处理后这似乎并不是一个完整的句子呀, 请你提供更准确清晰的内容以便我进行改写。智能体 A总结文档→ 预处理后, doc智能体 B生成文档字符串→ 预处理后你的内容似乎不太完整或不太清晰, 可补充完整准确的信息后以便进行改写。智能体 C添加到任务板和事件→ 预处理后注意, 词形还原会把“”规范成“”, 然而它不会把“doc”转变为“”, 它们是两个确实不一样的标记。这是两个全然迥异的标记。这是在真实智能体描述当中常常出现的问题, 也就是缩写、简写的问题, 恰恰是只因如此依靠标记重叠方法并不常常全都足够。词干提取与词形还原的权衡要考虑, 重复标记要移除, 还可进行按词性过滤仅保留名词/动词, 如果描述嘈杂的话, 这种使算法更准确的工作是预处理。3. 步骤2相似性算法3.1 基于标记/集合的算法把文本当作标记聚集, 而非字符排列顺序, 它们速度快、具有可解释性, 且非常适配宛如智能体元数据这般的简短说明。a) -Dice系数通常简称为Dice系数也常常被称作 -Dice 系数, 也就是或者说叫Dice 系数, 它属于相似性的近亲范畴, 不过在对重叠部分这一项加权时手段存在差异, 有不同方式, 是这样的。它衡量两个集合之间的标记重叠将交集加权两次骰子集合A, 集合B等于2乘以集合A与集合B的交集部分元素个数除以集合A中元素个数加上集合B中元素个数。示例 — 对所有三个智能体评分查询查询标记 (Q){want, , }智能体 A 标记{, doc}交集 {} → |Q ∩ A| 1骰子的值等于, 二乘以一的结果, 除以三加二的和, 其结果为五分之二, 也就是零点四零零。智能体 B 标记{, doc, }交集 {} → |Q ∩ B| 0Dice 0.000智能体 C 标记{add, , event}交集 {} → |Q ∩ C| 0Dice 0.000→ 智能体A, 其数值为0.400, 并且存在着不小的差距, Dice已然把正确的智能体同另外两个清晰地划分开来, 这是由于存有一个共享的精确标记。b) 相似性与Dice非常相似但除以并集而不是总和(A, B) |A ∩ B| / |A ∪ B|实际示例相同注册表智能体A, 集合Q与集合A之交集的元素个数等于1, 集合Q与集合A之并集等于包含want以及其他三个空元素的集合其元素个数为4, 由此可推算出结果等于1除以4等于0.250。智能体 B|Q ∩ B| 0 → 0.000智能体 C|Q ∩ C| 0 → 0.000智能体A, 其分值是0.250, 它是 和Dice一样的获胜者, 虽说分数绝对来说更低一点 , 可这也是在预想之中的情况 , 毕竟对于相同集合 情形下其永远是 ≤ Dice这个测量值的。Dice与, 这重要不, 对于排名而言不重要, Dice是重新缩放 , 若只是选最佳匹配 , 两者工作方式一样 , 只有设固定相似性阈值时有分歧 , 对于相同重叠 , Dice分数更高 , 它除以集合大小总和 , 而非并集 , 在实践中 , 是更标准的集合相似性度量 在/LSH中使用 , Dice在NLP/IR文本匹配上下文更常见。3.2 基于字符的编辑距离算法这些算法, 会逐字符去比较字符串, 如此一来, 它们就变得极为适合, 去捕获那些拼写错误, 以及拼写变体, 还有标记重叠方法根本错过的形态相似性。c) Jaro-相似性Jaro用于衡量字符层面的相似性, 会考量匹配字符以及转置情况即Jaro距离, 随后倘若两个字符串拥有公共前缀存在调整, 那么就会提高分数。它格外适用于像是名称这般的短字符串, 或者单字做比较。就每一个智能体而言, 去获取每一个查询标记与此描述标记所构成的搭配里的最优最大分值。于我们的注册表之上切实开展行动, 的的确确去运行。.ity智能体A, 最佳对呈(“”, “”) →这般形式, 其与1.000相关, 并且是缘于精确标记匹配而产生的这般对应关系。智能体B, 最佳对等于, 双引号和空字符串, 与双引号和doc, 得出结果为0.854, 这是由于共享doc前缀。智能体C, 最佳对便是这样, 等于 (event) , 可以得出一个结果 , 这个结果是 0.658。智能体A, 其数值为1.000, 依旧是正确的, 然而请仔细瞧瞧智能体B, 其值为0.854, 就错误的智能体而言这属高分。这存在Jaro - 的前缀加权对您不利之处, 就是“”和“doc”共享完整的前缀, 所以算法把它们评定为极为相似, 即便此处的“doc”更贴近“”的意思, 而非“文档”的意思。仅仅Jaro - 几乎能够将查询导向错误的智能体, 纯粹是出于其对共享前缀的加权方式。之所以建议把基于标记的方法同基于字符的方法进行集成, 原因就在于此, Dice/会把智能体B标记成0.0, 它捕获了Jaro -单独遗漏的那部分。d) 距离编辑距离最少单字符编辑次数, 也就是插入、删除或者替换, 是把一个字符串弄成另一个字符串所需的, 这被称作距离。它属最有名的“编辑距离”度量, 还是众多拼写检查器的根基。(, )要是把编辑距离转变为相似性分数, 这个分数范围是从0到1, 能够用来跟其他算法作比较的话, 那就按照较长字符串的长度来开展标准化操作:你提供的内容似乎不太完整准确, 请你检查一下并补充完整清晰的内容, 以便我能按照要求进行改写。在此操作运行于我们的注册表之上时, 每个智能体的最佳标记对应着匹配会通过。智能体A, 最佳对等于括号内为空字符串与空字符串组成的对, 其距离为0, 相似性为1.000。智能体B, 最佳对等于空字符串与文档, 其距离为5, 相似性是0.375。智能体C, 最佳对等于, 括号内为want和event, 距离是3, 相似性为0.400。请注意, 智能体A (1.000), 不会陷入与Jaro-相同的陷阱: “与” “doc” 在这里只得到0.375, 这是因为直接计算5个缺失字符, 而非像Jaro-的加权那样奖励共享前缀。这是一个有用的具体说明, 它指出两种基于字符的算法不可互换, 它们可能对相同的字符串对持有不同看法。e) 比尔塔普算法, 移位或运算/贝扎-耶茨。Bitap是一种实现, 这种实现是快速的位运算实现而且它可用来查找文本, 在文本里查找是否拥有与模式“近似相等”的子字符串, 它查找时依赖底层的编辑距离。它是算法, 什么算法? 它是Unix agrep背后的算法。有一个情况它表现出色, 什么情况? 当您需要在较长文本中搜索短模式, 在这种短模式里有少量允许错误的情况时, 该情况会让它表现出色。3.3 基于序列/频率的算法f) N-gram相似性不是对整个标记予以比较, 而是把每个字符串拆分成由n个字符或者单词构成的重叠序列, 接着比较这些n - gram的集合, 以及比较其频率。比如说, 关于的三元组, 此时n等于3:总和, 嗯, 混合武术, 三月, 阿里, 里兹, 有…之特性。例如针对比较那两个特定的“”与“”之间的n - gram集合而言, 哪怕是在不存在任何词形还原步骤的情形之下, 它也会展现出共享前缀的那些三元组呈现出高度重叠的状况。3.4, 存在一种基于向量的算法, 存在另一基于嵌入的算法, 被用于上下文, 该上下文, 不是那所谓的LLM验证, 且此算法仍然是基于机器学习的, 是这样的情况。倘若词汇或者模糊方法欠缺足够的准确性, 比如说查询表述为“压缩此文件”, 然而描述却是“总结文档”--二者不存在标记或者字符交叠的情况, 但其表意相同, 这种状况下, 下一层次便是嵌入加上距离度量。这并不需要借助大语言模型来“判断”匹配与否, 而是利用轻量级句子嵌入模型把文本转化成向量, 诸如这般, 接着通过普通的距离度量对这些向量进行排名:针对大型的智能体注册表, 其中包含有数百或者数千个智能体的情况, 精确最近邻搜索会变得迟缓, 所以采用**近似最近邻ANN**这样的方法:4. 手册您应该使用哪种算法您可以将此用作快速决策清单。您是在把短文本跟短文本进行匹配吗像是查询跟智能体描述/标签。从Dice/或者开始在预处理标记上。便宜、速度快、能够解释。您所进行的查询, 或者所给出的描述里面, 存在着可能包蕴着拼写错误、或是缩写、又或者存在拼写变体的情况吗 , 在标记级别之上, 增添或者Jaro那样的形式, 也就是每个标记的最佳匹配形式, 以此来捕获那种纯标记重叠时会被评定为零匹配的近似匹配情况啊。您是否要在篇幅相对长些的文本块当中去检测那些预先知道的短语, 允许存在一定误差不? → 要是语料库规模较为小的情况下 , 那就采用Bitap在线的那种 , 不用进行索引操作 , 要是语料库规模比较大的话 , 那就运用n - gram索引 的方式。难道您的匹配对于那种将人类输入风格之中产生出来的错误也就是相邻字母进行交换的情况是敏感的吗? 另外通过使用 “-” 这种方式而并非普通的方式。是不是您期许着, 哪怕查询与描述意义一样, 在措辞方面也会存在差异呢就像与与give me the gist这样? 词汇/模糊方法就会失败, 您需嵌入加上余弦相似性。您所需的是单个稳健分数而非是选择一种算法吗, 那么集成它。这是一种常见且更为有效的模式, 即计算Dice也就是标记重叠, 加上最佳配对Jaro也就是字符相似性, 之后把它们组合, 比如采用加权平均或者取最大值这种方式, 如此一来您不但能够捕获精确关键字重叠, 而且还能够捕获近似拼写变体。5. 综合应用对整个注册表进行端到端评分查询我想总结这个文档有四个算法, 其中三个算法给予智能体 A 最高分, Jaro -单独进行识别时也正确识别出了智能体 A, 然而其安全裕度小得多, 一边是 1.000, 另一边是 0.854, 这表明它是最不可靠的单一信号, 不能单独运用于这种短描述匹配的路由呢。路由智能体的实用要点是, 不要仅仅只取一种算法原始分数, 要计算至少一个基于标记的分数, 比如Dice/, 还要计算一个基于字符的分数, 像或Jaro-, 把它们进行组合, 例如采用平均值或加权和的方式组合, 并路由到组合分数获胜的智能体, 并且要考虑标记低置信度案例, 也就是前两个智能体之间差距小的情况作为后备, 例如要求用户澄清, 或者仅在那时调用LLM。6. 结束语原文链接相似性搜索选择正确的匹配算法 - 汇智网