Лексические графы

Graph RAG с LangChain и Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Повторение

Результаты подставляются в промпт и отправляются в LLM

Graph RAG с LangChain и Neo4j

Лексические графы

 

  • Графовое представление неструктурированного текста и документов
  • Хранит иерархическое представление книги, научной статьи и т. д.
  • На нижнем уровне хранится необработанный текст

Диаграмма, отражающая иерархию документа: связи «один ко многим» с страницами, каждая из которых связана со множеством узлов-фрагментов

Graph RAG с LangChain и Neo4j

Ромео и Джульетта

Введение:

The Project Gutenberg eBook of Romeo and Juliet

This ebook is for the use of anyone anywhere in the United States and
most other parts of the world at no cost and with almost no restrictions

Title: Romeo and Juliet
Author: William Shakespeare

Информация о персонажах:

Dramatis Personæ

ESCALUS, Prince of Verona.
MERCUTIO, kinsman to the Prince, and friend to Romeo.
PARIS, a young Nobleman, kinsman to the Prince.
Page to Paris.
...

Пролог:

 Enter Chorus.

CHORUS.
Two households, both alike in dignity,
In fair Verona, where we lay our scene,
From ancient grudge break to new mutiny,
...

Акты и сцены:

ACT I
SCENE I. A public place.
 Enter Sampson and Gregory armed with swords and bucklers.

SAMPSON.
Gregory, on my word, we'll not carry coals.

GREGORY.
No, for then we should be colliers...
1 https://gutenberg.org/ebooks/1513
Graph RAG с LangChain и Neo4j

Ромео и Джульетта как граф знаний

 

  • Пьеса состоит из Актов

Диаграмма графа знаний с выделенным узлом «Акт»

Graph RAG с LangChain и Neo4j

Ромео и Джульетта как граф знаний

 

  • Пьеса состоит из Актов
  • Акты состоят из Сцен

Диаграмма графа знаний с выделенной связью HAS_SCENE от узла «Акт» к узлу «Сцена»

Graph RAG с LangChain и Neo4j

Ромео и Джульетта как граф знаний

 

  • Пьеса состоит из Актов
  • Акты состоят из Сцен
  • Сцены содержат Реплики

Диаграмма графа знаний с выделенной связью HAS_LINE от узла «Сцена» к узлу «Реплика»

Graph RAG с LangChain и Neo4j

Ромео и Джульетта как граф знаний

 

  • Пьеса состоит из Актов
  • Акты состоят из Сцен
  • Сцены содержат Реплики
  • Реплики произносят Персонажи

Диаграмма графа знаний с выделенной связью SPOKEN_BY от узла «Реплика» к узлу «Персонаж»

Graph RAG с LangChain и Neo4j

Ромео и Джульетта как граф знаний

 

  • Пьеса состоит из Актов
  • Акты состоят из Сцен
  • Сцены содержат Реплики
  • Реплики произносят Персонажи

 

→ Каждый узел Реплика содержит свойства текста и эмбеддинга

Диаграмма графа со следующими связями: Act HAS_SCENE Scene, Scene HAS_LINE Line, Line SPOKEN_BY Character

Graph RAG с LangChain и Neo4j

Загрузка документа

Загрузите документ в память с помощью загрузчика документов:

# Load the PDF
loader = PyPDFLoader("romeo-and-juliet.pdf")
pages = loader.load()
Graph RAG с LangChain и Neo4j

Разбивка документа

act_splitter = RecursiveCharacterTextSplitter(
    # Split text into acts
    separators=[ r"\n\nTHE PROLOGUE.",  r"\n\nACT", r"\n\n\*\*\* END"],
    is_separator_regex=True
)

scene_splitter = RecursiveCharacterTextSplitter( # Split act into scenes separators=[r"\nSCENE "], is_separator_regex=True )
Graph RAG с LangChain и Neo4j

Создание узлов и связей

play = Node(

type="Play",
id="romeo-and-juliet",
properties={ "title": "Romeo and Juliet", "playwright": "William Shakespeare", "genres": ["Romance", "Tragedy"] }
)
# Store in a graph document graph_doc = GraphDocument(nodes=[play], relationships=[])
Graph RAG с LangChain и Neo4j

Извлечение актов

parts = act_splitter.split_text(text)

for act in parts: print(act[:20])
THE PROLOGUE...

ACT I
ACT II
ACT III
Graph RAG с LangChain и Neo4j

Извлечение актов

parts = act_splitter.split_text(text)

for a, act in enumerate(parts):

first_line = act_text.split("\n")[0].strip()
if first_line.startswith("ACT"):
act_node = Node(
type="Act",
id=first_line,
)
graph_doc.nodes.append(act_node)
Graph RAG с LangChain и Neo4j

Извлечение актов

for a, act in enumerate(parts):
    # ...
    # act_node = Node(...)


# Create a relationship relationship = Relationship(
source=play,
target=act_node,
type="HAS_ACT",
properties=dict(order=a)
)
graph_doc.relationships.append(relationship)
Graph RAG с LangChain и Neo4j

Сохранение узлов и связей

Используйте объект Neo4jGraph:

graph = Neo4jGraph(
    url=NEO4J_URI, 
    username=NEO4J_USERNAME, 
    password=NEO4J_PASSWORD
)
graph.add_graph_documents([graph_doc])
Graph RAG с LangChain и Neo4j

Давайте потренируемся!

Graph RAG с LangChain и Neo4j

Preparing Video For Download...