./tutorial/9_UltraChat.py。pip install openprompt提示学习(Prompt-learning) 是使预训练语言模型(PLMs)适应下游 NLP 任务的最新范式,它通过文本模板修改输入文本,并直接使用 PLM 执行预训练任务。本库提供了一个标准、灵活且可扩展的框架来部署提示学习流程。OpenPrompt 支持直接从 huggingface transformers 加载 PLM。未来,我们也将支持其他库实现的 PLM。关于提示学习的更多资源,请查阅我们的论文列表。

注意:请使用 Python 3.8+ 运行 OpenPrompt
我们的仓库在 Python 3.8+ 和 PyTorch 1.8.1+ 环境下测试通过,使用 pip 安装 OpenPrompt 如下:
pip install openprompt
如果你想体验最新功能,也可以从源码安装。
从 GitHub 克隆仓库:
git clone https://github.com/thunlp/OpenPrompt.git
cd OpenPrompt
pip install -r requirements.txt
python setup.py install
修改代码后,使用以下命令进行开发模式安装:
python setup.py develop
一个 PromptModel 对象包含一个 PLM、一个(或多个)Template 以及一个(或多个)Verbalizer。其中,Template 类用于使用模板包装原始输入,Verbalizer 类用于在当前词汇表中构建标签与目标词之间的映射。PromptModel 对象实际参与训练和推理过程。
借助 OpenPrompt 的模块化和灵活性,你可以轻松开发一个提示学习流程。
第一步是确定当前的 NLP 任务,思考你的数据是什么样子以及你想从数据中得到什么!也就是说,这一步的本质是确定任务的 classes 和 InputExample。为简单起见,我们以情感分析为例。
from openprompt.data_utils import InputExample
classes = [ # 情感分析中有两个类别,一个代表负面,一个代表正面
"negative",
"positive"
]
dataset = [ # 为简单起见,这里只有两个示例
# text_a 是数据的输入文本,有些数据集的一个示例中可能包含多个输入句子。
InputExample(
guid = 0,
text_a = "Albert Einstein was one of the greatest intellects of his time.",
),
InputExample(
guid = 1,
text_a = "The film was badly made.",
),
]
选择一个 PLM 来支持你的任务。不同的模型具有不同的属性,我们鼓励你使用 OpenPrompt 探索各种 PLM 的潜力。OpenPrompt 兼容 huggingface 上的模型。
from openprompt.plms import load_plm
plm, tokenizer, model_config, WrapperClass = load_plm("bert", "bert-base-cased")
Template 是对原始输入文本的修饰器,也是提示学习中最重要的模块之一。我们在步骤 1 中已经定义了 text_a。
from openprompt.prompts import ManualTemplate
promptTemplate = ManualTemplate(
text = '{"placeholder":"text_a"} It was {"mask"}',
tokenizer = tokenizer,
)
Verbalizer 是提示学习中另一个重要(但非必需)的模块,它将原始标签(我们已将其定义为 classes,还记得吗?)映射到一组标签词。这里是一个示例:我们将 negative 类映射到单词 bad,将 positive 类映射到单词 good、wonderful、great。
from openprompt.prompts import ManualVerbalizer
promptVerbalizer = ManualVerbalizer(
classes = classes,
label_words = {
"negative": ["bad"],
"positive": ["good", "wonderful", "great"],
},
tokenizer = tokenizer,
)
给定任务,现在我们有了 PLM、Template 和 Verbalizer,我们将它们组合成一个 PromptModel。请注意,尽管这个示例简单地将三个模块组合在一起,但实际上你可以在它们之间定义一些复杂的交互。
from openprompt import PromptForClassification
promptModel = PromptForClassification(
template = promptTemplate,
plm = plm,
verbalizer = promptVerbalizer,
)
PromptDataLoader 基本上是 PyTorch Dataloader 的提示学习版本,它还包含一个 Tokenizer、一个 Template 和一个 TokenizerWrapper。
from openprompt import PromptDataLoader
data_loader = PromptDataLoader(
dataset = dataset,
tokenizer = tokenizer,
template = promptTemplate,
tokenizer_wrapper_class=WrapperClass,
)
完成!我们可以像 PyTorch 中的其他流程一样进行训练和推理。
import torch
# 使用预训练的 MLM 和提示进行零样本推理
promptModel.eval()
with torch.no_grad():
for batch in data_loader:
logits = promptModel(batch)
preds = torch.argmax(logits, dim = -1)
print(classes[preds])
# 对于类别 'positive', 'negative',预测结果将是 1, 0
我们在 dataset/ 文件夹中提供了一系列下载脚本,欢迎使用它们下载基准测试数据集。
OpenPrompt 支持太多可能的组合。我们正在尽力尽快测试不同方法的性能。性能结果将持续更新到表格中。我们也鼓励用户为自己的任务寻找最佳超参数,并通过提交 Pull Request 来报告结果。
未来主要的改进/增强方向:
如果你在工作中使用了 OpenPrompt,请引用我们的论文。
@article{ding2021openprompt,
title={OpenPrompt: An Open-source Framework for Prompt-learning},
author={Ding, Ning and Hu, Shengding and Zhao, Weilin and Chen, Yulin and Liu, Zhiyuan and Zheng, Hai-Tao and Sun, Maosong},
journal={arXiv preprint arXiv:2111.01998},
year={2021}
}
我们感谢所有对本项目做出贡献的人,欢迎更多贡献者!