大语言模型无代码构建知识图谱(1)--提示工程准备

        2023年3月15日,ChatGPT4.0的横空出世,将人们对大语言模型的关注推到了风口浪尖。由于其在智能问答、翻译以及文本生成等工作任务上的卓越表现,业界一度出现了不再需要发展知识图谱相关技术的观点,知识图谱相关概念严重受挫。无可置疑的是,大语言模型的确在智能问答等功能上与知识图谱存在交集,并且表现令人惊讶。但由于大语言模型不可避免的“幻觉”问题,使其存在无法给出准确、全面回答的情况,故而无法适应用户全面的场景需求。而知识图谱存储着大量结构化的信息,可以表达复杂的知识关系,能够满足用户准确、有效的检索需求。由此看来,二者各有所长,不是简单的替代关系,更有甚者二者可以彼此促进。众所周知,知识图谱的构建过程是相当昂贵的,开发者需要从海量的文档中抽取、对齐各类知识,工作量巨大,准确度要求也高。由于大语言模型拥有很强的泛化能力,因此其能有效抽取、识别特定领域文档中的实体、属性以及关系知识,可大大降低知识图谱的构建成本。

    下面我们将通过一个示例,介绍如何使用大语言模型在无代码的情况下,辅助构建知识图谱。

案例设计

    在该案例中,我们使用如下内容进行知识提取。

刘彻之母王娡在怀孕时,汉景帝刘启尚为太子。王娡梦见太阳进入她的怀中,醒来告诉刘启后,刘启认为这是高贵的征兆。刘彻还未出生,他的祖父汉文帝刘恒就驾崩了。刘启继位,是为景帝,不久刘彻出生。刘彻是汉景帝第十子,亦是王娡唯一的儿子。 [3]

汉景帝前元四年(前153年)四月二十三日,汉景帝立栗姬所生的长子刘荣为皇太子,刘彻亦同时被封为胶东王。 [4]刘彻的姑母馆陶公主刘嫖向栗姬为其女陈氏提亲,被栗姬拒绝,而王娡却许诺让刘彻娶陈氏,因此刘嫖不断向景帝诋毁栗姬而赞誉王娡,栗姬亦曾出言不逊而触怒景帝,天平遂逐渐向王娡母子倾斜。前元六年(前151年)薄皇后被废黜后,王娡暗中指使大行令奏请立栗姬为皇后,使景帝对栗姬的不满达到极点,于是处死大行令、疏远栗姬,在前元七年(前150年)正月废刘荣为临江王。四月十七日,景帝立王娡为皇后;二十五日,立时年七岁的刘彻为皇太子。 [5-6]

刘彻成为储君后,景帝拜卫绾为太子太傅、王臧为太子少傅,让他们辅导刘彻。 [119-120]汉景帝后元三年(前141年)正月十七日,刘彻行冠礼。十天后,景帝驾崩,刘彻继位。 [7]

    该信息取自百度百科关于汉武帝刘彻的一个片段。我们设计提取该段信息中的以下三类知识:

  • 人物及头衔,获取文本中的人物信息作为知识的主体
  • 人物关系,包括:源人物、关系、目的人物三部分信息
  • 人物相关的事件,包括:人物、时间、事件描述三部分信息

提示工程准备

        笔者选定阿里的通义千问模型作为我们的大语言模型,用它提供的Web对话界面来进行提示工程。Web对话界面给出的答案可能会与其API接口有所差异,但对提示工程的影响整体不大。提示工程的尝试过程笔者在此就不展示了。下面可以看一下大模型的知识抽取能力,很大程度上超出了笔者的预期。

人物及头衔抽取

提示

请帮我分析####后文字中的人物及头衔。并将结果输出为json格式

####

文本片段

应答

Json

[

  {

    "人物": "刘彻",

    "头衔": [

      "汉景帝第十子",

      "胶东王",

      "皇太子",

      "皇帝"

    ]

  },

  {

    "人物": "王娡",

    "头衔": [

      "刘彻之母",

      "皇后"

    ]

  },

  {

    "人物": "刘启(汉景帝)",

    "头衔": [

      "太子",

      "皇帝"

    ]

  },

  {

    "人物": "汉文帝刘恒",

    "头衔": [

      "祖父(刘彻的祖父)",

      "皇帝"

    ]

  },

  {

    "人物": "刘荣",

    "头衔": [

      "皇太子",

      "临江王"

    ]

  },

  {

    "人物": "馆陶公主刘嫖",

    "头衔": [

      "刘彻的姑母",

      "公主"

    ]

  },

  {

    "人物": "栗姬",

    "头衔": [

      "刘荣之母"

    ]

  },

  {

    "人物": "薄皇后",

    "头衔": [

      "皇后"

    ]

  },

  {

    "人物": "大行令",

    "头衔": [

      "官员"

    ]

  },

  {

    "人物": "卫绾",

    "头衔": [

      "太子太傅"

    ]

  },

  {

    "人物": "王臧",

    "头衔": [

      "太子少傅"

    ]

  }

]

解读

信息抽取的非常全面,数据组织的也很好。只是有些头衔抽取的不准确,比如“刘彻之母”等信息,这个信息理解为关系可能更好。存在一个人有多个头衔的情况,这个是合理的。因为人的头衔是随时间变化的,笔者在这里做实验构建的模型忽略了时间情况,把人物曾经有的头衔都汇聚来存储了。如果知识库这部分信息需要做的更准确,可以考虑将改信息与时间绑定并单独存储。

人物关系抽取

提示

请帮我分析####后文字中的人物关系,并按照关系方向输出数据,如:父子关系时,父亲在前,儿子在后。以json格式输出,格式如下:{"src":"源名称","relation":"关系","dst":"目的名称"}

####

文本片段

应答

Json

[

  {"src": "王娡", "relation": "母亲", "dst": "刘彻"},

  {"src": "刘启(汉景帝)", "relation": "父亲", "dst": "刘彻"},

  {"src": "刘恒(汉文帝)", "relation": "祖父", "dst": "刘彻"},

  {"src": "栗姬", "relation": "原太子生母", "dst": "刘荣"},

  {"src": "刘嫖(馆陶公主)", "relation": "姑母", "dst": "刘彻"},

  {"src": "陈氏", "relation": "未婚妻(后成为皇后)", "dst": "刘彻"},

  {"src": "薄皇后", "relation": "前皇后", "dst": "汉景帝"},

  {"src": "卫绾", "relation": "太子太傅", "dst": "刘彻"},

  {"src": "王臧", "relation": "太子少傅", "dst": "刘彻"}

]

解读

信息抽取的很好,关系方向也是笔者所期望的。看到这里,笔者都没啥意愿去核查抽取的是否准确了。其中的关系信息可以根据需要再进一步转换,统一表达。

人物相关事件抽取

提示

请帮我分析####后文字中的事件及事件相关的人物和时间,并将结果输出为json格式

####

文本片段

应答

Json

[

  {

    "事件": "王娡怀孕并梦见太阳进入怀中",

    "时间": "(未明确)",

    "人物": ["王娡", "刘启(汉景帝)"]

  },

  {

    "事件": "汉文帝刘恒驾崩",

    "时间": "(刘彻出生前)",

    "人物": ["汉文帝刘恒"]

  },

  {

    "事件": "刘启继位为景帝",

    "时间": "(刘彻出生前)",

    "人物": ["刘启(汉景帝)"]

  },

  {

    "事件": "刘彻出生",

    "时间": "(刘启继位后不久)",

    "人物": ["刘彻", "王娡"]

  },

  {

    "事件": "刘荣被立为皇太子,刘彻被封为胶东王",

    "时间": "前153年四月二十三日",

    "人物": ["刘荣", "刘彻", "汉景帝刘启"]

  },

  {

    "事件": "馆陶公主刘嫖向栗姬提亲遭拒及王娡许诺刘彻娶陈氏",

    "时间": "(在刘荣被立为太子之后)",

    "人物": ["馆陶公主刘嫖", "栗姬", "王娡", "刘彻", "陈氏"]

  },

  {

    "事件": "薄皇后被废黜",

    "时间": "前151年",

    "人物": ["薄皇后", "汉景帝刘启"]

  },

  {

    "事件": "大行令受王娡指使奏请立栗姬为皇后,后被处死",

    "时间": "前150年前期",

    "人物": ["大行令", "王娡", "栗姬", "汉景帝刘启"]

  },

  {

    "事件": "刘荣被废为临江王",

    "时间": "前150年正月",

    "人物": ["刘荣", "汉景帝刘启"]

  },

  {

    "事件": "王娡被立为皇后",

    "时间": "前150年四月十七日",

    "人物": ["王娡", "汉景帝刘启"]

  },

  {

    "事件": "刘彻被立为皇太子",

    "时间": "前150年四月二十五日",

    "人物": ["刘彻", "汉景帝刘启"]

  },

  {

    "事件": "卫绾、王臧分别被任命为太子太傅和太子少傅",

    "时间": "(刘彻成为储君后,具体时间未给出)",

    "人物": ["刘彻", "卫绾", "王臧", "汉景帝刘启"]

  },

  {

    "事件": "刘彻行冠礼",

    "时间": "前141年正月十七日",

    "人物": ["刘彻"]

  },

  {

    "事件": "汉景帝刘启驾崩,刘彻继位",

    "时间": "前141年正月二十七日后十天",

    "人物": ["汉景帝刘启", "刘彻"]

  }

]

解读

信息抽取的相当全面了。如果以他的输出作为标准答案的话,估计想很多人在回答这个问题时,分数超不过50分。其中的时间信息并非我们标准意义上的时间格式,需要进行二次的处理转换才能实现时间格式的标准化。这个有一定的难度,本次实验我们就不演示如何转换了。事件相关人物

你可能感兴趣的:(知识图谱,低代码,人工智能,大语言模型,提示工程,通义千问,知识抽取)