Лексичні графи

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 від вузла Act до вузла Scene

Graph RAG з LangChain і Neo4j

«Ромео і Джульєтта» як граф знань

 

  • П'єса складається з дій
  • Дії складаються зі сцен
  • Сцени містять репліки

Діаграма графа знань із виділеним зв'язком HAS_LINE від вузла Scene до вузла Line

Graph RAG з LangChain і Neo4j

«Ромео і Джульєтта» як граф знань

 

  • П'єса складається з дій
  • Дії складаються зі сцен
  • Сцени містять репліки
  • Репліки промовляють персонажі

Діаграма графа знань із виділеним зв'язком SPOKEN_BY від вузла Line до вузла Character

Graph RAG з LangChain і Neo4j

«Ромео і Джульєтта» як граф знань

 

  • П'єса складається з дій
  • Дії складаються зі сцен
  • Сцени містять репліки
  • Репліки промовляють персонажі

 

→ Кожен вузол Line матиме властивості text і embedding

Діаграма графа із зв'язками: 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...