适用于 Python 的官方 Neo4j GraphRAG 包使开发人员能够使用 Neo4j 和 Python 的强大功能构建图形检索增强生成 (GraphRAG) 应用程序。作为第一方库,它提供了强大、功能丰富且高性能的解决方案,并直接从 Neo4j 进一步保证了长期支持和维护。
文档可以在这里找到
版本 | 支持吗? |
---|---|
3.12 | ✓ |
3.11 | ✓ |
3.10 | ✓ |
3.9 | ✓ |
3.8 | ✗ |
要安装最新的稳定版本,请运行:
pip install neo4j-graphrag
pygraphviz
用于可视化管道。您可以在此处找到安装说明。
下面的脚本演示了如何开始使用该包并利用其主要功能。要运行这些示例,请确保您有一个 Neo4j 实例已启动并正在运行,并使用 Neo4j 实例的详细信息更新每个脚本中的NEO4J_URI
、 NEO4J_USERNAME
和NEO4J_PASSWORD
变量。对于示例,请确保将 OpenAI 密钥导出为名为OPENAI_API_KEY
的环境变量。 examples
夹中提供了其他示例。
注意:APOC 核心库必须安装在 Neo4j 实例中才能使用此功能
该包提供了两种构建知识图的方法。
Pipeline
类提供了广泛的自定义选项,使其成为高级用例的理想选择。有关如何使用此类的示例,请参阅examples/pipeline
文件夹。
对于更简化的方法, SimpleKGPipeline
类在Pipeline
上提供了一个简化的抽象层,使构建知识图变得更容易。这两个类都支持直接处理文本和 PDF。
import asyncio
from neo4j import GraphDatabase
from neo4j_graphrag . embeddings import OpenAIEmbeddings
from neo4j_graphrag . experimental . pipeline . kg_builder import SimpleKGPipeline
from neo4j_graphrag . llm . openai_llm import OpenAILLM
NEO4J_URI = "neo4j://localhost:7687"
NEO4J_USERNAME = "neo4j"
NEO4J_PASSWORD = "password"
# Connect to the Neo4j database
driver = GraphDatabase . driver ( NEO4J_URI , auth = ( NEO4J_USERNAME , NEO4J_PASSWORD ))
# List the entities and relations the LLM should look for in the text
entities = [ "Person" , "House" , "Planet" ]
relations = [ "PARENT_OF" , "HEIR_OF" , "RULES" ]
potential_schema = [
( "Person" , "PARENT_OF" , "Person" ),
( "Person" , "HEIR_OF" , "House" ),
( "House" , "RULES" , "Planet" ),
]
# Create an Embedder object
embedder = OpenAIEmbeddings ( model = "text-embedding-3-large" )
# Instantiate the LLM
llm = OpenAILLM (
model_name = "gpt-4o" ,
model_params = {
"max_tokens" : 2000 ,
"response_format" : { "type" : "json_object" },
"temperature" : 0 ,
},
)
# Instantiate the SimpleKGPipeline
kg_builder = SimpleKGPipeline (
llm = llm ,
driver = driver ,
embedder = embedder ,
entities = entities ,
relations = relations ,
on_error = "IGNORE" ,
from_pdf = False ,
)
# Run the pipeline on a piece of text
text = (
"The son of Duke Leto Atreides and the Lady Jessica, Paul is the heir of House "
"Atreides, an aristocratic family that rules the planet Caladan."
)
asyncio . run ( kg_builder . run_async ( text = text ))
driver . close ()
使用上述脚本创建的知识图示例:
创建向量索引时,请确保索引中的维数与嵌入的维数相匹配。
from neo4j import GraphDatabase
from neo4j_graphrag . indexes import create_vector_index
NEO4J_URI = "neo4j://localhost:7687"
NEO4J_USERNAME = "neo4j"
NEO4J_PASSWORD = "password"
INDEX_NAME = "vector-index-name"
# Connect to the Neo4j database
driver = GraphDatabase . driver ( NEO4J_URI , auth = ( NEO4J_USERNAME , NEO4J_PASSWORD ))
# Create the index
create_vector_index (
driver ,
INDEX_NAME ,
label = "Chunk" ,
embedding_property = "embedding" ,
dimensions = 3072 ,
similarity_fn = "euclidean" ,
)
driver . close ()
此示例演示了一种在 Neo4j 数据库中更新插入数据的方法。值得注意的是,还有其他方法,例如使用 Neo4j Python 驱动程序。
确保在执行此示例之前创建向量索引。
from neo4j import GraphDatabase
from neo4j_graphrag . embeddings import OpenAIEmbeddings
from neo4j_graphrag . indexes import upsert_vector
NEO4J_URI = "neo4j://localhost:7687"
NEO4J_USERNAME = "neo4j"
NEO4J_PASSWORD = "password"
# Connect to the Neo4j database
driver = GraphDatabase . driver ( NEO4J_URI , auth = ( NEO4J_USERNAME , NEO4J_PASSWORD ))
# Create an Embedder object
embedder = OpenAIEmbeddings ( model = "text-embedding-3-large" )
# Generate an embedding for some text
text = (
"The son of Duke Leto Atreides and the Lady Jessica, Paul is the heir of House "
"Atreides, an aristocratic family that rules the planet Caladan."
)
vector = embedder . embed_query ( text )
# Upsert the vector
upsert_vector (
driver ,
node_id = 0 ,
embedding_property = "embedding" ,
vector = vector ,
)
driver . close ()
请注意,查询 Neo4j 向量索引时,使用近似最近邻搜索,这可能并不总是提供准确的结果。有关更多信息,请参阅有关向量索引的限制和问题的 Neo4j 文档。
在下面的示例中,我们使用检索器执行简单的向量搜索,该检索器对vector-index-name
向量索引进行相似性搜索。
该库提供了除VectorRetriever
之外的更多检索器。有关如何使用这些检索器的示例,请参阅examples
文件夹。
在运行此示例之前,请确保已创建并填充向量索引。
from neo4j import GraphDatabase
from neo4j_graphrag . embeddings import OpenAIEmbeddings
from neo4j_graphrag . generation import GraphRAG
from neo4j_graphrag . llm import OpenAILLM
from neo4j_graphrag . retrievers import VectorRetriever
NEO4J_URI = "neo4j://localhost:7687"
NEO4J_USERNAME = "neo4j"
NEO4J_PASSWORD = "password"
INDEX_NAME = "vector-index-name"
# Connect to the Neo4j database
driver = GraphDatabase . driver ( NEO4J_URI , auth = ( NEO4J_USERNAME , NEO4J_PASSWORD ))
# Create an Embedder object
embedder = OpenAIEmbeddings ( model = "text-embedding-3-large" )
# Initialize the retriever
retriever = VectorRetriever ( driver , INDEX_NAME , embedder )
# Instantiate the LLM
llm = OpenAILLM ( model_name = "gpt-4o" , model_params = { "temperature" : 0 })
# Instantiate the RAG pipeline
rag = GraphRAG ( retriever = retriever , llm = llm )
# Query the graph
query_text = "Who is Paul Atreides?"
response = rag . search ( query_text = query_text , retriever_config = { "top_k" : 5 })
print ( response . answer )
driver . close ()
您必须签署贡献者许可协议才能为本项目做出贡献。
我们的 Python 依赖项是使用 Poetry 来管理的。如果您的系统上尚未安装 Poetry,您可以按照此处的说明进行设置。要开始此项目的开发,请首先克隆存储库,然后使用以下命令安装所有必要的依赖项,包括开发依赖项:
poetry install --with dev
如果您需要报告错误或请求功能,请首先搜索以查看问题是否已存在。如果不存在相关问题,请使用问题表单提出新问题。
如果您是 Neo4j Enterprise 客户,您还可以联系客户支持。
如果您没有要报告的错误或功能请求,但需要库的帮助;可通过 Neo4j 在线社区和/或 Discord 获得社区支持。
main
创建一个工作分支并开始进行更改!我们的代码库遵循严格的格式和 linting 标准,使用 Ruff 进行代码质量检查,使用 Mypy 进行类型检查。在贡献之前,请确保所有代码格式正确,没有 linting 问题,并且包含准确的类型注释。
贡献必须遵守这些标准才能被接受。
我们建议设置预提交来自动检查代码质量。这可以确保您的更改在提交之前符合我们的准则。
按照安装指南安装预提交。
通过运行以下命令设置预提交挂钩:
pre-commit install
要手动检查文件是否满足质量要求,请运行:
pre-commit run --file path/to/file
完成更改后,请使用以下工作流程创建拉取请求 (PR)。
main
。CHANGELOG.md
,其中包括:CHANGELOG.md
更改简短并关注最重要的更改。CHANGELOG.md
@CodiumAI-Agent /update_changelog
CHANGELOG.md
文件中“下一步”下的相应小节。安装项目依赖项,然后运行以下命令在本地运行单元测试:
poetry run pytest tests/unit
要执行端到端 (e2e) 测试,您需要在本地运行以下服务:
设置这些的最简单方法是使用 Docker Compose:
docker compose -f tests/e2e/docker-compose.yml up
(提示:如果您在数据库中遇到任何缓存问题,可以通过运行docker compose -f tests/e2e/docker-compose.yml down
来完全删除它们)
所有服务运行后,执行以下命令来运行 e2e 测试:
poetry run pytest tests/e2e