Skip to content
🔗 分享本题
查看我的学习进度 →
从文档构建知识图谱流程图

🧠 图解记忆: 抽实体、连关系只是开始,还要做消歧、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%+ 准确率。"