GPT-4o与Gemini 1.5:大语言模型的上下文记忆能力评估

2024-06-12 17:04

本文主要是介绍GPT-4o与Gemini 1.5:大语言模型的上下文记忆能力评估,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GPT-4o与Gemini 1.5:大语言模型的上下文记忆能力评估

在大语言模型(LLM)的应用中,能够在大量上下文信息中找到并理解详细信息变得越来越重要。所谓的“大海捞针”测试便是衡量LLM在此类任务中表现的关键基准。在本文中,我将对OpenAI和Google的顶级LLM进行独立分析,测量它们基于上下文的理解能力。

什么是“大海捞针”测试?

“大海捞针”测试是针对大语言模型的一种评估方法,测试过程中会将特定信息(“针”)嵌入一大段无关文本(“大海”)中。然后,LLM需要回答一个问题,该问题要求从大量上下文中提取“针”信息。这种测试用于评估LLM的上下文理解能力和信息检索能力。在开发基于上下文的LLM应用程序时,这一能力至关重要。

随着自定义知识的集成变得越来越流行,所谓的检索增强生成(RAG)系统也随之兴起。为了进一步推动长上下文窗口的趋势,Google最近宣布了Gemini模型的新功能,可以为单个查询输入100万个tokens。

数据集生成

我们需要一个脚本,用于创建“针在大海中”数据集。该脚本允许我输入两个关键元素:

  1. 上下文(大海): 这是嵌入独特信息的文本。
  2. 独特信息(针): 这是需要在大量上下文中识别的具体信息。

数据集生成过程如下:

  1. 起点选择: 脚本首先在大段文本中随机选择一个起点。这个起点通常在文本的第10%到第40%之间。
  2. 针的放置: 然后在大海中插入独特信息(针)。它的位置也随机分布,但限制在大海长度的第20%到第80%之间。

一般来说,LLM最容易记住提示的开始和结尾信息。这个算法策略性地将针放置在上下文的特定百分比范围内,以确保评估能够捕捉模型识别和提取全范围文本数据的能力,而不仅仅是从提示更容易记住的边缘信息中提取。

以下是数据集生成算法的代码片段:

def create_haystack_with_needle(context: str, needle: str) -> str:import random# 确定大海的长度和针的位置context_length = len(context)start_pos = random.randint(int(context_length * 0.1), int(context_length * 0.4))insert_pos = random.randint(int(context_length * 0.2), int(context_length * 0.8))# 创建包含针的上下文haystack_with_needle = context[:insert_pos] + needle + context[insert_pos:]return haystack_with_needle

评估方法

在此次评估中,我使用了《哈利·波特》作为上下文(大海),而针则是一个虚构的电话号码。我为每个上下文长度(包括1000、2000、4000、8000、12000和16000字符)创建了100个大海。
包含1000字符的一个大海的示例,其中在第80个百分位位置插入了针(黄色部分)

context = "在哈利·波特的故事中,有一个重要的电话..."
needle = "123-456-7890"
haystack_with_needle = create_haystack_with_needle(context, needle)

不同的LLM任务是返回虚构电话号码。回复中是否包含虚构电话号码用于标记模型的回答准确性。使用的提示如下:

def create_needle_prompt(needle_text: str) -> str:prompt = f'''##### INSTRUCTION #####What is the fictive phone number to Lars Wiik according to the context?Only provide me what I want, nothing else.You can only respond with at max 20 words.##### CONTEXT #####{needle_text}'''return prompt

性能结果

此次评估包含以下模型:

  • gpt-4o-2024–05–13
  • gpt-4-turbo-2024–04–09
  • gpt-4–0613
  • gpt-3.5-turbo-0125
  • gemini-1.5-pro-preview-0514
  • gemini-1.5-flash-preview-0514
  • gemini-1.0-pro-002

每个模型都在不同上下文长度(1k、2k、4k、8k、12k、16k)上运行100次不同的“大海”测试。以下是结果准确率的折线图:

注意:你看不到gpt-4o和gpt-4–0613,因为它们被gpt-4-turbo-2024–04–09(100%准确率)隐藏了!

随着上下文窗口变长,由于噪声增加,提取特定信息变得更加困难。因此,性能预期会随着上下文窗口的增大而下降。从图中可以看出,OpenAI的模型在性能上与Google的模型有明显区别。Google的模型在8k上下文长度后准确率趋于平稳,约为50%。而OpenAI的模型在此测试中表现明显出色,其中gpt-4o、gpt-4-turbo-2024–04–09和gpt-4–0613是表现最好的模型。

结论

“针在大海中”评估可以用于测量大语言模型在使用长上下文时的理解和信息检索能力。在此次分析中,我们观察到OpenAI的模型和Google的Gemini系列在性能上的差异,其中OpenAI的gpt-4、gpt-4o和gpt-4-turbo得分最高。尽管Google最近增强了Gemini的能力,使其能够处理多达100万个tokens,但OpenAI的模型显示出更一致的能力,从大文本中准确检索特定信息。

对于用户和开发者来说,模型的选择可能取决于他们应用的具体需求。尽管如此,这些评估提供了宝贵的见解,帮助我们理解这些先进语言模型在复杂任务中的实际表现。未来,随着技术的进一步发展和改进,我们期待看到更多的创新和性能提升。

这篇关于GPT-4o与Gemini 1.5:大语言模型的上下文记忆能力评估的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054808

相关文章

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结