从非结构化数据构建知识图谱

使用 Spacy、Stanford NLP、OpenNLTK 等自然语言处理 (NLP) 技术从非结构化文本创建图结构一直是一种可能性。这通常需要对特定领域和语言的文本进行 NLP 模型微调,以及深厚的 NLP 技能才能获得最佳结果。

能够进行提示的现代大型语言模型(LLMs)的兴起,它们在多种语言和领域中具有强大的语言技能,极大地扩展了这些能力。LLMs 可以通过详细的提示(指令、示例、架构、现有实体、输出格式)进行指导,从而从非结构化文本、图像和音频片段中提取和去重实体及关系。提取的信息以结构化 JSON 格式返回,可以存储在 Neo4j 等图数据库中,并链接回源文档和附加元数据。

这使得从非结构化数据构建知识图谱(KGs)成为可能,并将其与 Neo4j 中现有的结构化数据集成。这些知识图谱随后可用于各种应用程序,包括 GraphRAG(检索增强生成)应用程序,其中知识图谱用于检索相关的上下文信息以增强 LLM 的响应。

0*qgT2hBiA3DA1Y3qu

Neo4j 产品能力

GraphRAG Python 包

Neo4j Python GraphRAG 包提供了一个全面的管道,用于非结构化文档处理、基于图模式的实体提取、解析和存储。

SimpleKGBuilder 提供了一种简单的入门方式,如需完全可配置性,请使用

from neo4j_graphrag.experimental.pipeline.kg_builder import SimpleKGPipeline

ENTITIES = [
    "Person",
    {"label": "Company", "description": "Company or organization"},
    {"label": "Location", "properties": [{"name": "city", "type": "STRING"}]},
]
RELATIONS = [
    "LOCATED_AT",
    {
        "label": "COMPETES_WITH",
        "description": "Used for competitor relationships between companies",
    },
    {"label": "WORKS_AT", "properties": [{"name": "fromYear", "type": "INTEGER"}]},
]

kg_builder = SimpleKGPipeline(
    llm=llm, # an LLMInterface for Entity and Relation extraction
    driver=neo4j_driver,  # a neo4j driver to write results to graph
    embedder=embedder,  # an Embedder for chunks
    from_pdf=True,   # set to False if parsing an already extracted text
    entities=ENTITIES,
    relations=RELATIONS,
    potential_schema=POTENTIAL_SCHEMA, # a optional list of node-relationship-node schema entries
)
await kg_builder.run_async(file_path=str(file_path))
kg builder pipeline

完整的知识图谱 (KG) 构建管道需要以下更多组件

  • 数据加载器:从文件(PDF 等)中提取文本。

  • 文本分割器:将文本分割成更小的文本块(chunks),以便 LLM * 上下文窗口(token 限制)能够处理。

  • 块嵌入器(可选):计算块嵌入。

  • 模式构建器:提供一个模式来确定 LLM 提取的实体和关系的基础,并获得 * 一个易于导航的知识图谱 (KG)。

  • 词汇图谱构建器:构建词汇图谱(文档、块及其关系)*(可选)。

  • 实体和关系提取器:从文本中提取相关实体和关系。

  • 知识图谱写入器:保存已识别的实体和关系。

  • 实体解析器:将相似实体合并到单个节点中。

在文档中了解更多信息

那些生成的知识图谱随后可与同一 Python 包结合使用,以构建由 GraphRAG 驱动的生成式 AI 应用程序。

原型设计与演示

LLM 知识图谱构建器

LLM 知识图谱构建器是一个易于使用的工具,用于从非结构化文本构建知识图谱。

它在底层使用 LangChain LLMGraphTransformer,但提供了一个简单的用户界面,可以从上传的 PDF、Office 文档、网页或 YouTube 视频转录中提取实体和关系。它首先提取词汇图谱(文档、块及其关系),然后使用所选的 LLM 提取实体和关系。它还可以选择性地丰富图谱社区摘要和嵌入。您可以指定图谱模式来指导提取过程并可视化提取的图谱。

build kg genai e1718732751482

要与提取的信息进行交互,您可以比较多种不同的检索器,包括 GraphRAG、向量、混合和 Text2Cypher。对于每个答案,您可以检查信息来源以及用于生成答案的检索上下文。它还允许对检索结果进行 RAGAs 评估。

一些内部细节已在LLM 图谱构建器 - 知识图谱提取挑战中记录。

带有 Neo4j MCP 服务器的 AI 助手

交互式地试验知识图谱提取的一种快速方法是使用像 Claude、ChatGPT 这样的 AI 助手,或者像 VS Code、Cursor、Windsurf 这样支持 MCP 的 IDE,交互式地处理文本或讨论,并提示 LLM 提取实体和关系。

以前,这些提取的图实体必须通过 JSON 或 CSV 等中间格式(例如通过数据导入工具)或通过 Cypher 进行导入。

现在,可以使用 mcp-neo4j-cyphermcp-neo4j-memory MCP 服务器将它们自动保存到连接的图谱中。

employee create entities and relations

生态系统集成

Neo4j 与许多其他工具和框架集成,为知识图谱提取和使用提供解决方案。

Unstructured.io

Unstructured.io 是一个用于从非结构化文档中提取结构化数据的平台和 Python 包。它提供了一套工具,用于解析、清理和将非结构化数据转换为结构化格式。

Neo4j 集成允许您从任何受支持的源提取词汇图谱。

unstructured ui neo4j

无论是在 平台中还是在开源包中,您都可以使用 Neo4jConnectionConfigNeo4jUploaderConfig 将提取的词汇数据写入 Neo4j 图谱。

Pipeline.from_configs(
    context=ProcessorConfig(),
    indexer_config=LocalIndexerConfig(input_path=os.getenv("LOCAL_FILE_INPUT_DIR")),
    downloader_config=LocalDownloaderConfig(),
    source_connection_config=LocalConnectionConfig(),
...
    chunker_config=ChunkerConfig(chunking_strategy="by_title"),
    embedder_config=EmbedderConfig(embedding_provider="huggingface"),
    destination_connection_config=Neo4jConnectionConfig(
        access_config=Neo4jAccessConfig(password=os.getenv("NEO4J_PASSWORD")),
        username=os.getenv("NEO4J_USERNAME"),
        uri=os.getenv("NEO4J_URI"),
        database=os.getenv("NEO4J_DATABASE"),
    ),
    stager_config=Neo4jUploadStagerConfig(),
    uploader_config=Neo4jUploaderConfig(batch_size=100)
).run()

LangChain

1*aCSCXuvrOB90jRQ0mNZtSA

其用法相当简单,如构建知识图谱中所述。您可以使用 convert_to_graph_documents 方法将 LangChain 文档列表转换为图文档(节点和关系)。为了指导提取过程,您可以指定一个包含允许的节点和关系、属性以及附加提取指令的模式。

from langchain_experimental.graph_transformers import LLMGraphTransformer

llm_transformer = LLMGraphTransformer(
    llm=llm,
    allowed_nodes=["Person", "Country", "Organization"],
    allowed_relationships=["NATIONALITY", "LOCATED_IN", "WORKED_AT", "SPOUSE"],
    node_properties=["born_year"],
)
graph_documents = llm_transformer.convert_to_graph_documents(documents)[0]

print(f"Nodes: {graph_documents.nodes} Rels: {graph_documents.relationships}")

graph.add_graph_documents(graph_documents, include_source=True)
graph construction4 e41087302ef4c331c2c95b57467f4c62

LlamaIndex

LlamaIndex 中,PropertyGraphIndex 是管理知识图谱(包括从非结构化数据构建知识图谱)的主要组件。对于实体和关系的提取,可以使用不同的提取器,例如 SchemaLLMPathExtractor

from typing import Literal
from llama_index.core.indices.property_graph import SchemaLLMPathExtractor

entities = Literal["Person", "Place", "Thing"]
relations = Literal["PART_OF", "HAS", "IS_A"]
schema = {
    "Person": ["PART_OF", "HAS", "IS_A"],
    "Place": ["PART_OF", "HAS"],
    "Thing": ["IS_A"],
}

kg_extractor = SchemaLLMPathExtractor(
    llm=llm,
    possible_entities=entities,
    possible_relations=relations,
    kg_validation_schema=schema,
    strict=True,  # if false, will allow triplets outside of the schema
    num_workers=4,
    max_triplets_per_chunk=10,
)

graph_store = Neo4jPropertyGraphStore(
    username="neo4j",
    password="<password>",
    url="neo4j+s://xxx.databases.neo4j.io",
)

# creates an index
index = PropertyGraphIndex.from_documents(
    documents,
    property_graph_store=graph_store,
    # optional, neo4j also supports vectors directly
    vector_store=vector_store,
    embed_kg_nodes=True,
)

Neo4j-PropertyGraphIndex 可以作为检索器用于 GraphRAG,例如通过 VectorContextRetriever、LLMSynonymRetriever、TextToCypherRetriever、CypherTemplateRetriever。

© . All rights reserved.