【2022 CCF BDCI 文心大模型创意项目】躺平借口生成器

朋友们,你们有没有遇到过以下情况,好不容易等到了假期,只想躺在床上装死,你的朋友却来找你出去玩;明明已经到了下班时间,可同事们还在工位上假装加班。

那么能不能让 AI 帮助语文水平不合格的我们,可以不用动脑子就生成相应的借口呢?

效果一览

如果“我的朋友”想“叫我出去玩”,但我作为躺平先锋,我却完全“不想出去玩”,这时候我应该说什么才能让你的朋友们“不在叫我出去玩了”,不如来问问万能的 AI 吧。

穷鬼派,“出去玩也是要花钱的”:

在这里插入图片描述

网瘾少年/女派,“人之所以要出去玩,是因为不知道家中有网络”:

在这里插入图片描述

怀疑对方水平派,“出去了又没得玩”:

在这里插入图片描述

顾左右而言他从而拖延派,“出于安全问题考虑,我要先考个驾照”:
在这里插入图片描述

当然如果下班后同事还要卷,AI也能教你阴阳怪气,“以后咱们家点个灯,大伙就都不走了”:

在这里插入图片描述

但事实上,AI是把双刃剑,当你想要涨工资时,你的老板也能用它来堵住你的口,“我们公司也有困难,现在不是要钱的时候”:

在这里插入图片描述

玩耍教程

首先创建一个百度账号,然后 fork 这个项目,只有在 fork 了这个项目后,才能自己运行它。当然,也欢迎大家点赞转发。

在这里插入图片描述

接下来,启动 fork 后的项目,启动时可以随意选择运行环境,如果只是玩耍一下这个项目,选择免费的基础版就可以了。

在这里插入图片描述

把鼠标移动到下面代码块前,然后点击运行,即可自动配置基本的环境与模型

在这里插入图片描述

#  安装环境
!pip install --upgrade paddlehub
!hub install ernie_zeus

# 下载模型
import paddlehub as hub
model = hub.Module(name='ernie_zeus')

接下来继续运行下面的代码块,定义生成借口的函数。

# 生成借口的函数
def excuse(who, do_what, i_want_to, expect_result, debug=False):
    conjunction_1 = ',但是我'
    conjunction_2 = ',于是我说:“[MASK]。”'
    conjunction_3 = '认为我说的很有道理,想都没想就同意了,'
    final_sentence = who + do_what + conjunction_1 + i_want_to + conjunction_2 + who + conjunction_3 + expect_result + '。'
    
    if debug:
        print(final_sentence)

    # 生成借口
    result = model.text_cloze(
        text=final_sentence,
        min_dec_len=2,
        seq_len=512,
        topp=1,
        penalty_score=1.2
    )

    return result

现在,你已经可以尝试修改下面的代码块中的参数并运行,让AI帮你想借口了。

其中 who 参数表示“不想让我躺平的人”,例如“我的朋友们”,do_what 参数表示“他们是如何不让我躺平的”,例如“叫我出去玩”,i_want_to 参数表示“我想怎么躺平”,例如“不想出去玩”,而最后的 expect_result 参数则表示“我期望 AI 帮我想的借口可以达到什么效果”,例如我的朋友们“不再叫我出去玩了”。

至此,你已经完全掌握了这一项目的用法,下一位糊弄学大师就此诞生了。

# 尝试生成一个借口
print(excuse(
    who='我的朋友',
    do_what='叫我出去玩',
    i_want_to = '不想出去玩',
    expect_result='不再叫我出去玩了',
    ))

原理解析

懂相关模型的同学或许已经明白了整个项目的关键,那就是使用大规模的预训练语言模型。首先构建一个包含 “事件起因,借口,事件结果”的句子,并将借口部分替换为 [MASK],让语言模型自动补全这一部分。这一思路是一种常见的 NLP 预训练手段,因此我们可以在不进行认为训练的情况下,就能调用官方预训练完成的参数实现上述效果。例如,在默认模板中,如果你的函数参数是:

print(excuse(
    who='我的朋友',
    do_what='叫我出去玩',
    i_want_to='不想出去玩',
    expect_result='不再叫我出去玩了',
    ))

传送给模型的句子其实被替换为了:

我的朋友(who变量)叫我出去玩(do_what变量),但是我不想出去玩(i_want_to变量),于是我说:“[MASK]。”我的朋友(who变量)认为我说的很有道理,想都没想就同意了,不再叫我出去玩了(expect_result变量)。

所以,你也可以尝试一下,修改掉默认的模板,从而实现更符合你自己需求的躺平借口生成器。

总结

这个项目本质上是使用了文心大模型的完形填空能力。而这个任务也是常见的一种大规模 NLP 模型的预训练方式,因此我们可以在完全不进行任何训练的前提下,通过修改 Prompt 从而实现不同的效果。挑选 Prompt 时,我们需要尽可能地使整个句子语义通顺,使用较为直白的语言,而且多次强调重点,例如在此项目默认的模板中,“认为我说的很有道理,想都没想就同意了,”这一模板就是为了更进一步的强调,“我”所说的话(即 AI 自动生成的借口)在当前场景下很合理。大家也可以尝试一下,当删除这一部分以后,模型生成的借口的合理性会有较为明显的下降。

当然除了挑选更为合适的 Prompt 模板,如果能够辅以因果推理模型,还可以让模型生成的借口更加合理。这些就留给各位自行探索了。

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐