結合詞彙圖與向量搜尋

使用 LangChain 與 Neo4j 的 Graph RAG

Adam Cowley

Manager, Developer Education at Neo4j

在語意搜尋中運用關係

在 Neo4j 工作是什麼感覺?

一張圖形圖,包含一個 Review 節點與文字屬性「Neo4j is a great place to work」

使用 LangChain 與 Neo4j 的 Graph RAG

在語意搜尋中運用關係

在 Neo4j 工作是什麼感覺?

這則評論由顯示名稱為 @emileifrem 的 Person 發佈

使用 LangChain 與 Neo4j 的 Graph RAG

在語意搜尋中運用關係

在 Neo4j 工作是什麼感覺?

Emil Eifrem 與名稱為 Neo4j 的 Company 節點之間有 WORKS_AT 關係

使用 LangChain 與 Neo4j 的 Graph RAG

將文字屬性轉為嵌入

 

  • text 屬性建立節點嵌入

一個場景與多個 HAS_CHUNK 關係指向帶有字串屬性的 Chunk 節點

使用 LangChain 與 Neo4j 的 Graph RAG

將文字屬性轉為嵌入

 

  • text 屬性建立節點嵌入
  • 以向量搜尋嵌入
  • 用關係補足脈絡

使用節點上的文字屬性來建立嵌入

使用 LangChain 與 Neo4j 的 Graph RAG

將 Neo4j 作為向量儲存

from langchain_neo4j import Neo4jVector

 

  • Neo4jVector.from_documents(): 從 Document 建立節點與底層索引
  • Neo4jVector.from_existing_graph(): 在既有標籤與屬性組合上建立索引
使用 LangChain 與 Neo4j 的 Graph RAG

拆分既有節點屬性為區塊

知識圖中高亮從 Act 節點到 Scene 節點的 HAS_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']
使用 LangChain 與 Neo4j 的 Graph RAG

拆分既有節點屬性為區塊

  • "\n\n" 切分 text
  • 舞臺指示為單行
  • 角色台詞以角色名開頭
    • 後續行是實際台詞
 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...
使用 LangChain 與 Neo4j 的 Graph RAG

拆分既有節點屬性為區塊

# 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:])
使用 LangChain 與 Neo4j 的 Graph RAG

拆分既有節點屬性為區塊

# ...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"))
使用 LangChain 與 Neo4j 的 Graph RAG

在既有圖上建立向量索引

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",
)
使用 LangChain 與 Neo4j 的 Graph RAG

使用 LCEL 進行向量擷取

# Create retriever
retriever = store.as_retriever()

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

一起來練習吧!

使用 LangChain 與 Neo4j 的 Graph RAG

Preparing Video For Download...