笔者在上篇文章中介绍了BGE,一个中文领域的通用embedding模型。本文则旨在介绍embedding技术的常见应用。
具体而言 , 笔者基于BGE搭建了 两个应 用: 其一是 鲁迅全集检索 ,将鲁迅全集解析后导入向量引擎,以进行语义搜索 -- 例如 查询鲁迅关于“内卷与躺平“的看法 ; 另一个是 新闻早报聚类 ,将 新闻进行embedding表征,使用聚类算法, 聚合那些相同、相关的新闻 ,以方便阅读。
本文相关代码:
https://github.com/duanyu/embedding\_application
搜索
搜索是text embedding最常见的使用场景之一。
其实现步骤如下:
- 提前计算document embedding,并存储在向量数据库之中(如Milvus[1]);
- 在检索时,计算query embedding,调用向量数据库进行向量检索,返回Top-K数据,通常来说排序metric为
cosine(query emb, doc emb)
。
与文本搜索系统(如ElasticSearch等)不同,基于embedding的搜索系统是一种 语义搜索 -- 即使query与doc没有很多重合词,但只要其语义接近,也能够被检索出来。
应用:鲁迅全集检索
笔者以鲁迅全集[2]数据为例,在passage粒度上(使用换行符进行分割)构建了向量引擎。
具体的环境和配置如下:
- 机器:Modelscope上的免费GPU机器(共100h免费时长)[3]
- 向量数据库:Milvus
- embedding索引设置:
FLAT
(数据量小,直接用FLAT即可) - metric_type:
Inner Product
(已对embdedding进行归一化,此时等同于cosine)
- 向量模型:bge-large-zh-v1.5[4],emb维度为
1024
,推理时大约需2G显存
- 由于BGE采取了instruction-tuning技术,在执行检索时,需在query前拼接instruction -
为这个句子生成表示以用于检索相关文章:
构建好了向量引擎,便能执行检索了。以下是笔者的检索结果示例:
query:男女平等问题
query:内卷与躺平
query:如何教育孩子
从上述例子可以看出,BGE的检索效果还不错。 掉书袋因此可以成为一件很轻松的事情:)
聚类
text embedding的另一个应用,是聚类。
所谓聚类,是将语义相似的内容,聚合在一起。
聚类的实现步骤如下:
- 计算待聚类的文本的embedding;
- 使用clustering算法(如KMeans、DBSCAN等),基于文本embedding进行聚类。
应用:新闻早报聚类
许多自媒体有日报栏目,这些日报的内容存在一部分交叉、相关的内容。
一个自然的疑问是: 能否将相同、相关的新闻聚合在一起,以方便阅读? 这是一个天然的聚类问题。
为展开实验,笔者选取12.11号, 36kr、腾讯科技和创业邦 的早报,提取了新闻的(title, passage),使用DBSCAN聚类算法展开实验。
机器配置和embedding模型与前文一致,此处不再赘述。其余配置如下:
- 新闻表征方法 :将title embedding作为新闻表征
- 聚类算法 :DBSCAN
-
metric :cosine distance
-
算法参数 :eps = 0.3 - 0.45(指一个cluster中,两个样本的距离上限),min_samples=2(指一个cluster的最小样本数)
原公众号链接如下:
36kr:https://mp.weixin.qq.com/s/bz8hnmaX6tdbrmADELbrzQ
腾讯科技:https://mp.weixin.qq.com/s/wvwIBrN6hczhiMIicK0SnA
创业邦:https://mp.weixin.qq.com/s/Gn6NZ9UtTF6Qy2SCOFf-KA
聚类结果如下:
当eps = 0.45时
-
可以发现,eps相对较大(0.45)时,聚类的相关性容忍度更高 。小米汽车和比亚迪的新闻会聚合在一起;X与亚马逊合作、马斯克招募openai首席科学家、openai“内幕”新闻均会被聚合在一起。
当eps=0.4时
- 当eps降低到0.4时,前面提到的 相关新闻大多会被分开 ,只有相关性较高的(如openai“内幕”新闻 与 马斯克招募openai首席科学家的新闻)才会聚合在一起。
当eps=0.3时
- 将eps进一步降低到0.3,那么只会把 相同 的新闻聚合在一起了。
因此,如果只想要“去重”,那么选择 较小的eps ;如果想要聚合更多相关的新闻,那么选择 稍大的eps 。
总结
本文通过两个简单而直观的应用,初步介绍了embedding技术的应用方式,希望加深读者对于embedding技术的理解。
本文相关代码如下,欢迎读者朋友基于此展开更多有趣的实验~
https://github.com/duanyu/embedding\_application
关注笔者
笔者将定期分享NLP技术与应用方面的知识,欢迎关注:)
参考资料
[1] Milvus: https://milvus.io/
[2] 鲁迅全集git: https://github.com/Ac-heron/luxun
[3] Modelscope免费GPU: https://modelscope.cn/my/mynotebook/preset
[4] bge模型地址(ms版): https://modelscope.cn/models/Xorbits/bge-large-zh-v1.5/summary