语言模型之text embedding(实战篇)

向量数据库大模型机器学习

提纲

1 简介

2 背景‍‍

3 基底模型选择

4 使用方式

5 训练方式‍

6 讨论 ‍ ‍

1 简介‍‍‍‍‍‍

在前面2年时间里介绍过数十种text embedding模型,虽然不同模型在MTEB这类benchmark上表现不尽相同,但是在实际使用过程,该选用哪个基底模型以及 选择哪种使用方式等问题还是值得进一步思考的。作为一个相对资深的实践者,在这里分享下一些基本使用经验。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

picture.image

2 背景

按照我的理解,我会把text embedding按照时间顺序分为以下几种类型,首先是在Bert之前的模型,主要是word2vec这种类型的模型,紧接是在Bert系列模型,典型代表是sentence bert跟simcse,然后是近几年才发展的统一句向量模型,包括sentence T5,GTR,Instructor等一系列模型,最后是这一两年里成功应用大模型到text embedding任务的decoder-only模型(目前MTEB榜单排名靠前的基本都属于这种)。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

picture.image

‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍

3 基底模型选择

 **语言限制** 目前大部分模型都是支持英语的,如果只需要支持中文场景的优先选择国内发布的中文模型,如果是要支持某些小语种或者需要支持多个语言的就选择多语言模型。尤其是在当下阶段,很多text embedding模型的基底都是LLM,天然就是支持多种语言,给这个任务带来了极大的好处。‍‍‍‍‍‍‍‍‍‍‍‍‍‍

任务类型限制 主要分为对称类(相似相似度任务相关)跟非对称类(检索任务相关),对称类的话可以选用的模型就很多了,早些年的word2vec,或者开启AI潮流的Bert,或者近些年的统一句向量模型,或者当下火热的大模型都可以考虑。但如果是非对称类的,建议还是选择后两者。

  **文本长度限制** Bert系列的最大文本长度基本都是512,近些年的统一句向量模型基本都是768或者1024,当下火热的大模型所能支持的文本长度基本在几K以上。千万不要轻易以为通过分块,把多个块的句向量聚合起来就能表征原始文本的完全信息。  





  **模型规模限制** 需要考虑到成本跟性能,更大规模的模型一般意味着更优的性能以及更佳高昂的成本,所以受限于各种现实条件,合适的就是最好的。在实验阶段可以选择更大规模的模型,一方面可以作为理想的天花板指标,另一方面可以通过蒸馏等方式增强小模型的能力。

4 使用方式‍‍‍‍‍‍‍‍

word2vec跟bert系列的模型,一般都需要做进一步微调才能适配实际的场景跟任务,除非任务很简单或者跟训练任务基本一致。




统一句向量大模型或者LLM,一般泛化能力比较强大,能满足大部分任务跟场景的要求,可以开箱即用。当然也可以做进一步finetune,finetune的成本一般会比较高,对于语料有比较高的要求。这种finetune一般是为了更加适配特定的任务跟场景,想让模型过拟合到某个小的领域里去,对于模型本身的泛化能力是有可能造成损害的。




另外需要注意的是,不同模型之间训练方式的差异导致本对应的用法是有区别的,使用之前主要看下说明,同一份代码换个model\_name可能是能跑通的,但是效果可能是有问题的,例如instruction的设置,pooling方式或者注意力机制的选择等等。  

5 训练方式‍‍‍‍‍‍‍‍

虽然我们前面介绍的各种模型都是预训练+SFT后得到的,但是普通玩家在实际使用中基本不会考虑从零开始做预训练的,ROI太低了。基本上只会采用对比学习做进一步的SFT,这个过程也有很多技巧,可以参考大佬们发布的各种指南[SFR-Embedding-Mistral: 都来看看吧,大佬们把炼丹秘籍都坦白了。](http://mp.weixin.qq.com/s?__biz=Mzk0NzMwNjU5Nw==&mid=2247485267&idx=1&sn=1b7ea2cee80e7659482b28a7ba7ec0fb&chksm=c379ae59f40e274f82df28b3226b43efe1e31beb9e2965f96daecfc10f73dcf36f574e9eb700&scene=21#wechat_redirect)。  





训练损失基本沿用的都是对比学习那套,大家之间的差异更多是在于训练数据上的不同,需要根据自己真实的任务跟场景去构建数据,尽可能保证多样性跟质量。  

6 讨论

以前每个任务或者每个场景,都会独立维护一个embedding模型,哪个模型表现不行再去针对性优化。现在也是更倾向于使用的统一embedding模型,一个模型同时支持多个任务或者场景,归根到底还是在于数据的多样性是对模型整体性能是有收益的。

我跟大家一样都很关注大模型在text embedding上的应用,每次看到这种方案我都很兴奋。从一开始简单的换个基底模型,到instruction tuning的引入,再到最近的icl的引入,可以看到大模型在生成任务上的能力对于text embedding任务也是有收益的。我相信这里还是有值得进一步探索的空间的。

Instruction的引入使得同样的文本在不同的任务或者场景设置下可以生成不同的embedding,但是相比于大模型的生成任务,可以通过最终的reponse直观感受到prompt变化所带来的影响,但是在text embedding任务上则不能,很难直观地观测到prompt变化所带来的向量变化,这一点就显得很不友好了。

现在RAG的火热也带动了对于text embedding的关注,其实大家最终关注的是端到端的效果,所以模型优化同时也要需要考虑到跟其他模块的协助跟配合,不要深陷于某个牛角尖当中。虽然做技术的都希望能在某个特别细致的领域有所突破,但是应用层关注还是系统整体的性能,所以千万不要一叶障目,因小失大。

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论