Menggabungkan grafik leksikal dengan pencarian vektor

Graph RAG dengan LangChain dan Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Menggunakan relationship dalam pencarian semantik

Seperti apa bekerja di Neo4j?

Diagram graf dengan node Review dan properti teks "Neo4j is a great place to work"

Graph RAG dengan LangChain dan Neo4j

Menggunakan relationship dalam pencarian semantik

Seperti apa bekerja di Neo4j?

Ulasan diposting oleh Person dengan nama layar @emileifrem

Graph RAG dengan LangChain dan Neo4j

Menggunakan relationship dalam pencarian semantik

Seperti apa bekerja di Neo4j?

Emil Eifrem memiliki relationship WORKS_AT ke node Company bernama Neo4j

Graph RAG dengan LangChain dan Neo4j

Dari properti teks ke embedding

 

  • Buat embedding node dari properti text

sebuah scene dengan relationship HAS_CHUNK ke node Chunk dengan properti string

Graph RAG dengan LangChain dan Neo4j

Dari properti teks ke embedding

 

  • Buat embedding node dari properti text
  • Pencarian vektor pada embedding
  • Gunakan relationship sebagai konteks

Properti teks pada node digunakan untuk membuat embedding

Graph RAG dengan LangChain dan Neo4j

Neo4j sebagai vector store

from langchain_neo4j import Neo4jVector

 

  • Neo4jVector.from_documents(): Buat node dan indeks dari Document
  • Neo4jVector.from_existing_graph(): Buat indeks pada kombinasi label dan properti yang ada
Graph RAG dengan LangChain dan Neo4j

Membagi properti node yang ada (chunking)

Diagram knowledge graph menyoroti relationship HAS_SCENE dari node Act ke node 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 dengan LangChain dan Neo4j

Membagi properti node yang ada (chunking)

  • Pisahkan text dengan "\n\n"
  • Petunjuk panggung satu baris
  • Dialog diawali nama karakter
    • Baris berikutnya berisi ucapannya
 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 dengan LangChain dan Neo4j

Membagi properti node yang ada (chunking)

# 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 dengan LangChain dan Neo4j

Membagi properti node yang ada (chunking)

# ...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 dengan LangChain dan Neo4j

Membuat indeks vektor pada graf yang sudah ada

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 dengan LangChain dan Neo4j

Pengambilan vektor dengan LCEL

# Create retriever
retriever = store.as_retriever()

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

Ayo berlatih!

Graph RAG dengan LangChain dan Neo4j

Preparing Video For Download...