交流平台网站怎么做不了,公司变更说明,宽屏网站尺寸,网络推广策划方案怎么写自动信息抽取发展了几十年#xff0c;虽然模型很多#xff0c;但是泛化能力很难用满意来形容#xff0c;直到LLM的诞生。虽然最终信息抽取质量部分还是需要专家审核#xff0c;但是已经极大的提高了信息抽取的效率。因为传统方法需要大量时间来完成数据清洗、标注和训练虽然模型很多但是泛化能力很难用满意来形容直到LLM的诞生。虽然最终信息抽取质量部分还是需要专家审核但是已经极大的提高了信息抽取的效率。因为传统方法需要大量时间来完成数据清洗、标注和训练然后来实体抽取、实体属性抽取、实体关系抽取、事件抽取、实体链接和指代消解等等。现在有了LLM可以实现Zero/One/Few-Shot信息抽取构建知识图谱。
一.ChatIE实现过程 ChatIE本质上是将零样本IE任务转变为一个两阶段框架的多轮问答问题使用的ChatGPT也可以修改为ChatGLM2问题是第一阶段和第二阶段如何设计本质上还是Prompt的设计。接下来都是以RE关系抽取为例进行说明NER命名实体识别和EE事件抽取以此类推。下面看一个例子如下所示
df_ret {chinese: {所属专辑: [歌曲, 音乐专辑], 成立日期: [机构, Date], 海拔: [地点, Number], 官方语言: [国家, 语言], 占地面积: [机构, Number], 父亲: [人物, 人物], 歌手: [歌曲, 人物], 制片人: [影视作品, 人物], 导演: [影视作品, 人物], 首都: [国家, 城市], 主演: [影视作品, 人物], 董事长: [企业, 人物], 祖籍: [人物, 地点], 妻子: [人物, 人物], 母亲: [人物, 人物], 气候: [行政区, 气候], 面积: [行政区, Number], 主角: [文学作品, 人物], 邮政编码: [行政区, Text], 简称: [机构, Text], 出品公司: [影视作品, 企业], 注册资本: [企业, Number], 编剧: [影视作品, 人物], 创始人: [企业, 人物], 毕业院校: [人物, 学校], 国籍: [人物, 国家], 专业代码: [学科专业, Text], 朝代: [历史人物, Text], 作者: [图书作品, 人物], 作词: [歌曲, 人物], 所在城市: [景点, 城市], 嘉宾: [电视综艺, 人物], 总部地点: [企业, 地点], 人口数量: [行政区, Number], 代言人: [企业/品牌, 人物], 改编自: [影视作品, 作品], 校长: [学校, 人物], 丈夫: [人物, 人物], 主持人: [电视综艺, 人物], 主题曲: [影视作品, 歌曲], 修业年限: [学科专业, Number], 作曲: [歌曲, 人物], 号: [历史人物, Text], 上映时间: [影视作品, Date], 票房: [影视作品, Number], 饰演: [娱乐人物, 人物], 配音: [娱乐人物, 人物], 获奖: [娱乐人物, 奖项]}
}1.第一阶段 第一阶段的模板如下所示
re_s1_p {chinese: 给定的句子为{}\n\n给定关系列表{}\n\n在这个句子中可能包含了哪些关系\n请给出关系列表中的关系。\n如果不存在则回答无\n按照元组形式回复如 (关系1, 关系2, ……),
}2.第二阶段 第二段的模板如下所示
re_s2_p {chinese: 根据给定的句子两个实体的类型分别为{}{}且之间的关系为{}请找出这两个实体如果有多组则按组全部列出。\n如果不存在则回答无\n按照表格形式回复表格有两列且表头为{}{},
}ChatIE通过两阶段的ChatGPT多轮问答来解决Zero-Shot信息抽取构建知识图谱。但有个问题是可能或一定会出现错误关系抽取这该如何办呢工程有个解决方案就是引入多个裁判比如ChatGPT是一个裁判文心一言是一个裁判BERT实体关系抽取是一个裁判规则实体关系抽取是一个裁判。可根据知识精度要求比如4个裁判都一致了才会自动更新到知识库中否则需要人工来审核实体关系抽取是否正确。知识图谱自动化更新是一个工程活需要一个人工审核的功能来确保模型识别不一致时的最终审核。 3.测试效果 ChatIE在不同任务RE、NER和EE和不同数据集上的测试效果如下所示
二.使用ChatGLM2来信息抽取[1] 这部分替换ChatGPT为ChatGLM2来做多轮问答。ChatGLM2进行金融知识抽取实践中在ChatGLM前置了两轮对话达到了较好的效果具体代码实现参考[9]。基本思路是加载ChatGLM2模型然后初始化Prompt分类和信息抽取最后根据输入和模型完成推理过程。简单理解整体思路是通过Few-Shot信息抽取构建知识图谱。 1加载ChatGLM2模型
tokenizer AutoTokenizer.from_pretrained(rL:/20230713_HuggingFaceModel/chatglm2-6b, trust_remote_codeTrue) # 指定使用的tokenizer
model AutoModel.from_pretrained(rL:/20230713_HuggingFaceModel/chatglm2-6b, trust_remote_codeTrue).half().cuda() # 指定使用的model
model model.eval() # 指定model为eval模式2初始化Prompt
def init_prompts():初始化前置prompt便于模型做 incontext learning。class_list list(class_examples.keys()) # 获取分类的类别class_list [基金, 股票]cls_pre_history [(f现在你是一个文本分类器你需要按照要求将我给你的句子分类到{class_list}类别中。,f好的。)]for _type, exmpale in class_examples.items(): # 遍历分类的类别和例子cls_pre_history.append((f“{exmpale}”是 {class_list} 里的什么类别, _type)) # 拼接前置promptie_pre_history [(现在你需要帮助我完成信息抽取任务当我给你一个句子时你需要帮我抽取出句子中三元组并按照JSON的格式输出上述句子中没有的信息用[原文中未提及]来表示多个值之间用,分隔。,好的请输入您的句子。)]for _type, example_list in ie_examples.items(): # 遍历分类的类别和例子for example in example_list: # 遍历例子sentence example[content] # 获取句子properties_str , .join(schema[_type]) # 拼接schemaschema_str_list f“{_type}”({properties_str}) # 拼接schemasentence_with_prompt IE_PATTERN.format(sentence, schema_str_list) # 拼接前置promptie_pre_history.append(( # 拼接前置promptf{sentence_with_prompt},f{json.dumps(example[answers], ensure_asciiFalse)}))return {ie_pre_history: ie_pre_history, cls_pre_history: cls_pre_history} # 返回前置promptcustom_settings数据结构中的内容如下所示 3根据输入和模型完成推理过程
def inference(sentences: list,custom_settings: dict):推理函数。Args:sentences (List[str]): 待抽取的句子。custom_settings (dict): 初始设定包含人为给定的few-shot example。for sentence in sentences: # 遍历句子with console.status([bold bright_green] Model Inference...): # 显示推理中sentence_with_cls_prompt CLS_PATTERN.format(sentence) # 拼接前置promptcls_res, _ model.chat(tokenizer, sentence_with_cls_prompt, historycustom_settings[cls_pre_history]) # 推理if cls_res not in schema: # 如果推理结果不在schema中报错并退出print(fThe type model inferenced {cls_res} which is not in schema dict, exited.)exit()properties_str , .join(schema[cls_res]) # 拼接schemaschema_str_list f“{cls_res}”({properties_str}) # 拼接schemasentence_with_ie_prompt IE_PATTERN.format(sentence, schema_str_list) # 拼接前置promptie_res, _ model.chat(tokenizer, sentence_with_ie_prompt, historycustom_settings[ie_pre_history]) # 推理ie_res clean_response(ie_res) # 后处理print(f [bold bright_red]sentence: {sentence}) # 打印句子print(f [bold bright_green]inference answer: ) # 打印推理结果print(ie_res) # 打印推理结果如果实体关系抽取搞定了那么自动更新到NebulaGraph就比较简单了可参考NebulaGraph实战2-NebulaGraph手工和Python操作。
参考文献 [1]利用ChatGLM构建知识图谱https://discuss.nebula-graph.com.cn/t/topic/13029 [2]ChatGPTSmartKG 3分钟生成哈利波特知识图谱https://www.msn.cn/zh-cn/news/technology/chatgpt-smartkg-3分钟生成-哈利波特-知识图谱/ar-AA17ykNr [3]ChatIEhttps://github.com/cocacola-lab/ChatIE [4]ChatIEhttp://124.221.16.143:5000/ [5]financial_chatglm_KGhttps://github.com/zhuojianc/financial_chatglm_KG [6]Creating a Knowledge Graph From Video Transcripts With ChatGPT 4https://neo4j.com/developer-blog/chatgpt-4-knowledge-graph-from-video-transcripts/ [7]GPT4IEhttps://github.com/cocacola-lab/GPT4IE [8]GPT4IEhttp://124.221.16.143:8080/ [9]https://github.com/ai408/nlp-engineering/blob/main/20230917_NLP工程化公众号文章\NebulaGraph教程\NebulaGraph实战3-信息抽取构建知识图谱