从非结构化数据构建知识图谱
使用 Spacy、Stanford NLP、OpenNLTK 等自然语言处理 (NLP) 技术从非结构化文本创建图结构一直是一种可能性。这通常需要对特定领域和语言的文本进行 NLP 模型微调,以及深厚的 NLP 技能才能获得最佳结果。
能够进行提示的现代大型语言模型(LLMs)的兴起,它们在多种语言和领域中具有强大的语言技能,极大地扩展了这些能力。LLMs 可以通过详细的提示(指令、示例、架构、现有实体、输出格式)进行指导,从而从非结构化文本、图像和音频片段中提取和去重实体及关系。提取的信息以结构化 JSON 格式返回,可以存储在 Neo4j 等图数据库中,并链接回源文档和附加元数据。
这使得从非结构化数据构建知识图谱(KGs)成为可能,并将其与 Neo4j 中现有的结构化数据集成。这些知识图谱随后可用于各种应用程序,包括 GraphRAG(检索增强生成)应用程序,其中知识图谱用于检索相关的上下文信息以增强 LLM 的响应。

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) 构建管道需要以下更多组件
-
数据加载器:从文件(PDF 等)中提取文本。
-
文本分割器:将文本分割成更小的文本块(chunks),以便 LLM * 上下文窗口(token 限制)能够处理。
-
块嵌入器(可选):计算块嵌入。
-
模式构建器:提供一个模式来确定 LLM 提取的实体和关系的基础,并获得 * 一个易于导航的知识图谱 (KG)。
-
词汇图谱构建器:构建词汇图谱(文档、块及其关系)*(可选)。
-
实体和关系提取器:从文本中提取相关实体和关系。
-
知识图谱写入器:保存已识别的实体和关系。
-
实体解析器:将相似实体合并到单个节点中。
在文档中了解更多信息
那些生成的知识图谱随后可与同一 Python 包结合使用,以构建由 GraphRAG 驱动的生成式 AI 应用程序。
原型设计与演示
LLM 知识图谱构建器
LLM 知识图谱构建器是一个易于使用的工具,用于从非结构化文本构建知识图谱。
它在底层使用 LangChain LLMGraphTransformer,但提供了一个简单的用户界面,可以从上传的 PDF、Office 文档、网页或 YouTube 视频转录中提取实体和关系。它首先提取词汇图谱(文档、块及其关系),然后使用所选的 LLM 提取实体和关系。它还可以选择性地丰富图谱社区摘要和嵌入。您可以指定图谱模式来指导提取过程并可视化提取的图谱。

要与提取的信息进行交互,您可以比较多种不同的检索器,包括 GraphRAG、向量、混合和 Text2Cypher。对于每个答案,您可以检查信息来源以及用于生成答案的检索上下文。它还允许对检索结果进行 RAGAs 评估。
一些内部细节已在LLM 图谱构建器 - 知识图谱提取挑战中记录。
带有 Neo4j MCP 服务器的 AI 助手
交互式地试验知识图谱提取的一种快速方法是使用像 Claude、ChatGPT 这样的 AI 助手,或者像 VS Code、Cursor、Windsurf 这样支持 MCP 的 IDE,交互式地处理文本或讨论,并提示 LLM 提取实体和关系。
以前,这些提取的图实体必须通过 JSON 或 CSV 等中间格式(例如通过数据导入工具)或通过 Cypher 进行导入。
现在,可以使用 mcp-neo4j-cypher 或 mcp-neo4j-memory MCP 服务器将它们自动保存到连接的图谱中。

生态系统集成
Neo4j 与许多其他工具和框架集成,为知识图谱提取和使用提供解决方案。
Unstructured.io
Unstructured.io 是一个用于从非结构化文档中提取结构化数据的平台和 Python 包。它提供了一套工具,用于解析、清理和将非结构化数据转换为结构化格式。
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
知识图谱提取的第一个实现是LangChain LLMGraphTransformer。

其用法相当简单,如构建知识图谱中所述。您可以使用 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)

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。