什么是嵌入?面向开发者的通俗指南
文本和图像如何变成计算机可以按含义比较的向量——语义搜索和RAG的基础。
嵌入是一个数字列表——一个向量——它捕捉一段内容的含义。嵌入模型读取一些文本(或图像、音频)并输出一个固定长度的数字数组,比如768个。关键特性:含义相似的事物获得的向量距离相近,而无关的事物向量相距很远。这个单一思想——将含义转化为几何——正是语义搜索、推荐、聚类和RAG背后的驱动力。本指南从头解释嵌入,无需数学学位。
这是一份概念入门。当你准备实际选择模型时,请参阅最佳本地嵌入模型;关于使用嵌入的搜索技术,请参阅什么是语义搜索。
核心思想:含义即坐标
想象一张地图,其中每个词、句子或文档都是一个点。在这张地图上,“dog”和”puppy”是邻居。“Dog”和”cat”相距稍远但仍属于同一个动物街区。“Dog”和”quarterly tax filing”则在小镇的两端。
嵌入就是地图上一个点的坐标——区别在于地图不是二维的,而是数百个维度。你无法想象768个维度,但数学原理与2D相同:相近的点相似,相远的点不同。嵌入模型的全部任务就是将文本放置在这张地图上,使距离等于含义。
这就是全部技巧。一旦含义变成了坐标,计算机就能做一些它用原始词汇永远无法做到的事:通过测量两点之间的距离来判断两个事物的相似度。
文本如何变成向量
你不用手动计算嵌入——一个经过训练的神经网络会完成。该模型已经阅读了海量文本,并从上下文中学习了哪些单词和短语往往含义相似。(它学会了”the bank of the river”和”I deposited money at the bank”对”bank”的使用不同,并据此放置它们。)
外部来看流程很简单:
- 你给模型一些文本——一个词、一个句子或整段(一个“块”)。
- 模型通过它的层处理该文本。
- 它输出一个固定长度的向量(数字),无论输入有多长(在模型限制内)。
该输出向量就是嵌入。同一个模型始终产生相同长度的向量——该固定长度就是模型的维度数。
图像及其他数据也一样
嵌入并非文本专属。图像模型(如CLIP风格的架构)将图片嵌入到同类向量空间中,因此你可以按含义搜索图片——甚至当文本和图像嵌入到共享空间时,可以用文本搜索图片(“找一些看起来像’雨中的红色自行车’的照片”)。音频、代码及其他数据类型也以相同方式工作。原则从未改变:输入复杂内容,输出含义向量。
维度:那几百个数字的含义
当有人说一个嵌入模型是“768维”或“1536维”时,意思是每个向量都是由那么多数字组成的列表。你会遇到的常见大小:
| 维度 | 典型来源 |
|---|---|
| 384 | 小型、快速的模型(在CPU上表现出色) |
| 768 | 非常常见的折中选择 |
| 1024 | 较大的开源模型 |
| 1536 / 3072 | 某些云端API模型 |
你可能以为每个维度都是一个可读的特征——“维度12 = 这与体育相关的程度”。并非如此。维度是学习得来的,大多无法单独解释。它们是模型自己的内部坐标系。重要的是向量之间的关系,而非任何单个数字。
维度更多并不自动更好。 更高维度的嵌入可以捕捉更多细微差别,但存储和比较的成本更高,且收益递减。一个训练良好的768维模型常常胜过平庸的1536维模型。维度数是模型选择的一个输入,而非质量评分——模型选择的权衡详见最佳本地嵌入模型。
相似度:如何比较两个向量
一旦有了两个嵌入,你需要一种方式来问“它们有多相似?”标准答案是余弦相似度。
余弦相似度测量两个向量之间的角度,而非距离。指向几乎相同方向(小角度)的两个向量非常相似;指向相反方向的向量则是相反的。得分从1.0(方向相同/最大相似度)经过0(不相关)到−1.0(相反)。在实践中,文本嵌入的值大多在0到1之间。
为什么是角度而不是直线距离?因为相比幅度,方向更能稳健地捕捉含义——它关注的是内容关于什么,而不是文本有多长或有多“响亮”。你也会看到使用点积和欧几里得距离;对于归一化的嵌入,它们对结果的排序几乎相同。余弦相似度是你首先会遇到的标准方法。
要点:比较含义变成了两个数字数组之间小小的算术运算。这很快——正是它使得大规模按含义搜索成为可能。
嵌入如何驱动语义搜索
将各个部分组合起来就能得到语义搜索——通过含义而非匹配关键词来找到结果。步骤如下:
- 提前: 嵌入你所有的文档(通常分割成块)并存储向量。
- 查询时: 使用同一个模型嵌入用户的查询。
- 比较: 找到与查询向量余弦相似度最高的存储向量。
- 返回这些最近邻作为结果。
因为比较是基于含义向量的,搜索“how do I reset my password”可以找到标题为“recovering account access”的文档——无需共享关键词。(关于关键词搜索、语义搜索和混合搜索的完整对比,请参阅什么是语义搜索——我们在此不重复。)
有一条规则不可妥协:请用同一个模型嵌入你的文档和查询。 来自两个不同模型的向量存在于不同、不兼容的坐标系中。混用它们会产生无意义的相似度得分。
嵌入如何驱动RAG
检索增强生成(RAG) 是“与你的文档聊天”背后的技术。嵌入是它的检索引擎:
- 你嵌入并存储你的知识库(wiki、PDF、支持工单等内容的块)。
- 当用户提问时,你嵌入问题并拉取最相似的块。
- 你将那些块粘贴到提示词中作为上下文,LLM基于你的内容撰写答案。
没有嵌入,LLM只能从训练中记住的内容来回答。嵌入正是在需要时让它找到并使用你专有知识正确片段的关键。
嵌入的归宿:向量数据库
将一个查询向量与少量文档进行比较很简单。要在毫秒级与数百万文档比较则不然——逐个检查每个向量很快就会变慢。这正是**向量数据库**的工作:它存储嵌入并使用巧妙的索引结构(如HNSW)来近似但快速地找到最近邻。对于小型项目,你可能会将向量保存在文件或简单的库中;超过一定规模,你需要一个真正的向量存储。嵌入是数据;向量数据库是它存放和被搜索的地方。
本地嵌入模型与API嵌入模型
你可以通过两种方式生成嵌入,选择主要关乎隐私和成本:
本地/自托管模型在你的自有硬件上运行(通过Ollama、sentence-transformers等)。文本永远不会离开你的机器,没有按token收费,并且你可以完全离线运行。代价是你需要提供计算资源——尽管许多强大的嵌入模型在CPU上也能很好地运行。这是任何希望掌控自己搜索栈的人的正统路径。
API/云端模型(如OpenAI的text-embedding-3-small)只是快速HTTP调用:无需基础设施,质量稳定,每token非常便宜。缺点是你嵌入的每个块都发送给第三方——这对私有或受监管的数据来说是一个实实在在的顾虑。
一种常见且实用的划分是:将嵌入和文档摄入保留在本地(你的敏感内容所在处),如果希望在前沿模型上执行,则保留云端调用用于最后的答案生成步骤。使用哪个具体的本地模型——以及大小、速度和质量的权衡——正是最佳本地嵌入模型所要讲的。
常见问题
嵌入和向量是同一回事吗? 基本上,在这个上下文中是的。嵌入就是一个向量——一个数字列表。“嵌入”强调该向量是由模型生成的,用于表示含义。“向量”是数字数组的通用术语。
我需要理解数学才能使用嵌入吗? 不需要。心智模型——“含义变成坐标,相近的坐标意味着相似的事物”——足以构建语义搜索和RAG。库和向量数据库会为你处理实际的余弦相似度计算。
我的嵌入应该有多少维度? 这取决于你选择的模型,而不是你可以自由设定的值。开源模型常见值为384、768和1024,某些云端模型可达1536或更多。维度更多并不自动更好——模型质量比原始大小更重要。
我可以比较来自两个不同模型的嵌入吗? 不可以。每个模型有自己的坐标系,因此来自不同模型的向量不可比。始终用同一个模型嵌入你的文档和查询,如果切换模型则重新嵌入所有内容。
嵌入需要GPU吗? 对于中等语料库的嵌入生成,CPU就足够了——尤其是在使用较小模型时。GPU主要用于加速嵌入非常大的数据集或运行大型模型。
嵌入是整个AI搜索栈的静谧基石。接下来,了解它们如何存在于向量数据库中,如何驱动语义搜索,或如何在最佳本地嵌入模型中选择模型。Aquila是您拥有并掌控的AI搜索的独立家园。掌控你自己的搜索。