本文为社区成员 Jun Chen 为 百姓 AI 和 Hugging Face 联合举办的黑客松所撰写的教程文档,欢迎你阅读今天的第二条推送了解和参加本次黑客松活动。文内含有较多链接,我们不再一一贴出,请在文末查看渲染后的 Notebook 文件链接。
随着人工智能和大模型 ChatGPT 的持续火爆,越来越多的个人和创业者都想并且可以通过自己创建人工智能 APP 来探索这个新兴领域的机会。只要你有一个想法,你就可以通过各种开放社区和资源实现一些简单功能,满足特定领域或者用户的需求。
试想现在有一部新的电影刚刚上线了,我们和朋友在家热烈的讨论着这部新的电影,这些都是非常有价值的电影评价的信息,不过估计这个时候很少有人会特地去登陆自己的豆瓣账号再去发表这些刚刚的评论,如果有一个电影评论机器人可以自动收集这些评论并且根据评论打分,然后自动上传到制定的电影评论网站呢?再比如,我们在某个餐厅吃饭,我们只用对着手机说几句话,我们的评分就自动上传到大众点评呢?我们来试试如何实现这样一个小小的机器人吧!
在本教程中,我们将探索如何使用 Hugging Face 资源来 Finetune 一个模型且构建一个电影评分机器人。我们将向大家展示如何整合这些资源,让你的聊天机器人具备总结评论并给出评分的功能。我们会用通俗易懂的语言引导你完成这个有趣的项目!
为了可以简单的说明实现的步骤,我们简化这个【电影打分机器人】的实现方法:
App 直接收集来自 input
的 text
作为输入,有兴趣的小伙伴们可以研究一下如何接入到语音,Whisper to ChatGPT 是一个很有好的例子。
App 不会实现自动上传评价到特定网站。
首先我们需要一个可以看懂评论且给评论打分的模型,这个例子选用的是利用数据集 IMDb 微调 DistilBERT,微调后的模型可以预测一个电影的评论是正面的还是负面的且给出评分(五分满分)。
当然大家可以根据各自的需求找到不同的数据集来 Finetune 模型,也可以使用不同的基础模型,Hugging Face 上提供了很多可选项。
本任务使用或间接使用了下面模型的架构:
ALBERT, BART, BERT, BigBird, BigBird-Pegasus, BLOOM, CamemBERT, CANINE, ConvBERT, CTRL, Data2VecText, DeBERTa, DeBERTa-v2, DistilBERT, ELECTRA, ERNIE, ErnieM, ESM, FlauBERT, FNet, Funnel Transformer, GPT-Sw3, OpenAI GPT-2, GPT Neo, GPT-J, I-BERT, LayoutLM, LayoutLMv2, LayoutLMv3, LED, LiLT, Longformer, LUKE, MarkupLM, mBART, Megatron-BERT, MobileBERT, MPNet, MVP, Nezha, Nyströmformer, OpenAI GPT, OPT, Perceiver, PLBart, QDQBert, Reformer, RemBERT, RoBERTa, RoBERTa-PreLayerNorm, RoCBert, RoFormer, SqueezeBERT, TAPAS, Transformer-XL, XLM, XLM-RoBERTa, XLM-RoBERTa-XL, XLNet, X-MOD, YOSO
在使用本示例前请安装如下库文件:
我们建议登陆 Hugging Face 账户进行操作,这样就可以方便的上传和分享自己创建的模型。当有弹框时请输入个人的 token 。根据下图找到我们自己的 Hugging Face Tokens。
开始从 Datasets 库中加载 IMDb 数据集 🤗 :
检查一下数据是否载入成功:
在这个数据集中有两个字段:
text
: 电影评论。
label
: 0 或者 1。0
代表负面评价、1
代表正面评价。
这一步是加载 DistilBERT tokenizer,并创建一个预处理函数来预处理 text
,且保证输入不会大于 DistilBERT 的最长输入要求:
使用 🤗 Datasets map 函数把预处理函数应用到整个数据集中。我们还可以使用 batched=True
来加速 map
:
使用 DataCollatorWithPadding 来生成数据包,这样动态的填充数据包到最大长度能够更加节省资源。
模型评测函数
选择一个合适的测评指标是至关重要的。大家可以直接调用库函数 🤗 Evaluate 里的各种测评指标。在这个例子中,我们使用了accuracy,了解更多请 查看文档快速上手:
这里我们需要定义一个可以 计算 指标的函数:
训练模型
在开始训练前,需要定义一个id到标签和标签到id的 map
:
如果不熟悉如何使用 Trainer 来训练模型, 可以查看更详细的教程!
好了,一切已经准备就绪!我们可以使用 AutoModelForSequenceClassification 加载 DistilBERT 模型:
接下来只有三步需要完成:
在 TrainingArguments 中定义模型超参,只有 output_dir
参数是必须的。我们可以设置 push_to_hub=True
来直接上传训练好的模型(如果已经登陆了Hugging Face)。在每一个训练段,Trainer 都会评测模型的 accuracy 和保存此节点。
传入超参数,模型,数据集和评测函数到 Trainer。
调用 train() 来微调模型。
训练结束后大家就可以通过 push_to_hub() 方法 上传模型到 Hugging Face 上了,这样所有人都可以看见并且使用你的模型了。
大家可以在 PyTorch Notebook或者 TensorFlow Notebook 查看更加详细的关于如何微调模型的教程。
恭喜大家已经获得了自己的模型!下面我们可以在 Hugging Face 中创建一个自己的 App 了。
在 Spaces 主页上点击 Create new Space
。
在 app.py
文件中接入以下代码:
成功运行后,大家应该可以看见下面类似的界面:
注意,我们需要把必须的库文件放在 requirements.txt
中,例如这个 App 需要:
另外,由于我们在示范中只跑了 2 个 epoch,所以最终模型 accuracy 不高。大家可以根据自己的情况调整超参和训练时长。
而且 app.py
以及 requirements.txt
文件,都可以在 Hugging Face Hub 的界面上直接操作,如下图:
现在,你已经创建了一个能够根据电影评论给电影打分的机器人。当你向机器人提问时,它会使用 Hugging Face 的模型进行情感分析,根据情感分析结果给出一个评分。
chjun/movie_rating_bot 是根据以上教程完成的一个机器人 App,大家也可以直接复制这一个 Space 应用,并在此基础上更改开发。
点击 submit
,与你的 AI 伙伴互动吧!这个项目仅仅是一个起点,你可以根据自己的需求和兴趣进一步完善这个聊天机器人,使其具备更多有趣的功能。
还有更激动人心的一步,我们可以把机器人接口根据 BaixingAI 机器人广场需求 扩展,让我们自己创建的机器人可以去和其他机器人交流对话,以下是代码示范:
更多详情请参考 Hugging Face 上 baixing 的 Spaces:
https://hf.co/baixing
渲染后的 Notebook 文件: https://ipynb.cn/urls/huggingface.co/datasets/HuggingFace-CN-community/translation/raw/main/events/movie_rating_bot_FINAL.ipynb
未来已来,各位 Hackathon 参赛者们都是探索者,预祝大家一切顺利!