与其他 ChatGPT 不同,但在这里我们将尝试了解如何将promptify与 ChatGPT 等 LLM(大型语言模型)一起使用来执行命名实体识别(NER),以及这种方法如何比直接使用 ChatGPT 更为稳健。
实体可以定义为文本中的关键信息。实体可以是单个单词或一组单词。命名实体识别(NER)可以定义为识别和分类 文本中的实体(关键信息)的过程。
这里的人、国家和职位是实体所属的组/类,识别这些实体及其所属组的过程称为命名实体识别(NER)。
像 ChatGPT 这样的 LLM 的输入和输出通常是纯非结构化文本,但是当你将它与某些参数(其中许多是可选的)一起通过 promptify 时,promtify 会向这些 LLM 发送一个结构化的输入,这相当于提出一个结构正确的问题,这将有助于这些 LLM 更好地理解问题。然后,LLM 的输出将作为python 对象返回。
我们将要求 ChatGPT 对纯文本执行命名实体识别,我们还将判断输入句子属于哪个域,然后我们将尝试使用 promptify 提供相同的输入并观察响应。
ChatGPT 输出结构很有可能在重试时发生变化,并且在应用程序中使用此输出相对困难,因为结构可能会因每个查询而异。
Promtify+ChatGPT 实体 (E) 及其对应的类/类型 (T) 作为 python 对象从 promptify 返回。您还可以观察到,当通过 promptify 传递时,会识别出更多实体。现在,相对而言,这是一个更强大的输出,可以轻松地在应用程序中使用。
现在让我们来看看 promptify 的 python 实现,代码实现是使用google colab完成的,以帮助更好地解释......
%%capture
!git clone https://github.com/promptslab/Promptify.git
!pip3 install openai
克隆 promptify 存储库并安装 openai 库
# 定义 OpenAI 模型的 API 密钥
api_key = "" # 创建 OpenAI 模型的实例,目前支持 Openai 的所有模型,未来将添加来自 Hugginface 和其他平台的更多生成模型
model = OpenAI(api_key)
nlp_prompter = Prompter(model)
创建 OpenAI 模型的一个实例并将其传递给 promptify 的Prompter,现在您有一个对象,您可以将提示与所需的参数一起传递到其中。
# 发送至 GPT 的例句
sent = "The patient is a 93-year-old female with a medical history of chronic right hip pain, osteoporosis, hypertension, depression, and chronic atrial fibrillation admitted for evaluation and management of severe nausea and vomiting and urinary tract infection"
此示例输入与医疗领域相关,涉及患者的医疗状况。
# 无标签、无描述、无样本、无示例的命名实体识别
# 带有说明的简单提示
# 域名为模型提供了更多信息以便生成更好的结果,该参数是可选的
# 输出是 python 对象-> [ {'E' : Entity Name, 'T': Type of Entity } ]
result = nlp_prompter.fit('ner.jinja',
domain = 'medical',
text_input = sent,
labels = None)
# Output
pprint(eval(result['text']))
在输出:E -实体,T -实体所属的类型/类中 ,如果您观察输出,则输出是一个Python 对象,与 ChatGPT 的原始输出相比,其结构良好。promptify 的这个功能/特性在将 LLM 与应用程序集成时非常有用。域参数是可选的,将域传递给提示将产生更精确的响应。
这并不是 promptify 的全部内容...
您还可以提供自定义标签,以便从提示中识别自定义标签及其对应的实体。
# 如果只想使用自定义标签执行 NER(处理越界预测)提示
result = nlp_prompter.fit('ner.jinja',
domain = 'medical',
text_input = sent,
labels = ["SYMPTOM", "DISEASE"])
# Output
pprint(eval(result['text']))
您可以从输出中观察到,属于所提供的自定义标签的实体已被识别。
顾名思义,一次性学习是指模型通过一次训练数据进行理解的能力。这真是太神奇了,有了 GPT 这样强大的 LLM 和 promptify 的帮助,你就可以做到这一点。
one_shot_training_data = "Leptomeningeal metastases (LM) occur in patients with breast cancer (BC) and lung cancer (LC). The cerebrospinal fluid (CSF) tumour microenvironment (TME) of LM patients is not well defined at a single-cell level. We did an analysis based on single-cell RNA sequencing (scRNA-seq) data and four patient-derived CSF samples of idiopathic intracranial hypertension (IIH)"
one_shot_labelled_training_data = [[one_shot, [{'E': 'DISEASE', 'W': 'Leptomeningeal metastases'}, {'E': 'DISEASE', 'W': 'breast cancer'}, {'E': 'DISEASE', 'W': 'lung cancer'}, {'E': 'BIOMARKER', 'W': 'cerebrospinal fluid'}, {'E': 'DISEASE', 'W': 'tumour microenvironment'}, {'E': 'TEST', 'W': 'single-cell RNA sequencing'}, {'E': 'DISEASE', 'W': 'idiopathic intracranial hypertension'}]]]
result = nlp_prompter.fit('ner.jinja',
domain = 'medical',
text_input = sent,
examples = one_shot_labelled_training_data,
labels = ["SYMPTOM", "DISEASE"])
pprint(eval(result['text']))
在这里,你只向模型提供了 1 个带标签的数据,标签为SYMPTOM
和DISEASE
,其中
E -实体所属的标签/类别
W -实体
您可以从输出中观察到,一次性训练数据中提供的特定标签(症状、疾病)的实体与其相应的标签一起被准确识别。
# 如果想在提示中给出一些领域知识和描述以增强输出
result = nlp_prompter.fit('ner.jinja',
domain = 'clinical',
text_input = sent,
examples = one_shot_labelled_training_data,
description = "以下段落摘自一位患者的出院总结。该段落描述了患者的病情和症状。",
labels = ["SYMPTOM", "DISEASE"])
pprint(eval(result['text']))
如果您具有领域知识,在上述案例中是临床领域以及有关数据内容的简短描述,那么可以在描述参数中传递该知识,这将进一步提高输出的准确性。