与其他 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完成的,以帮助更好地解释......
%�pture
!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']))
如果您具有领域知识,在上述案例中是临床领域以及有关数据内容的简短描述,那么可以在描述参数中传递该知识,这将进一步提高输出的准确性。
2023-11-29
2023-05-05
2023-01-28
2024-05-04
2023-02-18
5小时前
5小时前
5小时前
5小时前
5小时前
5小时前
5小时前
5小时前
5小时前
5小时前
金沙娱场城app copyright © 2024 金沙娱场城app-老版金沙app下载客户手机端 北京智识时代科技有限公司 金沙娱场城app的版权所有