Lexikální grafy

Graph RAG s LangChain a Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Rekapitulace

Výsledky jsou vloženy do promptu a připraveny k odeslání do LLM

Graph RAG s LangChain a Neo4j

Lexikální grafy

 

  • Grafová reprezentace nestrukturovaného textu a dokumentů
  • Ukládá hierarchickou strukturu knihy, vědeckého článku atd.
  • Nejnižší úroveň obsahuje surový text

Diagram znázorňující hierarchii dokumentu – vztahy 1:N ke stránkám, z nichž každá má přiřazené uzly fragmentů

Graph RAG s LangChain a Neo4j

Romeo a Julie

Úvod:

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

Informace o postavách:

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.
...

Prolog:

 Enter Chorus.

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

Dějství a scény:

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 s LangChain a Neo4j

Romeo a Julie jako znalostní graf

 

  • Hra se skládá z dějství

Diagram znalostního grafu se zvýrazněným uzlem dějství

Graph RAG s LangChain a Neo4j

Romeo a Julie jako znalostní graf

 

  • Hra se skládá z dějství
  • Dějství se skládají ze scén

Diagram znalostního grafu se zvýrazněným vztahem HAS_SCENE mezi uzlem dějství a uzlem scény

Graph RAG s LangChain a Neo4j

Romeo a Julie jako znalostní graf

 

  • Hra se skládá z dějství
  • Dějství se skládají ze scén
  • Scény obsahují repliky

Diagram znalostního grafu se zvýrazněným vztahem HAS_LINE mezi uzlem scény a uzlem repliky

Graph RAG s LangChain a Neo4j

Romeo a Julie jako znalostní graf

 

  • Hra se skládá z dějství
  • Dějství se skládají ze scén
  • Scény obsahují repliky
  • Repliky pronášejí postavy

Diagram znalostního grafu se zvýrazněným vztahem SPOKEN_BY mezi uzlem repliky a uzlem postavy

Graph RAG s LangChain a Neo4j

Romeo a Julie jako znalostní graf

 

  • Hra se skládá z dějství
  • Dějství se skládají ze scén
  • Scény obsahují repliky
  • Repliky pronášejí postavy

 

→ Každý uzel repliky bude mít vlastnosti text a embedding

Diagram grafu znázorňující vztahy: Act HAS_SCENE Scene, Scene HAS_LINE Line, Line SPOKEN_BY Character

Graph RAG s LangChain a Neo4j

Načítání dokumentu

Načti dokument do paměti pomocí document loaderu:

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

Rozdělení dokumentu

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 s LangChain a Neo4j

Vytváření uzlů a vztahů

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 s LangChain a Neo4j

Extrakce dějství

parts = act_splitter.split_text(text)

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

ACT I
ACT II
ACT III
Graph RAG s LangChain a Neo4j

Extrakce dějství

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 s LangChain a Neo4j

Extrakce dějství

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 s LangChain a Neo4j

Ukládání uzlů a vztahů

Pomocí objektu Neo4jGraph:

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

Pojďme cvičit!

Graph RAG s LangChain a Neo4j

Preparing Video For Download...