BM25: Лексический поиск для улучшения RAG-конвейеров
В мире больших языковых моделей (LLM) и систем на основе Claude, таких как Claude с Google Vertex AI, способность находить и извлекать релевантную информацию является ключевой. Это основа для создания мощных приложений, использующих архитектуру Retrieval Augmented Generation (RAG). RAG-конвейеры позволяют LLM отвечать на вопросы, используя актуальные и специфичные данные, выходящие за рамки их первоначального обучения. Однако, при создании таких систем, вы быстро обнаружите, что один лишь семантический поиск не всегда дает наилучшие результаты. Иногда вам нужны точные совпадения терминов, которые семантический поиск может упустить. Решение заключается в объединении семантического поиска с лексическим поиском, используя такую технику, как BM25.
Проблема чисто семантического поиска
Семантический поиск — это мощный инструмент, который использует embeddings и векторные базы данных для поиска информации на основе ее смысла, а не точных совпадений слов. Он отлично подходит для запросов типа "расскажи мне о возобновляемых источниках энергии", находя документы, которые обсуждают солнечную, ветровую или гидроэнергетику, даже если в запросе не было этих конкретных слов.
Однако, у него есть свои ограничения. Представьте, что вы ищете конкретный идентификатор инцидента, например, "INC-2023-Q4-011", в большом наборе документов. Хотя этот точный термин может встречаться несколько раз в релевантных разделах, чисто семантический поиск может вернуть вам разделы, которые семантически похожи (например, говорят о "проблемах с инцидентами" или "отчетах за четвертый квартал"), но на самом деле не содержат искомого вами конкретного идентификатора. Это происходит потому, что семантический поиск фокусируется на значении и контексте, а не на точном совпадении символов. Когда вам требуется точное совпадение терминов, необходим другой подход.
Гибридная стратегия поиска: лучшее из двух миров
Чтобы преодолеть ограничения чисто семантического поиска и обеспечить максимальную точность и полноту извлечения информации, применяется гибридная стратегия. Суть ее заключается в параллельном выполнении двух типов поиска и последующем объединении их результатов. Эта стратегия позволяет получить "лучшее из двух миров":
- Семантический поиск: Использует embeddings и векторные базы данных для поиска на основе смысла и контекста, что позволяет находить релевантную информацию, даже если в запросе используются синонимы или перефразирования.
- Лексический поиск: Применяет классические методы текстового поиска для нахождения точных совпадений терминов, что критически важно для поиска специфических идентификаторов, кодов, имен или других уникальных последовательностей символов.
- Объединение результатов: Комбинирование результатов из обоих наборов для обеспечения более полного и точного охвата, гарантируя, что будут найдены как контекстно-релевантные, так и точно совпадающие фрагменты.
Что такое BM25 и как он работает?
BM25 (Best Match 25) — это широко используемый алгоритм для лексического поиска, который отлично подходит для RAG-конвейеров. Он оценивает релевантность документа по отношению к поисковому запросу, основываясь на частоте появления терминов запроса в документе и их редкости во всей коллекции документов. Вот как BM25 обрабатывает поисковый запрос:
- Токенизация запроса: Сначала пользовательский запрос разбивается на отдельные термины (tokens). Например, запрос "Что случилось с
INC-2023-Q4-011?" будет разбит на "Что", "случилось", "с", "INC-2023-Q4-011". - Подсчет частоты терминов: Для каждого термина из запроса алгоритм подсчитывает, как часто он встречается в каждом документе коллекции.
- Взвешивание терминов по редкости: Это один из ключевых шагов. Терминам, которые встречаются реже во всей коллекции документов, присваивается более высокий "вес" или важность. Например, обычные слова, такие как "и", "или", "с", имеют очень низкий вес, тогда как уникальные термины, такие как "
INC-2023-Q4-011" или "Anthropic", получают значительно более высокие баллы важности. - Поиск наилучших совпадений: Наконец, BM25 ранжирует документы, отдавая предпочтение тем, которые содержат больше экземпляров высоко-взвешенных терминов из запроса. Документы, содержащие редкие и важные термины, получают значительно более высокий рейтинг.
Ключевая идея заключается в том, что редкие термины, такие как "INC-2023-Q4-011", гораздо важнее для поиска, чем общие слова вроде "а" или "в". BM25 эффективно использует эту информацию для точного ранжирования.
Применение BM25 в RAG-конвейере
Интеграция BM25 в RAG-конвейер относительно проста, поскольку многие библиотеки предоставляют готовые реализации. Концептуально, процесс настройки системы BM25 выглядит следующим образом:
# Создание хранилища BM25
store = BM25Index()
# Добавление документов в хранилище
for chunk in chunks:
store.add_document({"content": chunk})
# Поиск в хранилище
results = store.search("Что случилось с INC-2023-Q4-011?", 3)
В этом примере BM25Index() представляет собой объект, который управляет индексацией и поиском. Метод add_document() используется для добавления текстовых фрагментов (chunks) из вашей коллекции данных в индекс BM25. Затем метод search() позволяет выполнить запрос, возвращая наиболее релевантные документы. Важно отметить, что многие реализации BM25 предоставляют API, аналогичный тем, что используются в системах семантического поиска, что упрощает их совместное использование в рамках одного конвейера.
Преимущества гибридного подхода
Когда вы выполняете тот же запрос, который не дал результатов при использовании только семантического поиска, через систему BM25, вы получаете значительно лучшие результаты. Вместо возврата нерелевантных разделов, BM25 отдает приоритет тем разделам, которые фактически содержат ваши конкретные поисковые термины. Алгоритм правильно определяет, что "INC-2023-Q4-011" является редким, важным термином и ранжирует документы, содержащие его, гораздо выше, чем документы, содержащие только общие слова из запроса.
Теперь, когда у вас есть как семантическая, так и лексическая системы поиска, работающие независимо, следующим шагом является объединение их результатов. Этот гибридный подход дает вам лучшее из обоих миров — контекстное понимание семантического поиска в сочетании с точностью точного совпадения терминов из лексического поиска. Обе системы поиска часто используют схожие API, что делает параллельное выполнение запросов и объединение их результатов в единый, более полный набор результатов простым и эффективным процессом, значительно улучшающим качество ответов вашего RAG-конвейера.