难逃 AI 的法眼:ChatGPT 文本检测器(ERNIE 文本分类)

★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>

参考项目地址:https://github.com/Hello-SimpleAI/chatgpt-comparison-detection

本项目 Demo 地址:https://aistudio.baidu.com/aistudio/projectdetail/5691205

项目介绍

ChatGPT 是由 OpenAI 开发的一种基于人工智能技术的语言模型,它能够自动回答用户的问题,并生成文本响应。在过去一年中,ChatGPT 已经成为了人工智能领域的一个热门话题,引起了广泛的关注和讨论。

一方面,ChatGPT 的应用前景非常广阔。例如,它可以用于自然语言处理、智能客服、聊天机器人、在线问答等领域。另一方面,ChatGPT生成的文本也可能存在一些问题,比如不真实、不可信、不友善、不合法等。这些问题可能给用户带来误导或欺骗的风险,也可能给社会带来负面的影响。因此,需要对 ChatGPT 进行检测和评估,以确保其安全性和可靠性。

检测和评估 ChatGPT 的方法和技术有很多种,例如基于特定词频判断、基于PTM的分类器、基于深度学习模型、基于语言学特征的模型等等。

本项目使用 ERNIE 模型来对文本进行二分类,来达到 ChatGPT 文本检测的效果。

数据说明

HC3 数据集 至今已经收集了中英文的 3-4 万个问题和近 10 万条「人类-ChatGPT 对比」回答语料,涵盖了开放域、计算机科学、金融、医疗、法律、心理等多个领域。这批语料集从各个领域,反映了人类专家和 ChatGPT 在面对同一个问题时会有怎么不同的回答。

本项目采用 HC3-Chinese 中文文本问答数据集。我们对原始数据集进行了处理,将原本的 JSONL 格式转换为 CSV 格式,并清除了文本中的部分转义符和无意义符号,最后选取了一些适合在 AI Studio 训练的领域的文本合并成了 data.csv。所有的数据操作过程可见 /home/aistudio/data/data_processing.ipynb

现有数据集包括 文本 id文本内容标签,文件名为 data.csv,各字段以 , 分隔,格式如下:

  • id,样本 ID
  • text,人类或 ChatGPT 回答的文本内容
  • label,回答分类标签
idtextlabel
341没有特异的疗效,脑出血恢复期主要是功能锻炼和防止再复发:关键是治疗高血压,糖尿病,等危险因素…0
12567在劳动合同期内,或未签订劳动合同,用人单位单方面无缘由解除劳动关系的,劳动者可获得工作每满一…0
4786超频(overclocking)是指在计算机硬件系统的规定范围之外提高其工作频率的操作。这样…1

数据读取

!unzip -o /home/aistudio/data/data202733/HC3-Chinese.zip -d /home/aistudio/data # 解压原始数据集
!unzip -o /home/aistudio/data/data202734/chatgpt-comparison-detection.zip -d /home/aistudio/data # 解压清洗后的数据集和模型参数文文件
%pip install wordcloud # 词云
import numpy as np
import pandas as pd
from tqdm import tqdm
import paddle
from paddlenlp.transformers import AutoModelForSequenceClassification, AutoTokenizer
from paddle.io import Dataset, DataLoader
from paddlenlp.datasets import MapDataset
from sklearn.model_selection import train_test_split
from visualdl import LogWriter
import matplotlib.pyplot as plt
import jieba  
from wordcloud import WordCloud, ImageColorGenerator  
# 随机抽取三条数据查看内容
data = pd.read_csv("/home/aistudio/data/data.csv")
data.sample(frac=1).head(3)
idtextlabel
158725882SUMPRODUCT函数是一个Excel函数,它可以将一组数字的乘积相加起来。它的语法为:S...1
131483158《瑞普·凡·温克尔的新娘》是一部讲述瑞普·凡·温克尔的真实故事的电影。该电影由岩井俊二导演,...1
31543154想到哪写到哪吧! 1落米问题:米从高处的出米口处落下,初速为零,流量不变。米落在一个秤盘上,...0

模型选取

这是个经典的文本二分类任务,使用 ernie-3.0-base-zh 模型分类,用交叉熵作为损失函数,我们将数据处理后只保留了回答的文本,方便直接进行单文本分类预测。

# 载入模型与分词器
model = AutoModelForSequenceClassification.from_pretrained("ernie-3.0-base-zh", num_classes=2)
tokenizer = AutoTokenizer.from_pretrained("ernie-3.0-base-zh")optimizer = paddle.optimizer.AdamW(1e-5, parameters=model.parameters())
loss_fn = paddle.nn.loss.CrossEntropyLoss(reduction='mean')

句子分析

我们发现大部分句子长度集中在 200-300 词左右,最大的文本已经达到 2800 词,这对模型来说是个十分大的调整,为了兼顾推理速度和精度,尽可能模拟日常对话文本,我们将模型预测词大小限制在 70 词

# 句子长度分布图
data['text'].apply(len).plot(kind='box')
plt.title('Data')
Text(0.5,1,'Data')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u0FOXytr-1681891390596)(main_files/main_10_1.png)]

# 句子长度分布数据
data['text'].apply(len).describe()
count    19981.000000
mean       231.086832
std        195.019974
min          2.000000
25%         98.000000
50%        164.000000
75%        314.000000
max       2822.000000
Name: text, dtype: float64

我们同样也发现 ChatGPT 的文本中会出现大量有特点的词汇,这是文本分类器的突破口。

# 句子高频词词云
content = ''.join(data.loc[data["label"] == 1, "text"])
wordcloud = WordCloud(background_color = 'white', max_words = 1000, font_path = '/home/aistudio/data/STHeiti-Light.ttc')
wordcloud.generate(''.join(jieba.lcut(content)))
plt.imshow(wordcloud)
plt.xticks([]); plt.yticks([])
([], <a list of 0 Text yticklabel objects>)

在这里插入图片描述

标签比例分析

由于文本问答的特殊性,数据集同时包含了人类文本和对应的 ChatGPT 文本,不配对的文本已经在数据清洗时丢弃,标签分布非常均匀。

# 标签分布图
data["label"].value_counts().plot(kind="pie").text(1, 1, f"{data['label'].value_counts()}")
Text(1,1,'1    9991\n0    9990\nName: label, dtype: int64')

在这里插入图片描述

模型训练

# 按照 10% 的比例划分训练集与验证集
train_data, valid_data = train_test_split(data, test_size=0.1)train_dict = train_data.to_dict(orient='records')
valid_dict = valid_data.to_dict(orient='records')
train_ds = MapDataset(train_dict)
valid_ds = MapDataset(valid_dict)
train_loader = DataLoader(train_dict, batch_size=2, shuffle=True)
valid_loader = DataLoader(valid_dict, batch_size=2)with LogWriter(logdir="/home/aistudio/log/ernie/train") as writer:for epoch in range(30):# 训练过程model.train()for batch_x in tqdm(train_loader):X = tokenizer(batch_x["text"], max_length=70, padding=True)input_ids = paddle.to_tensor(X['input_ids'], dtype="int32")token_type_ids = paddle.to_tensor(X['token_type_ids'], dtype="int32")pred = model(input_ids, token_type_ids)loss = loss_fn(pred, paddle.to_tensor(batch_x["label"], dtype="int32"))loss.backward()optimizer.step()optimizer.clear_gradients()# 验证过程model.eval()val_loss = []with paddle.no_grad():for batch_x in tqdm(valid_loader):X = tokenizer(batch_x["text"], max_length=70, padding=True)input_ids = paddle.to_tensor(X['input_ids'], dtype="int32")token_type_ids = paddle.to_tensor(X['token_type_ids'], dtype="int32")pred = model(input_ids, token_type_ids)loss = loss_fn(pred, paddle.to_tensor(batch_x["label"], dtype="int32"))val_loss.append(loss.item())writer.add_scalar(tag="loss", step=epoch, value=np.mean(val_loss))print('Epoch {0}, Val loss {1:3f}, Val Accuracy {2:3f}'.format(epoch,np.mean(val_loss), (pred.argmax(1) == batch_x["label"]).astype('float').mean().item()))
# 保存Layer参数
paddle.save(model.state_dict(), "/home/aistudio/model.pdparams")
# 保存优化器参数
paddle.save(optimizer.state_dict(), "/home/aistudio/optimizer.pdopt")

训练参数载入

# 载入模型参数、优化器参数和最后一个epoch保存的检查点
layer_state_dict = paddle.load("/home/aistudio/work/model.pdparams")
opt_state_dict = paddle.load("/home/aistudio/work/optimizer.pdopt")# 将load后的参数与模型关联起来
model.set_state_dict(layer_state_dict)
optimizer.set_state_dict(opt_state_dict)

如果想使用已训练好的模型,直接运行下面的代码

# layer_state_dict = paddle.load("/home/aistudio/data/model.pdparams")
# model.set_state_dict(layer_state_dict)

模型预测

def infer(string):softmax = paddle.nn.Softmax()X = tokenizer([string], max_length=70, padding=True)input_ids = paddle.to_tensor(X['input_ids'], dtype="int32")token_type_ids = paddle.to_tensor(X['token_type_ids'], dtype="int32")pred = model(input_ids, token_type_ids)print(f"text: {string}\n")print(f"label: {pred.argmax(1)} \n probability: {softmax(pred).max().item()}")

标签为 0 的代表可能是人类撰写的文本

infer("根据你的描述属于检查肾脏感染的,需要检查确诊后治疗,配合抗生素抗感染治疗,清热解毒治疗,增加营养补充维生素补充蛋白质。,对患者来说,泌尿外科疾病问题一直困扰患者,病情严重就要及时对症治疗,合理用药,否则会导致疾病再次病发,除此之外,患者还需要保持心情愉快,以免加重病情,这样有利于健康恢复!")
text: 根据你的描述属于检查肾脏感染的,需要检查确诊后治疗,配合抗生素抗感染治疗,清热解毒治疗,增加营养补充维生素补充蛋白质。,对患者来说,泌尿外科疾病问题一直困扰患者,病情严重就要及时对症治疗,合理用药,否则会导致疾病再次病发,除此之外,患者还需要保持心情愉快,以免加重病情,这样有利于健康恢复!label: Tensor(shape=[1], dtype=int64, place=Place(cpu), stop_gradient=True,[0]) probability: 0.9999372959136963

标签为 1 的代表可能由 ChatGPT 生成

infer("我无法确定招联好期贷是否是正规的。如果你对这家公司有任何疑问,我建议你直接向他们进行询问,或者向相关主管部门寻求帮助。")
text: 我无法确定招联好期贷是否是正规的。如果你对这家公司有任何疑问,我建议你直接向他们进行询问,或者向相关主管部门寻求帮助。label: Tensor(shape=[1], dtype=int64, place=Place(cpu), stop_gradient=True,[1]) probability: 0.9999421834945679

834945679

总结与展望

本项目很大程度上参考了:2022人民网算法赛:微博话题识别任务(ERNIE文本分类)。

目前只是用了非常简单的方式来进行直接的文本分类,但是在实际文本中检测时效果不错,并且不仅适用于 ChatGPT,同样适用于 文心一言New Bing 等 LLMs。在 How Close is ChatGPT to Human Experts? Comparison Corpus, Evaluation, and Detection,作者们从多个方面分析了预测 ChatGPT 文本的可行性,并且发布了 Demo,非常值得一读。

同类项目还有 DetectGPT: Zero-Shot Machine-Generated Text Detection using Probability Curvature 和 GPTZero。

本项目还有很多可以改进和深入挖掘的工作:

  • 预测限制在 70 词,在文字数量较少的情况下,模型预测不稳定,容易出现误判。
  • 如维基百科等结构化的人类文本容易误判为 ChatGPT 生成。
  • 目前数据集话题覆盖不充分,只适用于特定领域的文本。
  • 模型结构简单,后续可以加入对抗训练来增强模型的稳健性

此文章为转载
原文链接

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python对文本进行分词

Python对文本进行分词 在自然语言处理&#xff08;NLP&#xff09;领域中&#xff0c;对文本进行分词是一个重要的预处理步骤。分词的目的是将一段文本切割成由词语组成的序列&#xff0c;为后续的处理提供基础。 Python在NLP任务中是广泛使用的编程语言之一&#xff0c;有许…

chatgpt赋能python:Python中文文本预处理

Python中文文本预处理 Python作为一门广泛应用于数据分析、机器学习和人工智能的编程语言&#xff0c;在处理中文文本方面也有不可忽视的优势。但是由于中文特殊性&#xff0c;中文文本预处理也有独特的需求。本文将介绍在Python中进行中文文本预处理的常见操作。 分词 分词…

DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍

DeepSpeed is a deep learning optimization library that makes distributed training and inference easy, efficient, and effective. www.deepspeed.ai/ DeepSpeed Integration DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍

使用EasyExcel导入导出Excel

在管理一个系统时&#xff0c;总会有许多的数据&#xff0c;为了方便浏览查看数据&#xff0c;系统总会提供「导出Excel」的功能&#xff1b;有导出就有导入&#xff0c;在要向数据库中插入大量的数据时&#xff0c;我们向程序提供准备好的 Excel&#xff0c;然后程序读取表格内…

EasyExcel导入导出,处理数据

1.导出模块,导出中有中文文件名称&#xff0c;设置格式 /*** 以流方式响应回给客户端&#xff0c;返回值类型设置成void** param response 输出excel表格&#xff0c;让用户下载*/PostMapping("/exportExcel")public void exportExcel(ZqRewardProjectContract zqRew…

QT常用表格导出为Excel以及Excel导入表格

表格导出为Excel 注意&#xff1a;演示所用到的软件为Qt5.14.2&#xff0c;编译器为MinGW 64-bit&#xff0c;电脑必须装有office所用的类为 QAxObject&#xff0c;QAxObject可以实例化为一个空对象&#xff0c;使用它应该封装的COM对象的名称&#xff0c;或者使用一个指向表示…

获取微信的聊天记录导出为Excel

获取微信的聊天记录导出为Excel ios端 1.工具2.步骤 1.工具 iTunes楼月免费iTunes备份管理器DB Browser for SQLitepython 2.步骤 通过iTunes备份ipone中的数据到电脑上&#xff0c; 打开楼月免费iTunes备份管理器选择备份的记录 导出 微信个人信息中的DB文件夹 使用 DB Br…

Excel表格的导入导出——EasyExcel

参考视频 csdn参考地址 一、导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version> </dependency>二、实体类 方式一&#xff1a;Excel Property&#xff08;&…

Easyexcel导入导出多个sheet

EasyExcel对于导入导出的操作十分简洁&#xff0c;记录一下多个sheet且内容不一致的导入导出。 引入 easyExcel依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.1</version></d…

EasyExcel实现Excel文件多sheet导入导出

一、概述 最近公司需要做一个需求&#xff0c;通过excel上传病例信息&#xff0c;并将病例信息进行归档和整理&#xff1b;该需求可以简化为excel模板下载和excel上传并解析归档。既然知道需求了&#xff0c;找excel的操作工具jar包吧&#xff0c;发现以前常用的poi需要写的代…

导入导出excel表格EasyExcel操作

一、添加依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.3</version> </dependency>二、创建实体类 /*** 创建User类,用于构建向Excel表格中写数据的类型;* ExcelPropert…

EasyExcel的导入导出使用

1、说明 EasyExcel是阿里出的一款基于Java的、快速、简洁、解决大文件内存溢出的处理Excel的开源工具&#xff0c;本文主要是使用这个工具对Excel导入导出进行讲解。 官网&#xff1a; https://easyexcel.opensource.alibaba.com/github&#xff1a; https://github.com/alib…

EasyExcel实现execl导入导出

引言 在实际开发中&#xff0c;处理 Excel 文件是一个常见的需求。EasyExcel 是一个基于 Java 的开源库&#xff0c;提供了简单易用的 API&#xff0c;可以方便地读取和写入 Excel 文件。本文将介绍如何使用 EasyExcel 实现 Excel 导入功能&#xff0c;以及一些相关的技巧和注…

导入Excel---post提交通用版

前端界面 通过点击导入弹出一个文本框下载导入的模板 直接进入代码实现环节: 前端部分添加导入按钮: <a href"javascript:;" class"btn btn-primary radius professional_btn">导入</a> 导入的文本框 //导入 $(".professional_btn&qu…

EasyExcel实现Excel文件导入导出

1 EasyExcel简介 EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址: https://github.com/alibaba/easyexcel 官方文档: https://www.yuque.com/easyexcel/doc/easyexcel B站视频: https://www.bilib…

导出Excel表格(调用后端接口方式)

在开发中我们会遇到导出Excel表格的需求&#xff0c;但是导出分为前端生成和后端生成。 前端生成的方式CSDN其他小伙伴已经做出了很多教程&#xff0c;是依赖 xlsx插件。 但是&#xff0c;今天我讲的是&#xff0c;调用后端接口的方式生成Excel表格。 1.调用后端提供的导出接口…

如何快速构建网站chatgpt插件

在本文中&#xff0c;我们将一步一步地探索并构建一个名为"AI Prompt Testing"的项目。该项目是一个网站插件&#xff0c;旨在帮助网站生成一个ChatGPT提示测试题&#xff0c;以巩固当前网页的内容。 1、抽象提取 这个网站chatgpt插件大概的效果&#xff0c;类比的…

【ChatGPT】ChatGPT 高质量资源列表:3000 多个提示、示例、用例、工具、API、扩展、失败和其他资源的集合。

ChatGPT 高质量资源列表:3000 多个提示、示例、用例、工具、API、扩展、失败和其他资源的集合。 更新了 4 月 25 日,集成自治代理 AI 部分。 图片来源:作者,Midjourney。 目录 ChatGPT 高质量资源列表:3000 多个提示、示例、用例、工具、API、扩展、失败和其他资源的集合。…

伟大的创造不是计划出来的!来自OpenAI科学家的反直觉建议

来源 | 中国企业家杂志 每天几乎从一睁眼&#xff0c;我们的工作与生活都会被大大小小的目标所牵引。 诚然&#xff0c;若只想实现一些普普通通的小愿望&#xff0c;那么目标导向会非常有效。但对于那些与探索创造、创新发明有关的愿望&#xff0c;目标还有效吗&#xff1f; 近…

GitHub放大招!CEO现场挑战18分钟开发小游戏,人还在台上网友已经玩到了

梦晨 明敏 发自 凹非寺量子位 | 公众号 QbitAI GitHub CEO&#xff0c;直播AI写代码&#xff0c;挑战18分钟完成一个小游戏。 结果只用了不到15分钟&#xff0c;直接成功在线部署&#xff0c;这边人还在讲台上&#xff0c;全球网友已经能玩上了。 整个项目从一片空白的新建文件…