Kết hợp đồ thị từ vựng với tìm kiếm vector

Graph RAG với LangChain và Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Dùng quan hệ trong tìm kiếm ngữ nghĩa

Làm việc tại Neo4j như thế nào?

Sơ đồ đồ thị với một nút Review và thuộc tính text "Neo4j is a great place to work"

Graph RAG với LangChain và Neo4j

Dùng quan hệ trong tìm kiếm ngữ nghĩa

Làm việc tại Neo4j như thế nào?

Bài đánh giá được đăng bởi một Person với tên màn hình @emileifrem

Graph RAG với LangChain và Neo4j

Dùng quan hệ trong tìm kiếm ngữ nghĩa

Làm việc tại Neo4j như thế nào?

Emil Eifrem có quan hệ WORKS_AT tới một nút Company tên Neo4j

Graph RAG với LangChain và Neo4j

Từ thuộc tính văn bản đến embedding

 

  • Tạo embedding nút từ thuộc tính text

một Scene có các quan hệ HAS_CHUNK tới các nút Chunk với thuộc tính chuỗi

Graph RAG với LangChain và Neo4j

Từ thuộc tính văn bản đến embedding

 

  • Tạo embedding nút từ thuộc tính text
  • Tìm kiếm vector trên embedding
  • Dùng quan hệ làm ngữ cảnh

Các thuộc tính text trên nút được dùng để tạo embedding

Graph RAG với LangChain và Neo4j

Neo4j như một vector store

from langchain_neo4j import Neo4jVector

 

  • Neo4jVector.from_documents(): Tạo nút và index nền từ các Document
  • Neo4jVector.from_existing_graph(): Tạo index trên nhãn và cặp thuộc tính hiện có
Graph RAG với LangChain và Neo4j

Chia nhỏ thuộc tính nút hiện có

Sơ đồ knowledge graph làm nổi bật quan hệ HAS_SCENE từ nút Act đến nút Scene

res = graph.query("""

MATCH (s:Scene)
WHERE NOT {(s)-[:HAS_LINE]->()}
RETURN s.id AS id, s.text AS text
""")
for scene in res: # Create chunks from scene['text']
Graph RAG với LangChain và Neo4j

Chia nhỏ thuộc tính nút hiện có

  • Tách text theo "\n\n"
  • Chỉ dẫn sân khấu có một dòng
  • Lời thoại bắt đầu bằng tên nhân vật
    • Các dòng sau là nội dung nói
 Enter Sampson and Gregory armed with swords..

SAMPSON.
Gregory, on my word...
GREGORY. No, for then we should...
SAMPSON. I mean, if we be in choler, we'll draw...
Graph RAG với LangChain và Neo4j

Chia nhỏ thuộc tính nút hiện có

# Split text into lines
lines = [
    line.strip() for line in text.split("\n\n")

if "\n" in line
]
for line in lines: parts = line.split("\n")
character = parts[0]
text = "\n".join(parts[1:])
Graph RAG với LangChain và Neo4j

Chia nhỏ thuộc tính nút hiện có

# ...Continuing loop over scenes

line_node = Node(type="Line", id=f"{scene.id}-line-{i}", properties={})
character_node = Node(type="Character", id=character, properties={})


# (:Scene)-[:HAS_LINE]->(:Line) graph_document.relationships.append( Relationship(source=scene, target=line_node, type="HAS_LINE"))
# (:Line)-[:SPOKEN_BY]->(:Character) graph_document.relationships.append(Relationship( source=line_node, target=characters[character], type="SPOKEN_BY"))
Graph RAG với LangChain và Neo4j

Tạo vector index trên đồ thị hiện có

from langchain.embeddings import init_embeddings
store = Neo4jVector.from_existing_graph(

init_embeddings("openai:text-embedding-3-small"),
url=NEO4J_URI, username=NEO4J_USERNAME, password=NEO4J_PASSWORD,
node_label="Line",
text_node_properties=["text"],
embedding_node_property="embedding",
index_name="lines",
)
Graph RAG với LangChain và Neo4j

Truy hồi vector với LCEL

# Create retriever
retriever = store.as_retriever()

# Invoke manually retriever.invoke("What does Romeo think of Juliet?") # [ Document, Document, ... ]
Graph RAG với LangChain và Neo4j

Vamos praticar!

Graph RAG với LangChain và Neo4j

Preparing Video For Download...