Официальный пакет Neo4j GraphRAG для Python позволяет разработчикам создавать приложения дополненной генерации с извлечением графов (GraphRAG), используя возможности Neo4j и Python. В качестве собственной библиотеки она предлагает надежное, многофункциональное и высокопроизводительное решение с дополнительной гарантией долгосрочной поддержки и обслуживания непосредственно от Neo4j.
Документацию можно найти здесь
Версия | Поддерживается? |
---|---|
3.12 | ✓ |
3.11 | ✓ |
3.10 | ✓ |
3,9 | ✓ |
3,8 | ✗ |
Чтобы установить последнюю стабильную версию, запустите:
pip install neo4j-graphrag
pygraphviz
используется для визуализации конвейеров. Инструкции по установке можно найти здесь.
Сценарии ниже демонстрируют, как начать работу с пакетом и использовать его ключевые функции. Чтобы запустить эти примеры, убедитесь, что у вас запущен и работает экземпляр Neo4j, и обновите переменные NEO4J_URI
, NEO4J_USERNAME
и NEO4J_PASSWORD
в каждом скрипте, указав сведения о вашем экземпляре Neo4j. Для примеров обязательно экспортируйте ключ OpenAI как переменную среды с именем OPENAI_API_KEY
. Дополнительные примеры доступны в папке examples
.
ПРИМЕЧАНИЕ. Чтобы использовать эту функцию, в вашем экземпляре Neo4j должна быть установлена основная библиотека APOC.
Этот пакет предлагает два метода построения графа знаний.
Класс 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. Важно отметить, что существуют альтернативные подходы, например использование драйвера Python Neo4j.
Перед выполнением этого примера убедитесь, что ваш векторный индекс создан.
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
и начните вносить изменения!Наша кодовая база соответствует строгим стандартам форматирования и линтинга, используя Ruff для проверки качества кода и Mypy для проверки типов. Прежде чем вносить свой вклад, убедитесь, что весь код правильно отформатирован, не содержит проблем с линтингом и содержит точные аннотации типов.
Соблюдение этих стандартов необходимо для принятия взносов.
Мы рекомендуем настроить предварительную фиксацию для автоматизации проверок качества кода. Это гарантирует, что ваши изменения будут соответствовать нашим рекомендациям перед их фиксацией.
Установите pre-commit, следуя руководству по установке.
Настройте перехватчики предварительной фиксации, выполнив:
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