Đồ thị từ vựng

Graph RAG với LangChain và Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Tóm tắt

Kết quả được chèn vào prompt và sẵn sàng gửi tới LLM

Graph RAG với LangChain và Neo4j

Đồ thị từ vựng

 

  • Biểu diễn đồ thị cho văn bản và tài liệu phi cấu trúc
  • Lưu cấu trúc phân cấp của sách, bài nghiên cứu, v.v.
  • Mức chi tiết lưu văn bản thô

Sơ đồ biểu diễn phân cấp của tài liệu, quan hệ một-nhiều tới các trang, mỗi trang có nhiều nút mảnh văn bản

Graph RAG với LangChain và Neo4j

Romeo và Juliet

Giới thiệu:

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

Thông tin nhân vật:

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

Dẫn nhập:

 Enter Chorus.

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

Hồi và Cảnh:

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 với LangChain và Neo4j

Romeo và Juliet dưới dạng đồ thị tri thức

 

  • Vở kịch gồm các Hồi

Sơ đồ đồ thị tri thức làm nổi bật nút Hồi

Graph RAG với LangChain và Neo4j

Romeo và Juliet dưới dạng đồ thị tri thức

 

  • Vở kịch gồm các Hồi
  • Mỗi Hồi gồm các Cảnh

Sơ đồ đồ thị tri thức làm nổi bật quan hệ HAS_SCENE từ nút Hồi đến nút Cảnh

Graph RAG với LangChain và Neo4j

Romeo và Juliet dưới dạng đồ thị tri thức

 

  • Vở kịch gồm các Hồi
  • Mỗi Hồi gồm các Cảnh
  • Mỗi Cảnh có các Lời thoại

Sơ đồ đồ thị tri thức làm nổi bật quan hệ HAS_LINE từ nút Cảnh đến nút Lời thoại

Graph RAG với LangChain và Neo4j

Romeo và Juliet dưới dạng đồ thị tri thức

 

  • Vở kịch gồm các Hồi
  • Mỗi Hồi gồm các Cảnh
  • Mỗi Cảnh có các Lời thoại
  • Nhân vật nói các lời thoại

Sơ đồ đồ thị tri thức làm nổi bật quan hệ SPOKEN_BY từ nút Lời thoại đến nút Nhân vật

Graph RAG với LangChain và Neo4j

Romeo và Juliet dưới dạng đồ thị tri thức

 

  • Vở kịch gồm các Hồi
  • Mỗi Hồi gồm các Cảnh
  • Mỗi Cảnh có các Lời thoại
  • Nhân vật nói các lời thoại

 

→ Mỗi nút Lời thoại sẽ có thuộc tính văn bản và embedding

Sơ đồ đồ thị cho thấy các quan hệ: Hồi HAS_SCENE Cảnh, Cảnh HAS_LINE Lời thoại, Lời thoại SPOKEN_BY Nhân vật

Graph RAG với LangChain và Neo4j

Nạp tài liệu

Nạp tài liệu vào bộ nhớ bằng bộ nạp tài liệu:

# Load the PDF
loader = PyPDFLoader("romeo-and-juliet.pdf")
pages = loader.load()
Graph RAG với LangChain và Neo4j

Tách tài liệu

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 với LangChain và Neo4j

Tạo nút và quan hệ

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 với LangChain và Neo4j

Trích xuất các hồi

parts = act_splitter.split_text(text)

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

ACT I
ACT II
ACT III
Graph RAG với LangChain và Neo4j

Trích xuất các hồi

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 với LangChain và Neo4j

Trích xuất các hồi

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 với LangChain và Neo4j

Lưu các nút và quan hệ

Dùng đối tượng Neo4jGraph:

graph = Neo4jGraph(
    url=NEO4J_URI, 
    username=NEO4J_USERNAME, 
    password=NEO4J_PASSWORD
)
graph.add_graph_documents([graph_doc])
Graph RAG với LangChain và Neo4j

Ayo berlatih!

Graph RAG với LangChain và Neo4j

Preparing Video For Download...