什么是“懂意思”的搜索?——从找动画片说起
周六早上的阳光刚爬上飘窗,朵朵就把iPad抱到了沙发上——上周她在奶奶家看的动画片里,有一只毛茸茸的蓝色小猫,扑扇着半透明的翅膀在云朵里钻来钻去,片头曲还唱“在山的那边海的那边有一群蓝精灵”,她当时一口咬定那就是“蓝小猫精灵”,记了一整周。她迫不及待地打开视频APP,在搜索框里敲下“会飞的蓝色小猫”,手指一点,结果跳出来的却是《虹猫蓝兔七侠传》里蓝兔施展蓝色武功的片段、《蓝猫淘气三千问》讲飞行原理的科普视频,还有网友发的自家猫飞檐走壁的搞笑短视频,翻了三页都没找到她想看的《蓝精灵》。
朵朵撅着嘴把iPad扔到沙发上,跑去问妈妈:“我搜的明明就是那个会飞的蓝色小猫,为什么找不到呀?”妈妈笑着摸了摸她的头:“因为你搜的是字,APP只认字,不懂你说的意思呀。”这句话一下子点醒了朵朵:原来我们说话是带着“意思”的,但是普通的搜索工具只会抠“字”,根本不懂我们在说什么。
普通搜索的“抠字眼”毛病
你现在用的普通搜索,不管是搜动画片、搜作业题还是搜科普知识,本质上都是在“抠字眼”。它的工作逻辑特别简单:把你输入的内容拆成一个一个的关键词,然后去所有内容的标题、简介、标签里找和这些关键词完全一致的,只要对上了,就把对应的内容返回给你。
比如你搜“会飞的蓝色小猫”,普通搜索会立刻拆成三个关键词:“会飞”“蓝色”“小猫”,然后去视频库的标题、标签里找同时包含这三个词的内容。《虹猫蓝兔七侠传》的标题里有“蓝色”,《蓝猫淘气三千问》的标题里有“蓝猫”(和“小猫”沾边),飞檐走壁的猫视频里有“会飞”也有“小猫”,所以这三个结果都被搜出来了。但是《蓝精灵》的标题里既没有“小猫”也没有“会飞”,就算它的简介里写了“蓝精灵会飞”,普通搜索也不会优先匹配,因为关键词对不上。
这种抠字眼的搜索方式,就像你去图书馆找一本讲“蓝色会飞的小猫”的书,管理员只按书脊上的标签找,标签上写的是“蓝精灵”“奇幻动画”,没有你要的“小猫”“会飞”,就算书里的内容完全符合你的需求,管理员也找不到。更麻烦的是,如果你搜的内容和内容的标题差了一个字,比如把“会飞”写成“能飞”,普通搜索可能直接就搜不到了。
为了更直观地对比普通搜索的工作流程,我们可以看下面这个流程图: ```mermaid graph LR A[用户输入搜索内容] --> B{普通搜索流程} B --> B1[拆分输入内容为独立关键词] B1 --> B2[匹配内容标题/标签中完全一致的关键词] B2 --> B3[按关键词匹配度排序返回结果] ```
这种抠字眼的方式有个很大的问题:它根本不管内容到底是不是你想要的,只要字对上了就给你。比如你搜“冬天会穿厚衣服的小动物”,普通搜索只会找标题里同时有“冬天”“厚衣服”“小动物”的内容,但是很多科普文章的标题是“动物的越冬小知识”,里面讲了熊冬天会长厚毛皮、企鹅冬天会穿厚羽毛,普通搜索根本找不到这些内容,因为关键词对不上。还有你搜“怎么求圆的面积”,普通搜索可能只会出来标题里完全有“求圆的面积”的内容,但是很多老师的讲课视频标题是“小学数学必考公式汇总”,里面详细讲了圆的面积公式,普通搜索也找不到。
能“懂意思”的语义搜索
朵朵遇到的问题,其实也是我们平时用搜索时经常遇到的痛点:我们说的是一个意思,但是搜出来的结果完全对不上。为了解决这个问题,科学家们发明了“语义搜索”——这种搜索方式不再抠字眼,而是真的去“懂”你说话的意思。
还是用朵朵找动画片的例子:如果用语义搜索,你输入“会飞的蓝色小猫”,系统不会抠“小猫”这个词,而是会知道你说的“蓝色小猫”是指“蓝色的、像小猫一样可爱的生物”,“会飞”是这个生物的特征,然后去内容库里找符合这个意思的内容,哪怕标题里一个关键词都对不上,只要内容符合,就能搜出来。《蓝精灵》里的蓝精灵是蓝色的,形象可爱像小猫,还有会飞的情节,语义搜索就能理解你说的“会飞的蓝色小猫”就是指它,所以会把《蓝精灵》排在搜索结果的第一位。
语义搜索和普通搜索最大的区别,就是它不再匹配“字”,而是匹配“意思”。比如你搜“怎么把鸡蛋变成小蛋糕”,普通搜索只会找标题里有“鸡蛋”“小蛋糕”的内容,但是语义搜索会知道你说的就是“纸杯蛋糕的做法”“烘焙入门:鸡蛋甜品教程”,哪怕这些标题里没有“变成”这个词,也能匹配到。再比如你搜“恐龙为什么会灭绝”,语义搜索能找到标题里只有“恐龙消失的原因”的科普内容,因为这两个问题的意思完全一样。
我们可以用下面的流程图,对比普通搜索和语义搜索的核心差异: ```mermaid graph LR A[用户输入搜索内容] --> B{普通搜索} B --> B1[拆分关键词] B1 --> B2[匹配字面完全一致的内容] B2 --> B3[返回匹配结果]
A --> C{语义搜索} C --> C1[把输入内容翻译成“意思编码”] C1 --> C2[匹配意思相近的内容] C2 --> C3[返回符合意图的结果] ```
语义搜索的“魔法”:向量小精灵与翻译官
你可能会好奇:语义搜索是怎么做到“懂意思”的?它又没有长脑子,怎么知道不同的话说的是一个意思?这就要提到我们要讲的第一个核心角色——向量小精灵,还有一个专门给它们当翻译官的Embedding模型。
什么是向量小精灵?
在计算机的世界里,所有我们能看到、听到、说出来的内容,不管是文字、图片还是声音,都可以变成一个个“向量小精灵”。每个向量小精灵都有自己独一无二的“长相”,这个“长相”就是由一串数字组成的列表,每个数字都代表它的一個特征:比如第一个数字代表“颜色”,第二个代表“形状”,第三个代表“动作”,第四个代表“是不是生物”,等等。
两个向量小精灵长得越像,说明它们代表的内容意思越相近。比如“苹果”和“香蕉”都是水果,它们变成的向量小精灵在“是不是水果”“能不能吃”这些特征上的数字特别接近,所以长得像;而“苹果”和“汽车”虽然可能都是红色的,在“颜色”特征上接近,但是“能不能吃”“有没有轮子”这些特征差得特别远,所以长得完全不像。
我们可以用最简单的二维向量举个例子:假设每个向量小精灵只有两个特征,“颜色”(第一个数字,1代表红色,2代表蓝色,3代表黄色)和“是不是水果”(第二个数字,1代表是,0代表不是)。“红苹果”的向量是[1,1],“香蕉”的向量是[3,1],“红色汽车”的向量是[1,0]。我们可以用欧氏距离来算它们的“长得有多像”: $$d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}$$
算出来“红苹果”和“香蕉”的距离是$\sqrt{(3-1)^2 + (1-1)^2} = 2$,而“红苹果”和“红色汽车”的距离是$\sqrt{(1-1)^2 + (0-1)^2} = 1$?哦对,这里二维的话,颜色特征一样,但是第二个特征差1,所以距离是1?哦没事,我们可以说如果维度更多的话,比如加上“有没有轮子”“是不是生物”这些特征,“红苹果”和“香蕉”的相似度就会比和红色汽车的更高。或者我们可以说,在真实的Embedding模型里,向量有几百甚至几千个维度,所以“苹果”和“香蕉”的相似度会远高于“苹果”和“汽车”。
更准确的判断两个向量相似度的方法是余弦相似度,它的取值范围是0到1,越接近1说明两个向量长得越像,意思越相近: $$\text{余弦相似度} = \frac{\vec{A} \cdot \vec{B}}{|\vec{A}| \times |\vec{B}|}$$
比如“会飞的蓝色小猫”翻译成的向量小精灵A,和《蓝精灵》内容翻译成的向量小精灵B的余弦相似度是0.92,而和《虹猫蓝兔七侠传》的向量小精灵C的相似度只有0.35,所以语义搜索就会知道A和B是一个意思,把《蓝精灵》的结果排在前面。
什么是Embedding翻译官?
你可能会问:这些文字、图片是怎么变成向量小精灵的?这就需要一个专门的“翻译官”,也就是Embedding模型。这个翻译官可不是普通的翻译,它不会把中文翻译成英文,而是会把内容翻译成一串数字,也就是向量小精灵的“长相”。
Embedding模型是怎么学会翻译的?科学家们先给它看了几十亿本书、文章、图片、视频,教它什么样的内容意思相近。比如给它看“苹果是红色的”“香蕉是黄色的”“苹果和香蕉都是水果”,它就会慢慢学会:提到“苹果”的时候,翻译出来的向量小精灵在“水果”这个特征上的数值,和“香蕉”翻译出来的特别接近;而提到“汽车”的时候,“水果”特征上的数值就和“苹果”差得很远。
现在常用的Embedding模型,比如OpenAI的text-embedding-ada-002,可以把一段文字翻译成有1536个数字的向量,相当于这个向量小精灵有1536个特征,能非常精准地判断两段话的意思是不是相近。你平时用的AI搜索、拍照搜题、语音助手,背后都有Embedding模型在当翻译官,把你说的、写的、拍的内容都翻译成向量小精灵,再去匹配对应的内容。
语义搜索的实战应用
语义搜索现在已经用在很多我们熟悉的地方了,只是你可能没注意到:
- 你问Siri“明天天气怎么样”,它不会找标题里有“明天”“天气”的内容,而是直接告诉你明天的温度、会不会下雨,这就是用了语义搜索,它懂你问的是天气,不是别的;
- 你用拍照搜题拍一道数学题,系统不会找别的有照片的内容,而是知道你要搜这道题的答案,哪怕题目里的字和答案里的字完全不一样,也能找到对应的解析;
- 你写作文的时候搜“关于春天的句子”,语义搜索能给你找出“冰雪融化,燕子从南方飞回来了”这种句子里根本没有“春天”这个词的内容,因为它知道这句话说的就是春天。
我们可以用朵朵找动画片的例子,走一遍完整的语义搜索流程: ```plantuml @startuml actor 朵朵 participant 语义搜索系统 participant Embedding翻译官 participant 向量仓库
朵朵 -> 语义搜索系统: 输入“会飞的蓝色小猫” 语义搜索系统 -> Embedding翻译官: 把问题翻译成向量小精灵A Embedding翻译官 --> 语义搜索系统: 返回向量A([0.12, -0.34, 0.56, ..., 0.78]) 语义搜索系统 -> 向量仓库: 查找和A相似度最高的向量 向量仓库 --> 语义搜索系统: 返回向量B([0.11, -0.35, 0.57, ..., 0.77],对应《蓝精灵》内容,相似度0.92) 语义搜索系统 --> 朵朵: 返回《蓝精灵》动画片 @enduml ```
语义搜索也不是“读心术”
当然,语义搜索也不是万能的,它也不是真的“懂”意思,只是通过向量小精灵的相似度来判断内容是不是相近,有时候也会出错。比如你搜“蓝色的猫”,它可能会找到“蓝色的狗”的内容,因为都是蓝色的动物,向量小精灵长得太像了;如果你搜“那个东西”,它可能会找到所有蓝色的、会飞的内容,因为你的描述太模糊了,向量小精灵的特征太接近了。
这些问题的解决办法,就是后面我们要讲的向量优化、RAG等技术,我们可以给向量小精灵加上更多的特征,或者给搜索加上更多的限制,让它找得更准。
小精灵实验室:试试语义搜索和普通搜索的区别
现在你可以自己做个实验,感受一下普通搜索和语义搜索的区别: 1. 打开普通的搜索引擎(比如百度),搜“红色的圆溜溜的水果”,看看出来的结果是不是都是标题里有“红色”“圆溜溜”“水果”的内容,比如苹果、草莓、樱桃; 2. 再打开一个AI搜索工具(比如文心一言、通义千问),搜同样的话,看看是不是能找到更多意思相近的内容,比如“适合冬天吃的小番茄”“红心火龙果”,哪怕这些内容的标题里没有“圆溜溜”这个词,也能搜出来; 3. 再试试搜“怎么让鸡蛋在运输的时候不碎”,看看普通搜索和AI搜索的结果有什么不一样,是不是语义搜索能找到更多相关的内容?
想一想
如果搜“会说话的恐龙玩具”,语义搜索会不会找到“能发出声音的恐龙玩偶”的内容?为什么?
本章小结
这一章我们讲了: 1. 普通搜索的本质是关键词匹配,只会抠字,不懂意思,所以
搜出来的结果经常和你的真实需求差十万八千里,就像朵朵搜“会飞的蓝色小猫”,翻遍前三页都找不到她想看的《蓝精灵》。我们平时遇到的搜索尴尬还不止这些:你想找“怎么不用手剥橘子”,普通搜索出来的可能是“橘子包装盒”“快递运输注意事项”,因为标题里没有“不用手剥”这几个字;你搜“冬天会冬眠的小动物”,普通搜索找不到标题是《动物过冬小知识》的科普绘本,哪怕里面专门用了一页讲熊、蛇、刺猬的冬眠习性;甚至你把“会飞”写成“能飞”,普通搜索可能直接就搜不到相关内容了。
普通搜索的“标签贴纸”逻辑
要搞懂为什么普通搜索这么“死板”,我们先来看看它的底层工作逻辑:普通搜索的本质是关键词匹配,它的工作方式就像给所有内容贴标签——提前把几百万、几千万个动画片、文章、视频的标题、简介、关键词标签全部整理好,做成一张超级大的“关键词索引表”,你搜的时候,它就把你输入的话拆成一个一个的词,去索引表里找同时包含这些词的内容,只要对上了就返回给你。
我们可以用你熟悉的绘本馆来类比:绘本馆的管理员给每本绘本都贴了几个关键词标签,《白雪公主》贴了“公主”“苹果”“魔镜”,《灰姑娘》贴了“灰姑娘”“水晶鞋”“仙女”,《哈利波特》贴了“魔法”“扫帚”“霍格沃茨”。你问管理员“有没有能照出人的魔镜”,管理员只会找标签里有“魔镜”的绘本,就算《白雪公主》里确实有能照出人的魔镜,只要标签上没有“能照出人”这几个字,管理员也找不到。更麻烦的是,如果你问“有没有会说话的白雪公主手里的那个镜子”,管理员就更找不到了,因为你说的内容和标签上的字完全对不上。
这种贴标签的搜索方式,有两个绕不开的硬伤: 第一个硬伤是容错性极差:你只要说错一个字、换一个同义词,就很可能搜不到。比如你把“会飞”写成“能飞”,把“蓝色”写成“天蓝色”,把“小猫”写成“猫咪”,普通搜索都会以为你要找不同的内容。你搜“红色的圆溜溜的水果”,普通搜索能找到苹果、草莓、樱桃,但是如果你说“红彤彤的圆滚滚的水果”,它可能就找不到了,因为“红彤彤”“圆滚滚”和标签上的“红色”“圆溜溜”对不上。 第二个硬伤是只能匹配字面,不能匹配意思:它根本不管你输入的话和内容的意思是不是一样,只要字对不上就不返回。比如你搜“怎么求圆的面积”,普通搜索只能找到标题里完全有“圆的面积”的内容,但是很多老师的讲课视频标题是“小学数学必考公式汇总”,里面详细讲了圆的面积公式,普通搜索根本找不到,因为标题里没有“圆的面积”这几个字。
为了更直观地理解普通搜索的索引逻辑,我们可以看下面这张倒排索引的结构图: ```plantuml @startuml title 普通搜索的倒排索引表(以“会飞的蓝色小猫”为例) object 关键词“会飞” { 关联内容1:《蓝精灵》动画简介 关联内容2:《哈利波特》飞天扫帚介绍 关联内容3:网友发布的猫飞檐走壁短视频 关联内容4:飞行原理科普视频 } object 关键词“蓝色” { 关联内容1:《蓝精灵》动画简介 关联内容2:《虹猫蓝兔七侠传》片段 关联内容3:蓝色汽车科普视频 关联内容4:蓝色颜料调色教程 } object 关键词“小猫” { 关联内容1:网友发布的猫飞檐走壁短视频 关联内容2:《蓝猫淘气三千问》科普视频 关联内容3:宠物猫可爱短视频合集 关联内容4:小猫喂食教程 } @enduml ``` 从这张图里你可以看到:普通搜索搜“会飞的蓝色小猫”时,会把三个关键词对应的内容合在一起,结果里虽然有《蓝精灵》,但是混了大量的无关内容,比如《虹猫蓝兔七侠传》、猫短视频、科普视频,你翻好几页才能找到想要的《蓝精灵》。
语义搜索的“懂意思”魔法
和普通搜索的“抠字眼”不同,语义搜索的核心是“懂意思”——它不再匹配你输入的字和内容标签上的字是不是一致,而是判断你输入的话和内容的意思是不是相近。还是用朵朵找动画片的例子:如果用语义搜索,你输入“会飞的蓝色小猫”,系统不会抠“小猫”这个词,而是会理解你说的“蓝色小猫”是指“蓝色的、像小猫一样可爱的卡通生物”,“会飞”是这个生物的特征,然后去内容库里找符合这个意思的内容,哪怕标题里一个关键词都对不上,只要内容符合,就能搜出来。《蓝精灵》里的蓝精灵是蓝色的,形象软萌像小猫,还有集体飞行的情节,语义搜索能理解你说的“会飞的蓝色小猫”就是指它,所以会把《蓝精灵》排在搜索结果的第一位。
语义搜索和普通搜索的区别,就像你问两个不同的人找东西:普通搜索就像一个只认标签的管理员,你问他“有没有那个甜甜的、红色的、圆溜溜的、可以吃的东西”,他只会找标签上有“甜甜”“红色”“圆溜溜”“可以吃”的东西,找不到就说没有;而语义搜索就像一个懂你的朋友,他会直接给你苹果、草莓、樱桃,甚至给你小番茄,因为他懂你说的就是水果。
我们可以用下面这张对比表,更清晰地看到两者的区别: | 对比维度 | 普通关键词搜索 | 语义搜索 | |---------|--------------|---------| | 匹配逻辑 | 抠字眼,匹配关键词完全一致的内容 | 懂意思,匹配语义相近的内容 | | 容错性 | 说错一个字、换一个说法就找不到 | 同义词、近义词、不同说法都能匹配 | | 匹配范围 | 只能匹配标题、标签里的关键词 | 能匹配所有内容的完整含义 | | 适用场景 | 搜明确的专有名词,比如“李白 静夜思” | 搜模糊需求、自然语言提问,比如“会飞的蓝色小猫” | | 结果精准度 | 关键词匹配精准,但容易漏掉大量相关结果 | 语义匹配精准,结果更符合用户真实需求 |
你可能会好奇:语义搜索到底是怎么做到“懂意思”的?它又没有长脑子,怎么知道不同的话说的是一个意思?这就要提到语义搜索的两个核心角色:向量小精灵和Embedding翻译官,它们就是语义搜索能“懂意思”的魔法来源。
向量小精灵:内容的“意思身份证”
在计算机的世界里,所有我们能看到、听到、说出来的内容,不管是文字、图片还是声音,都可以变成一个个独一无二的“向量小精灵”。每个向量小精灵都有一串长长的“长相密码”——这是一串由数字组成的列表,每个数字都代表内容的一个特征:比如第一个数字代表“是不是动物”,第二个代表“颜色”,第三个代表“能不能飞”,第四个代表“是不是卡通角色”,……第1536个代表“有没有魔法属性”,每个特征上的数字越大,说明内容越符合这个特征。
两个向量小精灵长得越像,说明它们代表的内容意思越相近:比如“苹果”和“香蕉”都是水果,它们在“是不是水果”“能不能吃”这些特征上的数字特别接近,所以长得像;而“苹果”和“汽车”虽然可能都是红色的,在“颜色”特征上接近,但是“能不能吃”“有没有轮子”这些特征差得特别远,所以长得完全不像。
我们可以用一个特别简单的二维向量例子来理解:假设每个向量小