做产品 PMaker 首页
搜索
跟随系统
颜色主题
空格的键盘
把每句话放到一张地图上,找答案就变成了「找最近的邻居」它解决了什么关键词搜索是字面匹配,「退款」「退钱」「不想要了」字面零重合、意思是一回事。向量不看字面看意思,转成坐标后意思相近的靠得近。怎么变成坐标的专门的向量模型把文字变成几百到几千维的数字。坐标从海量文本里训练出来:常出现在相似语境的词句,坐标被拉近。距离算余弦相似度。产品上意味着什么文档先离线切段、逐段算向量入库;文档更新要重算;换向量模型等于全部重算。查询时只给问题算一次向量,然后比距离,很快。几个要知道的限制算的是「像不像」不是「对不对」;对否定不敏感;精确匹配是弱项;长文本会被稀释。

向量把「意思」变成了坐标。有了坐标,「哪段话和这个问题最像」就成了一道可以计算的距离题。

向量与语义相似度

把一句话变成一串坐标,意思相近的靠得近。整套检索都建在这上面。

整套知识库、语义搜索、推荐相关内容,底下都是同一个东西:**把文字变成坐标,然后比距离。**这一节讲清楚这个坐标是怎么回事。

你会遇到的现象:

  • 知识库能答对「怎么退款」,但用户问「我不想要了」它就找不到
  • 工程师说「做个向量库就行」,你不确定这句话覆盖了多少工作
  • 搜索结果看起来都挺相关,但就是没有真正要的那一条

它解决了什么

先看老办法的毛病。传统的关键词搜索是字面匹配:用户搜「退款」,系统去找含有「退款」两个字的文档。

问题是,同一个意思有太多说法。「退款」「退钱」「不想要了」「申请退回」——字面上毫无重合,意思却是一回事。关键词搜索对这些一律抓瞎。

向量解决的就是这件事。它不看字面,看意思。「我不想要了」和「怎么申请退款」在字面上没有一个字重合,但转成坐标之后,两个点靠得很近。

所以语义空间可以理解成一张按意思排布的地图:讲退款的挤在一块,讲物流的挤在另一块,讲天气的在很远的地方。检索就是把用户的问题也放上这张图,然后看谁离它最近。

怎么变成坐标的

负责这件事的是一个专门的模型,叫向量模型(embedding model)。它和你熟悉的文本模型是两类不同的东西:文本模型文字进文字出,向量模型文字进、一串数字出。

这串数字通常有几百到几千个,也就是几百到几千维。图上画成两维只是为了看得见——但「距离近=意思像」这个直觉是对的,几千维空间里也是同一回事。

这些坐标不是人定的,是模型从海量文本里训练出来的:经常出现在相似语境里的词句,坐标就被拉得近。所以它反映的是语料里的用法习惯,不是什么客观真理——这一点后面会成为一个坑。word-embedding-wiki

算距离的方法通常叫余弦相似度,你不需要懂它的数学。只要知道:**它输出一个 0 到 1 之间的数,越大越像。**OpenAI 的向量文档也建议用余弦相似度给检索结果排序。openai-embeddings

好消息是这一层很便宜。向量模型是六类模型里最便宜的,通常比文本模型低一两个数量级。所以「把全部文档向量化」这件事,成本上几乎不是问题。

产品上意味着什么

三件事值得知道。

**一、这是一次性的预处理。**你的文档要先切成小段、逐段算出向量、存进向量数据库。这是离线做的,用户提问时只需要给问题算一次向量,然后比距离——所以查询很快。

**二、文档更新要重新算。**改了一篇文档,对应的向量得重新生成。这件事很容易在项目里被忘掉,结果就是知识库答的还是三个月前的旧内容。更新机制必须在设计阶段就想好。

**三、换向量模型意味着全部重算。**不同向量模型产出的坐标系不通用,混着用等于在两张不同的地图上量距离,结果毫无意义。所以选型要慎重,换一次成本不小。

几个要知道的限制

向量很好用,但它有几个内建的局限,提前知道能少踩不少坑。

**一、它算的是「像不像」,不是「对不对」。**这是最要紧的一条,下一节专门讲。一段和问题很像的文字,未必包含答案;一段能回答问题的文字,未必和问题字面相像。

二、它对否定不敏感。「支持退款」和「不支持退款」在向量空间里往往靠得很近——因为它们的用词几乎一样。这在合规、政策类的知识库里是个真风险。

**三、精确匹配反而是弱项。**订单号、产品型号、法条编号这类东西,向量检索经常不如老式的关键词搜索准。这也是实际系统要混合使用两种检索的原因

**四、长文本会被稀释。**一段很长的文字压成一个坐标,等于把里面所有主题平均了一下,结果哪个主题都不突出。所以切分怎么做,直接决定检索准不准

参考资料

  1. Vector embeddings — OpenAI
  2. Word embedding — Wikipedia