知识图谱
知识图谱于14年出现,之后进入平稳期,23年由于大模型的出现再次火爆。
大模型的“幻觉”问题的解决方式
- 提高LLM的能力
- 框定边界(大量符合逻辑的facts),大模型在边界内通过自身的理解能力,提供回复
- facts 来源于:一些网络/企业内部文档/企业内的数据库/结构化的知识图谱
知识图谱:一种存储facts的方式
采用了“实体&关系”的方法来存储信息
区别于简单的图:包含多种实体和多种关系
知识图谱的优势
- 关系直观
- 抓住重要信息
- 弥补文本到向量直接的关系(GraphRAG:KG与向量数据库融合)
RAG 与知识图谱结合
知识图谱的必要性
e.g:问题:“感冒常用药物的负作用”;数据库存储的是“冲剂” 的描述,对应段落刚好没有出现“感冒” 这个关键词;两者相似度不够高,无法匹配
—— 使用知识图谱找到“感冒”和“冲剂”之间的关系
RAG 与知识图谱如何结合
基于知识图谱扩充问题,将问题具像化
- 改写后的问题进入向量数据库,作为 chunks
- 改写后的问题进入知识图谱,检索出与问题对应的相关子图(subgraph);子图由很多三元组(如感冒-治疗的药物有-冲剂)构成,将所有的三元组转化为文字形式
将上述两部分合在一起,构造新的上下文包含我们的潜在答案。
存在的问题
- 如何构建图谱:人工、通过 LLM…
- 合并后存在冗余信息,如何过滤重复信息
- 怎么抽取子图 (k-hop)
- 抽出的子图是否可再次在向量库中检索,得到结果后再次合并
- 如何更好地融入结构信息,让 LLM 更好地理解结构信息
- 使用更结构化的 prompt
- 结合图模型技术
SPARQL
SPARQL 是用于访问 RDF 的查询语言和协议。
**RDF **是一组三元组,指的是两个事物和它们之间的直接关系,在语法上呈现为"主语 + 谓语 + 宾语"。
每套谓语必须有一个明确的 URL,通过 URL 区分不同的谓语。RDF 官方定义了一套常用的谓语。
URL 比较冗长,引用不方便。RDF 通常用前缀rdf
表示,代表 URL 地址:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns>
每个 URL 里面可以包含多种谓语,通过"前缀 : 谓语"的形式来区分。
比如,官方定义了一个"type"谓语,说明主语的类型,就可以用
rdf:type
表示。小明是学生。
上面这句话,写成 RDF 三元组,就是下面的形式。
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns> 小明 rdf:type 学生.
由于
rdf:type
是一个常用谓语,RDF 允许把它简写成a
,因此"小明是学生"又可以表示成小明 a 学生
。PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns> 小明 a 学生 .
注意:每个 RDF 三元组的结尾是一个英文的句号,用来区分多个三元组。
语法示例
“甲壳虫是一个乐队,成员有 John Lennon、Paul McCartney、Ringo Starr 和George Harrison。”
这句话对应的三元组如下:
甲壳虫 rdf:type Band . 甲壳虫 :name "甲壳虫" . 甲壳虫 :member John_Lennon . 甲壳虫 :member Paul_McCartney . 甲壳虫 :member Ringo_Starr . 甲壳虫 :member George_Harrison .
上面例子中,
rdf:type
、:name
、:member
都是谓语。由于这些三元组的主语相同,RDF 允许将它们合并:甲壳虫 a 乐队 ; :name "甲壳虫" ; :member John_Lennon, Paul_McCartney, George_Harrison, Ringo_Starr .
上面的代码中,主语相同的三元组采用合并写法时,每个三元组之间使用分号隔开,最后一个三元组采用句号结尾。
SPARQL 查询语言
核心思想:根据给定的谓语动词,从三元组提取符合条件的主语或宾语:
SELECT <variables> WHERE { <graph pattern> }
上面代码中,
<variables>
是所要提取主语或宾语,<graph pattern>
是所要查询的三元组模式。