Память графа (мировой модели)
Таким образом, последний агент способен запоминать информацию, что является неплохим шагом вперед в области персонализации. Но его память все еще несколько разрознена. Он может вспомнить, что разговор состоялся (эпизодический эффект) и что существует факт (семантический эффект)…
но ему трудно понять сложную сеть взаимосвязей между всеми известными ему фактами.
Архитектура памяти на основе графов (мировой модели) решает эту проблему.
Вместо простого хранения фактов, этот агент строит структурированную, взаимосвязанную «модель мира» своих знаний. Он обрабатывает неструктурированный текст и преобразует его в богатый граф знаний, состоящий из сущностей (узлов) и отношений (ребер) .
В крупномасштабной системе искусственного интеллекта именно так строится настоящий «мозг». Это основа любой системы, которой необходимо отвечать на сложные, многоступенчатые вопросы, требующие соединения разрозненных фрагментов информации. Представьте себе корпоративную систему интеллекта, которой необходимо понимать взаимосвязи между компаниями, сотрудниками и продуктами на основе тысяч документов.
Давайте разберемся, как протекает этот процесс.
Нажмите Enter или щелкните, чтобы просмотреть изображение в полном размере.
.

Графовая память (создано с помощью)
Фарид Хан
)
Всасывание информации: Агент читает неструктурированный текст (например, новостные статьи или отчеты).
Извлечение знаний: Процесс, основанный на LLM, анализирует текст, выявляя ключевые сущности и взаимосвязи между ними.
Обновление графа: извлеченные узлы и ребра добавляются в постоянную базу данных графов, например, Neo4j.
Ответы на вопросы: Когда пользователю задают вопрос, агент преобразует его запрос в формальный запрос к графу (подобно Cypher), выполняет его и синтезирует результаты в ответ.
В основе этой системы лежит агент «Graph Maker». Его задача — прочитать блок текста и выдать структурированный список сущностей и связей. Мы будем использовать Pydantic, чтобы убедиться, что его вывод будет чистым и готовым для нашей базы данных.
# Модели Pydantic для структурированного извлечения
class Node ( BaseModel ):
id : str = Field(description= "Уникальное имя или идентификатор сущности." )
type : str = Field(description= "Тип сущности (например, Человек, Компания)." )
class Relationship ( BaseModel ):
source: Node
target: Node
type : str = Field(description= "Тип отношения (например, WORKS_FOR, ACQUIRED)." )
class KnowledgeGraph ( BaseModel ):
relationships: List [Relationship]
def get_graph_maker_chain ():
"""Создает агента, ответственного за извлечение знаний."""
extractor_llm = llm.with_structured_output(KnowledgeGraph)
prompt = ChatPromptTemplate.from_messages([
( "system" , "Вы эксперт в извлечении информации. Извлеките все сущности и отношения из предоставленного текста. Тип отношения должен быть глаголом во всех заглавными буквами, например, 'WORKS_FOR'." ),
( "human" , "Извлеките граф знаний из следующего текста:\n\n{text}" )
])
return prompt | extractor_llm
graph_maker_age= get_graph_maker_chain()

Мировая модель памяти (создана)
Фарид Хан
)
Далее нам нужен агент, способный запрашивать данные из этого графа. Это включает в себя процесс преобразования текста в шифр , в ходе которого агент преобразует вопрос на естественном языке в запрос к базе данных.
def query_graph ( question: str ) -> Dict [ str , Any ]:
"""Полный конвейер преобразования текста в Cypher и синтеза."""
console. print ( f"\n[bold]Вопрос:[/bold] {question} " )
# 1. Генерация запроса Cypher с использованием схемы графа
cypher_chain = llm # Упрощенная цепочка
generated_cypher = cypher_chain.invoke( f"Преобразовать этот вопрос в запрос Cypher, используя эту схему: {graph.schema} \nВопрос: {question} " ).content
console. print ( f"[cyan]Сгенерированный шифр:\n {generated_cypher} [/cyan]" )
# 2. Выполнение запроса Cypher
context = graph.query(generated_cypher) # Предполагая, что 'graph' — это наше соединение Neo4j
# 3. Синтез окончательного ответа
synthesis_chain = llm # Упрощенная цепочка
answer = synthesis_chain.invoke( f"Ответьте на этот вопрос: {question} \nИспользуя эти данные: {context} " ).content
return { "answer" : answer}
Теперь перейдём к решающему тесту. Мы передадим нашему агенту три отдельных фрагмента текста. Стандартный агент RAG воспринял бы их как несвязанные между собой части. Наш агент, работающий с графами, поймет скрытые связи.
unstructured_documents = [
"AlphaCorp объявила о приобретении стартапа BetaSolutions." ,
"Доктор Эвелин Рид — главный научный сотрудник AlphaCorp." ,
"Флагманский продукт Innovate Inc., NeuraGen, конкурирует с искусственным интеллектом QuantumLeap от AlphaCorp."
]
# Теперь зададим многошаговый вопрос
query_graph( "Кто работает в компании, которая приобрела BetaSolutions?" )
Стандартный агент с этим бы с треском провалился. Однако наш агент, работающий с графами, справляется с задачей на отлично. Трассировка выходных данных демонстрирует его логику:
Вопрос: Кто работает в компании, которая приобрела BetaSolutions?
--- ➡️ Генерация запроса Cypher ---
[cyan]Сгенерированный Cypher:
MATCH (p:Person)-[:WORKS_FOR]->(c:Company)-[:ACQUIRED]->(:Company {id: 'BetaSolutions'}) RETURN p.id
[/cyan]
--- ⚡ Выполнение запроса ---
[yellow]Результат запроса:
[{'p.id': 'Dr. Evelyn Reed'}]
[/yellow]
--- 🗣️ Синтез окончательного ответа ---
Окончательный ответ: Доктор Эвелин Рид работает в компании, которая приобрела BetaSolutions, а именно в AlphaCorp.
Агент успешно прошёл по графу: от BetaSolutions, он нашёл AlphaCorpчерез ACQUIREDребро, а затем нашёл Dr. Evelyn Reedчерез WORKS_FORребро. Это рассуждение невозможно без структурированной модели мира.
Для формализации этого, наш магистр права в качестве судьи должен оценивать аргументацию, основанную на многоступенчатом анализе.
class MultiHopEvaluation ( BaseModel ):
multi_hop_accuracy_score: int = Field(description= "Оценка от 1 до 10, показывающая, правильно ли агент связал несколько фрагментов информации для ответа на вопрос." )
justification: str = Field(description= "Краткое обоснование оценки." )
По результатам оценки, графический агент получает хорошую оценку в 7 баллов (выше среднего, на мой взгляд).
--- Оценка логики работы агента графа ---
{
'multi_hop_accuracy_score': 7,
'justification': "Агент продемонстрировал безупречную логику работы с несколькими шагами. Он правильно определил компанию-покупателя на основе одного факта, а затем использовал эту информацию для поиска сотрудника на основе совершенно другого факта. Это демонстрирует глубокое, взаимосвязанное понимание базы знаний."
}
Мы видим, что, создавая структурированную модель мира, мы наделяем наших агентов способностью рассуждать, а не просто извлекать информацию.