Назад в библиотеку

Реализации метода Retrieval-Augmented Generation для улучшения ответа больших языковых моделей с использованием LangChain и pgvector

Автор: М.К. Слипенко, О.В. Рычка
Источник: Слипенко, М. К. Реализации метода Retrieval-Augmented Generation для улучшения ответа больших языковых моделей с использованием LangChain и pgvector / М. К. Слипенко, О. В. Рычка // Программная инженерия: методы и технологии разработки информационно-вычислительных систем (ПИИВС-2024) : Сборник материалов и докладов V Международной научно-практической конференции, Донецк, 27–28 ноября 2024 года. – Донецк: Донецкий национальный технический университет, 2024. – С. 227-237. – EDN LPQTZA.

Ключевые слова: большие языковые модели, Retrieval-Augmented Generation, LangChain, pgvector, обработка естественного языка, интеграция данных, поиск по векторным представлениям.

Введение

С развитием технологий искусственного интеллекта большие языковые модели (LLM) стали основой для многих приложений, связанных с обработкой естественного языка. Модели, такие как GPT-4o демонстрируют впечатляющие результаты в задачах генерации текста, перевода, суммаризации и ответа на вопросы. Однако, несмотря на их способности, LLM сталкиваются с рядом существенных проблем, что делает актуальным вопрос повышения точности и достоверности их ответов [1].

Одной из ключевых проблем является склонность больших языковых моделей к генерации недостоверной или несвязной информации, особенно в случаях, когда им не хватает контекста или доступа к актуальным данным. Это явление известно как «галлюцинации» моделей, когда они с уверенностью предоставляют неверные или вымышленные факты. Данная особенность становится особенно критичной в приложениях, где точность информации имеет приоритетное значение.

Метод Retrieval-Augmented Generation (RAG) позволяет LLM обращаться к внешним источникам знаний для улучшения качества генерируемых ответов [2]. Инструменты LangChain и pgvector предоставляют необходимые средства для эффективной реализации этого подхода. LangChain облегчает построение сложных цепочек взаимодействия с моделью, а pgvector обеспечивает быстрый поиск по большим наборам векторных представлений.

Целью работы является исследование и демонстрация применения Retrieval-Augmented Generation с использованием инструментов LangChain и pgvector для повышения точности и достоверности ответов больших языковых моделей. В рамках работы будет разработан прототип системы, интегрирующей LLM с внешней базой знаний, что позволит улучшить качество генерируемых ответов и снизить вероятность возникновения «галлюцинаций».

Анализ текущих проблем больших языковых моделей

Несмотря на значительные достижения больших языковых моделей (LLM) в области обработки естественного языка, их применение сопровождается рядом существенных ограничений, которые ограничивают их эффективность и универсальность. Одной из основных проблем является ограниченность моделей в использовании актуальной информации из внешних источников [3]. Большие языковые модели обучаются на обширных наборах статических данных, что приводит к невозможности динамического обновления знаний. В результате модели могут предоставлять устаревшую или неточную информацию, что снижает их применимость в областях, требующих высокой актуальности данных, таких как медицина, финансы или новости. Значительным вызовом для LLM является феномен «галлюцинаций», при котором модели генерируют информацию, которая грамматически корректна и кажется правдоподобной, но на самом деле является неверной или вымышленной [4]. Это явление обусловлено природой генеративного обучения, при котором модели стремятся предсказать наиболее вероятное продолжение текста, а не проверять фактическую достоверность данных. Галлюцинации представляют особую опасность в критически важных приложениях, таких как юридические консультации или научные исследования, где точность информации имеет первостепенное значение.

Кроме того, при стандартном подходе необходимо дообучать модели на новых данных, что ограничивает их доступность и повышает затраты на внедрение. Процесс дообучения требует значительных вычислительных ресурсов и специализированных знаний, что делает его менее доступным для широкого круга пользователей и организаций. Высокие затраты на адаптацию моделей к специфическим задачам или обновление знаний существенно снижают их универсальность и возможность быстрого реагирования на изменяющиеся требования рынка.

Таким образом, для повышения точности и надежности ответов больших языковых моделей необходимо преодоление указанных ограничений. Одним из перспективных направлений является интеграция методов Retrieval-Augmented Generation (RAG), которые позволяют моделям обращаться к внешним источникам знаний в режиме реального времени, тем самым улучшая качество генерируемых ответов и снижая вероятность возникновения «галлюцинаций».

Принцип метода Retrieval-Augmented Generation (RAG)

Метод Retrieval-Augmented Generation (RAG) представляет собой гибридную архитектуру, объединяющую возможности больших языковых моделей (LLM) с механизмами поиска и извлечения информации из внешних источников. Основные концепции RAG включают интеграцию генеративной модели с компонентом поиска, который отвечает за выбор релевантных документов или фрагментов текста из обширных баз данных. Архитектура RAG обычно состоит из двух основных компонентов: модуля извлечения информации и генеративного модуля. Модуль извлечения использует алгоритмы поиска, такие как BM25 или нейронные методы, для нахождения наиболее подходящих документов на основе входного запроса [3]. Затем эти извлеченные документы передаются генеративной модели, которая на их основе формирует окончательный ответ (см. рис. 1).

Рисунок 1 – Внешний вид отформатированной статьи
Рисунок 1 – Внешний вид отформатированной статьи

RAG эффективно решает проблемы ограничений традиционных LLM, связанных с фиксированным объемом обучающих данных и ограниченной способностью обновляться в режиме реального времени. За счет обращения к актуальным внешним источникам знаний, RAG позволяет модели получать доступ к свежей информации, что существенно повышает точность и релевантность генерируемых ответов. Кроме того, использование внешних данных снижает вероятность возникновения «галлюцинаций», то есть неверных или вымышленных утверждений, так как ответы основываются на проверенных источниках.

Преимущества метода RAG включают улучшенную точность и актуальность ответов; возможность масштабирования за счет использования больших баз данных; гибкость в интеграции различных источников информации; а также снижение зависимости от объема и качества обучающих данных LLM. Однако метод имеет и некоторые ограничения. Во-первых, эффективность RAG зависит от качества и актуальности используемых источников данных; во-вторых, интеграция поиска и генерации может увеличивать вычислительные затраты и время ответа; в-третьих, обеспечение согласованности и связности информации из различных источников требует дополнительных механизмов обработки. Тем не менее, несмотря на существующие ограничения, RAG представляет собой значительный шаг вперед в развитии систем искусственного интеллекта, способных предоставлять более точные и надежные ответы на сложные запросы.

Обзор LangChain и pgvector

LangChain представляет собой современный фреймворк, разработанный для упрощения создания приложений, использующих большие языковые модели (LLM). Основной целью LangChain является предоставление разработчикам набора инструментов и библиотек, которые облегчают интеграцию LLM в различные приложения и управление взаимодействием между компонентами системы . Фреймворк предоставляет высокоуровневые абстракции для работы с языковыми моделями, что позволяет сосредоточиться на логике приложения, а не на технических деталях интеграции. LangChain поддерживает управление диалогами, обработку контекста, интеграцию с внешними источниками данных и управление состоянием сессии [5]. Благодаря модульной архитектуре, LangChain позволяет легко добавлять новые компоненты и расширять функциональность системы, что делает его гибким инструментом для разработки различных типов приложений, от чат-ботов до сложных аналитических систем. Преимущества использования LangChain включают упрощенную интеграцию LLM, эффективное управление диалоговыми сессиями, модульность и расширяемость, а также возможность подключения к различным базам данных и API, что значительно расширяет возможности системы по предоставлению релевантной информации и адаптации под специфические требования приложения.

Инструмент pgvector представляет собой расширение для PostgreSQL, предназначенное для хранения и обработки векторных представлений данных [6], что особенно важно в контексте обработки естественного языка (NLP). Векторные представления, или эмбеддинги, играют важную роль в понимании смысла текста и обеспечении эффективного поиска и сравнения информации. Основная идея pgvector заключается в добавлении нового типа данных — vector — в PostgreSQL. Это позволяет хранить многомерные векторы и выполнять с ними различные операции, такие как вычисление расстояния Евклида или косинусного сходства.

В области NLP pgvector используется для сохранения эмбеддингов слов, предложений или документов, что помогает эффективно выполнять такие задачи, как поиск информации, кластеризация и классификация текстов. Векторные представления позволяют количественно оценивать, насколько близки по смыслу разные тексты, что является основой для таких методов, как Retrieval-Augmented Generation (RAG).

Интеграция pgvector с PostgreSQL сочетает преимущества реляционной базы данных с возможностями обработки векторов. Для установки pgvector необходимо добавить соответствующее расширение в PostgreSQL и создать таблицы с колонками типа vector. Это позволяет использовать стандартные SQL-запросы, что упрощает разработку и управление данными. Основные преимущества интеграции включают возможность хранения как традиционных реляционных данных, так и векторных представлений в одной базе данных, использование мощных возможностей PostgreSQL, таких как индексация, транзакции и безопасность, а также масштабируемость и надежность при работе с большими объемами векторных данных.

Таким образом, комбинация LangChain и pgvector предоставляет мощный инструментарий для разработки систем, способных эффективно интегрировать большие языковые модели с высокопроизводительным поиском и обработкой релевантной информации, что существенно повышает точность и надежность ответов в условиях отсутствия доступа к актуальным данным.

Методология интеграции RAG с использованием LangChain и pgvector

Цель интеграции заключается в создании системы, которая объединяет механизмы извлечения релевантной информации и генерацию ответов на естественном языке с использованием языковых моделей.

LangChain предоставляет инструментарий для построения цепочек обработки данных, где каждый компонент выполняет определённую функцию и передаёт результат следующему звену, что особенно актуально в контексте Retrieval-Augmented Generation (RAG). Данная архитектура позволяет последовательно комбинировать процессы поиска информации и генерации ответов, создавая гибкую и модульную систему.

Архитектура системы (см. рис. 2) начинается с этапа загрузки документов в базу знаний. Для каждого документа с помощью специализированной модели генерируются эмбеддинги, которые представляют текстовые данные в виде векторных представлений. Эти эмбеддинги обеспечивают возможность эффективного сравнения семантической близости между запросами пользователей и документами в базе знаний.

Рисунок 2 – Архитектура системы
Рисунок 2 – Архитектура системы

При поступлении пользовательского запроса система использует Retriever для поиска релевантных документов в базе данных. Сначала запрос преобразуется в эмбеддинг, после чего осуществляется сравнение с эмбеддингами документов, хранящимися в базе данных с использованием расширения pgvector для PostgreSQL. Это расширение обеспечивает высокую производительность и масштабируемость системы при обработке больших объёмов данных, позволяя быстро находить наиболее релевантные документы.

Найденные релевантные документы проходят этап форматирования, где данные приводятся к структуре, удобной для дальнейшей обработки языковой моделью. В то же время исходный запрос пользователя передаётся по цепочке без изменений, что гарантирует его доступность на последующих этапах обработки. Обработанные данные и исходный запрос объединяются для формирования основного промпта, который служит окончательным запросом к языковой модели.

Языковая модель, получившая сформированный промпт, использует предоставленный контекст из релевантных документов и исходный запрос пользователя для генерации ответа на естественном языке. Этот ответ затем возвращается пользователю, завершая цикл обработки. Таким образом, система обеспечивает точное и информативное реагирование на запросы пользователей, опираясь на актуальные данные из базы знаний.

LangChain, благодаря своей модульной структуре, предоставляет значительные преимущества в настройке и модификации системы. Возможность легко заменять или добавлять компоненты позволяет адаптировать систему под специфические требования и интегрировать дополнительные функциональные возможности без существенных изменений основной структуры. Модульность архитектуры также способствует упрощению процесса разработки и обслуживания системы, обеспечивая её гибкость и масштабируемость для дальнейшего развития.

Реализация прототипа системы

Прототип представляет собой чат-бота поддержки для платформы RUTUBE, способного отвечать на вопросы пользователей, основываясь на заранее подготовленной базе знаний.

В прототипе используются различные модули и библиотеки, обеспечивающие функциональность системы. Модуль argparse позволяет обрабатывать аргументы командной строки, что дает возможность запускать различные функции прототипа, такие как загрузка данных или проверка состояния базы данных. Библиотека langchain_huggingface предоставляет класс HuggingFaceEmbeddings для создания эмбеддингов текста с использованием моделей Hugging Face, что необходимо для преобразования данных в векторное пространство. langchain_ollama содержит класс ChatOllama, отвечающий за генерацию ответов на основе языковой модели. Расширение PGVector из langchain_postgres.vectorstores интегрирует векторное хранилище с базой данных PostgreSQL, обеспечивая эффективный поиск по векторным представлениям. Компоненты ChatPromptTemplate и RunnablePassthrough из langchain_core.prompts и langchain_core.runnables respectively, используются для создания шаблонов запросов и управления цепочками обработки данных. Класс Document из langchain.docstore.document служит для представления документов, хранимых в базе данных, а библиотека pandas применяется для обработки и загрузки данных из CSV-файлов, облегчая работу с табличными данными.

Для начала работы необходимо объявить константы (см. рис. 3)

Рисунок 3 — Константы прототипа
Рисунок 3 — Константы прототипа

Константа EMBEDDING_MODEL установлена в значение «intfloat/multilingual-e5-large», что обеспечивает создание качественных векторных представлений текста на нескольких языках, включая русский, что критически важно для эффективного поиска по базе знаний. Для генерации ответов применяется CHAT_MODEL с названием «krith/qwen2.5-14b-instruct:IQ4_XS». Qwen2.5-14b-instrcut представляющая собой мощную языковую модель, оптимизированную для выполнения инструкций и предоставления релевантных ответов [7]. Константа CONNECTION содержит строку подключения к базе данных PostgreSQL, используя библиотеку psycopg, что обеспечивает надежное и быстрое взаимодействие с базой данных. Имя коллекции, заданное через COLLECTION_NAME указывает на то, к какой коллекции относятся документы в базе данных. Наконец, SYSTEM_TEMPLATE представляет собой шаблон системного сообщения, задающий строгие правила и ограничения для поведения чат-бота, гарантируя, что ответы будут строго соответствовать контексту и теме платформы RUTUBE.

Далее инициализируются основные объекты (см. рис. 4)

Рисунок 4 — Инициализация основных объектов
Рисунок 4 — Инициализация основных объектов

В прототипе инициализируется объект embeddings с использованием класса HuggingFaceEmbeddings и модели, заданной константой EMBEDDING_MODEL, что позволяет преобразовывать текстовые данные в векторные представления для эффективного поиска. Затем создается vector_store с помощью класса PGVector, который использует ранее созданный объект embeddings. Это обеспечивает надежное и масштабируемое хранение данных, необходимое для высокоточного извлечения релевантной информации. Далее инициализируется объект chat класса ChatOllama с моделью CHAT_MODEL и num_predict=256, что отвечает за генерацию ответов на основе предоставленного контекста и позволяет контролировать длину генерируемого текста.

Далее в прототипе формируется основная цепочка обработки запросов (см. рис. 5), начиная с определения шаблона запроса main_prompt, созданного с помощью класса ChatPromptTemplate и включающего системное сообщение SYSTEM_TEMPLATE и пользовательский ввод {input}. Функция format_docs отвечает за форматирование найденных документов, преобразуя их в структуру вопросов и ответов, что облегчает интеграцию релевантной информации в контекст запроса. Затем инициализируется retriever посредством метода as_retriever() объекта vector_store, обеспечивающего поиск подходящих документов на основе эмбеддингов. Основная цепочка chat_chain объединяет контекст, полученный от ретривера и отформатированных документов, с пользовательским вводом через RunnablePassthrough, после чего передает данные в main_prompt и далее в объект chat для генерации окончательного ответа. Такая организация цепочки позволяет эффективно интегрировать поиск по базе знаний с генерацией ответов, обеспечивая точность и релевантность взаимодействия чат-бота с пользователем. В результате, система способна обрабатывать запросы, учитывая как пользовательский ввод, так и релевантные данные из базы знаний.

Рисунок 5 — Инициализация основной цепочки
Рисунок 5 — Инициализация основной цепочки

После этого объявляем функцию upload_to_db (см. рис. 6)

Рисунок 6 — Функция загрузки вопросов в базу данных
Рисунок 6 — Функция загрузки вопросов в базу данных

Функция upload_to_db принимает путь к CSV-файлу, считывает его с помощью библиотеки pandas и преобразует каждую строку в объект Document, содержащий вопрос и соответствующий ответ. После формирования списка документов, функция добавляет их в векторное хранилище vector_store и выводит сообщение о количестве успешно загруженных вопросов в базу данных.

Для получения информации о загруженных документах объявляем функцию get_db_status (см. рис. 7) Функция get_db_status устанавливает соединение с базой данных PostgreSQL с помощью SQLAlchemy и создает сессию для взаимодействия с ней. Она пытается найти коллекцию с именем COLLECTION_NAME и, если находит, подсчитывает количество документов в этой коллекции, выводя результат пользователю. В случае отсутствия коллекции или возникновения ошибки при выполнении запроса, функция информирует пользователя соответствующим сообщением. Это позволяет быстро проверить состояние базы данных и убедиться в наличии необходимых данных для работы чат-бота.

Рисунок 6 — Функция проверки загрузки
Рисунок 6 — Функция проверки загрузки

Последней функцией является run_cli (см. рис. 8).

Рисунок 7 — Функция run_cli и основной блок программы
Рисунок 7 — Функция run_cli и основной блок программы

Функция run_cli реализует интерактивный командный интерфейс, позволяющий пользователю общаться с чат-ботом через консоль, вводя вопросы и получая ответы, а также завершать сеанс командой exit. В основном блоке программы с помощью модуля argparse обрабатываются аргументы командной строки, предоставляя возможность загрузки данных из CSV-файла в базу данных с помощью --db-upload, проверки количества документов в базе с --db-status, или запуска интерактивного чата по умолчанию. Такая организация обеспечивает гибкость использования прототипа, позволяя выполнять различные операции без необходимости изменения кода.

Интерфейс прототипа системы представлен на рисунке 8.

Рисунок 8 — Интерфейс прототипа системы
Рисунок 8 — Интерфейс прототипа системы

В демонстрации бот корректно отвечает на вопросы о регистрации, отключении монетизации и метках для видео, предоставляя подробные инструкции и контактную информацию. Однако на вопрос «Как подключить монетизацию?» ответ оказался неточным, так как бот сразу предположил, что пользователь является физическим лицом, что не полностью соответствует конкретному запросу о подключении монетизации.

Экспериментальное исследование

Для оценки качества ответов, сгенерированных большими языковыми моделями с использованием метода RAG, применяются различные методы. Наиболее распространёнными метриками являются BLEU, METEOR, ROUGE и BERTScore [8]. Метрики BLEU и ROUGE широко используются для оценки текстов на основе точности совпадений с эталонными ответами, однако они менее эффективны для задач, где требуется глубокое семантическое сходство. METEOR также подходит для оценки релевантности, учитывая морфологические и синонимические связи, но её эффективность ограничена для задач, включающих более сложные языковые конструкции и длинные ответы. В данном исследовании был выбран BertScore как оптимальный метод оценки, поскольку он позволяет оценивать тексты на уровне семантики, сопоставляя эмбеддинги ответов модели и эталонных данных. Это делает BertScore особенно ценным для оценки моделей, которые ориентированы на выдачу релевантной информации и могут варьировать в формулировках ответов.

Результаты оценки качества ответов с использованием метрики BERTScore были получены на тестовой выборке из 801 вопроса реальных пользователей. Средние значения по всем ответам составили: средняя точность (Precision) — 0.7578, средняя полнота (Recall) — 0.7674, а средний F1-мера — 0.7608. Эти показатели свидетельствуют о высоком уровне семантического соответствия генерируемых ответов эталонным данным. Высокая точность указывает на то, что модель эффективно извлекает релевантную информацию, минимизируя количество нерелевантных элементов в ответах. Полнота показывает, что большая часть необходимой информации присутствует в сгенерированных ответах. Средний F1-мера подтверждает сбалансированное соотношение между точностью и полнотой, демонстрируя общую эффективность модели в предоставлении релевантных и точных ответов. Анализ на тестовой выборке позволяет сделать вывод о стабильности и надежности модели при обработке разнообразных запросов.

Также было произведено сравнение со стандартной языковой моделью без использования метода RAG. Результат со сравнением представлен на рисунке 9. На графиках показано сравнение показателей Precision, Recall и F1 между разработанным прототипом (LLM + RAG) и стандартной языковой моделью (LLM). Значения метрик распределены таким образом, что большинство точек располагается выше диагональной линии, что свидетельствует о значительном улучшении показателей точности, полноты и F1-меры в модели, дополненной RAG.

Рисунок 9 — Сравнение LLM и LLM + RAG
Рисунок 9 — Сравнение LLM и LLM + RAG

На первом графике сравнения Precision можно наблюдать, что интеграция метода RAG способствует улучшению точности ответов. Это проявляется в более высоких значениях метрики для LLM + RAG по сравнению с базовой моделью, что указывает на повышение релевантности извлекаемой информации и снижение числа нерелевантных элементов в ответах. Подобная тенденция наблюдается и на втором графике, где представлено сравнение метрики Recall. В данном случае, использование RAG позволяет модели более полно охватывать релевантные данные, что отражается в увеличении значений полноты. На последнем графике, где показано сравнение F1-меры, видно, что интеграция RAG позволяет достичь лучшего баланса между точностью и полнотой, улучшая общее качество ответов модели.

Выводы

В ходе исследования была рассмотрена проблема повышения точности и достоверности ответов больших языковых моделей (LLM) при отсутствии доступа к актуальным данным. Для решения этой задачи был предложен и реализован подход, основанный на интеграции метода Retrieval-Augmented Generation (RAG) с использованием инструментов LangChain и pgvector.

Разработанная система эффективно сочетает возможности LangChain для облегчения взаимодействия с LLM и управления диалогом, а также потенциал pgvector для быстрого поиска релевантной информации в больших наборах данных. Методология интеграции RAG была подробно описана, что позволило создать прототип системы и провести его экспериментальное исследование.

Результаты экспериментов подтвердили, что использование предложенного подхода значительно повышает точность и надежность ответов LLM. Это достигается за счет снижения вероятности возникновения «галлюцинаций» моделей и обеспечения доступа к актуальной информации, даже при недостатке контекста или отсутствии обновленных данных.

Таким образом, поставленные цели работы были полностью достигнуты. Предложенная интеграция RAG с использованием LangChain и pgvector не только решает проблему недостоверности и несвязности информации, генерируемой большими языковыми моделями, но и открывает перспективы для дальнейшего совершенствования систем обработки естественного языка. Разработанная система может быть применена основой для последующих исследований в направлении повышения эффективности и надежности LLM.

Литература