跳转至

P6-3.3 补充学习:学习近表达与远表达的 embedding 学习

Section ID: P6-3.3 Version: v2026.07.26

在 P6-3.1 中,我们抓住了 embedding 是把 token 和句子转换成向量(vector)的表达方式;在 P6-3.2 中,我们抓住了用距离(distance)和相似度(similarity)阅读这些向量的标准。这里再往前一步,从大图上整理这个向量空间最初是怎样生成的。

这里经常混在一起的是寻找邻近候选的问题和最初学会把什么放近的问题。先要关闭的是后一个问题,也就是表达空间学到了什么样的排列标准。

学习表达空间的标准

  • embedding 学习想把什么放得更近,又想把什么放得更远?
  • word2vec、GloVe、sentence embedding 分别把什么作为代表向量?
  • contrastive learning 给出什么样的学习感觉?
  • 为什么要先把表达质量问题和搜索速度问题分开?

这里先抓住生成好的表达空间的问题。在实践速度下快速缩小邻近候选的问题,以及表达空间在检索系统中怎样连接到存储和 index 的问题,会在后续小节再次展开。

当前焦点 接下来的问题 再次扩展阅读的位置
表达学习 学到了把什么放近? P6-3.3, P6-7.1, P6-8.1
快速候选搜索 在这个表达空间中怎样更快缩小范围? P6-3.4, P6-13.1, P6-13.2

因此,中心问题是embedding 怎样学习,才把相似的东西放近。

区分表达空间学习和快速候选搜索

  • 可以把 embedding 学习说明为生成表达空间的问题。
  • 可以按目的区分代表性 embedding 系列。
  • 可以把 contrastive learning 说明为同时学习应该靠近的东西和应该远离的东西的流程。
  • 可以把表达质量问题和搜索速度问题分成不同层位。

为什么要单独看学习

在 P6-3.2 中能够阅读邻近候选之后,很容易产生一个误解:那不就是先选近的东西就可以了吗?但在那之前,还有一个必须先问的问题。

这个向量空间最初学会把什么放近?

如果同一含义的咨询总是散到不同候选群中,这可能先是表达空间的问题,而不是搜索速度的问题。反过来,如果指向同一个问题场景的句子聚得很好,但响应很慢,那么搜索速度问题才更靠前。

代表 embedding 系列看什么不同

代表系列可以这样阅读。

系列 入门直觉 什么成为代表向量
word2vec 从周围上下文学习词表达 词
GloVe 更直接反映共现统计 词
sentence embedding 把整个句子做成可比较向量 句子、段落

这个区分的核心不是背名称。首先需要的是看想把什么做成一个比较单位。

例如,在 FAQ 检索中,通常把整个句子或段落作为比较单位,比只比较一个词更自然。反过来,说明早期 embedding 直觉时,从词周围上下文开始更容易理解。

contrastive learning 是什么感觉

把 contrastive learning 缩到最短,它会同时问下面两个问题。

  • 哪些成对项目应该变近?
  • 哪些成对项目应该变远?

例如,可以让模型学会:

  • 可以退款吗? 和 怎样取消付款? 靠近
  • 可以退款吗? 和 我想修改配送地址 远离

也就是说,contrastive learning 与其说是背下一个正确句子,不如说更接近学习同一问题场景靠近,不同问题场景远离这种排列感觉。

表达质量问题怎样显现

表达质量问题通常会先出现在下面这些场景中。

先看到的现象 实际上先怀疑什么
同一意图的咨询散到不同候选群中 相似句子是否真的被放得很近
不同问题的句子经常混进同一个候选群 应该远离的句子是否充分分开
一出现特定领域术语,奇怪候选就增加 学习空间是否正确区分那个领域表达

这里重要的是,不要把这些现象笼统说成检索很奇怪。先看空间是否被错误排列,下一步行动才会不同。

案例与示例

案例 1. 同一意图咨询彼此散开时

假设客服中心收到可以退款吗?、怎样取消付款?、我想把钱拿回来这样的句子。没有相同词时,它们很容易看起来像不同咨询。但在实际处理流程中,这三句先聚到同一个候选群中通常更自然。

这个案例支持本节,是因为它说明 embedding 学习的核心不是寻找相同词,而是把指向同一解决流程的表达放得更近。从 contrastive learning 视角看,前面的退款咨询更接近 positive pair,而我想修改配送地址这样的句子更接近 negative pair。

这里要确认的结果是,比起表面词,同一解决流程是否被放到更近的位置。

这个案例最后要关闭的判断不是相同词,而是同一解决流程。退款咨询之间应该变近,地址变更咨询应该变远,所以要先看表达排列质量,再看搜索速度。

案例 2. 领域术语一变,候选突然晃动时

一般咨询中表现不错的检索,一旦出现报销截止日、政策例外、审批路由这样的内部术语,就可能突然晃动。这个场景中首先要越过的误解,是这是因为检索慢,或者 index 太弱。

实际上,学习空间可能还没有充分抓住这些表达在同一领域中应该怎样靠近。例如,审批路由和指定审批线本来是同一业务流程中的相近表达,如果它们被放得很远,那么检索再快,同义候选也不会稳定出现。

这个案例支持本节,是因为它说明 embedding 质量不会停在一般语言感觉上,而取决于模型学会把哪些领域表达彼此放近。

这个案例最后要关闭的判断,是不要把领域表达问题压扁成一般检索失败。先确认同一业务流程中的表达是否真的接近,再把速度改进或 ANN 调整交给下一个问题。

案例 3. 候选仍然错误,但速度变快时

如果更激进地使用 ANN 后速度变快了,但上位候选仍然一直错误,那么问题可能是表达质量,而不是速度。一个更快展示错误候选的系统,只会让用户更快感到失败。

所以这个案例中先要关闭的句子是:

表达空间不稳定时,即使搜索变快,根本问题仍然会留下。

这个案例支持本节,是因为它说明表达空间是怎样学出来的和在那个空间中多快找到候选是不同层位。如果相似句子一开始就被放得很远,ANN 只是更快地搜索那个错误排列。

这个案例最后要关闭的判断,是分开表达质量和搜索速度。候选错误时,先检查排列质量;ANN 改进只有在表达空间足够稳定之后,意义才会变大。

把三个案例重新整理如下。

情况 先要变好的东西 不要混入的误解
同一意图咨询散开 表达空间的排列 词不同,所以就是不同问题
领域术语使结果晃动 领域表达区分 先断定是 index 问题
速度变快但候选错误 表达质量 把速度改进当作质量改进

区分表达空间排列问题

从表达学习视角重新看实践现象,即使还不能直接写训练代码,也可以先像下面这样区分现在先晃动的是不是排列问题。

当前看到的现象 容易先想到的误解 先改问的问题
相似咨询散到不同候选群中 容易觉得是搜索慢或 index 弱 同一意图句子是否真的放在彼此接近的空间中?
完全不同的咨询一起出现在同一候选群中 容易因为上位候选有多个就直接放过 应该远离的句子是否充分分离?
只在特定领域表达上质量急剧下降 容易觉得是例外输入,所以无能为力 学习空间是否单独区分了那个领域表达?

这张表的目的不是让人记住更多算法名称。它是为了避免把一切压成检索很奇怪一句话,而是先短暂问一句:表达空间是不是排列错了?

练习与示例

这个练习的目标,是把应该靠近的成对项目和应该远离的成对项目放在一起,直观看出为什么这是表达学习的核心感觉。在写实际训练代码之前,只要看咨询句子对并判断 positive pair 和 negative pair,也能抓住表达空间的排列标准。

先看下面这些句子。

句子 ID 句子
refund_a 可以退款吗?
refund_b 怎样取消付款?
address 我想修改配送地址

从表达学习视角整理这些句子,可以这样阅读。

成对项目 标签 为什么这样看
refund_a <-> refund_b positive pair 表面词不同,但指向同一个退款解决流程。
refund_a <-> address negative pair 一个是退款问题,另一个是配送地址变更问题。

这个例子中要读的核心不是数字计算。

  • positive pair 应该变得更近。
  • negative pair 应该变得更远。
  • 如果这个排列晃动,即使把搜索延迟降得再低,同一意图句子也很难聚到一个候选群中。

读完示例后,先回答下面的问题。每个问题先自己回答,再和右侧解说比较。

问题 解说
为什么 refund_a 和 refund_b 是 positive pair? 两个句子的表面词不同,但指向同一个退款解决流程。从表达学习视角看,同一意图句子应该放近,所以把它们作为 positive pair。
为什么 refund_a 和 address 是 negative pair? 一个是退款问题,另一个是配送地址变更问题。如果它们混进同一个候选群,检索质量会晃动,所以把它们作为应该远离的成对项目。
这个例子中还不确认什么? 不确认实际 ANN 速度或 index 结构。中心不是怎样快速找到,而是学到了把什么放近。

练习 1. 判断 positive 和 negative 成对项目

观察值:

句子 ID 句子
billing_a 我想确认这个月的付款明细
billing_b 请告诉我这笔账单金额从哪里来的
login_a 我忘记密码了
refund_a 可以退款吗?

先自己回答。

  • billing_a 最应该靠近的 positive pair 候选是什么?
  • billing_a 应该远离的 negative pair 候选是什么?
  • 这个判断是搜索速度问题,还是表达空间排列问题?

解说:billing_a 最应该靠近的候选是 billing_b。二者分别指向付款明细和账单金额,属于同一个费用确认流程。login_a 和 refund_a 分别是登录问题和退款问题,所以是应该远离 billing_a 的 negative pair 候选。这个判断不是搜索速度问题,而是要学会把哪些句子放在同一空间中靠近的问题。

练习 2. 找出错误的学习信号

观察值:

学习成对项目 当前标签
可以退款吗? <-> 怎样取消付款? negative
我忘记密码了 <-> 无法登录 positive
可以退款吗? <-> 我想修改配送地址 positive

先自己回答。

  • 哪些成对项目的标签错了?
  • 错误标签会在表达空间中制造什么问题?
  • 为什么这个问题不能靠搜索速度调优解决?

解说:第一组成对项目属于同一个退款解决流程,所以不是 negative,而更接近 positive。第三组成对项目分别是退款和配送地址变更,所以不是 positive,而更接近 negative。如果这些标签错误进入学习,应该靠近的句子会变远,应该远离的句子会混进同一个候选群。这个问题是表达空间的排列信号错了,所以提高搜索速度也只是更快找到被错误排列的候选。

练习 3. 区分表达质量和搜索速度

观察值:

现象 先怀疑的层位
同一意图咨询散到不同候选群中 ?
候选质量很好,但响应时间太长 ?
只要咨询中出现领域术语,错误候选就变多 ?

先自己回答。

  • 每个现象是表达质量问题,还是搜索速度问题?
  • 为什么混淆两个层位会让行动偏掉?

解说:同一意图咨询散开的现象是表达质量问题。候选质量好但响应时间长的现象更接近搜索速度问题。只在领域术语中错误候选增加的现象,是领域表达排列不足造成的表达质量问题。混淆两个层位时,行动会偏掉:表达空间不稳定却只调 index,或者候选质量好只是慢,却误解成学习问题。

因此,本节最后的判断很简单。候选错误时,先确认表达空间是否真的把相似句子放近;只有候选质量好但慢时,才把问题转到搜索速度。

检查清单

  • 能否把 embedding 学习说明为生成好的表达空间的问题?
  • 能否按什么成为代表向量区分 word2vec、GloVe、sentence embedding?
  • 能否把 contrastive learning 说明为同时学习应该靠近的东西和应该远离的东西的流程?
  • 能否先分开阅读表达质量问题和搜索速度问题?

来源与参考资料