为什么要用LLM构建数据标注工具
在LLM出现之前,传统的深度学习模型(包括CV和NLP)就已经需要大量的数据进行训练和微调。没有足够的数据,或者数据需要进行二次加工(比如标签标注),这些问题都成为限制深度学习模型泛化的关键。对于第一个问题,一般就是从网络上爬虫或者花大价钱从数据供应商购买数据;对于第二种情况,一般是找外包进行标注,这在业界非常普遍。
种类 | 优点 | 缺点 |
---|---|---|
爬虫 | 成本几乎可以忽略 | 质量参差不齐 |
买数据 | 质量符合要求 | 价格昂贵 |
标注 | 准确性足够 | 昂贵、容易泄露数据信息 |
自从Chatgpt3.5诞生以来,已经有不少公司使用Chatgpt的接口来标注自己的数据了,甚至国内知名的大模型公司也有这些操作,这是因为大家逐渐发现LLM已经可以达到和人类数据标注者相同的水平。
大模型现在已经不是什么稀罕之物了,但是为什么有的大模型效果就比别人的好很多呢?一般认为是数据质量起到决定性的作用。据网上流传的消息,OpenAI数据标注过程可是非常昂贵的,简单理解就是模型训练用到的数据可以分成好几个档次,比如生活常识、基础知识、高级知识等。对于生活常识,可能一个普通的工人就能标注,而且这类标注往往只是选择一个正确的选项即可。而基础知识类可能需要有义务教育才能解决,而且需要写出简短的解题理由。而高级知识往往是某个领域专属的数据,比如医疗、法律等,往往是需要这些专业的研究生及以上学历的人来标注,而且需要写出完整的解题思路。正因为花了大量的时间和金钱在构建高质量的数据上,才有了OpenAI如今碾压别人的表现。
话说回来,既然已经有如此多优秀的大模型开源出来了,那么对于普罗大众来说,就可以用这些模型来帮助自己、提升效率,只要不违反相应的协议即可。
用LLM构建数据标注助手
在网上找了一个中文的酒店住宿评价数据集用于本次验证模型标注能力,数据下载地址:住宿评论数据
数据预览:
# 好评,用1表示
1,在宜昌应该是排名前三位的酒店了,希望能继续得到保持,应该会成为宜昌的首选
1,外观看起来不是很起眼,房间不是很大,但是很干净,服务也不错,早餐也很丰富,比较喜欢。
1,环境优美,设施齐全,服务周到,房间舒适。
1,员工服务好,房间舒适如家,硬件设施应有尽有,保持。
...
# 差评,用0表示
0,看到网友的点评还有些不信,去了以后才知道什么叫全世界最脏,最差的酒店。
0,超级恶心的一家宾馆,入住后发现写字台窗台上到处是灰尘,非常恶心,向总台投诉后,才打扫干净!服务非常差,房间也非常差,进去后还有异味,而且床非常不舒服,感觉床单也不干净,个人感觉根本够不上星级!太恶心了,这么破的地方,晚上竟然还有人打骚扰电话,问要不要服务,什么破地方!早餐也非常恶心,根本没什么吃的!!
0,一个字,差啊,冷啊,暖气没有.空调太差!
0,服务极差,价格高,地点环境偏,房间条件能有一星..
本次使用了Chatglm3-6b-32k的模型搭建了一个本地的服务,如果用的是其他厂商提供的API,只需要修改url的内容以及传输的参数即可。如果用的是本地的模型,就把post请求替换为模型的调用即可。而且为了加快处理,用了进程池,如果用的是买的API,可能需要加个延迟防止短时间内发起太多请求。
import pandas as pd
import requests
import json
from multiprocessing import Pool
df = pd.read_csv('ChnSentiCorp_htl_all.csv')
url = 'your_llm_serve_api'
def process_text(t):
try:
prompt = f"""\
你是一个精通酒店用户评论的标注员,能准确辨别出用户的评价是正面的还是负面的。
你的任务是从用户的角度分析以下文本中的情绪,并仅用两个标签中的一个标签进行标记。
不要提供任何解释,只返回标签:正面、负面
例子:
文本: 早餐很丰富,服务也热情,早上很早退房时,前台值此人员办理手续也非常快.
标签: 正面
文本: 离机场很近,房间里的床很大,里面还有一面镜子
标签: 正面
文本: 可能是酒店比较老的缘故,房间看起来很一般,设施也比较一般.
标签: 负面
文本: 房间太小。设施太简单。服务太冷淡。不会再住。
标签: 负面
你需要标注的评论:
文本: {t}
标签: """
d = {"messages": prompt}
response = requests.post(url, data=json.dumps(d), stream=False)
r = json.loads(response.text)
return r
except Exception:
return 'ERROR'
if __name__ == '__main__':
texts = df['review'].tolist()
with Pool(processes=4) as pool: # 根据需要设置进程数量
results = pool.map(process_text, texts)
tmp = []
for t, r in zip(texts, results):
tmp.append(f"{r}[<>]{t}") # 加个符号区分标签和文本
with open('./save_res.txt', 'w') as f:
f.write('\n'.join(tmp))
效果评估
实际\预测 | 正 | 负 |
---|---|---|
正 | 4266 | 1056 |
负 | 230 | 2215 |
综合来看准确率只有83%,初步看起来不高。
距离川沙公路较近,但是公交指示不对,如果是"蔡陆线"的话,会非常麻烦.建议用别的路线.房间较为简单
早餐太差,无论去多少人,那边也不加食品的。酒店应该重视一下这个问题了。房间本身很好。
闹中取静的一个地方,在窗前能看到不错的风景。酒店价格的确有些偏高
价格偏高,好象连云港这地方的酒店都偏贵.早饭不好.房间还不错,窗外风景还行.最重要是房间的窗户很隔音.床小,还是明珠万豪的床好些.
房间设备太破,连喷头都是不好用,空调几乎感觉不到,虽然我开了最大另外就是设备维修不及时,洗澡用品感觉都是廉价货,味道很奇怪的洗头液等等...总体感觉服务还可以,设备招待所水平...
随机查看了5条模型标注为负面但标签是正面的评论,实际上这几条都没有完全好评的内容,基本上都是中性甚至偏向负面。因此实际上准确率应该在83%以上才对,这里主要还是受到数据集本身都影响。
本次虽然只测试了Chatglm3-6b-32k的模型,其他的模型如千问、llama等虽然没测,但应该都可以满足标注需求了,说明用现在的大模型来标注数据是完全可行的,能节省成本。如果怕泄漏数据那把模型部署到本地即可,这些大模型在消费级显卡上完全是跑得动的。