Создайте конвейер RAG с помощью индекса LLama

Создайте RAG-конвейер с помощью индекса LLama

Введение

Одним из самых популярных применений больших языковых моделей (LLM) является ответ на вопросы о настраиваемых наборах данных. LLM, такие как ChatGPT и Bard, являются отличными коммуникаторами. Они могут отвечать практически на любой вопрос, который был включен в их обучение. Это также является одной из основных проблем для LLM. Они могут отвечать только на вопросы, с которыми сталкивались во время обучения модели. Языковые модели имеют ограниченные знания о мире. Например, ChatGPT обучен на данных, доступных до 2021 года. Кроме того, нет способа, чтобы GPT мог узнать о ваших конфиденциальных файлах. Как же сделать модель осведомленной о знаниях, которых у нее еще нет? Ответом является создание конвейера с повышенным извлечением информации. В этой статье мы узнаем о конвейере RAG (Retrieval Augmented Generation) и создадим его с использованием индекса LLama.

Цели обучения

  • Изучить, что такое Retrieval Augmented Generation (RAG) и когда ее следует использовать.
  • Понять различные компоненты RAG вкратце.
  • Узнать о индексе LLama и о том, как использовать его для создания простого конвейера RAG для PDF-файлов.
  • Понять, что такое векторные базы данных и как использовать встроенные модули индекса LLama для создания баз знаний из PDF-файлов.
  • Открыть для себя реальные примеры применения приложений на основе RAG.

Эта статья была опубликована в рамках мероприятия Data Science Blogathon.

Что такое RAG?

LLM на сегодняшний день являются самыми эффективными и мощными моделями в области естественного языка (NLP). Мы видели потенциал LLM в переводе, написании эссе и общем вопросно-ответном формате. Однако, когда речь идет о вопросах в рамках конкретной области, они страдают от галлюцинаций. Кроме того, в приложении с областью специализации лишь несколько документов содержат соответствующий контекст для каждого запроса. Поэтому нам нужна унифицированная система, которая объединяет процессы от извлечения информации из документов до генерации ответов. Этот процесс называется Retrieval Augmented Generation.

Узнать больше: Retrieval-Augmented Generation (RAG) в искусственном интеллекте

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

Почему следует использовать RAG?

Существуют три способа, с помощью которых LLM могут освоить новые данные.

  • Обучение: Большая сеть нейронных сетей обучается на триллионах токенов с миллиардами параметров, чтобы создать большие языковые модели. Параметры модели глубокого обучения являются коэффициентами или весами, содержащими всю информацию о конкретной модели. Обучение модели, например, GPT-4, стоит сотни миллионов долларов. Этот способ выходит за пределы возможностей каждого человека. Мы не можем переобучить такую громадную модель на новых данных. Это неосуществимо.
  • Настройка: Другой вариант – настройка модели на существующих данных. Настройка включает использование предобученной модели в качестве отправной точки во время обучения. Мы используем знания предобученной модели для обучения новой модели на разных наборах данных. Хотя это очень мощный способ, он требует много времени и денег. Если нет конкретной потребности, настройка не имеет смысла.
  • Подсказки: Подсказки – это метод, в котором мы вводим новую информацию в контекстное окно LLM и заставляем его отвечать на запросы на основе предоставленной информации. Возможно, это не так эффективно, как знания, полученные во время обучения или настройки, но это достаточно для многих примеров использования в реальной жизни, таких как вопросно-ответные системы на основе документов.

<p>Запрос ответов из текстовых документов является эффективным, но эти документы часто намного больше контекстных окон крупных языковых моделей (LLM), что представляет некоторую сложность. Алгоритмы генерации с использованием информации из поисковых веб-сервисов (RAG) решают эту проблему, обрабатывая, храня и извлекая соответствующие разделы документов, что позволяет LLM эффективно отвечать на запросы. Итак, давайте обсудим важные компоненты алгоритма RAG.</p><h2 id=”what-are-the-rag-components”>Каковы компоненты алгоритма RAG?</h2><p>В типичном процессе RAG у нас есть несколько компонентов.</p><ul><li><strong>Разделитель текста</strong>: Разделяет документы, чтобы адаптироваться к контекстным окнам LLM.</li><li><strong>Модель вложения</strong>: Модель глубокого обучения, используемая для получения вложений документов.</li><li><strong>Векторные хранилища</strong>: Базы данных, в которых хранятся и запрашиваются векторные представления документов вместе с метаданными.</li><li><strong>LLM</strong>: Крупная языковая модель, отвечающая на запросы и генерирующая ответы из текстовых документов.</li><li><strong>Вспомогательные функции</strong>: Включает дополнительные вспомогательные функции, такие как Webretriver и парсеры документов, которые помогают при извлечении и предварительной обработке файлов.</li></ul><p>Выше приведена типичная картина процесса RAG. У нас есть документы (PDF, веб-страницы, документы), инструмент для разделения большого текста на более маленькие части, модели вложения для получения векторного представления текстовых частей, векторные хранилища в качестве баз знаний и LLM для получения ответов из текстовых частей.</p><h2 id=”what-is-the-llama-index”>Что такое индекс Llama?</h2><p>Индекс Llama (GPTIndex) – это фреймворк, написанный на <a href=”https://www.rupython.com/optimizing-ml-models-with-dehb-a-guide-with-xgboost-and-python.html”>Python</a> для создания приложений, использующих крупные языковые модели (LLM). Он является простой и гибкой системой связи пользовательских источников данных с крупными языковыми моделями. Фреймворк предоставляет соответствующие инструменты для поддержки импорта данных из различных источников, векторных баз данных для индексации данных и интерфейсов запросов для работы с крупными документами. Другими словами, индекс Llama – это магазин для создания приложений, основанных на алгоритме RAG. Он позволяет легко интегрироваться с другими приложениями, такими как Langchain, Flask, Docker и т. д. Для получения дополнительной информации см. официальный репозиторий GitHub по адресу <a class=”uri” href=”https://github.com/run-llama/llama_index”>https://github.com/run-llama/llama_index</a>.</p><p>Также прочтите: <a href=”https://www.rupython.com/10-ai-uses-in-space.html”>Как использовать индекс Llama</a></p><p>Теперь, когда мы знаем о алгоритме RAG и индексе Llama. Так что давайте создадим нашу конвейерную линию RAG для обработки PDF-документов и обсудим отдельные концепции по мере продвижения.</p><h2 id=”set-up-dev-environment”>Настройка среды разработки</h2><p>Первое правило при создании любого проекта на Python – создать виртуальную среду. После завершения установите следующие библиотеки.</p><pre><code>llama-indexopenaitiktoken</code></pre><p>Теперь импортируйте следующие функции.</p><pre><code>import osfrom llama_index import ServiceContext, LLMPredictor, OpenAIEmbedding, PromptHelperfrom llama_index.llms import OpenAIfrom llama_index.text_splitter import TokenTextSplitterfrom llama_index.node_parser import SimpleNodeParserfrom llama_index import VectorStoreIndex, SimpleDirectoryReaderfrom llama_index import set_global_service_context</code></pre><p>Теперь установите ключ API Open AI.</p><pre><code>import osos.environ[‘OPENAI_API_KEY’] = “ВАШ_КЛЮЧ_API”</code></pre><h2 id=”load-documents”>Загрузка документов</h2><p>Как мы знаем, LLM не обладают обновленными знаниями о мире или знаниями о ваших внутренних документах. Чтобы помочь LLM, нам необходимо подать им соответствующую информацию из источников знаний. Такие источники знаний могут быть структурированными данными, такими как CSV-файлы, электронные таблицы или таблицы SQL, неструктурированными данными, такими как тексты, документы Word, документы Google Docs, PDF-файлы или презентации, а также полуструктурированными данными, такими как платформы Notion, Slack, Salesforce и другие.</p><p>В этой статье мы будем использовать PDF-документы. В индексе Llama есть класс SimpleDirectoryReader, который может считывать сохраненные документы из указанного каталога. Он автоматически выбирает парсер на основе расширения файла.</p><pre><code>documents = SimpleDirectoryReader(input_dir=’data’).load_data()</code></pre><p>Вы можете создать собственную реализацию читателя PDF, используя пакеты, такие как PyMuPDF или PyPDF2.</p><h2 id=”creating-text-chunks”>Создание текстовых фрагментов</h2><p>Часто данные, извлеченные из источников знаний, являются длинными и превышают контекстное окно LLM. Если мы отправляем тексты, которые длиннее контекстного окна, API Chatgpt сокращает данные, упуская важную информацию. Один из способов решить эту проблему – это разделение текста на фрагменты. При разделении текста более длинные тексты разбиваются на более мелкие фрагменты на основе разделителей.</p>

Чанкование текста имеет и другие преимущества, помимо возможности вписать тексты в окно контекста большой языковой модели.

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

Индекс Ламы включает в себя встроенные инструменты для чанкования текстов. И вот как мы можем это сделать.

text_splitter = TokenTextSplitter(  separator=" ",  chunk_size=1024,  chunk_overlap=20,  backup_separators=["\n"],  tokenizer=tiktoken.encoding_for_model("gpt-3.5-turbo").encode)node_parser = SimpleNodeParser.from_defaults(  text_splitter = TokenTextSplitter ))

SimpleNodeParser создает узлы из частей текста, и части текста создаются с помощью TokenTextSplitter индекса Ламы. Можно также использовать SentenceSplitter.

text_splitter = SentenceSplitter(  separator=" ",  chunk_size=1024,  chunk_overlap=20,  paragraph_separator="\n\n\n",  secondary_chunking_regex="[^,.;。]+[,.;。]?",  tokenizer=tiktoken.encoding_for_model("gpt-3.5-turbo").encode)

Построение базы знаний

Извлеченные из источников знаний тексты необходимо где-то хранить. Но в приложениях, основанных на RAG, нам нужны вставки данных. Эти вставки представляют собой числа с плавающей точкой, представляющие данные в пространстве высоких размерностей векторного пространства. Для хранения и операций с ними нам нужны векторные базы данных. Векторные базы данных – это специальные хранилища данных для хранения и запроса векторов.

В данном разделе мы рассмотрим встраивания и векторные базы данных и реализуем их с помощью индекса Ламы для нашего конвейера RAG.

Встраивания

Мы можем понять вставки на примере простого супермаркета. В супермаркете вы всегда будете находить яблоки и апельсины в одном углу. Чтобы найти мыло, вам придется подойти ближе к фруктовому отделу, но вы легко найдете духи в том же отделе на расстоянии нескольких шагов.

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

Итак, зачем нам нужны встраивания?

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

Для моделей встраивания нам не нужно ничего особенного. У индекса Ламы есть собственная реализация популярных моделей встраивания, таких как Ada от OpeanAI, Cohere, Sentence transformers и т. д.

Для настройки модели встраивания нам нужно использовать ServiceContext и PromptHelper.

llm = OpenAI(model='gpt-3.5-turbo', temperature=0, max_tokens=256)embed_model = OpenAIEmbedding()prompt_helper = PromptHelper(  context_window=4096,   num_output=256,   chunk_overlap_ratio=0.1,   chunk_size_limit=None)service_context = ServiceContext.from_defaults(  llm=llm,  embed_model=embed_model,  node_parser=node_parser,  prompt_helper=prompt_helper)

Векторная база данных

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

Теперь вы, наверняка, спрашиваете, почему нельзя использовать традиционные базы данных? Технически, мы можем использовать базу данных, такую как SQLite или MySQL, для хранения векторов и линейного сравнения вставок запросов с другими. Но проблема в том, что, как вы могли догадаться, это линейный поиск с временной сложностью O(n). В то время как машина с поддержкой GPU может обрабатывать несколько тысяч данных отлично, она прекрасно справляется с обработкой сотен миллионов встраиваний в любом реальном приложении.

Как же мы решаем эту проблему? Ответ заключается в индексировании встраиваний с использованием различных алгоритмов ANN, таких как HNSW. Алгоритм HNSW – это графовый алгоритм, который эффективно обрабатывает миллиарды встраиваний. Средняя сложность запроса HNSW составляет O(log n).

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

Мы узнали о вложениях и векторных хранилищах. Теперь мы реализуем их в нашем коде. Мы будем использовать векторное хранилище по умолчанию Llama Index. Это база данных векторов в памяти. Вы также можете использовать другие векторные хранилища, такие как Chroma, Weaviate, Qdrant, Milvus, и т.д.

index = VectorStoreIndex.from_documents(    documents,     service_context = service_context    )

Индекс создается с использованием документов из нашей директории и параметров по умолчанию, определенных в контексте службы.

Запрос индекса

Последний шаг – выполнение запроса на индекс и получение ответа от LLM. Llama Index предоставляет движок запросов для выполнения запросов и чат-движок для разговоров в формате чата. Разница между ними заключается в том, что чат-движок сохраняет историю разговора, а движок запросов – нет.

query_engine = index.as_query_engine(service_context=service_context)response = query_engine.query("Что такое HNSW?")print(response)

Репозиторий GitHub для изображений и кода: sunilkumardash9/llama_rag

Полный код:

from llama_index import ServiceContext, LLMPredictor, OpenAIEmbedding, PromptHelperfrom llama_index.llms import OpenAIfrom llama_index.text_splitter import TokenTextSplitterfrom llama_index.node_parser import SimpleNodeParserimport tiktokenllm = OpenAI(model='gpt-3.5-turbo', temperature=0, max_tokens=256)embed_model = OpenAIEmbedding()text_splitter = TokenTextSplitter(  separator=" ",  chunk_size=1024,  chunk_overlap=20,  backup_separators=["\n"],  tokenizer=tiktoken.encoding_for_model("gpt-3.5-turbo").encode)node_parser = SimpleNodeParser.from_defaults(  text_splitter=text_splitter)prompt_helper = PromptHelper(  context_window=4096,   num_output=256,   chunk_overlap_ratio=0.1,   chunk_size_limit=None)service_context = ServiceContext.from_defaults(  llm=llm,  embed_model=embed_model,  node_parser=node_parser,  prompt_helper=prompt_helper)documents = SimpleDirectoryReader(input_dir='data').load_data()index = VectorStoreIndex.from_documents(    documents,     service_context = service_context    )index.storage_context.persist()query_engine = index.as_query_engine(service_context=service_context)response = query_engine.query("Что такое HNSW?")print(response)

Практические применения

Приложение на основе RAG может быть полезно во многих практических случаях.

  1. Научные исследования: Исследователи часто имеют дело с большим количеством научных статей и статей в формате PDF. Модуль RAG может помочь им извлекать соответствующую информацию, создавать библиографии и эффективно организовывать свои ссылки.
  2. Юридические фирмы: Юридические фирмы часто имеют дело с огромным количеством юридических документов. Корзина вопросов и ответов на основе RAG может оптимизировать процесс извлечения документов, что позволит сэкономить много времени.
  3. Образовательные учреждения: Учителя и педагоги могут извлекать содержимое из учебных ресурсов, чтобы создавать индивидуальные учебные материалы или готовить учебный материал. Студенты могут извлекать актуальную информацию из больших PDF файлов за долю времени.
  4. Административные задачи: Государственные и частные административные отделы часто имеют дело с большим количеством документов, заявок и отчетов. Использование чат-бота на основе RAG может оптимизировать рутинные процессы извлечения документов.
  5. Обслуживание клиентов: Чат-бот на основе RAG с базой знаний может использоваться для отвечения на вопросы клиентов.

Заключение

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

Итак, вот основные выводы из статьи.

Основные выводы

  • Идеальный способ научить LLM работать с персональными документами и сократить галлюцинации – это подключить LLM к документам из баз знаний.
  • RAG означает Retrieval Augmented Generation. RAG используется для дополнения LLM информацией из баз знаний и пользовательских документов.
  • Векторные представления – это числовые представления текстовых данных в пространстве высоких размерностей. Векторные представления отражают семантическое значение текстов.
  • Пользователи используют Векторные Базы Данных в качестве баз знаний, используя различные алгоритмы индексирования для организации высокомерных векторов и обеспечения быстрой и надежной возможности запроса.
  • Индекс Llama предоставляет инструменты и методы для создания приложений на основе RAG промышленного уровня.

Часто задаваемые вопросы

Показанный в статье материал не принадлежит Analytics Vidhya и используется по усмотрению автора.