AGI и будущее ИИ

Сила Реранкеров и Двухэтапного Поиска для Генерации с Помощью Поиска

mm
Добавьте Unite.AI в избранные источники в Google

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

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

Понимание Генерации с Помощью Поиска (RAG)

связанный агент LLM

Прежде чем погрузиться в подробности двухэтапного поиска и реранкеров, давайте кратко рассмотрим концепцию Генерации с Помощью Поиска (RAG). RAG – это метод, который расширяет знания и возможности больших языковых моделей (LLM), предоставляя им доступ к внешним источникам информации, таким как базы данных или коллекции документов. Подробнее см. в статье “Глубокое погружение в Генерацию с Помощью Поиска в LLM“.

Типичный процесс RAG включает следующие шаги:

  1. Запрос: Пользователь задает вопрос или дает инструкцию системе.
  2. Поиск: Система запрашивает векторную базу данных или коллекцию документов, чтобы найти информацию, релевантную для запроса пользователя.
  3. Улучшение: Извлеченная информация объединяется с исходным запросом или инструкцией пользователя.
  4. Генерация: Языковая модель обрабатывает улучшенный вход и генерирует ответ, используя внешнюю информацию для улучшения точности и полноты своего вывода.

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

Необходимость Двухэтапного Поиска и Реранкеров

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

Чтобы решить эту проблему, исследователи и практики обратились к двухэтапному поиску с реранкерами. Этот подход включает двухступенчатый процесс:

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

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

Преимущества Двухэтапного Поиска и Реранкеров

Принятие двухэтапного поиска с реранкерами предлагает несколько значительных преимуществ в контексте систем RAG:

  1. Улучшенная Точность: Переранкинг изначально извлеченных документов и продвижение наиболее релевантных из них в верхнюю часть списка позволяет системе предоставить более точную и полную информацию языковой модели, что приводит к более высокому качеству сгенерированных ответов.
  2. Смягчение Проблем, Связанных с Доменом: Модели, используемые для традиционного поиска, часто обучаются на общих текстовых корпусах, которые могут не адекватно отражать язык и семантику конкретного домена. Модели реранкинга, с другой стороны, могут быть обучены на данных конкретного домена, что смягчает проблему “вне домена” и улучшает релевантность извлеченных документов в рамках специализированных доменов.
  3. Масштабируемость: Двухэтапный подход позволяет эффективно масштабировать систему, используя быстрые и легкие методы поиска на первой стадии, а более вычислительно интенсивный процесс реранкинга зарезервирован для меньшего подмножества документов.
  4. Гибкость: Модели реранкинга могут быть заменены или обновлены независимо от метода первоначального поиска, что обеспечивает гибкость и адаптивность к меняющимся потребностям системы.

ColBERT: Эффективное и Эффективное Позднее Взаимодействие

Одной из выдающихся моделей в области реранкинга является ColBERT (Контекстуальное Позднее Взаимодействие над BERT). ColBERT – это модель реранкинга документов, которая использует возможности глубокого понимания языка BERT и вводит новый механизм взаимодействия, известный как “позднее взаимодействие”.

ColBERT: Эффективный и Эффективный Поиск Пассажей посредством Контекстуального Позднего Взаимодействия над BERT

ColBERT: Эффективный и Эффективный Поиск Пассажей посредством Контекстуального Позднего Взаимодействия над BERT

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

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

Настройка Окружения

Прежде чем мы погрузимся в код, давайте настроим наше окружение разработки. Мы будем использовать Python и несколько популярных библиотек NLP, включая Hugging Face Transformers, Sentence Transformers и LanceDB.

# Установка необходимых библиотек
!pip install datasets huggingface_hub sentence_transformers lancedb

Подготовка Данных

Для демонстрационных целей мы будем использовать набор данных “ai-arxiv-chunked” из Hugging Face Datasets, который содержит более 400 статей ArXiv по машинному обучению, обработке естественного языка и большим языковым моделям.

from datasets import load_dataset

<p>dataset = load_dataset(&quot;jamescalam/ai-arxiv-chunked&quot;, split=&quot;train&quot;)</p>

&amp;lt;pre&amp;gt;

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

from transformers import AutoTokenizer

<p>tokenizer = AutoTokenizer.from_pretrained(&quot;bert-base-uncased&quot;)</p>

<p>def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors=&quot;pt&quot;, truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts</p>

<p>chunked_data = []
for doc in dataset:
text = doc[&quot;chunk&quot;]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)</p>

Для первоначальной стадии поиска мы будем использовать модель Sentence Transformer для кодирования наших документов и запросов в плотные векторные представления, а затем выполним приблизительный поиск ближайших соседей с помощью векторной базы данных, такой как LanceDB.
from sentence_transformers import SentenceTransformer
from lancedb import lancedb

<p># Загрузка модели Sentence Transformer
model = SentenceTransformer(&#039;all-MiniLM-L6-v2&#039;)</p>

<p># Создание хранилища векторной базы данных LanceDB
db = lancedb.lancedb(&#039;/path/to/store&#039;)
db.create_collection(&#039;docs&#039;, vector_dimension=model.get_sentence_embedding_dimension())</p>

<p># Индексация документов
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document(&#039;docs&#039;, vector, text)</p>

<p>from sentence_transformers import SentenceTransformer
from lancedb import lancedb</p>

<p># Загрузка модели Sentence Transformer
model = SentenceTransformer(&#039;all-MiniLM-L6-v2&#039;)</p>

<p># Создание хранилища векторной базы данных LanceDB
db = lancedb.lancedb(&#039;/path/to/store&#039;)
db.create_collection(&#039;docs&#039;, vector_dimension=model.get_sentence_embedding_dimension())</p>

<p># Индексация документов
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document(&#039;docs&#039;, vector, text)

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

from transformers import AutoTokenizer

<p>tokenizer = AutoTokenizer.from_pretrained(&quot;bert-base-uncased&quot;)</p>

<p>def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors=&quot;pt&quot;, truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts</p>

<p>chunked_data = []
for doc in dataset:
text = doc[&quot;chunk&quot;]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)

Реранкинг

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

from lancedb.rerankers import ColbertReranker

reranker = ColbertReranker()

<p># Реранкинг первоначальных документов
reranked_docs = reranker.rerank(query, initial_docs)

Список reranked_docs теперь содержит документы, переупорядоченные на основе их релевантности для запроса, как определено моделью реранкинга ColBERT.

Улучшение и Генерация

С перерастированными и релевантными документами в руках мы можем перейти к стадиям улучшения и генерации в конвейере RAG. Мы будем использовать языковую модель из библиотеки Hugging Face Transformers для генерации окончательного ответа.

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

<p>tokenizer = AutoTokenizer.from_pretrained(&quot;t5-base&quot;)
model = AutoModelForSeq2SeqLM.from_pretrained(&quot;t5-base&quot;)</p>

<p># Улучшение запроса с помощью перерастированных документов
augmented_query = query + &quot; &quot; + &quot; &quot;.join(reranked_docs[:3])</p>

<p># Генерация ответа из языковой модели
input_ids = tokenizer.encode(augmented_query, return_tensors=&quot;pt&quot;)
output_ids = model.generate(input_ids, max_length=500)
response = tokenizer.decode(output_ids[0], skip_special_tokens=True)</p>

print(response)

В фрагменте кода выше мы улучшаем исходный запрос перерастированными документами, создавая augmented_query. Затем мы передаем этот улучшенный запрос модели языка T5, которая генерирует ответ на основе предоставленного контекста.

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

Расширенные Техники и Рассмотрения

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

  1. Расширение Запроса: Чтобы улучшить первоначальную стадию поиска, можно использовать методы расширения запроса, которые включают добавление связанных терминов или фраз к исходному запросу. Это может помочь извлечь более разнообразный набор потенциально релевантных документов.
  2. Ансамблевый Реранкинг: Вместо того, чтобы полагаться на одну модель реранкинга, можно объединить несколько моделей реранкинга в ансамбль, используя сильные стороны разных моделей для улучшения общей производительности.
  3. Настройка Моделей Реранкинга: Хотя предварительно обученные модели реранкинга могут быть эффективными, их настройка на данных конкретного домена может еще больше улучшить их способность захватить семантику и сигналы релевантности конкретного домена.
  4. Итеративный Поиск и Реранкинг: В некоторых случаях один итерация поиска и реранкинга может быть недостаточной. Можно изучить итеративные подходы, где вывод языковой модели используется для уточнения запроса и процесса поиска, что приводит к более интерактивной и динамичной системе.
  5. Баланс Релевантности и Разнообразия: Хотя модели реранкинга направлены на продвижение наиболее релевантных документов, важно найти баланс между релевантностью и разнообразием. Включение методов, способствующих разнообразию, может помочь предотвратить слишком узкий или предвзятый выбор источников информации.
  6. Метрики Оценки: Чтобы оценить эффективность подхода двухэтапного поиска и реранкинга, необходимо определить соответствующие метрики оценки. Это могут включать традиционные метрики поиска информации, такие как точность, полнота и средний обратный ранг (MRR), а также метрики, специфичные для задачи и адаптированные к конкретному случаю использования.

Заключение

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

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

Я провел последние пять лет, погружаясь в увлекательный мир машинного обучения и глубокого обучения. Моя страсть и экспертиза привели меня к участию в более чем 50 различных проектах программной инженерии, с особым акцентом на ИИ/МО. Мое непрекращающееся любопытство также привело меня к обработке естественного языка, области, которую я с нетерпением жду возможности изучить дальше.