在基于大语言模型图数据库存储中,要从文本中提取实体,实体属性和关系。 实体关系抽取是从文本中的句子里抽取出一对实体并给出实体间关系的任务。
该任务的输入是一句话,输出是一个spo三元组(subject-predicate-object)。
spo三元组
- subject 主语
- object 宾语
- predicate 谓词
中文表达
实体联系模式图(ERD)(Entity-relationship model)
实体(Entity)
实体是一个系统内可定义的事物或概念,如人/角色(例如学生),对象(例如发票),概念(例如简介)或事件(例如交易)
实体的属性(attributes)
属性是定义实体或实体类型的质量、属性和特征。
联系(Relationship)
联系是多个实体之间的相互联系。
联系集是相同类型联系的集合。
基于大语言模型抽取实体和关系
大语言模型能够从语句中提取实体和关系,这给实体抽取提供了新的方法。下面是kimi 的回答:
例子:
陈述:请列出下列语句中的实体和实体之间的关系。姚远的妻子是刘素霞,他们有一个儿子叫姚大伟。用JSON 输出。
回答:{
"entities": [
{
"name": "姚远",
"type": "person"
},
{
"name": "刘素霞",
"type": "person"
},
{
"name": "姚大伟",
"type": "person"
}
],
"relationships": [
{
"subject": "姚远",
"predicate": "妻子",
"object": "刘素霞"
},
{
"subject": "姚远",
"predicate": "儿子",
"object": "姚大伟"
},
{
"subject": "刘素霞",
"predicate": "儿子",
"object": "姚大伟"
}
]
}
例2
陈诉:请列出下列语句中的实体和实体之间的关系。丹阳第二中学位于江苏省丹阳市。用JSON 输出
回答:{
"entities": [
{
"name": "丹阳第二中学",
"type": "school"
},
{
"name": "江苏省",
"type": "province"
},
{
"name": "丹阳市",
"type": "city"
}
],
"relationships": [
{
"subject": "丹阳第二中学",
"predicate": "位于",
"object": "江苏省丹阳市"
}
]
}
提取实体和关系的难点
中文表达关系的含义不准确。
例如:姚远的父亲是姚邦豪。
实体:姚远,姚邦豪
关系:父亲
表达关系 (姚远)->[父亲]->(姚邦豪)
这种关系的名称并不确切,经常会误解为姚远是姚邦豪的儿子。不如英文 is_father 和father_of 表达更贴切。
因此我们改用了英文表达关系。
具体应用中,依然存在许多的问题:
1 姚远的哥哥是谁?
有时候会提取出实体为”姚远“,有时候会提取出”姚远的哥哥“
2 姚远的哥哥今年60岁了
提取出来的实体是”姚远“ 和”姚远的哥哥“两个实体。不会通过”姚远“节点找到他的哥哥。
ERD 的图数据库存储
当LLM 获取了实体和关系之后,可以将这些信息存储到图数据库中。
节点-存储实体
关系-关系的类型
(主语)->[关系]->(宾语)
例如:
姚远->[妻子]->刘素霞
ERD 图的文本表达
(主语)->[关系]->(宾语) => 姚远妻子刘素霞
(主语)->[关系]->(宾语) => 丹阳第二中学位于江苏省丹阳市
基本符合中文的语法。但是容易产生幻觉。
提示词:
你是一个图数据库专家,通过路径查询信息,回答问题。
已经查询的路径:
Path ={
"entities":[{
"name":"姚远",
"type":"person"
},
{
"name":"姚大伟",
"type":"person"
}
],
"relationships": [
{
"subject": "姚远",
"predicate": "儿子",
"object": "姚大伟"
}]
}
当前节点的名称:姚大伟。
当前节点有一些相邻节点,通过如下关系连接。
"relationships": [
{
"subject": "姚大伟",
"predicate": "儿子",
"object": "姚舜宇"
},
{
"subject": "姚大伟",
"predicate": "妻子",
"object": "翟瑞玥"
},
]
要回答的问题:姚大伟的儿子的同学是那些人?
如果能回答问题,直接回答(文本格式)。
如果目前的信息还无法回答问题,请推荐下一个查询节点名称。使用JSON输出。你是一个图数据库专家,通过路径查询信息,回答问题。
已经查询的路径:
Path ={
"entities":[{
"name":"姚远",
"type":"person"
},
{
"name":"姚大伟",
"type":"person"
}
],
"relationships": [
{
"subject": "姚远",
"predicate": "儿子",
"object": "姚大伟"
}]
}
当前节点的名称:姚大伟。
当前节点有一些相邻节点,通过如下关系连接。
"relationships": [
{
"subject": "姚大伟",
"predicate": "儿子",
"object": "姚舜宇"
},
{
"subject": "姚大伟",
"predicate": "妻子",
"object": "翟瑞玥"
},
]
要回答的问题:姚大伟的儿子的同学是那些人?
如果能回答问题,直接回答(文本格式)。
如果目前的信息还无法回答问题,请推荐下一个查询节点名称。使用JSON输出。格式为:
{
“NextNodes”:[ {“name”:”next query node”}]
}
结束语
使用LLM 提取实体和关系,查询neo4j图数据库。这看似简单,但是极其富有挑战性。我们尝试了kimi 和零一万物大模型yi-large 。效果都不十分令人满意。而且使用程序调用大模型,要比大模型在线对话差一点。也不知道是为什么。