Das offizielle Neo4j GraphRAG-Paket für Python ermöglicht Entwicklern die Erstellung von Graph Retrieval Augmented Generation (GraphRAG)-Anwendungen mit der Leistungsfähigkeit von Neo4j und Python. Als Erstanbieter-Bibliothek bietet sie eine robuste, funktionsreiche und leistungsstarke Lösung mit der zusätzlichen Sicherheit von langfristigem Support und Wartung direkt von Neo4j.
Die Dokumentation finden Sie hier
Version | Unterstützt? |
---|---|
3.12 | ✓ |
3.11 | ✓ |
3.10 | ✓ |
3.9 | ✓ |
3.8 | ✗ |
Führen Sie Folgendes aus, um die neueste stabile Version zu installieren:
pip install neo4j-graphrag
pygraphviz
wird zur Visualisierung von Pipelines verwendet. Eine Installationsanleitung finden Sie hier.
Die folgenden Skripte zeigen, wie Sie mit dem Paket beginnen und seine wichtigsten Funktionen nutzen. Um diese Beispiele auszuführen, stellen Sie sicher, dass eine Neo4j-Instanz aktiv ist und aktualisieren Sie die Variablen NEO4J_URI
, NEO4J_USERNAME
und NEO4J_PASSWORD
in jedem Skript mit den Details Ihrer Neo4j-Instanz. Stellen Sie für die Beispiele sicher, dass Sie Ihren OpenAI-Schlüssel als Umgebungsvariable mit dem Namen OPENAI_API_KEY
exportieren. Weitere Beispiele finden Sie im examples
.
HINWEIS: Um diese Funktion nutzen zu können, muss die APOC-Kernbibliothek in Ihrer Neo4j-Instanz installiert sein
Dieses Paket bietet zwei Methoden zum Erstellen eines Wissensgraphen.
Die Pipeline
Klasse bietet umfangreiche Anpassungsoptionen und eignet sich daher ideal für fortgeschrittene Anwendungsfälle. Beispiele für die Verwendung dieser Klasse finden Sie im Ordner examples/pipeline
.
Für einen effizienteren Ansatz bietet die SimpleKGPipeline
-Klasse eine vereinfachte Abstraktionsschicht über der Pipeline
, was die Erstellung von Wissensgraphen erleichtert. Beide Klassen unterstützen die direkte Arbeit mit Text und PDFs.
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 ()
Beispiel eines Wissensgraphen, der mit dem obigen Skript erstellt wurde:
Stellen Sie beim Erstellen eines Vektorindex sicher, dass die Anzahl der Dimensionen im Index mit der Anzahl der Dimensionen Ihrer Einbettungen übereinstimmt.
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 ()
Dieses Beispiel zeigt eine Methode zum Einfügen von Daten in Ihre Neo4j-Datenbank. Es ist wichtig zu beachten, dass es alternative Ansätze gibt, beispielsweise die Verwendung des Neo4j-Python-Treibers.
Stellen Sie sicher, dass Ihr Vektorindex erstellt wird, bevor Sie dieses Beispiel ausführen.
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 ()
Bitte beachten Sie, dass bei der Abfrage eines Neo4j-Vektorindex die Suche nach dem ungefähren nächsten Nachbarn verwendet wird, was möglicherweise nicht immer genaue Ergebnisse liefert. Weitere Informationen finden Sie in der Neo4j-Dokumentation zu Einschränkungen und Problemen von Vektorindizes.
Im folgenden Beispiel führen wir eine einfache Vektorsuche mit einem Retriever durch, der eine Ähnlichkeitssuche über den vector-index-name
durchführt.
Diese Bibliothek bietet mehr Retriever als nur den VectorRetriever
. Beispiele für die Verwendung dieser Retriever finden Sie im examples
.
Bevor Sie dieses Beispiel ausführen, stellen Sie sicher, dass Ihr Vektorindex erstellt und gefüllt wurde.
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 ()
Sie müssen die Lizenzvereinbarung für Mitwirkende unterzeichnen, um Beiträge zu diesem Projekt leisten zu können.
Unsere Python-Abhängigkeiten werden mit Poetry verwaltet. Wenn Poetry noch nicht auf Ihrem System installiert ist, können Sie den Anweisungen hier folgen, um es einzurichten. Um mit der Entwicklung dieses Projekts zu beginnen, klonen Sie zunächst das Repository und installieren Sie dann alle erforderlichen Abhängigkeiten, einschließlich der Entwicklungsabhängigkeiten, mit dem folgenden Befehl:
poetry install --with dev
Wenn Sie einen Fehler melden oder eine Funktion anfordern möchten, suchen Sie zunächst, ob bereits ein Problem besteht. Wenn ein verwandtes Problem nicht existiert, melden Sie bitte über das Problemformular ein neues Problem.
Wenn Sie Neo4j Enterprise-Kunde sind, können Sie sich auch an den Kundensupport wenden.
Wenn Sie keinen Fehler melden oder keine Funktion wünschen, aber Hilfe bei der Bibliothek benötigen; Community-Support ist über die Neo4j Online Community und/oder Discord verfügbar.
main
und beginnen Sie mit Ihren Änderungen!Unsere Codebasis folgt strengen Formatierungs- und Linting-Standards und verwendet Ruff für Codequalitätsprüfungen und Mypy für die Typprüfung. Stellen Sie vor dem Beitrag sicher, dass der gesamte Code ordnungsgemäß formatiert ist, keine Linting-Probleme aufweist und korrekte Typanmerkungen enthält.
Die Einhaltung dieser Standards ist Voraussetzung für die Annahme von Beiträgen.
Wir empfehlen die Einrichtung eines Pre-Commits, um Codequalitätsprüfungen zu automatisieren. Dadurch wird sichergestellt, dass Ihre Änderungen unseren Richtlinien entsprechen, bevor sie übernommen werden.
Installieren Sie Pre-Commit, indem Sie der Installationsanleitung folgen.
Richten Sie die Pre-Commit-Hooks ein, indem Sie Folgendes ausführen:
pre-commit install
Um manuell zu prüfen, ob eine Datei die Qualitätsanforderungen erfüllt, führen Sie Folgendes aus:
pre-commit run --file path/to/file
Wenn Sie mit Ihren Änderungen fertig sind, erstellen Sie mithilfe des folgenden Workflows eine Pull-Anfrage (PR).
main
eingestellt ist.CHANGELOG.md
, wenn Sie wesentliche Änderungen am Projekt vorgenommen haben, dazu gehören:CHANGELOG.md
-Änderungen kurz und konzentrieren Sie sich auf die wichtigsten Änderungen.CHANGELOG.md
@CodiumAI-Agent /update_changelog
CHANGELOG.md
unter „Weiter“.Installieren Sie die Projektabhängigkeiten und führen Sie dann den folgenden Befehl aus, um die Komponententests lokal auszuführen:
poetry run pytest tests/unit
Um End-to-End-Tests (E2E) auszuführen, müssen die folgenden Dienste lokal ausgeführt werden:
Der einfachste Weg, diese einzurichten, ist die Verwendung von Docker Compose:
docker compose -f tests/e2e/docker-compose.yml up
(Tipp: Wenn Sie auf Caching-Probleme in den Datenbanken stoßen, können Sie diese vollständig entfernen, indem Sie docker compose -f tests/e2e/docker-compose.yml down
ausführen.)
Sobald alle Dienste ausgeführt werden, führen Sie den folgenden Befehl aus, um die e2e-Tests auszuführen:
poetry run pytest tests/e2e