Графы и RAG

Graph RAG с LangChain и Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

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

 

  • Менеджер, Developer Education в Neo4j
  • Developer Education через Neo4j GraphAcademy
  • Более 20 лет опыта в разработке ПО
  • Более 10 лет работы с Neo4j

 

Фотография Адама

1 https://graphacademy.neo4j.com
Graph RAG с LangChain и Neo4j

R в аббревиатуре RAG

Схема приложения: пользовательский запрос добавляется в промпт и отправляется в языковую модель

Graph RAG с LangChain и Neo4j

R в аббревиатуре RAG

Промпт требует контекста из документов и источников данных

Graph RAG с LangChain и Neo4j

R в аббревиатуре RAG

Данные часто преобразуются в векторные эмбеддинги

Graph RAG с LangChain и Neo4j

Где семантический поиск не справляется?

Векторы хорошо подходят для

  • Размытых или открытых вопросов

Векторы плохо справляются с

  • Точными и фактическими вопросами
  • Числовыми и точными запросами
  • Логическими запросами

Что думает Пол Грэм о генеративном ИИ?

В сколько стартапов в области генеративного ИИ инвестировал Пол Грэм?

Graph RAG с LangChain и Neo4j

Векторы и графы знаний

Текст Векторный эмбеддинг
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 к Южному Детройту

Graph RAG с LangChain и Neo4j

Векторы и графы знаний

Текст Векторный эмбеддинг
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]

Узлы: человек — парень из маленького города, место — Южный Детройт, поезд — Midnight Train, место — Anywhere

Graph RAG с LangChain и Neo4j

Векторы и графы знаний

Текст Векторный эмбеддинг
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 и заголовка

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 от узла «книга» к двум узлам «человек», представляющим авторов

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 — это узел «книга»

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_BY — это узел «человек»

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(...)
)

Схема с узлом «книга» и двумя отношениями 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


# Wrapper for Nodes and Relationships doc = GraphDocument(
nodes=[book, jesus, jim],
relationships=[jesus_wrote_book, jim_wrote_book]
)
# Save nodes and relationships to the database 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...