基础原理
嵌入(Embedding)是什么?
嵌入把一段文本转换成一个代表其含义的数字向量,这正是按含义而不是按字面表达来搜索或匹配内容得以实现的根本原因。这篇文章说明相似度具体是如何计算出来的,以及为什么用不同模型生成的嵌入不能拿来直接混用或比较。
全部文章 · 最近核实:
用一组数字代替含义
嵌入模型读取一段文本——一个词、一句话、一个段落,有时是整篇文档——然后输出一个固定长度的向量:一份有序的数字列表,通常长达数百甚至数千个元素。这个向量不是人能读懂的摘要;它是模型在训练过程中习得的一个数学空间里的一个位置,其组织方式使含义相关的文本彼此靠近。
靠得近的是相近的含义,而不是相近的写法
两句话几乎没有共同的词,但意思大致相同,也可能产生彼此靠近的向量,因为嵌入模型在训练中学到的是概念之间的关联,而不只是出现了哪些字。反过来,两句话共用很多词但意思不同,最终也可能相距很远。这正是基于嵌入的搜索与精确关键词匹配之间的核心区别。
接近程度是计算出来的,不是凭感觉判断的
一旦文本被表示为向量,比较含义就变成了一个几何问题:在两个向量之间计算出的一个相似度分数,最常见的做法是看它们指向同一方向的程度。在一个大型集合中搜索,意味着在查询向量和每一个已存储的向量之间计算这个分数,然后返回最接近的匹配——不管集合里有一百条还是一亿条记录,都是同一种运算。
不同模型的嵌入不能混用
就像分词器的词表一样,一个嵌入模型的向量空间是该模型及其训练方式所特有的。一个嵌入模型产生的向量,即便维度数与另一个模型产生的向量相同,两者之间的比较也没有实际意义。更换嵌入模型意味着要给已经存储的所有内容重新生成嵌入,而不只是从那以后的新内容。
嵌入模型的工作和语言模型的工作不一样
语言模型根据提示词逐个词元地生成文本。嵌入模型则什么都不生成——它把文本转换成一个向量,到此为止。有些系统对两种任务使用同一个基础模型,有些则使用两个完全独立的模型;不管哪种方式,嵌入步骤输出的向量本身并不是答案,只是供搜索或匹配步骤拿来比较的东西。
这在实践中出现在哪些地方
嵌入正是让检索增强生成成为可能的基础——关于检索如何与语言模型配合,参见《什么是 RAG》——但同样的技术也支撑着支持工单或文档中的语义搜索、匹配相似的历史对话、去除几乎重复的内容,以及在无人手动打标签的情况下把相关条目聚在一起。
常见问题
- 嵌入和词元是一回事吗?
- 不是。词元是语言模型一次读写一个的离散文本单位。嵌入是表示更大一段文本含义的连续向量,由一个不生成任何内容的独立步骤产生。
- 我能比较两个不同模型产生的嵌入吗?
- 没有实际意义。每个嵌入模型在训练时都定义了自己的向量空间,所以在一个模型的空间里意味着“非常相似”的距离,在另一个模型的空间里没有确定的含义,即便两个向量长度相同也是如此。
- 嵌入向量越大就意味着搜索质量越好吗?
- 光凭这一点不行。维度更多可能捕捉到更多细微差别,但质量取决于模型是用什么训练的,以及这与你的内容有多匹配,而不只是取决于维度数量。
- 有人能从嵌入还原出原始文本吗?
- 精确还原通常并不现实,但嵌入终究是直接从你的内容中得出的,在某些攻击手段下仍可能泄露与内容相关的重要信息。对待存储的敏感文本嵌入,应像对待文本本身一样谨慎,而不是把它当作已经匿名化的数据。
与其阅读,不如亲自试试
ClawAI 的记忆和上下文包功能通过 Ollama 在本地生成嵌入,并存入向量数据库用于相似度搜索,而不会为此把你的内容发送到单独的云端嵌入 API。