paint-brush
Создавайте эффективные графы знаний с помощью Relik и LlamaIndex: связывание сущностей и извлечение отношенийк@neo4j

Создавайте эффективные графы знаний с помощью Relik и LlamaIndex: связывание сущностей и извлечение отношений

к Neo4j7m2024/11/05
Read on Terminal Reader

Слишком долго; Читать

Узнайте, как Relik и LlamaIndex обеспечивают эффективное создание графа знаний без больших языковых моделей. Это руководство охватывает связывание сущностей, извлечение отношений и интеграцию Neo4j.
featured image - Создавайте эффективные графы знаний с помощью Relik и LlamaIndex: связывание сущностей и извлечение отношений
Neo4j HackerNoon profile picture
0-item
1-item


Построение графов знаний из текста уже давно является увлекательной областью исследований. С появлением больших языковых моделей (LLM) эта область привлекла больше внимания. Однако LLM могут быть довольно дорогими. Альтернативный подход заключается в тонкой настройке меньших моделей, что было поддержано академическими исследованиями, что приводит к более эффективным решениям. Сегодня мы рассмотрим Relik , фреймворк для запуска невероятно быстрых и легких моделей извлечения информации, разработанный группой NLP в Римском университете Ла Сапиенца.


Типичный конвейер извлечения информации без степени магистра права выглядит следующим образом:


Конвейер извлечения информации — изображение автора


Изображение иллюстрирует конвейер извлечения информации, начинающийся с входных данных, которые состоят из текста, упоминающего «Томазу нравится писать сообщения в блоге. Он особенно интересуется рисованием диаграмм». Процесс начинается с разрешения кореферентности для идентификации «Томаза» и «Он» как одной и той же сущности. Затем распознавание именованных сущностей (NER) идентифицирует такие сущности, как «Томаз», «Блог» и «Диаграмма».


Связывание сущностей — это процесс, который следует за NER, где распознанные сущности сопоставляются с соответствующими записями в базе данных или базе знаний. Например, «Tomaz» связан с «Tomaz Bratanic (Q12345)», а «Blog» с «Blog (Q321)», но «Diagram» не имеет соответствия в базе знаний.


Извлечение отношений — это следующий шаг, на котором система идентифицирует и извлекает значимые отношения между распознанными сущностями. Этот пример определяет, что «Томаз» имеет отношение к «Блогу», характеризуемому как «ПИШЕТ», что указывает на то, что Томаз пишет блоги. Кроме того, он определяет, что «Томаз» имеет отношение к «Диаграмме», характеризуемому как «ИНТЕРЕСУЮЩИЙСЯ_В», что указывает на то, что Томаз интересуется диаграммами.


Наконец, эта структурированная информация, включая сущности и их взаимосвязи, хранится в графе знаний, что позволяет организовать и сделать данные доступными для дальнейшего анализа или поиска.


Традиционно, без мощи LLM, весь этот процесс опирается на набор специализированных моделей, каждая из которых обрабатывает определенную задачу от разрешения кореферентности до извлечения взаимосвязей. Хотя интеграция этих моделей требует больше усилий и координации, она предлагает значительное преимущество: снижение затрат. Благодаря тонкой настройке меньших, специализированных для задач моделей общие расходы на создание и поддержку системы можно держать под контролем.


Код доступен на GitHub .

Настройка среды

Я предлагаю вам использовать отдельную среду Python, например Google Colab , поскольку нам придется немного поиграться с зависимостями. Модели быстрее на GPU, поэтому вы можете использовать среду выполнения на базе GPU, если у вас есть версия Pro.


Кроме того, нам нужно настроить Neo4j, собственную графовую базу данных, для хранения извлеченной информации. Существует много способов настроить экземпляр базы данных . Однако я рекомендую использовать Neo4j Aura , которая предоставляет бесплатный облачный экземпляр, к которому можно легко получить доступ из блокнота Google Colab.


Neo4j Aura – полностью управляемое облачное решение


После создания базы данных мы можем определить соединение с помощью LlamaIndex:


 from llama_index.graph_stores.neo4j import Neo4jPGStore username="neo4j" password="rubber-cuffs-radiator" url="bolt://54.89.19.156:7687" graph_store = Neo4jPGStore( username=username, password=password, url=url, refresh_schema=False )

Набор данных

Мы будем использовать набор данных новостей, который я получил через API Diffbot некоторое время назад. Набор данных удобно доступен на GitHub для повторного использования:


 import pandas as pd NUMBER_OF_ARTICLES = 100 news = pd.read_csv( "https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/news_articles.csv" ) news = news.head(NUMBER_OF_ARTICLES)

Разрешение кореференции

Первым шагом в конвейере является модель разрешения кореференции. Разрешение кореференции — это задача идентификации всех выражений в тексте, относящихся к одной и той же сущности.


Насколько мне известно, для разрешения кореферентности доступно не так много моделей с открытым исходным кодом. Я пробовал maverick-coref , но в моих тестах Coreferee от spaCy показал себя лучше, поэтому мы будем использовать его. Единственный недостаток использования Coreferee заключается в том, что нам приходится иметь дело с адом зависимостей, который решается в блокноте, но мы не будем его здесь рассматривать.


Вы можете загрузить модель coreference в spaCy с помощью следующего кода:


 import spacy, coreferee coref_nlp = spacy.load('en_core_web_lg') coref_nlp.add_pipe('coreferee')


Модель Coreferee обнаруживает кластеры выражений, которые ссылаются на одну и ту же сущность или сущности. Чтобы переписать текст на основе этих кластеров, нам нужно реализовать собственную функцию:


 def coref_text(text): coref_doc = coref_nlp(text) resolved_text = "" for token in coref_doc: repres = coref_doc._.coref_chains.resolve(token) if repres: resolved_text += " " + " and ".join( [ t.text if t.ent_type_ == "" else [e.text for e in coref_doc.ents if t in e][0] for t in repres ] ) else: resolved_text += " " + token.text return resolved_text


Давайте протестируем функцию, чтобы убедиться, что модели и зависимости настроены правильно:


 print( coref_text("Tomaz is so cool. He can solve various Python dependencies and not cry") ) # Tomaz is so cool . Tomaz can solve various Python dependencies and not cry


В этом примере модель определила, что «Томаз» и «Он» относятся к одной и той же сущности. Используя функцию coref_text, мы заменяем «Он» на «Томаз».


Обратите внимание, что переписывание не всегда возвращает грамматически правильные предложения из-за использования простой логики замены для сущностей внутри кластера. Тем не менее, этого должно быть достаточно для большинства сценариев.


Теперь мы применяем разрешение кореферентности к нашему набору данных новостей и оформляем результаты как документы LlamaIndex:


 from llama_index.core import Document news["coref_text"] = news["text"].apply(coref_text) documents = [ Document(text=f"{row['title']}: {row['coref_text']}") for i, row in news.iterrows() ]

Связывание сущностей и извлечение отношений

Relik — это библиотека с моделями для связывания сущностей (EL) и извлечения отношений (RE), а также поддерживает модели, которые объединяют эти две. В связывании сущностей Википедия используется как целевая база знаний для сопоставления сущностей в тексте с соответствующими им записями в энциклопедии.


Связывание сущностей с Википедией – Изображение автора



С другой стороны, извлечение связей включает в себя выявление и категоризацию связей между сущностями в тексте, что позволяет извлекать структурированную информацию из неструктурированных данных.


Извлечение отношений – Изображение автора



Если вы используете бесплатную версию Colab, используйте модель relik-ie/relik-relation-extraction-small, которая выполняет только извлечение связей. Если у вас версия Pro или вы будете использовать ее на более мощной локальной машине, вы можете протестировать модель relik-ie/relik-cie-small, которая выполняет связывание сущностей и извлечение связей.


 from llama_index.extractors.relik.base import RelikPathExtractor relik = RelikPathExtractor( model="relik-ie/relik-relation-extraction-small" ) # Use on Pro Collab with GPU # relik = RelikPathExtractor( # model="relik-ie/relik-cie-small", model_config={"skip_metadata": True, "device":"cuda"} # )


Кроме того, нам необходимо определить модель внедрения, которая будет использоваться для внедрения сущностей и LLM для вопросно-ответного потока:


 import os from llama_index.embeddings.openai import OpenAIEmbedding from llama_index.llms.openai import OpenAI os.environ["OPENAI_API_KEY"] = "sk-" llm = OpenAI(model="gpt-4o", temperature=0.0) embed_model = OpenAIEmbedding(model_name="text-embedding-3-small")


Обратите внимание, что LLM не будет использоваться при построении графика.


Теперь, когда у нас все готово, мы можем создать экземпляр PropertyGraphIndex и использовать новостные документы в качестве входных данных для графа знаний.


Кроме того, нам необходимо передать модель relik как значение kg_extractors для извлечения связей:


 from llama_index.core import PropertyGraphIndex index = PropertyGraphIndex.from_documents( documents, kg_extractors=[relik], llm=llm, embed_model=embed_model, property_graph_store=graph_store, show_progress=True, )



После построения графика вы можете открыть браузер Neo4j для проверки импортированного графика. Вы должны получить похожую визуализацию, выполнив следующий оператор Cypher:


 MATCH p=(:__Entity__)--(:__Entity__) RETURN p LIMIT 250


Результаты


Визуализация графика – Изображение автора


Вопрос Ответ

Используя LlamaIndex, теперь легко выполнять ответы на вопросы. Чтобы использовать извлекатели графов по умолчанию, вы можете задавать такие простые вопросы, как:


 query_engine = index.as_query_engine(include_text=True) response = query_engine.query("What happened at Ryanair?") print(str(response))


Вот где в игру вступают определенные LLM и модель встраивания. Конечно, вы также можете реализовать пользовательские извлекатели для потенциально большей точности.

Краткое содержание

Построение графов знаний без опоры на LLM не только осуществимо, но и экономически эффективно и действенно. Тонкая настройка меньших, специализированных для задач моделей, таких как в фреймворке Relik, позволяет добиться высокопроизводительного извлечения информации для приложений генерации дополненного поиска (RAG).


Связывание сущностей, важный шаг в этом процессе, гарантирует, что распознанные сущности точно сопоставляются с соответствующими записями в базе знаний, тем самым сохраняя целостность и полезность графа знаний.


Используя такие фреймворки, как Relik, и такие платформы, как Neo4j, можно создавать расширенные графы знаний, которые облегчают сложные задачи анализа и извлечения данных, и все это без высоких затрат, обычно связанных с развертыванием LLM. Этот метод не только делает мощные инструменты обработки данных более доступными, но и способствует инновациям и эффективности в рабочих процессах извлечения информации.


Обязательно дайте библиотеке Relik звезду . Код доступен на GitHub .


Чтобы узнать больше об этой теме, присоединяйтесь к нам на NODES 2024 7 ноября, нашей бесплатной виртуальной конференции разработчиков по интеллектуальным приложениям, графам знаний и ИИ. Зарегистрируйтесь СЕЙЧАС !