
🧠 图解记忆: 抽实体、连关系只是开始,还要做消歧、Schema 约束、来源追溯、增量更新和质量评估。
💡 答案要点
知识图谱构建流程:
原始文档
↓
① 实体抽取(Named Entity Recognition)
→ 人名、地名、机构名、事件...
↓
② 关系抽取(Relation Extraction)
→ CEO、成立于、投资、竞争...
↓
③ 实体链接(Entity Linking)
→ "苹果" → Apple Inc.(消歧)
↓
④ 图谱存储(Neo4j / 图数据库)
→ (实体) --[关系]--> (实体)实体抽取代码示例:
python
from transformers import pipeline
ner_pipeline = pipeline("ner", model="bert-base-chinese")
def extract_entities(text):
entities = ner_pipeline(text)
# 返回:[{'word': '苹果', 'entity': 'ORG'}, {'word': 'Tim Cook', 'entity': 'PER'}]
return entities关系分类代码示例:
python
def extract_relations(sentence, entities):
prompt = f"""
从以下句子中抽取关系:
句子:"{sentence}"
实体:{entities}
关系类型:CEO、成立于、投资、收购、竞争、合作
以(json)格式返回:{{"subject": "", "relation": "", "object": ""}}
"""
result = llm.generate(prompt)
return json.parse(result)知识图谱存储:
python
# Neo4j 示例
from neo4j import GraphDatabase
def add_triple(tx, subject, relation, obj):
tx.run("""
MERGE (s:Entity {name: $subject})
MERGE (o:Entity {name: $object})
MERGE (s)-[r:RELATION {type: $relation}]->(o)
""", subject=subject, relation=relation, object=obj)
# 查询示例:Tim Cook 的所有关系
def query_graph(tx, entity):
result = tx.run("""
MATCH (e:Entity {name: $entity})-[r]-(other)
RETURN e.name, type(r), other.name
""", entity=entity)
return list(result)面试话术:
示例表达(仅在能用本人经历或可复现实验佐证时使用): "GraphRAG 的核心是构建知识图谱。流程是:先用 NER 抽实体(人名/地名/机构),再用关系分类抽关系(CEO/收购/合作),然后存到 Neo4j 图数据库。构建成本确实高,但收益是:对多跳问题('A和B什么关系')效果远超向量 RAG。我在项目里用 SpaCy 做中文 NER,用 LLM 做关系抽取,实测抽取出 80%+ 准确率。"