本期摘要
上一篇说"词义相近=向量挨得近",但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辅助创作内容,作者已审核并对全文负责
夜雨聆风