知识图谱构建与应用
约 1505 字大约 5 分钟
knowledge-graphgraph
2025-09-04
知识图谱以结构化的方式表示现实世界中的实体及其关系,是连接数据与知识的桥梁。本文介绍知识图谱的表示模型、构建方法、存储方案以及与 LLM 的结合应用。
知识图谱基础
知识图谱的核心数据结构是三元组(Triple):
(主体 Subject, 谓词 Predicate, 客体 Object)
(Entity, Relation, Entity)例如:
- (北京, 是...的首都, 中国)
- (爱因斯坦, 出生于, 乌尔姆)
- (Python, 创建者, Guido van Rossum)
RDF 与 OWL
RDF(Resource Description Framework)
RDF 是 W3C 标准的知识表示框架,使用 URI 标识实体和关系:
<!-- RDF/XML 格式 -->
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dbp="http://dbpedia.org/property/"
xmlns:dbr="http://dbpedia.org/resource/">
<rdf:Description rdf:about="dbr:Albert_Einstein">
<dbp:birthPlace rdf:resource="dbr:Ulm"/>
<dbp:field rdf:resource="dbr:Theoretical_physics"/>
<dbp:nationality rdf:resource="dbr:Germany"/>
</rdf:Description>
</rdf:RDF># Turtle 格式(更简洁)
@prefix dbr: <http://dbpedia.org/resource/> .
@prefix dbp: <http://dbpedia.org/property/> .
dbr:Albert_Einstein dbp:birthPlace dbr:Ulm ;
dbp:field dbr:Theoretical_physics ;
dbp:nationality dbr:Germany .OWL(Web Ontology Language)
OWL 在 RDF 之上定义本体(Ontology),描述类层次、属性约束和推理规则:
# 本体定义
:Person a owl:Class .
:Scientist rdfs:subClassOf :Person .
:Physicist rdfs:subClassOf :Scientist .
:birthPlace a owl:ObjectProperty ;
rdfs:domain :Person ;
rdfs:range :Place .知识抽取
命名实体识别(NER)
从非结构化文本中识别实体及其类型。
import spacy
nlp = spacy.load("zh_core_web_trf")
text = "2024年,OpenAI发布了GPT-4o,这是一个多模态AI模型。"
doc = nlp(text)
for ent in doc.ents:
print(f"实体: {ent.text}, 类型: {ent.label_}")
# 实体: 2024年, 类型: DATE
# 实体: OpenAI, 类型: ORG
# 实体: GPT-4o, 类型: PRODUCT关系抽取(Relation Extraction)
从文本中抽取实体之间的关系。
from transformers import pipeline
# 使用预训练关系抽取模型
re_pipeline = pipeline("text-classification", model="relation-extraction-model")
# 基于 LLM 的关系抽取
def extract_relations_with_llm(text, llm_client):
prompt = f"""从以下文本中抽取所有实体关系三元组,格式为 (主体, 关系, 客体):
文本:{text}
三元组:"""
response = llm_client.generate(prompt)
return parse_triples(response)
# 示例输出
# (OpenAI, 发布, GPT-4o)
# (GPT-4o, 类型, 多模态AI模型)图数据库(Neo4j)
Neo4j 是最流行的图数据库,使用 Cypher 查询语言。
// 创建节点和关系
CREATE (einstein:Person {name: '爱因斯坦', birth_year: 1879})
CREATE (ulm:City {name: '乌尔姆'})
CREATE (physics:Field {name: '理论物理'})
CREATE (relativity:Theory {name: '相对论'})
CREATE (einstein)-[:BORN_IN]->(ulm)
CREATE (einstein)-[:WORKS_IN]->(physics)
CREATE (einstein)-[:PROPOSED]->(relativity)
CREATE (relativity)-[:BELONGS_TO]->(physics)
// 查询:找出爱因斯坦提出的所有理论
MATCH (p:Person {name: '爱因斯坦'})-[:PROPOSED]->(t:Theory)
RETURN t.name
// 查询:两个实体之间的最短路径
MATCH path = shortestPath(
(a:Person {name: '爱因斯坦'})-[*]-(b:Person {name: '玻尔'})
)
RETURN path
// 图模式匹配:找出同一领域的科学家
MATCH (p1:Person)-[:WORKS_IN]->(f:Field)<-[:WORKS_IN]-(p2:Person)
WHERE p1 <> p2
RETURN p1.name, f.name, p2.namePython 操作 Neo4j
from neo4j import GraphDatabase
class KnowledgeGraph:
def __init__(self, uri, user, password):
self.driver = GraphDatabase.driver(uri, auth=(user, password))
def add_triple(self, subject, predicate, obj):
with self.driver.session() as session:
session.run(
"MERGE (s:Entity {name: $subject}) "
"MERGE (o:Entity {name: $object}) "
"MERGE (s)-[r:`" + predicate + "`]->(o)",
subject=subject, object=obj
)
def query_neighbors(self, entity_name, depth=1):
with self.driver.session() as session:
result = session.run(
"MATCH (e:Entity {name: $name})-[r*1.." + str(depth) + "]-(n) "
"RETURN e, r, n",
name=entity_name
)
return [record for record in result]
def close(self):
self.driver.close()SPARQL 查询
SPARQL 是 RDF 数据的标准查询语言,可查询 DBpedia、Wikidata 等公开知识图谱:
# 查询所有获得诺贝尔物理学奖的科学家
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
SELECT ?scientist ?name WHERE {
?scientist dbo:award dbr:Nobel_Prize_in_Physics ;
rdfs:label ?name .
FILTER(LANG(?name) = "zh")
}
ORDER BY ?name
LIMIT 20知识图谱嵌入
将实体和关系嵌入到低维连续向量空间,用于链接预测和知识推理。
TransE
核心思想:如果 (h, r, t) 成立,则 h+r≈t。
RotatE
将关系建模为复数空间中的旋转:t=h∘r,能更好地建模对称、反对称、逆和组合关系。
import torch
import torch.nn as nn
class TransE(nn.Module):
def __init__(self, num_entities, num_relations, embedding_dim):
super().__init__()
self.entity_embeddings = nn.Embedding(num_entities, embedding_dim)
self.relation_embeddings = nn.Embedding(num_relations, embedding_dim)
nn.init.xavier_uniform_(self.entity_embeddings.weight)
nn.init.xavier_uniform_(self.relation_embeddings.weight)
def forward(self, head, relation, tail):
h = self.entity_embeddings(head)
r = self.relation_embeddings(relation)
t = self.entity_embeddings(tail)
# score: h + r 应该接近 t
score = torch.norm(h + r - t, p=2, dim=-1)
return score
def training_step(self, pos_triples, neg_triples, margin=1.0):
pos_score = self.forward(*pos_triples)
neg_score = self.forward(*neg_triples)
loss = torch.relu(margin + pos_score - neg_score).mean()
return lossKG + LLM 应用
典型应用模式:
- GraphRAG:用知识图谱增强 RAG,提供结构化的上下文
- 知识验证:用 KG 验证 LLM 生成内容的事实准确性
- KG 构建:用 LLM 从文本中自动抽取三元组构建知识图谱
- 混合推理:KG 提供精确事实,LLM 提供推理和自然语言生成
def kg_augmented_qa(question, kg, llm):
# 1. 从问题中抽取实体
entities = extract_entities(question)
# 2. 从知识图谱中检索相关子图
subgraph = kg.get_subgraph(entities, depth=2)
# 3. 将知识图谱信息注入 prompt
kg_context = format_subgraph(subgraph)
prompt = f"""基于以下知识图谱信息回答问题:
知识图谱:
{kg_context}
问题:{question}
回答:"""
# 4. LLM 生成回答
answer = llm.generate(prompt)
return answer总结
知识图谱通过三元组的形式将知识结构化,结合 NER、关系抽取等 NLP 技术可以从非结构化数据中自动构建。Neo4j 和 SPARQL 提供了强大的图查询能力,TransE/RotatE 等嵌入方法支持链接预测和知识推理。知识图谱与 LLM 的结合(如 GraphRAG)是提升 AI 系统事实准确性的重要方向。
贡献者
更新日志
2026/3/14 13:09
查看所有更新日志
9f6c2-feat: organize wiki content and refresh site setup于