引入

  • 上一篇文章介绍了如何使用Paddle2.0构建了GPT-2模型
  • 本次就使用之前构建好的模型加载清源CPM-LM模型参数来实现简单的问答机器人

效果展示

  • 支持问答和古诗默写两个模式

快速体验

  • 可以在百度AIStudio平台上快速体验这个项目:链接

清源 CPM

  • 清源 CPM (Chinese Pretrained Models) 是北京智源人工智能研究院和清华大学研究团队合作开展的大规模预训练模型开源计划
  • 清源计划是以中文为核心的大规模预训练模型
  • 首期开源内容包括预训练中文语言模型和预训练知识表示模型,可广泛应用于中文自然语言理解、生成任务以及知识计算应用
  • 所有模型免费向学术界和产业界开放下载,供研究使用
  • 清源 CPM 项目官网、Github

加载 CPM-LM 模型参数

  • 通过下面的代码就可以使用之前构建的GPT-2模型来加载CPM-LM的参数了
  • 适用于Paddle平台的CPM-LM 模型参数可以在这里下载
  • 由于官方提供的模型参数为FP16半精度储存,所以加载时需要提前将参数转换为FP32格式
  • 其他地方与加载普通模型并无差别
import paddle
from GPT2 import GPT2Model# 初始化GPT-2模型
model = GPT2Model(vocab_size=30000,layer_size=32,block_size=1024,embedding_dropout=0.0,embedding_size=2560,num_attention_heads=32,attention_dropout=0.0,residual_dropout=0.0)# 读取CPM-LM模型参数(FP16)
state_dict = paddle.load('CPM-LM.pdparams')# FP16 -> FP32
for param in state_dict:state_dict[param] = state_dict[param].astype('float32')# 加载CPM-LM模型参数
model.set_dict(state_dict)# 将模型设置为评估状态
model.eval()

问答机器人实现方式

  • CPM-LM有着不错的few-shot文本生成的能力,即可以通过输入几个样例,然后能够学习样例进行对应的文本生成,就像下面这样:
  • ps. 下面的代码仅为演示,其中的model指代的不是上面的那个model
inputs = '''默写古诗:
日照香炉生紫烟,遥看瀑布挂前川。
飞流直下三千尺,'''
outputs = model.predict(inputs, max_len=10, end_word='\n')
print(inputs+outputs)

默写古诗:
日照香炉生紫烟,遥看瀑布挂前川。
飞流直下三千尺,疑是银河落九天。

inputs = '''问题:西游记是谁写的?
答案:'''
outputs = model.predict(inputs, max_len=10, end_word='\n')
print(inputs+outputs)

问题:西游记是谁写的?
答案:吴承恩。

inputs = '''小明决定去吃饭,小红继续写作业
问题:去吃饭的人是谁?
答案:'''
outputs = model.predict(inputs, max_len=10, end_word='\n')
print(inputs+outputs)

小明决定去吃饭,小红继续写作业
问题:去吃饭的人是谁?
答案:小明

inputs = '''默写英文:
狗:dog
猫:'''
outputs = model.predict(inputs, max_len=10, end_word='\n')
print(inputs+outputs)

默写英文:
狗:dog
猫:cat

  • 所以只需要通过拼接几个简单的few-shot预测函数,就可以实现一个简单的问答机器人

问答机器人程序代码

  • 下面通过代码简单了解一下程序的运行流程
  • 具体的代码详情参考本人的GitHub项目CPM-Generate-Paddle
  • 与官方开源项目使用的采样的解码方式不同
  • 本项目解码时使用到的是最简单的Greedy Search,所以相同输入对应的输出是唯一的
  • 于是乎本项目不太适合生成文章类的文本,因为生成的结果过于固定
import paddle
import argparse
import numpy as np
from GPT2 import GPT2Model, GPT2Tokenizer# 参数设置
parser = argparse.ArgumentParser()
parser.add_argument("--pretrained_model", type=str, required=True, help="the detection model dir.")
args = parser.parse_args()# 初始化GPT-2模型
model = GPT2Model(vocab_size=30000,layer_size=32,block_size=1024,embedding_dropout=0.0,embedding_size=2560,num_attention_heads=32,attention_dropout=0.0,residual_dropout=0.0)print('正在加载模型,耗时需要几分钟,请稍后...')# 读取CPM-LM模型参数(FP16)
state_dict = paddle.load(args.pretrained_model)# FP16 -> FP32
for param in state_dict:state_dict[param] = state_dict[param].astype('float32')# 加载CPM-LM模型参数
model.set_dict(state_dict)# 将模型设置为评估状态
model.eval()# 加载编码器
tokenizer = GPT2Tokenizer('GPT2/bpe/vocab.json','GPT2/bpe/chinese_vocab.model',max_len=512)# 初始化编码器
_ = tokenizer.encode('_')print('模型加载完成.')# 基础预测函数
def predict(text, max_len=10):ids = tokenizer.encode(text)input_id = paddle.to_tensor(np.array(ids).reshape(1, -1).astype('int64'))output, cached_kvs = model(input_id, use_cache=True)nid = int(np.argmax(output[0, -1].numpy()))ids += [nid]out = [nid]for i in range(max_len):input_id = paddle.to_tensor(np.array([nid]).reshape(1, -1).astype('int64'))output, cached_kvs = model(input_id, cached_kvs, use_cache=True)nid = int(np.argmax(output[0, -1].numpy()))ids += [nid]# 若遇到'\n'则结束预测if nid==3:breakout.append(nid)print(tokenizer.decode(out))# 问答
def ask_question(question, max_len=10):predict('''问题:中国的首都是哪里?答案:北京。问题:李白在哪个朝代?答案:唐朝。问题:%s答案:''' % question, max_len)# 古诗默写
def dictation_poetry(front, max_len=10):predict('''默写古诗:白日依山尽,黄河入海流。%s,''' % front, max_len)# 主程序
mode = 'q'
funs = ask_question
print('输入“切换”更换问答和古诗默写模式,输入“exit”退出')
while True:if mode == 'q':inputs = input("当前为问答模式,请输入问题:")else:inputs = input("当前为古诗默写模式,请输入古诗的上半句:")if inputs=='切换':if mode == 'q':mode = 'd'funs = dictation_poetryelse:mode = 'q'funs = ask_questionelif inputs=='exit':breakelse:funs(inputs)

总结

  • 通过简单实现的两个few-shot的预测函数,就能构建这样的一个简单的问答机器人,实现问答和古诗默写的功能
  • 通过这个例子可以看出,CPM-LM模型的few-shot文本生成能力还是不错的,甚至zero-shot的表现也不错,这样的一个超大的中文预训练模型,确实有那么一点GPT-3的味道了

使用GPT-2加载CPM-LM模型实现简单的问答机器人相关推荐

  1. 【深度学习】Keras加载权重更新模型训练的教程(MobileNet)

    [深度学习]Keras加载权重更新模型训练的教程(MobileNet) 文章目录 1 重新训练 2 keras常用模块的简单介绍 3 使用预训练模型提取特征(口罩检测) 4 总结 1 重新训练 重新建 ...

  2. 超图桌面版加载obj 3D模型 - 2

    在 https://blog.csdn.net/bcbobo21cn/article/details/109041525 里,加载obj格式模型没有出来效果: 下面来看一下其他方法:当前用的版本是10 ...

  3. 超图桌面版加载obj 3D模型

    根据目前看到的资料帮助,使用超图桌面版加载obj 3D模型的步骤如下: 新建场景,图层管理器---普通图层右键,新建KML----开启KML可编辑,右键添加模型. 下面来操作一下: 下一个obj模型: ...

  4. opengl加载显示3D模型UC类型文件

    opengl加载显示3D模型UC类型文件 前置条件 注意事项 项目展示 项目完整C++源代码 前置条件 opengl三方库freeglut,显示uc格式的三维模型文件, 注意事项 源代码 model_ ...

  5. opengl加载显示3D模型3d类型文件

    opengl加载显示3d模型UC类型文件 前置条件 注意事项 项目展示 项目完整C++源代码 前置条件 opengl三方库freeglut,显示3d格式的三维模型文件, 注意事项 源代码 model_ ...

  6. opengl加载显示3DS模型3DS类型文件

    opengl加载显示3DS模型UC类型文件 前置条件 注意事项 项目展示 项目完整C++源代码 前置条件 opengl三方库freeglut,显示3DS格式的三维模型文件 注意事项 源代码 model ...

  7. opengl加载显示3D模型3MF类型文件

    opengl加载显示3D模型3MF类型文件 前置条件 注意事项 项目展示 项目完整C++源代码 前置条件 opengl三方库freeglut,显示3MF格式的三维模型文件 注意事项 源代码 model ...

  8. opengl加载显示3D模型AC类型文件

    opengl加载显示3D模型AC类型文件 前置条件 注意事项 项目展示 项目完整C++源代码 前置条件 opengl三方库freeglut,显示AC格式的三维模型文件 注意事项 源代码 model_f ...

  9. opengl加载显示3D模型AMF类型文件

    opengl加载显示3D模型AMF类型文件 前置条件 注意事项 项目展示 项目完整C++源代码 前置条件 opengl三方库freeglut,显示AMF格式的三维模型文件 注意事项 源代码 model ...

最新文章

  1. 【VS开发】【智能语音处理】Windows下麦克风语音采集
  2. 福利 | 零基础学习Python量化交易 !(深圳)
  3. LinearLayout 里面放入一个超宽的TextView
  4. C++与JAVA语言区别
  5. java 画图板源代码_非常值得学习的java 绘图板源代码
  6. Python的scrapy框架POST方式爬虫时碰见__VIEWSTATE和__EVENTVALIDATION的参数处理
  7. 系统学习机器学习之半参数方法(一)--基于距离
  8. nfine框架 上传文件_NFine快速开发框架
  9. Excel常用统计分析函数分享
  10. Java HttpUtils 请求工具类
  11. 1.深入浅出:理解三极管截止、放大和饱和状态!——参考《模拟电子技术基础》清华大学华成英主讲
  12. 机器学习中各分类算法的优缺点比较
  13. 网络爬虫-抓取酷航机票信息
  14. 使用Linux搭建软路由
  15. 淘宝之初:湖畔花园小区里诞生的巨人
  16. elasti 时间范围查询
  17. ASEMI代理AD8603AUJZ-REEL7原装ADI车规级AD8603AUJZ-REEL7
  18. 全志平台WiFi无法连接AP问题调试(1)问题分析
  19. 赋值运算符重载和日期运算代码
  20. PHP接入网易易盾验证码

热门文章

  1. VAE和AAE的主要区别
  2. lasagne 错误解决 ImportError: cannot import name downsample
  3. OpenWBS 企业商城系统(手机端 PC端 微信 分销)
  4. AQR:趋势跟踪不仅仅是量价趋势
  5. 100多个免费API接口分享,调用完全不限次数
  6. HUD2222 Keywords Serch AC自动机
  7. 动态场景下基于实例分割的SLAM(毕业设计开题及语义分割部分)
  8. 产品在设计上,如何为用户创造惊喜
  9. 基金投资好简单,从入门到精通 -学习笔记day10
  10. 求助:IDEA Swing 中文 方块 乱码 字体