El paquete oficial Neo4j GraphRAG para Python permite a los desarrolladores crear aplicaciones de generación aumentada de recuperación de gráficos (GraphRAG) utilizando el poder de Neo4j y Python. Como biblioteca propia, ofrece una solución sólida, rica en funciones y de alto rendimiento, con la garantía adicional de soporte y mantenimiento a largo plazo directamente desde Neo4j.
La documentación se puede encontrar aquí.
Versión | ¿Apoyado? |
---|---|
3.12 | ✓ |
3.11 | ✓ |
3.10 | ✓ |
3.9 | ✓ |
3.8 | ✗ |
Para instalar la última versión estable, ejecute:
pip install neo4j-graphrag
pygraphviz
se utiliza para visualizar tuberías. Las instrucciones de instalación se pueden encontrar aquí.
Los scripts a continuación demuestran cómo comenzar con el paquete y utilizar sus características clave. Para ejecutar estos ejemplos, asegúrese de tener una instancia de Neo4j en funcionamiento y actualice las variables NEO4J_URI
, NEO4J_USERNAME
y NEO4J_PASSWORD
en cada script con los detalles de su instancia de Neo4j. Para los ejemplos, asegúrese de exportar su clave OpenAI como una variable de entorno denominada OPENAI_API_KEY
. Hay ejemplos adicionales disponibles en la carpeta de examples
.
NOTA: La biblioteca central APOC debe estar instalada en su instancia Neo4j para poder utilizar esta función
Este paquete ofrece dos métodos para construir un gráfico de conocimiento.
La clase Pipeline
proporciona amplias opciones de personalización, lo que la hace ideal para casos de uso avanzados. Consulte la carpeta de examples/pipeline
para ver ejemplos de cómo utilizar esta clase.
Para un enfoque más ágil, la clase SimpleKGPipeline
ofrece una capa de abstracción simplificada sobre Pipeline
, lo que facilita la creación de gráficos de conocimiento. Ambas clases admiten trabajar directamente con texto y archivos 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 ()
Ejemplo de gráfico de conocimiento creado con el script anterior:
Al crear un índice vectorial, asegúrese de hacer coincidir la cantidad de dimensiones del índice con la cantidad de dimensiones que tienen sus incrustaciones.
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 ()
Este ejemplo demuestra un método para insertar datos en su base de datos Neo4j. Es importante tener en cuenta que existen enfoques alternativos, como utilizar el controlador Neo4j Python.
Asegúrese de que su índice vectorial esté creado antes de ejecutar este ejemplo.
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 ()
Tenga en cuenta que al consultar un índice vectorial Neo4j se utiliza la búsqueda aproximada del vecino más cercano, que puede no siempre ofrecer resultados exactos. Para obtener más información, consulte la documentación de Neo4j sobre limitaciones y problemas de índices vectoriales.
En el siguiente ejemplo, realizamos una búsqueda vectorial simple utilizando un recuperador que realiza una búsqueda de similitud sobre el índice vectorial vector-index-name
.
Esta biblioteca proporciona más recuperadores además de VectorRetriever
. Consulte la carpeta de examples
para ver ejemplos de cómo utilizar estos recuperadores.
Antes de ejecutar este ejemplo, asegúrese de que su índice de vectores haya sido creado y completado.
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 ()
Debe firmar el acuerdo de licencia de contribuyentes para poder realizar contribuciones a este proyecto.
Nuestras dependencias de Python se gestionan mediante Poetry. Si Poetry aún no está instalado en su sistema, puede seguir las instrucciones aquí para configurarlo. Para comenzar el desarrollo de este proyecto, comience clonando el repositorio y luego instale todas las dependencias necesarias, incluidas las dependencias de desarrollo, con el siguiente comando:
poetry install --with dev
Si tiene un error que informar o una función que solicitar, primero busque para ver si ya existe un problema. Si no existe un problema relacionado, plantee un nuevo problema utilizando el formulario de problemas.
Si es cliente de Neo4j Enterprise, también puede comunicarse con Atención al cliente.
Si no tiene un error que informar o solicitar una función, pero necesita ayuda con la biblioteca; El soporte de la comunidad está disponible a través de Neo4j Online Community y/o Discord.
main
y comience con sus cambios!Nuestra base de código sigue estrictos estándares de formato y linting utilizando Ruff para controles de calidad del código y Mypy para verificación de tipos. Antes de contribuir, asegúrese de que todo el código tenga el formato adecuado, no tenga problemas de linting e incluya anotaciones tipográficas precisas.
Se requiere el cumplimiento de estos estándares para que se acepten contribuciones.
Recomendamos configurar un compromiso previo para automatizar las comprobaciones de calidad del código. Esto garantiza que sus cambios cumplan con nuestras pautas antes de confirmarlos.
Instale la confirmación previa siguiendo la guía de instalación.
Configure los ganchos de confirmación previa ejecutando:
pre-commit install
Para comprobar manualmente si un archivo cumple con los requisitos de calidad, ejecute:
pre-commit run --file path/to/file
Cuando haya terminado con los cambios, cree una solicitud de extracción (PR) utilizando el siguiente flujo de trabajo.
main
.CHANGELOG.md
si ha realizado cambios significativos en el proyecto, estos incluyen:CHANGELOG.md
y céntrese en los cambios más importantes.CHANGELOG.md
@CodiumAI-Agent /update_changelog
CHANGELOG.md
en 'Siguiente'.Instale las dependencias del proyecto y luego ejecute el siguiente comando para ejecutar las pruebas unitarias localmente:
poetry run pytest tests/unit
Para ejecutar pruebas de un extremo a otro (e2e), necesita que los siguientes servicios se ejecuten localmente:
La forma más sencilla de configurarlos es mediante Docker Compose:
docker compose -f tests/e2e/docker-compose.yml up
(Consejo: si encuentra algún problema de almacenamiento en caché dentro de las bases de datos, puede eliminarlo por completo ejecutando docker compose -f tests/e2e/docker-compose.yml down
)
Una vez que todos los servicios se estén ejecutando, ejecute el siguiente comando para ejecutar las pruebas e2e:
poetry run pytest tests/e2e