从文本到向量:理解Embedding
作者:程序员马丁
热门项目实战社群,收获国内众多知名公司面试青睐,近千名同学面试成功!助力你在校招或社招上拿个offer。
上一节我们聊了元数据管理——怎么给每个 chunk 贴上标签,让它从“一段裸文本”变成“一段带上下文的文本”。到这一步,每个 chunk 都带着来源、权限、位置等信息了,看起来已经很完整。
但有个根本问题还没解决:这些文本还是人类语言,计算机看不懂。
你让计算机去比较“七天无理由退货”和“买了一周的东西还能退吗”这两句话,它只会逐字比对,发现没几个字是一样的,然后告诉你不相关。可任何一个正常人都知道,这两句话说的是同一件事。
怎么让计算机也能理解这种语义上的相似性?答案是把文本转成一组数字——向量(Vector)。这个转换过程,就叫向量化(Embedding)。
关键词检索的困境:为什么文本匹配不够用
在讲向量化之前,咱们先看看不用向量化的传统检索方式有什么问题。这样你才能理解,为什么 RAG 系统非要多这么一步。
1. 场景:电商客服知识库的检索难题
还是用前两篇的电商客服知识库场景。假设知识库里有这么一条规则:
自签收之日起 7 天内,商品未经使用且不影响二次销售的,消费者可申请七天无理由退货。
现在用户问了一句:“买了一周的东西还能退吗?”
如果用传统的关键词检索(比如 Elasticsearch 的全文搜索),系统会把用户的问题拆成关键词:“买”“一周”“东西”“退”,然后去知识库里找包含这些词的文本块。
结果呢?知识库里那条规则用的是 “七天”“签收”“无理由退货”这些词,和用户问题里的“一周”“东西”“退”几乎没有重叠。关键词检索大概率找不到这条规则,或者把它排在很后面。
但这两句话明明说的是同一件事。
2. 关键词匹配的三个致命问题
上面这个例子暴露的其实是关键词检索的通病,归纳起来有三个:
2.1 同义词问题
“一周”和“七天”是同一个意思,“退”和“退货”是同一个动作,但关键词检索不知道。它只做字面匹配,不理解语义。
再举几个例子:
| 用户的说法 | 知识库的写法 | 关键词能匹配吗 |
|---|---|---|
| 手机坏了怎么修 | 设备故障维修流程 | 不能,“手机”≠“设备”,“坏了”≠“故障” |
| 怎么把钱要回来 | 退款申请流程 | 不能,“把钱要回来”≠“退款” |
| 快递到哪了 | 物流状态查询 | 不能,“快递”≠“物流”,“到哪了”≠“状态查询” |
这些都是日常对话中很自然的表达,但关键词检索全部抓瞎。
2.2 一词多义问题
同一个词 在不同语境下意思完全不同。
用户问“苹果的售后政策是什么”——这里的“苹果”是指 Apple 品牌,还是指水果?关键词检索不知道,它会把所有包含“苹果”的文本块都返回,水果类目的退货政策和 Apple 产品的保修政策混在一起。
再比如“充值”这个词,在游戏场景是充游戏币,在话费场景是充话费,在会员场景是充会员余额。关键词检索没法区分。
2.3 上下文理解问题
有些问题需要理解整句话的意思,而不是拆成单个关键词。
用户问:“我不想要了,但已经拆了包装。”
关键词检索拆出来的是“不想要”“拆了”“包装”,可能匹配到“包装材料说明”或者“拆箱指南”这种完全不相关的内容。但实际上用户想问的是“拆封商品能不能退货”。
3. 我们需要的是“语义检索”而不是“文本匹配”
上面三个问题的根源是一样的:关键词检索只看字面,不看含义。
咱们真正需要的是一种能理解语义的检索方式——不管用户怎么表达,只要意思相近,就能匹配上。“一周”和“七天”意思一样,就应该匹配上;“苹果手机”和“水果苹果”意思不同,就不应该混在一起。
这种基于语义的检索,就是 RAG 系统的核心能力 。而要实现语义检索,第一步就是把文本转成一种计算机能比较语义的格式——向量。
向量:让计算机理解语义的方式
向量这个词听起来有点数学味,但别被吓到,核心思想其实很直觉。
1. 什么是向量——用坐标来表示含义
打个比方。假设我们用一个二维坐标系来表示词语的含义,横轴代表“和购物相关的程度”,纵轴代表“和售后相关的程度”:
售后相关 ↑
|
1.0 | ● 退货(0.3, 0.9)
| ● 退款(0.2, 0.85)
0.8 |
|
0.6 |
| ● 换货(0.5, 0.7)
0.4 |
| ● 物流配送(0.6, 0.2)
0.2 |
| ● 加入购物车(0.8, 0.1)
0.0 +-----|-----|-----|-----|---→ 购物相关
0 0.2 0.4 0.6 0.8 1.0
在这个坐标系里:
- “退货”的坐标是 (0.3, 0.9),“退款”的坐标是 (0.2, 0.85)——两个点离得很近,因为它们语义相近
- “退货”和“加入购物车”的坐标差得很远——语义确实不相关
- “换货”在中间偏上的位置——它既和购物有关,也和售后有关
每个词语在坐标系里的位置,就是它的向量。向量本质上就是一组数字(坐标值),用来表示这个词语的含义。
两个词语的含义越接近,它们的向量(坐标)就越接近。这就是向量表示语义的基本原理。