论文复现:Training on the Benchmark Is Not All You Need

文章目录

  • 1 资料
  • 2 我的总结
  • 3 复现源码
    • 首先你需要有gpt的api接口
    • 安装:
    • 执行指令
    • 源码
      • data_process.py
      • inference_logprobs.py
  • 4 结果

1 资料

我复现的源码: https://github.com/Whiffe/Benchmark-leakage-detection/tree/main

官网源码:https://github.com/nishiwen1214/Benchmark-leakage-detection

论文:https://arxiv.org/pdf/2409.01790

论文翻译:arxiv-2024 Training on the Benchmark Is Not All You Need

b站复现视频:

2 我的总结

这篇论文还是非常通俗易懂的,就是交换题目的选项顺序,来计算logprobs,查看是否有异常值。

3 复现源码

首先你需要有gpt的api接口

# 设置API key和API的基础URL,用于调用 OpenAI 接口
API_KEY = ""  # 替换为你的 API key
BASE_URL = ""  # 替换为API的基本URL

安装:

pip install openai

执行指令

数据集的生成:

python data_process.py \
    --data_dir  ./data/example_data.json \
    --save_dir ./data

计算logprobs:

python inference_logprobs.py --permutations_data_dir ./data/permutations_data2.json \
     --save_dir ./data

源码

data_process.py

'''
python data_process.py \
    --data_dir  ./data/example_data.json \
    --save_dir ./data
'''

import json
import itertools
import argparse

'''
{
   'option': {
   'A': '由间充质增生形成', 
   'B': '人胚第4周出现', 
   'C': '相邻鳃弓之间为鳃沟',
    'D': '共5对鳃弓'
    },
   'question': '下列有关鳃弓的描述,错误的是'
}
'''
parser = argparse.ArgumentParser(prog='data_process', description='')
parser.add_argument("--data_dir", type=str)
parser.add_argument("--save_dir", type=str)
args = parser.parse_args()
with open(args.data_dir, 'r') as file:
    data_list = json.load(file)

# 定义你的字符列表
chars = ['A', 'B', 'C', 'D']

# 使用itertools.permutations生成所有排列yy
permutations_list = list(itertools.permutations(chars))
result = []

for index, row in enumerate(data_list):

    for perm in permutations_list:
        instruction = {
            "instruction":
f"""
{row['question']}:
A:{row['option'][perm[0]]}
B:{row["option"][perm[1]]}
C:{row["option"][perm[2]]} 
D:{row["option"][perm[3]]}
""",
        }
        result.append(instruction)

with open(f"{args.save_dir}/permutations_data.json", 'w') as json_file:
    json.dump(result, json_file, indent=4, ensure_ascii=False)

inference_logprobs.py

'''
python inference_logprobs.py --permutations_data_dir ./data/permutations_data2.json \
     --save_dir ./data
'''
import json
import tqdm
import argparse
from openai import OpenAI

# 定义命令行参数
parser = argparse.ArgumentParser(prog='logprobs', description='')
parser.add_argument("--permutations_data_dir", type=str, help="Path to the input data (JSON)")
parser.add_argument("--save_dir", type=str, help="Directory to save the results")
args = parser.parse_args()

# 初始化OpenAI API客户端
client = OpenAI(
    api_key='xxx', #将这里换成你在api keys
    base_url="xxx"  # 替换为你要访问的 API 入口
)

def find_indices(lst, value):
    indices = []
    for i, elem in enumerate(lst):
        if (elem == value and len(lst[i + 1]) != 0 and lst[i + 1][0] == ":") or elem == 'A:':
            indices.append(i)
            return indices
    return indices

# 使用OpenAI API获取logprobs
def score(prompt):
    response = client.chat.completions.create(
        messages=[
            {
                "role": "user",
                "content": prompt,
            }
        ],
        model="gpt-3.5-turbo",  # 选择模型
        logprobs=True  # 获取logprobs
    )
    
    # 提取tokens及其logprobs
    input_tokens = [item.token for item in response.choices[0].logprobs.content]
    input_logprobs = [item.logprob for item in response.choices[0].logprobs.content]
    
    # 打印以查看提取是否正确
    # print("Tokens:", input_tokens)
    # print("Logprobs:", input_logprobs)
    
    # 找到 'A' 的索引
    index = find_indices(input_tokens, 'A')
    
    return input_tokens, input_logprobs, index[0] if index else 0

def display(prompt):
    input_tokens, input_logprobs, index = score(prompt)
    all_logprobs = 0
    # 累积从index开始的logprobs
    for i in range(index, len(input_logprobs)):
        all_logprobs += input_logprobs[i]
    return all_logprobs

# 加载输入数据
with open(args.permutations_data_dir, 'r') as file:
    datas = json.load(file)

logprobs_list = []

# 对每个数据计算logprobs
for index, data in enumerate(tqdm.tqdm(datas)):
    result = display(data["instruction"])
    logprobs_list.append(result)

# 保存logprobs结果
with open(f"{args.save_dir}/logprobs.json", 'w') as json_file:
    json.dump(logprobs_list, json_file, indent=4, ensure_ascii=False)

4 结果

数据集的打乱生成,就是对4个选项进行排列组合。
在这里插入图片描述

对打乱后的数据计算logprobs
在这里插入图片描述

[
    -8.13673193681245,
    -9.511466482160149,
    -5.386469065935929,
    -9.432328614854779,
    -5.405103636728939,
    -9.08097951506345,
    -6.560878102447153,
    -5.13767155106839,
    -5.49210427956123,
    -53.71251137077802,
    -6.3262343066056,
    -8.972361489357953,
    -8.017449890078197,
    -4.852460129236841,
    -7.9068465161303,
    -5.729137238647233,
    -9.92944942808605,
    -15.058123669689795,
    -10024.199599759702,
    -8.1004607337965,
    -12.517808548910251,
    -33.58417227999325,
    -7.63461314750679,
    -13.655588575448178,
    -30.238195388717422,
    -22.205287599773747,
    -15.618651239780414,
    -16.08750962605555,
    -25.21407782270761,
    -19.756035716175465,
    -14.75928077,
    -18.81754370852463,
    -19.75940019079578,
    -22.26305767797671,
    -21.812592662996376,
    -39.88223290471884,
    -9.58445245659858,
    -25.465287367872612,
    -2.19529201559165,
    -21.777878197784858,
    -20.38349776538606,
    -0.16652563152008001,
    -3.18791372228803,
    -0.17106814774657997,
    -1.5009587775304096,
    -29.762072239900135,
    -30.634590575760512,
    -21.8722806283808
]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【RAG】HiQA:一种用于多文档问答的层次化上下文增强RAG

前言 文档领域的RAG,之前的工作如ChatPDF等很多的RAG框架,文档数量一旦增加,将导致响应准确性下降,如下图;现有RAG方法在处理具有相似内容(在面对大量难以区分的文档时)和结构的文档时表现不佳…

【leetcode】125.验证回文串

思路: isPalindrome 函数: 使用两个指针 left 和 right 分别指向字符串的开始和结束。使用 isalnum 函数跳过非字母数字字符。使用 tolower 函数将字符转换为小写进行比较。如果在某一步比较中发现字符不相等,则返回 0(false&…

Python进阶--函数进阶

目录 1. 函数多返回值 2. 函数多种传参方式 (1). 位置参数 (2). 关键字参数 (3). 缺省参数 (4). 不定长参数 3. 匿名函数 (1). 函数作为参数传递 (2). lambda匿名函数 1. 函数多返回值 def return_num():return 1# 返回1之后就不会再向下继续执行函数体return 2 resu…

gstreamer 内存 alloctor 介绍

文章目录 前言一、gstreamer 默认的内存 alloctor1. gstreamer 中默认的内存 allocator 为 GST_ALLOCATOR_SYSMEM (即SystemMemory)2. GST_ALLOCATOR_SYSMEM 申请内存实例二、gstreamer 目前支持的几种内存 alloctor1.GstDmaBufAllocator1.1 GstDmaBufAllocator 介绍1.2 GstDma…

Vue3轻松实现前端打印功能

文章目录 1.前言2.安装配置2.1 下载安装2.2 main.js 全局配置3.综合案例3.1 设置打印区域3.2 绑定打印事件3.3 完整代码4.避坑4.1 打印表格无边框4.2 单选框复选框打印不选中4.3 去除页脚页眉4.4 打印內容不自动换行1.前言 vue3 前端打印功能主要通过插件来实现。 市面上常用的…

基于springboot vue地方废物回收机构管理系统设计与实现

博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

GeoCue与Xer Technologies合作推动无人机测绘技术革新

GeoCue与Xer Technologies合作推动无人机测绘技术革新 近期,LiDAR测绘硬件和软件开发商GeoCue与瑞士长航时混合动力无人机制造商Xer Technologies AG携手合作,成功将GeoCue的TrueView 720 LiDAR和图像传感器集成至Xer X8无人机平台。这一里程碑式的合作不仅标志着无人机测绘技…

基于STM32的智能门锁控制系统设计

引言 本项目基于STM32微控制器设计了一个智能门锁控制系统,用户可以通过密码输入或指纹识别来控制门锁的开关。该系统集成了键盘、指纹传感器、舵机等外设,实现了门锁的安全、便捷控制,同时也具备了较强的扩展性。该项目展示了STM32在安防领…

某个应用的CPU使用率居然达到100%,我该怎么办?

摘至https://learn.lianglianglee.com/ CPU使用率 Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉。 为了维护 CPU 时间,Linux 通过事先定…

七、InnoDB数据存储结构

文章目录 1. 数据库的存储结构:页1.1 磁盘与内存交互基本单位:页1.2 页结构概述1.3 页的大小1.4 页的上层结构2. 页的内部结构2.1 第1部分:File Header(文件头部)和 File Trailer(文件尾部)2.1.1 File Header(文件头部)2.1.2 File tRAILER(文件尾部)2.2 第2部分:Fr…

【AIGC】通过OpenAi Canvas修改论文(附40条论文优化指令)

目录 1、用ChatGPT优化论文大纲和逻辑2、用ChatGPT充实论文内容3、用ChatGPT寻找案例和数据4、用ChatGPT检查语法和字词错误5、如何直接使用ChatGPT4o、o1、OpenAI Canvas6、OpenAI Canvas增强了啥?7、编程功能增强 在刚开始撰写学术论文时,很多小伙伴感…

深度学习之贝叶斯分类器

贝叶斯分类器 1 图解极大似然估计 极大似然估计的原理,用一张图片来说明,如下图所示: ​ 例:有两个外形完全相同的箱子,1号箱有99只白球,1只黑球;2号箱有1只白球,99只黑球。在一次…

LeetCode刷题日记之二叉树(六)

目录 前言二叉搜索树中的众数二叉树的最近公共祖先二叉搜索树的最近公共祖先总结 前言 又是学习LeetCode二叉树的新一天,今天还是接着学习一下二叉搜索树的内容,希望博主记录的内容能够对大家有所帮助 ,一起加油吧朋友们!&#x…

LeetCode讲解篇之2466. 统计构造好字符串的方案数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 组成长度为i的字符串个数 组成长度为i - zero的字符串个数 组成长度为i - one的字符串个数 设数组f中i号元素的值为组成长度为i的字符串个数 则状态转移方程为f[i] f[i - zero] f[i - one],其中需…

MySQL中NULL值是否会影响索引的使用

MySQL中NULL值是否会影响索引的使用 为何写这一篇文章 🐭🐭在面试的时候被问到NULL值是否会走索引的时候,感到有点不理解,于是事后就有了这篇文章 问题: 为name建立索引,name可以为空select * from user …

使用标签实现MyBatis的基础操作

目录 前言 1.配置MyBatis⽇志打印 2.参数传递 2.1 #{} 和 ${}区别 2.2传递多个参数 3.增删改查 3.1增(Insert) 3.2删(Delete) 3.3改(Update) 3.4查(Select) 前言 接下来我们会使用的数据表如下: 对应的实体类为:UserInfoMapper 所有的准备工作都…

Nginx08-反向代理

零、文章目录 Nginx08-反向代理 1、概述 关于正向代理和反向代理,我们在前面已经介绍过了,简而言之就是正向代理代理的对象是客户端,反向代理代理的是服务端,这是两者之间最大的区别。 Nginx即可以实现正向代理,也可…

Python进阶--正则表达式

目录 1. 基础匹配 2. 元字符匹配 1. 基础匹配 正则表达式,又称规则表达式(Regular Expression),是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式(规则&#xff…

爱心曲线公式大全

local r a*((math.sin(angle) * math.sqrt(math.abs(math.cos(angle)))) / (math.sin(angle) 1.4142) - 2 * math.sin(angle) 2) local x r * math.cos(angle) -- 计算对应的x值 local z r * math.sin(angle) 1.5*a - --曲线公式绘画 local function generateParabola()…

【异常记录Vue_20241006】使用TagsView后控制台报错

报错截图 报错原因 未将TagsView所依赖的组件permission组件注册到store中,导致TagsView组件在找permission.routes时没找到 解决方法:store注册相应组件