图 1:本文封面,点明主题「向量检索入门:嵌入与相似度」。
先想象一个搜索场景。你在公司文档库里搜「发票弄丢了怎么报销」,关键词搜索一条结果都没有——制度文件里写的其实是「票据遗失后的费用处理」。字面没有一个词对上,意思明明是一回事。关键词匹配卡壳的地方,正是向量检索的入口。
核心结论一句话
向量检索分两步:先用嵌入模型把文本变成一串数字——向量,让语义相近的文本在向量空间里也离得近;检索时把问题同样变成向量,找出距离最近的那些文本。「比相似」取代「对字眼」,最常用的相似性度量是余弦相似度。
原理拆解:三个层次
第一层,嵌入到底是什么。OpenAI 官方文档的定义很直白:embedding 是一个浮点数列表(向量),两个向量之间的距离度量两段文本的相关程度——距离小则相关度高。要注意,向量的单个维度通常没有可读含义,语义是整体编码在几百上千个数字里的:text-embedding-3-small 输出 1536 维,text-embedding-3-large 输出 3072 维,官方还提供了 dimensions 参数允许缩短向量以节省存储。
第二层,相似度怎么算。余弦相似度度量两个向量方向的夹角,取值在 -1 到 1 之间:越接近 1 越相似,接近 0 表示不相关,接近 -1 表示相反。欧氏距离则度量空间里的直线距离。两者该选哪个?OpenAI 的建议是直接选余弦相似度——它的 embedding 已归一化到长度 1,此时余弦相似度退化为一次点积,算得更快,并且与欧氏距离给出的排序完全一致。
第三层,向量从哪来。早期做法如词袋模型、TF-IDF 只统计词频,不理解语义。今天的 embedding 模型建立在 Transformer 之上:2017 年 Vaswani 等人发表的论文提出了完全基于注意力机制的架构,彻底抛弃了循环与卷积。自注意力的关键特性是「词的含义由上下文决定」——「充电」在「给手机充电」和「周末报个班给自己充电」里会得到不同的向量表示,语义差异由此被模型捕捉。
这三层连起来,会推出一个值得记住的结论:embedding 模型的质量决定检索的上限,而且它的向量空间必须在所有文本上保持一致,检索才有意义。所以「用哪个模型编码」不是随手一选,而是整个系统的地基——选型要看它在你实际的语种和业务领域上的表现,而不是只看通用榜单。
图 2:嵌入空间里语义相近的文本聚成簇,余弦相似度量化「有多像」。
实际案例与工具现状
把机制落成系统:文档批量过 embedding 模型,向量写入向量数据库;提问取向量的最近邻(Top-K),把命中文本交给下游使用。向量规模上来以后逐个比对太慢,向量数据库靠近似最近邻(ANN)索引提速——开源的 Milvus 支持 FLAT(暴力比对)、IVF、HNSW、DiskANN、SCANN 等索引类型,部署形态从笔记本里的 Milvus Lite 到 Kubernetes 上的分布式集群都有。另一个值得一提的特性是多语言:OpenAI 称新一代 embedding 模型的多语言表现更强,语义相同的不同语言文本向量也彼此接近,中文提问可以命中英文资料——不少产品的多语言帮助中心正是这么做的。
三个常见误区
误区一:以为向量每一维都有固定含义,这一维是词性、那一维是情感。实际是分布式表示,单个维度不可读,不要逐维解读。
误区二:以为相似度高就等于答案对。语义相近只说明「话题像」,不代表内容正确或没有过时,检索结果仍要核对来源。
误区三:换 embedding 模型不重算旧向量。不同模型的向量空间互不兼容,混着存检索结果会乱成一团,换模型意味着全库重新编码。
给你的行动建议
先手写一遍余弦相似度:两个三维向量,点积除以两个模长的乘积,十分钟算完。再找一个 embedding 服务,把十几段自有文本编码后做 Top-3 检索,故意问几个「意思一样、字眼不同」的问题,观察分数分布。亲手看过相似度分数,检索阈值该怎么定就有体感了。如果 Top-3 里混进明显不相关的段落,先别急着怀疑算法:检查文本是不是太长、是否混入无关的模板文字——长文本的向量往往被稀释得面目模糊,这正是切分环节存在的意义。
你做语义检索时踩过最大的坑是什么——相似度阈值、模型选型,还是文本切分?欢迎分享你的经历。
参考资料
- Attention Is All You Need(Vaswani et al. 2017,arXiv:1706.03762,完全基于注意力机制、抛弃循环与卷积的 Transformer 架构) — https://arxiv.org/abs/1706.03762
- Embeddings(OpenAI 官方文档:embedding 为浮点数向量、距离度量相关度;text-embedding-3-small 1536 维 / text-embedding-3-large 3072 维与 dimensions 参数;建议余弦相似度、归一化后与欧氏距离排序一致;多语言性能提升) — https://platform.openai.com/docs/guides/embeddings
- What is Milvus(Milvus 官方文档:开源向量数据库,Lite/Standalone/Distributed 部署形态,FLAT/IVF/HNSW/DiskANN/SCANN 索引与 ANN 检索) — https://milvus.io/docs/overview.md