揭秘AI如何衡量语义相似度
本期导读
前文提到“词义相近即向量邻近”,但AI判定“邻近”并非依据直线距离,而是“余弦相似度”——即考察两个向量的夹角。本文将以最直观的方式解析其原理、设计初衷及阈值判断标准。
上篇回顾
前文阐述了向量空间概念——每个词汇在数千维空间中对应一个点,词义相近意味着点距较近,且方向能编码语义关联。然而,“邻近”如何量化?为何选用夹角而非直线距离?本文将揭晓答案。
前文结尾抛出一个疑问:既然词义相近等同于向量邻近,AI究竟采用何种公式来度量这种“邻近度”?
或许你会认为:这还不简单,计算两点间的直线距离即可。但AI却另辟蹊径,采用了一个听起来颇为高深的方法——余弦相似度(Cosine Similarity)。
无需被名称吓退。其核心逻辑一言以蔽之:不关注向量间的距离远近,仅考察其指向方向的一致性。本文将对此进行透彻解析。
▲ 余弦相似度关注夹角,而非直线距离
设想每个向量都是从原点(坐标0,0,0...)射出的箭矢。余弦相似度所做的,便是测量这两支箭之间的夹角:
▸ 两支箭方向几乎一致(夹角趋近0°)→ 相似度趋近1,高度相似
▸ 两支箭互相垂直(夹角90°)→ 相似度为0,毫无关联
▸ 两支箭方向相反(夹角180°)→ 相似度为-1,完全对立
“余弦”一词便由此而来——夹角的余弦值,天然落在 -1 到 1 的区间内,作为“相似度评分”再恰当不过。夹角越小,余弦值越逼近1。
你无需掌握余弦计算,只需铭记这一图景:两支箭矢,夹角小则相似,夹角大则相异。AI判定两段文本语义是否相近,本质上就是在测量这个夹角。
这是最关键且最反直觉的一点。明明直线距离更为简单,为何AI坚持考察夹角?
症结在于“长度”会产生干扰。试看一例:
一个词 vs 一句话
“猫”是一个词,向量相对“短”;“我家养了好几只可爱的小猫咪”是一句话,向量相对“长”。若用直线距离衡量,两者相距甚远,会被判定为“不相似”。然而它们明明在描述同一件事!
为何长度差异如此巨大?因为向量的“长度”往往与文本长短、某些词汇出现的强度相关,而这与“语义”并无直接联系。句子中词汇多,向量自然“长”,但其表达的核心含义可能与那个单词高度一致。
余弦相似度的精妙之处正在于此:它仅关注方向,自动忽略长度差异。“猫”与“小猫咪那句话”虽一短一长、直线距离遥远,但指向方向几乎一致,余弦相似度依然给出高分——正确判定为“语义相近”。
打个比方:判断两人是否“志同道合”,不应看身高悬殊(长度),而应看是否朝同一方向努力(方向)。余弦相似度衡量的正是这种“志同道合”的程度。
▲ 余弦相似度的取值范围为-1到1
余弦相似度的结果是一个介于 -1 到 1 之间的数值,可将其想象为一支“相似度温度计”:
▸ 接近 1:高度相似。如“猫”与“小猫咪”、“如何省钱”与“理财技巧”
▸ 接近 0:毫不相关。如“猫”与“微积分”、“天气”与“股票代码”
▸ 接近 -1:完全相反(在文本Embedding中极少出现,因词向量多落在正向区域)
有个细节值得注意:在实际文本Embedding中,相似度很少为负数。任意两段正常的中文文本,相似度通常落在0到1之间。因此工程实践中,大家更关注的是“0.5还是0.85”的差异,而非正负之分。
工程实践中的经验阈值(仅供参考)
> 0.8:极可能在讲述同一件事,适用于去重、强匹配。0.5~0.8:相关,是语义搜索/RAG最常用的召回区间。< 0.3:基本无关。需注意这些阈值与具体使用的Embedding模型相关,无通用标准,实际需自行测试。
因此,当你听到“这两段文本相似度为0.87”时,你便知晓:这意味着它们的向量夹角很小,AI认为它们在讲述高度接近的内容。
▲ 整句如何合成为句向量
前文皆在探讨“词”的相似度。但标题问的是“两段话”——整句或整段,如何比较?
答案是:先整段文本压缩为一个向量(句向量/段向量),再对这两个句向量计算余弦相似度。如何压缩?常见两种方法:
方法1:取词向量平均值
将“今天天气真好”切分为若干Token,每个Token拥有独立向量,将其相加并取平均(mean pooling),得到一个代表整句的向量。方法简单粗暴,却意外有效。
方法2:使用专用句向量模型
存在专门训练用于生成句向量的模型(如各家的Embedding API、Sentence-BERT类模型)。它们在训练时即以“让相似句子的向量也相似”为目标,效果优于简单平均。这是语义搜索、RAG实际采用的方案。
无论哪种方法,最终都是将“一段话”转化为“一个向量”,随后计算两个句向量间的余弦相似度——这便是AI判断“两段话语义是否相近”的完整链条。
这条链条几乎支撑了所有“查找相似”的应用:你在知识库中搜索问题(RAG)、平台向你推荐相似文章、系统检测重复或洗稿内容,背后皆是“转为句向量→计算余弦相似度→寻找最高分”这三步。
余弦相似度=比方向不比远近
测量两个向量的夹角,夹角小即相似。无需计算,记住“两支箭夹角”这一图景即可
采用夹角旨在忽略长度干扰
一个词与一句话长度差异巨大,直线距离会导致误判。仅看方向,方能正确判定“语义相近”
分数0~1,0.8以上视为高度相似
文本相似度通常介于0~1,极少为负。> 0.8为强匹配,0.5~0.8为相关,阈值需自行测试
整段话先合成句向量再比较
取平均或使用句向量模型将整段压缩为一个向量。语义搜索、RAG、去重均依赖此机制
余弦相似度是AI判定“两段话是否相似”的核心工具。它不关注向量距离远近,仅考察夹角——方向越一致,越相似,分数越趋近1。
之所以选用夹角而非直线距离,是为了摆脱“长度”的干扰:一个词与一整句话长度悬殊,但只要方向一致,余弦相似度依然判定它们语义相近。整段文本则先合成为句向量,再进行两两夹角比较。
“理解语义”这件虚事,至此彻底转化为“计算夹角”这件实事。我们已走完从Token、Embedding、向量空间到相似度的全过程。下一篇将做收尾:将这一整条“从你输入到变为模型可算数字”的流水线,完整串联一遍。
下期预告
输入框中的文本如何转化为模型可计算的数字
收官篇:将切分→编号→向量→进入模型的完整流水线,从头至尾串联一遍。
若获启发,请点“在看”后离开
本文含AI辅助创作内容,作者已审核并对全文负责