Графи та RAG

Graph RAG з LangChain і Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Познайомтесь з інструктором

 

  • Менеджер із навчання розробників у Neo4j
  • Навчання розробників через Neo4j GraphAcademy
  • 20+ років досвіду розробки ПЗ
  • 10+ років досвіду з Neo4j

 

Світлина Адама

1 https://graphacademy.neo4j.com
Graph RAG з LangChain і Neo4j

Літера R у RAG

Діаграма застосунку: введення користувача додається до підказки, що надсилається до LLM

Graph RAG з LangChain і Neo4j

Літера R у RAG

Підказці потрібен контекст з документів і джерел даних

Graph RAG з LangChain і Neo4j

Літера R у RAG

Ці дані часто перетворюють на векторні вбудовування

Graph RAG з LangChain і Neo4j

Де семантичний пошук дає збій?

Вектори добре працюють для

  • Нечітких або відкритих запитань

Вектори неефективні для

  • Дуже специфічних або фактологічних запитань
  • Числових або запитів на точну відповідність
  • Логічних запитів

Що Пол Ґрем думає про Generative AI?

У скільки стартапів Generative AI інвестував Пол Ґрем?

Graph RAG з LangChain і Neo4j

Вектори vs графи знань

Текст Векторне вбудовування
He's just a city boy born [0.12, -0.34, 0.56, 0.78, ..., -0.91]
born and raised in South Detroit [0.22, 0.45, -0.67, 0.11, ..., 0.33]
He took the midnight train [-0.55, 0.89, 0.12, -0.44, ..., 0.67]
going anywhere [0.78, -0.23, 0.45, 0.91, ..., -0.12]

Графова діаграма з сутностями з тексту пісні Don't Stop Believin': хлопець із маленького містечка з зв'язками BORN і RAISED до South Detroit

Graph RAG з LangChain і Neo4j

Вектори vs графи знань

Текст Векторне вбудовування
He's just a city boy born [0.12, -0.34, 0.56, 0.78, ..., -0.91]
born and raised in South Detroit [0.22, 0.45, -0.67, 0.11, ..., 0.33]
He took the midnight train [-0.55, 0.89, 0.12, -0.44, ..., 0.67]
going anywhere [0.78, -0.23, 0.45, 0.91, ..., -0.12]

Вузли: person — Small town boy, location — South Detroit, train — Midnight Train і location — Anywhere

Graph RAG з LangChain і Neo4j

Вектори vs графи знань

Текст Векторне вбудовування
He's just a city boy born [0.12, -0.34, 0.56, 0.78, ..., -0.91]
born and raised in South Detroit [0.22, 0.45, -0.67, 0.11, ..., 0.33]
He took the midnight train [-0.55, 0.89, 0.12, -0.44, ..., 0.67]
going anywhere [0.78, -0.23, 0.45, 0.91, ..., -0.12]

Зв'язки BORN і RAISED йдуть від особи до місця. Зв'язок GOING іде від вузла Midnight Train до вузла Anywhere

Graph RAG з LangChain і Neo4j

Графи знань і Neo4j

 

  • Neo4j — провідна у світі графова база даних
  • Гнучка, зі схемою за бажанням
  • Інтеграція LangChain langchain-neo4j
  • LCEL: LangChain Expression Language

Логотипи neo4j і langchain

1 https://db-engines.com/en/ranking/graph%20dbms
Graph RAG з LangChain і Neo4j

Вузли представляють об'єкти

from langchain_neo4j.graphs.graph_document \
  import Node

book = Node(
type="Book",
id=f"9781098127107",
properties={ "title": "Building Knowledge Graphs" }
)

Вузол книги в графі з властивостями ID і Title

Graph RAG з LangChain і Neo4j

Зв'язки поєднують вузли

from langchain_neo4j.graphs.graph_document \
  import Node, Relationship

book = Node(type="Book", id=f"9781098127107")

jesus = Node(type="Person", id="dr-jesus-barrasa")
jim = Node(type="Person", id="chief-scientist")
for author in [jesus, jim]:
    relationship = Relationship(





)

Два зв'язки WRITTEN_BY від вузла Book до двох вузлів Person, що представляють авторів

Graph RAG з LangChain і Neo4j

Зв'язки поєднують вузли

from langchain_neo4j.graphs.graph_document \
  import Node, Relationship

book = Node(type="Book", id=f"9781098127107")

jesus = Node(type="Person", id="dr-jesus-barrasa")
jim = Node(type="Person", id="chief-scientist")
for author in [jesus, jim]:
    relationship = Relationship(

source=book,



)

Початковий вузол зв'язку WRITTEN_BY — вузол Book

Graph RAG з LangChain і Neo4j

Зв'язки поєднують вузли

from langchain_neo4j.graphs.graph_document \
  import Node, Relationship

book = Node(type="Book", id=f"9781098127107")

jesus = Node(type="Person", id="dr-jesus-barrasa")
jim = Node(type="Person", id="chief-scientist")
for author in [jesus, jim]:
    relationship = Relationship(

source=book,
target=author,


)

Цільовий вузол для зв'язку WRITTEN_IN — це Person

Graph RAG з LangChain і Neo4j

Зв'язки поєднують вузли

from langchain_neo4j.graphs.graph_document \
  import Node, Relationship

book = Node(type="Book", id=f"9781098127107")

jesus = Node(type="Person", id="dr-jesus-barrasa")
jim = Node(type="Person", id="chief-scientist")
for author in [jesus, jim]:
    relationship = Relationship(

source=book,
target=author,
type="WRITTEN_BY"
properties=dict(...)
)

Діаграма вузлів з Book і двома зв'язками WRITTEN_BY до авторів, що демонструє: у вузлів може бути багато зв'язків.

Graph RAG з LangChain і Neo4j

Під'єднання до Neo4j

from langchain_neo4j import Neo4jGraph


graph = Neo4jGraph( url=NEO4J_URI, username=NEO4J_USERNAME, password=NEO4J_PASSWORD )
1 https://neo4j.com/docs/getting-started/
Graph RAG з LangChain і Neo4j

Збереження графових документів

from langchain_neo4j.graphs.graph_document import GraphDocument


# Обгортка для Nodes і Relationships doc = GraphDocument(
nodes=[book, jesus, jim],
relationships=[jesus_wrote_book, jim_wrote_book]
)
# Збереження вузлів і зв'язків у базі даних graph.add_graph_documents([graph_document])
Graph RAG з LangChain і Neo4j

То що таке GraphRAG?

Попередня діаграма з контекстом із документів і їхніми вбудовуваннями

Graph RAG з LangChain і Neo4j

То що таке GraphRAG?

Попередня діаграма з контекстом із документів і доданим графом знань із вузлами та зв'язками, отриманими з документів

Graph RAG з LangChain і Neo4j

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

Graph RAG з LangChain і Neo4j

Preparing Video For Download...