大模型分不清 9.9 与 9.11 谁大,那 Embedding 模型呢?

news2024/11/15 11:39:19

这是我今天在维也纳举行的 ICML 会议上被问到的问题。

在茶歇期间,一位 Jina 用户向我提出了一个源自 LLM 社区最近讨论的问题。他问我们 Jina Embeddings 能不能判断 9.11 比 9.9 更小,很多大模型在这个小问题上翻了车。

我说:“老实说,我也不知道。” 他接着详细阐述了这个能力对于他应用的重要性,并暗示:Tokenizer 可能是问题的源头,我若有所思点点头,脑海里开始构思如何用实验来找到答案。

本文我将通过一系列实验来探索 Embeddings、Reranker 模型能否可以准确比较数字。为了验证模型在实际应用中的表现,我还设计了一些具有挑战性的测试用例,包括

  1. 小数比较(例如 0.001 和 0.0001)

  2. 货币金额(例如 和 2.00)

  3. 日期比较(例如 2023-12-31 和 2024-01-01)

  4. 时间比较(例如 23:59 和 00:00)

在这次实验中,我选择了 jina-embeddings-v2-base-en(2023 年 10 月发布)和 Reranker jina-reranker-v2-multilingual(2024 年 6 月发布)作为研究对象,来评估它们在数字理解和比较方面的优势与局限。

让我们拭目以待。

实验装置

完整的实现可以在下面的 Colab 中找到: https://colab.research.google.com/drive/11kUxYhHMLqYhw5HVKEYdHv0EfdZIyBBy?ref=jina-ai-gmbh.ghost.io#scrollTo=G7Cy9zSb2Ukg

本次实验设计非常直观。举个例子,要检查 Embeddings 模型是否理解 1 到 100 之间的数字,步骤如下:

  1. 构建文档:为每个数字生成“字符串文字”文档。

  2. 发送至 Embeddings API: 使用 Embeddings API 获取每个文档的 Embeddings。

  3. 计算余弦相似度:计算每两个文档的余弦相似度,创建一个相似度矩阵。

  4. 绘制散点图:使用散点图可视化结果。相似度矩阵中的每个元素(i, j)映射到一个点,X 轴为(i-j),Y 轴为(i, j)的相似度值。

实验原理是:如果(i-j)的差值为零,即 i 等于 j,那么语义相似度应该是最高的。随着(i-j)的差值增加,相似度应该降低。理想情况下,相似度应该与差值成线性关系。 如果我们观察不到这种线性关系,那么模型可能无法理解数字,并可能产生错误,比如认为 9.11 大于 9.9。

Reranker 模型遵循类似流程。主要区别在于,我们将每个文档逐一设为查询,通过加上 Prompt:“哪一项最接近...”,将所有其他文档作为 documents 进行排名。Reranker API 返回的相关性得分直接作为语义相似度度量。核心实现如下:

def rerank_documents(documents):
    reranker_url = "https://api.jina.ai/v1/rerank"
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {token}"
    }

    # 初始化相似度矩阵
    similarity_matrix = np.zeros((len(documents), len(documents)))

    for idx, d in enumerate(documents):
        payload = {
            "model": "jina-reranker-v2-base-multilingual",
            "query": f"what is the closest item to {d}?",
            "top_n": len(documents),
            "documents": documents
        }
    ...

模型能否比较 1 到 100 之间的数字?

左图是 jina-embeddings-v2-base-en 的结果,右图是 jina-reranker-v2-multilingual 的结果。

如何阅读这些图

在继续实验之前,我先解释一下如何正确解读这些图表。首先,我观察到 Embeddings 模型表现不错,而 Reranker 模型表现稍差。那么,这些图表到底展示了什么呢?

X 轴代表索引(i, j)的差值,即 i-j,当我们从文档集中均匀采样 di 和 dj 时。这个差值范围是[-100, 100]。由于文档集是按顺序排列的,即|i-j|越小,di 和 dj 在语义上越接近;i 和 j 越远,di 和 dj 之间的相似度越低。这就是为什么你会看到相似度(由 Y 轴表示)在 X=0 处达到峰值,然后随着 X 值的增大或减小而线性下降。

理想情况下,这应该形成一个尖峰或“^”形状。 然而,情况并非总是如此。如果你固定 X 轴某一点,例如 X = 25,并沿 Y 轴查看,你会发现相似度值在 0.80 到 0.95 之间。这意味着 sim(d_27,d_2)可能是 0.81,而 sim(d_42,d_17)可能是 0.91,尽管它们的差值都是 25。也就是说,即使差值相同,不同文档对的相似度也会不同。

青色趋势线显示了每个 X 值的平均相似度及其标准差。要注意,由于文档集是均匀分布的,确保了连续文档间的间隔相等,相似度应该线性下降。

Embedding 模型图总是对称的,X = 0 时,Y 值最大,为 1.0。这是因为对于 di 和 dj,余弦相似度是对称的,且 cos(0) = 1。

相反,Reranker 模型图总是呈现非对称性,这是因为在重排序模型中,查询与文档的角色存在差异。其最大值未必是 1.0,毕竟 X=0 表示的是我们利用 Reranker 模型去计算“与 4 最接近的一项是什么”和“4”的相关性。倘若深入思考,X = 0 并不一定会致使出现最大的 Y 值。

模型能否比较 -100 到 -1 之间的负数?

我们想测试模型在负数空间中是否能够判断语义相似性,测试数据集是从 -1 到 -100 的负整数字符串,即 documents = [str(-i) for i in range(1, 101)]。这是一个散点图,一同显示了平均值和标准差。

左侧是jina-embeddings-v2-base-en的结果,右侧是jina-reranker-v2-multilingual的结果。

模型能否比较更大间隔的数字 1000, 2000, 3000, ..., 100000?

在这里,我们想测试当比较间隔为 1000 的数字时,模型能否识别语义相似性。documents是由 1 到 100 的数字乘以 1000 构成的字符串列表。documents = [str(i*1000) for i in range(1, 101)]。同上,本散点图一并显示了平均值和标准差。

左侧是jina-embeddings-v2-base-en的结果,右侧是jina-reranker-v2-multilingual的结果。

模型能否比较任意范围内的数字,例如 376, 377, 378, ..., 476?

我们希望测试当比较任意范围内的数字时,模型能否识别语义相似性。我们将数字移动到一个随机范围,documents是由 0 到 100 的数字加上 375 构成的字符串列表。即 documents = [str(i+375) for i in range(1, 101)]

左侧是jina-embeddings-v2-base-en的结果,右侧是jina-reranker-v2-multilingual的结果。

模型能否比较非常大的数字 4294967296, 4294967297, 4294967298, ..., 4294967396?

我们想测试当比较大数字时,模型能否识别语义相似性。我们将范围进一步移动到一个大数字,documents是由 0 到 100 的数字加上 4294967296 构成的字符串列表。即 documents = [str(i+4294967296) for i in range(1, 101)]

左侧是jina-embeddings-v2-base-en的结果,右侧是jina-reranker-v2-multilingual的结果。

模型能否比较 0.0001, 0.0002, 0.0003, ..., 0.1 之间的浮点数?(不固定小数位数)

在这里,我们想测试当比较浮点数时,模型能否识别语义相似性。documents是由 1 到 100 的数字除以 1000 构成的字符串列表。即 documents = [str(i/1000) for i in range(1, 101)]

左侧是jina-embeddings-v2-base-en的结果,右侧是jina-reranker-v2-multilingual的结果。

模型能否比较货币数字 1,1 2, 3,...,3 ..., 100?

在这里,我们想测试当比较货币中的数字时,模型能否识别语义相似性。documents是由 1 到 100 的数字前面加上货币符号$ 构成的字符串列表。即 documents = ['$'+str(i) for i in range(1, 101)]

模型能否比较日期 2024-07-24, 2024-07-25, 2024-07-26, ..., 2024-10-31?

在这里,我们想测试当比较日期格式中的数字时,模型能否识别语义相似性。documents是由当前日期加上 0 到 100 天构成的日期字符串列表。today = datetime.today(); documents = [(today + timedelta(days=i)).strftime('%Y-%m-%d') for i in range(100)]

模型能否比较时间 19:00:07, 19:00:08, 19:00:09,..., 20:39:07?

在这里,我们想测试当比较时间格式中的数字时,模型能否识别语义相似性。documents是由当前时间加上 0 到 100 分钟构成的时间字符串列表。now = datetime.now() documents = [(now + timedelta(minutes=i)).strftime('%H:%M:%S') for i in range(100)]

观察结果

从上述图表中,我们得出了一些观察结果:

Reranker 模型

  • Reranker 模型在处理数字比较问题时,确实有些力不从心。 哪怕是在 1 到 100 这样简单的数字比较内,它的表现也不尽人意。

  • 不过我们在 Reranker 使用了为查询构造的特殊提示词,即最接近 x 的一项是什么,这也可能影响结果。

Embedding 模型

  • Embedding 模型在处理 1 到 100 的小数字或者 -100 到 1 的负数时,表现还算不错,但一旦数字范围扩大,或者涉及到更复杂的数值区间,如浮点数,它的效果就会大打折扣。

  • 我们还会注意到,在每隔 10 的倍数处,算法的表现会出现一些规律性的波动。这可能与分词器将字符串如"10"拆分成"1"和"0"的方式有关。

日期和时间理解

  • Embedding 模型对日期和时间有相当不错的理解,大多数情况下都能准确比较它们。 例如,在日期图表里,我们会发现每 30 或 31 天会出现一个高峰,对应一个月的天数。而在时间的图表中,每 60 分钟也会出现一个高峰,这与一小时的分钟数相匹配。

  • 重排器模型也在一定程度上捕捉到了这种理解。

可视化与“零”的相似性

我们还设计了另一个直观有趣的实验:可视化任意数字与零(原点)之间的语义相似性。将参考点固定为零的嵌入,我们想看看数字与零之间的语义相似性是否随数字增大而线性下降。

Google Colab:https://colab.research.google.com/drive/1S9qZQ0jjdKLNUT2GKqPbU4ogpDe6g9Qh#scrollTo=nvAX2GOpCiRt

我们将查询固定为"0"或"与数字零最接近的数字是什么",并对所有数字进行排序,看看它们的相关性得分是否随着数字的增加而下降。结果如下所示:

左侧是jina-embeddings-v2-base-en的结果,右侧是jina-reranker-v2-multilingual的结果。

关键发现

尽管本文实验设置相对简单,但它揭示了当前模型在数字处理方面的一些基本问题,为我们后续的模型开发提供了宝贵见解。

影响模型数字比较能力的两大关键因素有 分词策略 和 训练数据

首先是分词策略: 词汇表的设计直接影响数字的表示。例如,如果词汇表只包括 0-9 的数字,那么 11 可能被分为单独的 1 和 1,或作为整体的 11,不同的分词方式会导致模型对数值的理解差异。

来源:HuggingFace 上的 Tokenizer Playground。

其次是训练数据: 训练语料的选择对模型的数值推理能力影响重大。比如,如果训练数据主要是软件开发文档或 GitHub Repo,那么模型可能会解释 9.11 大于 9.9 (受语义化版本控制的影响)。

密集检索模型(例如 Embeddings 和 Reranker)的算术能力对于涉及 RAG 以及高级检索和推理的任务至关重要。强大的数字推理能力可以显著提高搜索质量,尤其是在处理 JSON 这样的结构化数据时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1982687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink 实时数仓(七)【DWS 层搭建(一)流量域汇总表创建】

前言 今天开始 DWS 层的搭建,不知不觉又是周一,都忘了昨天是周末,近两年对我来说,周六日晚上八九点能打一小会篮球就算一周的休息了。不得不说自己真的是天生打工体质,每天不管多累,晚上十二点睡&#xff0…

SpringBoot自动配置和执行过程

Spring的执行流程 1. 加载容器(加载配置文件) 2. 根据配置完成Bean的初始化(扫描配置范围内的五大类注解) 3. 将被五大类注解修饰的类注册到Spring容器中 (将对象交给Spring IoC容器管理) 4.注入Bean对象(Autowired、R…

Linux - - - Linux 添加环境变量

1.添加环境变量 编辑环境变量配置文件。 vim /etc/profile在最后面新增一行,导出 PATH 变量并在之前的 PATH 变量后面添加冒号,然后添加上你的可执行文件的目录。 export PATH$PATH:/usr/local/aspnetcore/aspnetcore-runtime-8.0.7-linux-x64/2.加载…

GD32 SPI 通信协议

1.0 SPI 简介 SPI是一种串行通信接口,相对于IIC而言SPI需要的信号线的个数多一点,时钟的信号是主机产生的。 MOSI:主机发送,从机接收 MISO:主机接收,从机发送 CS:表示的是片选信号 都是单向…

在线Banner设计工具大比拼:谁更胜一筹

在数字营销的时代,一个吸引眼球的 Banner 广告是吸引潜在客户、提高品牌知名度的关键。为了帮助营销人员和设计师快速创建专业的 Banner 广告,市面上出现了多种易于使用的 Banner 设计工具。本文将介绍几个受欢迎的 Banner 设计工具,包括即时…

路径规划——A*算法

路径规划——A*算法 算法原理 为了解决Dijkstra算法效率低的问题,A Star 算法作为一种启发式算法被提出。该算法在广度优先的基础上加入了一个估价函数。如BFS和常规方法如Dijsktra算法结合在一起的算法,有点不同的是,类似BFS的启发式经常给…

RGB红绿灯——Arduino

光的三原色 牛顿发现光的色散奥秘之后,进一步计算发现:七种色光中只有红、绿、蓝三种色光无法被分解,而其他四种颜色的光均可由这三种色光以不同比例相合而成。于是红、绿、蓝被称为“三原色光”或“光的三原色”。后经证实:红、绿…

提升C++开发效率的利器:深入解析Clang Power Tools

目录 一、引言 二、Clang Power Tools 简介 什么是 Clang Power Tools? 背景与发展历史 与 Clang 编译器的关系 主要开发团队和社区支持 系统要求 安装步骤 基本配置和使用 三、主要功能 代码格式化(Clang-Format) 代码质量提升 …

springboot+Loki+Loki4j+Grafana搭建轻量级日志系统

文章目录 前言一、日志组件介绍1.1 Loki组件1.2 Loki4j组件1.3 Grafana 二、组件下载安装运行Loki下载安装运行Grafana下载安装运行 三、创建springboot项目总结 前言 日志在任何一个web应用中都是不可忽视的存在,它已经成为大部分系统的标准组成部分。搭建日志可视…

【大模型】Unsloth安装及使用教程

Unsloth是一个开源的大模型训练加速项目,使用OpenAI的Triton对模型的计算过程进行重写,大幅提升模型的训练速度,降低训练中的显存占用。Unsloth能够保证重写后的模型计算的一致性,实现中不存在近似计算,模型训练的精度…

【Material-UI】Button 组件中的基本按钮详解

文章目录 一、基本按钮变体1. 文本按钮(Text Button)2. 实心按钮(Contained Button)3. 轮廓按钮(Outlined Button) 二、应用场景与注意事项1. 使用场景2. 注意事项 三、总结 Material-UI 的 Button 组件是前…

ShardingProxy使用自定义策略,数据迁移方案

文章目录 ShardingProxy功能扩展分库分表数据迁移方案 ShardingProxy功能扩展 我们在使用ShardingJDBC时,会进行自定义分布式主键生成策略、自定义分片策略 如果我们想要我们自定义的这些策略在ShardingProxy中也能使用,应该如何操作嘞? 我…

使用F1C200S从零制作掌机之I2C传感器

访问I2C设备(比如eeprom),我知道的有三总方法: (一)i2c-dev操作I2C设备:不用添加设备驱动,用户直接在应用层完成对具体I2C 设备的驱动工作。 (二)sysfs操作…

微信小程序教程011-:2:京西购物商城实战之TabBar实现

2、tabBar 2.0 创建tabBar分支 运行如下命令,基于master分支,创建本地tabBar子分支,用来开发和tabBar相关的功能 git checkout -b tabbar2.1 创建tabBar页面 在pages目录中,创建首页(home)、分类(cate)、购物车(cart)、我的(my)这4个tabBar页面,在HBuilderX中…

【网络世界】数据链路层

目录 🌈前言🌈 📁 初识数据链路层 📂 概念 📂 协议格式 📁 MAC地址 📂 概念 📂 与IP地址的区别 📁 MTU 📂 对IP协议的影响 📂 对UDP协议的影响…

思维+位运算,CF 1934D1 - XOR Break --- Solo Version

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1934D1 - XOR Break --- Solo Version 二、解题报告 1、思路分析 合法操作会让 n 越变越小 假如最高位1为 b1, 次高位1 为b2 那么我们去掉b1 的 1最大能够得到的数为 &#xff08;1 << b2&#xff…

图像传感器 - 从零开始认识各种传感器【二十六期】

图像传感器|从零开始认识各种传感器 1、什么是图像传感器&#xff1f; 图像传感器是将光信号转换为电信号的设备&#xff0c;图像传感器通过捕捉光子并将其转化为电子信号&#xff0c;从而生成数字图像。它是数码相机、摄像机、智能手机、无人机、自动驾驶汽车以及各种工业和医…

良心推荐!分享6个强大的电脑软件,每一个都非常实用

良心推荐&#xff01;分享6个功能强大的电脑软件&#xff0c;每一个都非常实用&#xff01; 1.Listen1 一个可以免费听音乐的软件&#xff0c;也可以在浏览器上作为插件使用&#xff0c;曲库丰富&#xff0c;里面涵盖了QQ音乐、酷狗音乐、网易云音乐等多个平台的歌单资源&…

【MySQL】索引——索引的实现、B+ vs B、聚簇索引 VS 非聚簇索引、索引操作、创建索引、查询索引、删除索引

文章目录 MySQL5. 索引的实现5.1 B vs B5.2 聚簇索引 VS 非聚簇索引 6. 索引操作6.1 创建主键索引6.2 创建唯一索引6.3 创建普通索引6.4 创建全文索引6.5 查询索引6.6 删除索引 MySQL 5. 索引的实现 因为MySQL和磁盘交互的基本单位为Page&#xff08;页&#xff09;。 MySQL 中…

LTrack:实现夜间多目标追踪,并开放低光多目标追踪数据集LMOT

摘要 低光场景在现实应用中很常见&#xff08;例如&#xff0c;夜间的自动驾驶和监控&#xff09;。最近&#xff0c;多目标跟踪在各种实际用例中受到了很多关注&#xff0c;但黑暗场景中的多目标跟踪却很少被考虑。在本文中&#xff0c;我们专注于黑暗场景中的多目标跟踪。为…