Поєднання лексичних графів із векторним пошуком

Graph RAG з LangChain і Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Використання зв'язків у семантичному пошуку

Як працювати в Neo4j?

Діаграма графа з вузлом Review і текстовою властивістю "Neo4j is a great place to work"

Graph RAG з LangChain і Neo4j

Використання зв'язків у семантичному пошуку

Як працювати в Neo4j?

Відгук залишив користувач Person з ніком @emileifrem

Graph RAG з LangChain і Neo4j

Використання зв'язків у семантичному пошуку

Як працювати в Neo4j?

Emil Eifrem має зв'язок WORKS_AT до вузла Company з назвою Neo4j

Graph RAG з LangChain і Neo4j

Від текстових властивостей до вбудовувань

  • Створіть вбудовування вузлів з властивості text

сцена зі зв'язками HAS_CHUNK до вузлів Chunk зі строковою властивістю

Graph RAG з LangChain і Neo4j

Від текстових властивостей до вбудовувань

  • Створіть вбудовування вузлів з властивості text
  • Векторний пошук по вбудовуваннях
  • Використовуйте зв'язки для контексту

Текстові властивості на вузлах використовують для створення вбудовування

Graph RAG з LangChain і Neo4j

Neo4j як сховище векторів

from langchain_neo4j import Neo4jVector
  • Neo4jVector.from_documents(): створює вузли та підлеглий індекс з Documents
  • Neo4jVector.from_existing_graph(): створює індекс для наявних комбінацій міток і властивостей
Graph RAG з LangChain і Neo4j

Розбиття на частини наявних властивостей вузлів

Схема графа знань із підсвіченим зв'язком HAS_SCENE від вузла Act до вузла 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 з LangChain і Neo4j

Розбиття на частини наявних властивостей вузлів

  • Розбийте text за "\n\n"
  • Ремарки мають один рядок
  • Репліки починаються з імені персонажа
    • Наступні рядки містять вимовлені слова
 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 з LangChain і Neo4j

Розбиття на частини наявних властивостей вузлів

# 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 з LangChain і Neo4j

Розбиття на частини наявних властивостей вузлів

# ...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 з LangChain і Neo4j

Створення векторного індексу на наявному графі

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 з LangChain і Neo4j

Векторне отримання з LCEL

# Create retriever
retriever = store.as_retriever()

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

Давайте потренуємось!

Graph RAG з LangChain і Neo4j

Preparing Video For Download...