Le package officiel Neo4j GraphRAG pour Python permet aux développeurs de créer des applications de génération augmentée de récupération de graphiques (GraphRAG) en utilisant la puissance de Neo4j et Python. En tant que bibliothèque propriétaire, elle offre une solution robuste, riche en fonctionnalités et hautes performances, avec l'assurance supplémentaire d'un support et d'une maintenance à long terme directement depuis Neo4j.
La documentation peut être trouvée ici
Version | Soutenu? |
---|---|
3.12 | ✓ |
3.11 | ✓ |
3.10 | ✓ |
3.9 | ✓ |
3.8 | ✗ |
Pour installer la dernière version stable, exécutez :
pip install neo4j-graphrag
pygraphviz
est utilisé pour visualiser les pipelines. Les instructions d'installation peuvent être trouvées ici.
Les scripts ci-dessous montrent comment démarrer avec le package et utiliser ses fonctionnalités clés. Pour exécuter ces exemples, assurez-vous que vous disposez d'une instance Neo4j opérationnelle et mettez à jour les variables NEO4J_URI
, NEO4J_USERNAME
et NEO4J_PASSWORD
dans chaque script avec les détails de votre instance Neo4j. Pour les exemples, assurez-vous d'exporter votre clé OpenAI en tant que variable d'environnement nommée OPENAI_API_KEY
. Des exemples supplémentaires sont disponibles dans le dossier examples
.
REMARQUE : La bibliothèque principale APOC doit être installée dans votre instance Neo4j pour pouvoir utiliser cette fonctionnalité.
Ce package propose deux méthodes pour construire un graphe de connaissances.
La classe Pipeline
offre des options de personnalisation étendues, ce qui la rend idéale pour les cas d'utilisation avancés. Voir le dossier examples/pipeline
pour des exemples d'utilisation de cette classe.
Pour une approche plus rationalisée, la classe SimpleKGPipeline
propose une couche d'abstraction simplifiée sur le Pipeline
, facilitant la création de graphiques de connaissances. Les deux classes prennent en charge le travail direct avec du texte et des 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 ()
Exemple de graphique de connaissances créé à l'aide du script ci-dessus :
Lors de la création d'un index vectoriel, assurez-vous de faire correspondre le nombre de dimensions de l'index avec le nombre de dimensions de vos intégrations.
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 ()
Cet exemple montre une méthode pour insérer des données dans votre base de données Neo4j. Il est important de noter qu'il existe des approches alternatives, telles que l'utilisation du pilote Python Neo4j.
Assurez-vous que votre index vectoriel est créé avant d'exécuter cet exemple.
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 ()
Veuillez noter que lors de l'interrogation d'un index vectoriel Neo4j, une recherche approximative du voisin le plus proche est utilisée, ce qui peut ne pas toujours fournir des résultats exacts. Pour plus d'informations, reportez-vous à la documentation Neo4j sur les limitations et les problèmes des index vectoriels.
Dans l'exemple ci-dessous, nous effectuons une recherche vectorielle simple à l'aide d'un récupérateur qui effectue une recherche de similarité sur l'index vectoriel vector-index-name
.
Cette bibliothèque fournit plus de récupérateurs au-delà du simple VectorRetriever
. Voir le dossier examples
pour des exemples d'utilisation de ces récupérateurs.
Avant d'exécuter cet exemple, assurez-vous que votre index vectoriel a été créé et rempli.
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 ()
Vous devez signer le contrat de licence des contributeurs pour pouvoir contribuer à ce projet.
Nos dépendances Python sont gérées à l'aide de Poetry. Si Poetry n'est pas encore installé sur votre système, vous pouvez suivre les instructions ici pour le configurer. Pour commencer le développement sur ce projet, commencez par cloner le référentiel puis installez toutes les dépendances nécessaires, y compris les dépendances de développement, avec la commande suivante :
poetry install --with dev
Si vous avez un bug à signaler ou une fonctionnalité à demander, recherchez d'abord si un problème existe déjà. Si un problème connexe n'existe pas, veuillez soulever un nouveau problème en utilisant le formulaire de problème.
Si vous êtes un client Neo4j Enterprise, vous pouvez également contacter le support client.
Si vous n'avez pas de bug à signaler ou de demande de fonctionnalité, mais que vous avez besoin d'un coup de main avec la bibliothèque ; le support communautaire est disponible via la communauté en ligne Neo4j et/ou Discord.
main
et commencez vos modifications !Notre base de code suit des normes strictes de formatage et de peluchage en utilisant Ruff pour les contrôles de qualité du code et Mypy pour la vérification de type. Avant de contribuer, assurez-vous que tout le code est correctement formaté, exempt de problèmes de peluchage et inclut des annotations de type précises.
Le respect de ces normes est requis pour que les contributions soient acceptées.
Nous vous recommandons de configurer un pré-commit pour automatiser les contrôles de qualité du code. Cela garantit que vos modifications respectent nos directives avant de s’engager.
Installez le pré-commit en suivant le guide d'installation.
Configurez les hooks de pré-validation en exécutant :
pre-commit install
Pour vérifier manuellement si un fichier répond aux exigences de qualité, exécutez :
pre-commit run --file path/to/file
Lorsque vous avez terminé vos modifications, créez une pull request (PR) à l'aide du flux de travail suivant.
main
.CHANGELOG.md
si vous avez apporté des modifications importantes au projet, notamment :CHANGELOG.md
brèves et concentrez-vous sur les modifications les plus importantes.CHANGELOG.md
@CodiumAI-Agent /update_changelog
CHANGELOG.md
sous « Suivant ».Installez les dépendances du projet puis exécutez la commande suivante pour exécuter les tests unitaires localement :
poetry run pytest tests/unit
Pour exécuter des tests de bout en bout (e2e), vous devez exécuter les services suivants localement :
Le moyen le plus simple de les configurer consiste à utiliser Docker Compose :
docker compose -f tests/e2e/docker-compose.yml up
(astuce : si vous rencontrez des problèmes de mise en cache dans les bases de données, vous pouvez les supprimer complètement en exécutant docker compose -f tests/e2e/docker-compose.yml down
)
Une fois tous les services exécutés, exécutez la commande suivante pour exécuter les tests e2e :
poetry run pytest tests/e2e