Создание гибридного RAG-агента с помощью Neo4j Graphs и Milvus Vector Search
5 ноября 2024 г.В этой записи блога подробно описывается, как создать агента GraphRAG с использованием графовой базы данных Neo4j иМильвусВекторная база данных. Этот агент объединяет в себе мощьграфовые базы данныхипоиск векторовдля предоставления точных и релевантных ответов на запросы пользователей. В этом примере мы будем использовать LangGraph, Llama 3.1 8B с Ollama и GPT-4o.
Традиционное извлечение Расширенная генерация (ТРЯПКА) системы полагаются исключительно на
Создание агента RAG
Наш агент следует трем ключевым концепциям: маршрутизация, механизмы отката и самокоррекция. Эти принципы реализуются с помощью серии компонентов LangGraph:
- Маршрутизация– Специальный механизм маршрутизации решает, следует ли использовать векторную базу данных, граф знаний или их комбинацию на основе запроса.
- Отступать– В ситуациях, когда первоначального поиска недостаточно, агент возвращается к веб-поиску с помощью Tavily.
- Самокоррекция– Агент оценивает свои собственные ответы и пытается исправить галлюцинации или неточности.
Затем у нас есть другие компоненты, такие как:
- Извлечение– Мы используем Milvus, высокопроизводительную векторную базу данных с открытым исходным кодом, для хранения и извлечения фрагментов документов на основесемантическое сходствона запрос пользователя.
- Улучшение графика– Neo4j используется для построения графа знаний из извлеченных документов, обогащая контекст связями и сущностями.
- Интеграция LLM– Llama 3.1 8B, локальный LLM, используется для генерации ответов и оценки релевантности и точности полученной информации, в то время как GPT-4o используется для генерации Cypher, языка запросов, используемого Neo4j.
Архитектура GraphRAG
Архитектуру нашего агента GraphRAG можно визуализировать как рабочий процесс с несколькими взаимосвязанными узлами:
- Маршрутизация вопросов– Сначала агент анализирует вопрос, чтобы определить наилучшую стратегию поиска (векторный поиск, поиск по графу или оба).
- Извлечение– На основании решения о маршрутизации соответствующие документы извлекаются из Milvus, или информация извлекается из графика Neo4j.
- Поколение– LLM генерирует ответ, используя извлеченный контекст.
- Оценка– Агент оценивает сгенерированный ответ на предмет релевантности, точности и возможных галлюцинаций.
- Уточнение(при необходимости) — Если ответ признан неудовлетворительным, агент может уточнить свой поиск или попытаться исправить ошибки.
Примеры агентов
Чтобы продемонстрировать возможности наших агентов LLM, давайте рассмотрим два различных компонента:Graph Generation
иComposite Agent
.
Хотя полный код доступен в конце этой статьи, эти фрагменты позволят лучше понять, как эти агенты работают в рамках LangChain.
Генерация графика
Этот компонент предназначен для улучшения процесса вопросов и ответов с использованием возможностей Neo4j. Он отвечает на вопросы, используя знания, встроенные в графовую базу данных Neo4j. Вот как это работает:
GraphCypherQAChain
– Позволяет LLM взаимодействовать с базой данных графов Neo4j. Он использует LLM двумя способами:cypher_llm
– Этот экземпляр LLM отвечает за генерацию запросов Cypher для извлечения релевантной информации из графика на основе вопроса пользователя.Проверка– Проверяет запросы Cypher на предмет их синтаксической правильности.
Поиск контекста– Проверенные запросы выполняются на графике Neo4j для извлечения необходимого контекста.
Генерация ответов– Языковая модель использует извлеченный контекст для генерации ответа на вопрос пользователя.
### Generate Cypher Query
llm = ChatOllama(model=local_llm, temperature=0)
# Chain
graph_rag_chain = GraphCypherQAChain.from_llm(
cypher_llm=llm,
qa_llm=llm,
validate_cypher=True,
graph=graph,
verbose=True,
return_intermediate_steps=True,
return_direct=True,
)
# Run
question = "agent memory"
generation = graph_rag_chain.invoke({"query": question})
Этот компонент позволяет системе RAG подключаться к Neo4j, что может помочь предоставить более полные и точные ответы.
Композитный агент, график и вектор 🪄
Вот где происходит магия: наш агент может объединять результаты Milvus и Neo4j, что позволяет лучше понимать информацию и приводит к более точным и подробным ответам. Вот как это работает:
- Подсказки –Мы определяем подсказку, которая инструктирует LLM использовать контекст из Milvus и Neo4j для ответа на вопрос.
- Извлечение –Агент извлекает соответствующую информацию из Milvus (используя векторный поиск) и Neo4j (используя генерацию графов).
- Генерация ответов –Llama 3.1 8B обрабатывает подсказку и генерирует краткий ответ, используя объединенные знания из векторных и графовых баз данных с составной цепочкой.
### Composite Vector + Graph Generations
cypher_prompt = PromptTemplate(
template="""You are an expert at generating Cypher queries for Neo4j.
Use the following schema to generate a Cypher query that answers the given question.
Make the query flexible by using case-insensitive matching and partial string matching where appropriate.
Focus on searching paper titles as they contain the most relevant information.
Schema:
{schema}
Question: {question}
Cypher Query:""",
input_variables=["schema", "question"],
)
# QA prompt
qa_prompt = PromptTemplate(
template="""You are an assistant for question-answering tasks.
Use the following Cypher query results to answer the question. If you don't know the answer, just say that you don't know.
Use three sentences maximum and keep the answer concise. If topic information is not available, focus on the paper titles.
Question: {question}
Cypher Query: {query}
Query Results: {context}
Answer:""",
input_variables=["question", "query", "context"],
)
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# Chain
graph_rag_chain = GraphCypherQAChain.from_llm(
cypher_llm=llm,
qa_llm=llm,
validate_cypher=True,
graph=graph,
verbose=True,
return_intermediate_steps=True,
return_direct=True,
cypher_prompt=cypher_prompt,
qa_prompt=qa_prompt,
)
Давайте посмотрим на результаты нашего поиска, объединив сильные стороны графовых и векторных баз данных для улучшения результатов исследований.
Начнем с поиска графа с помощью Neo4j:
# Example input data
question = "What paper talks about Multi-Agent?"
generation = graph_rag_chain.invoke({"query": question})
print(generation)
> Entering new GraphCypherQAChain chain...
Generated Cypher:
cypher
MATCH (p:Paper)
WHERE toLower(p.title) CONTAINS toLower("Multi-Agent")
RETURN p.title AS PaperTitle, p.summary AS Summary, p.url AS URL
> Finished chain.
{'query': 'What paper talks about Multi-Agent?', 'result': [{'PaperTitle':
'Collaborative Multi-Agent, Multi-Reasoning-Path (CoMM) Prompting Framework', 'Summary':
'In this work, we aim to push the upper bound of the reasoning capability of LLMs by
proposing a collaborative multi-agent, multi-reasoning-path (CoMM) prompting framework.
Specifically, we prompt LLMs to play different roles in a problem-solving team, and
encourage different role-play agents to collaboratively solve the target task.
In particular, we discover that applying different reasoning paths for different roles
is an effective strategy to implement few-shot prompting approaches in the multi-agent
scenarios. Empirical results demonstrate the effectiveness of the proposed methods on
two college-level science problems over competitive baselines. Our further analysis shows
the necessity of prompting LLMs to play different roles or experts independently.',
'URL': 'https://github.com/amazon-science/comm-prompt'}]
Поиск по графу отлично подходит для поиска связей и метаданных. Он может быстро идентифицировать документы по заголовкам, авторам или предопределенным категориям, предоставляя структурированное представление данных.
Далее мы обратимся к нашему векторному поиску с другой точки зрения:
# Example input data
question = "What paper talks about Multi-Agent?"
# Get vector + graph answers
docs = retriever.invoke(question)
vector_context = rag_chain.invoke({"context": docs, "question": question})
> The paper discusses "Adaptive In-conversation Team Building for Language Model Agents"
and talks about Multi-Agent. It presents a new adaptive team-building paradigm
that offers a flexible solution for building teams of LLM agents to solve complex
tasks effectively. The approach, called Captain Agent, dynamically forms and manages
teams for each step of the task-solving process, utilizing nested group conversations
and reflection to ensure diverse expertise and prevent stereotypical outputs.
Векторный поиск действительно хорош в понимании контекста и семантического сходства. Он может обнаружить статьи, которые концептуально связаны с запросом, даже если они явно не содержат поисковые термины.
Наконец, мы объединяем оба метода поиска:
Это важнейшая часть нашего агента RAG, позволяющая использовать как векторные, так и графовые базы данных.
composite_chain = prompt | llm | StrOutputParser()
answer = composite_chain.invoke({"question": question, "context": vector_context, "graph_context": graph_context})
print(answer)
> The paper "Collaborative Multi-Agent, Multi-Reasoning-Path (CoMM) Prompting Framework"
talks about Multi-Agent. It proposes a framework that prompts LLMs to play different roles
in a problem-solving team and encourages different role-play agents to collaboratively solve
the target task. The paper presents empirical results demonstrating the effectiveness of the
proposed methods on two college-level science problems.
Интегрируя графовые и векторные поиски, мы используем сильные стороны обоих подходов. Графовый поиск обеспечивает точность и навигацию по структурированным отношениям, в то время как векторный поиск добавляет глубину за счет семантического понимания.
Этот комбинированный метод имеет ряд преимуществ:
- Улучшение запоминания: Он находит релевантные статьи, которые могли быть пропущены при использовании любого из этих методов по отдельности.
- Расширенный контекст: Это обеспечивает более детальное понимание того, как документы связаны друг с другом.
- Гибкость: Он может адаптироваться к различным типам запросов: от поиска по конкретным ключевым словам до более широких концептуальных исследований.
Подводя итоги
В этой записи блога мы показали, как создать агента GraphRAG с помощью Neo4j и Milvus. Объединив сильные стороны графовых баз данных ипоиск векторов, этот агент дает точные и релевантные ответы на запросы пользователей.
Архитектура нашего агента RAG с его выделенной маршрутизацией, механизмами отката и возможностями самокоррекции делает его надежным и прочным. Примеры компонентов Graph Generation и Composite Agent демонстрируют, как этот агент может подключаться как к векторным, так и к графовым базам данных для предоставления всесторонних и подробных ответов.
Мы надеемся, что это руководство было полезным и вдохновит вас изучить возможности комбинирования графовых баз данных и векторного поиска в ваших собственных проектах.
Текущий код доступен наGitHub.
Чтобы узнать больше по этой теме, присоединяйтесь к нам на NODES 2024 7 ноября — нашей бесплатной виртуальной конференции разработчиков, посвященной интеллектуальным приложениям, графам знаний и ИИ.Зарегистрируйтесь сейчас!
Оригинал