Улучшение точности поиска с Rerank
Современные системы информационного поиска постоянно совершенствуются, стремясь предоставить пользователям наиболее релевантные результаты. Одним из эффективных методов улучшения качества поиска является использование двухэтапного подхода с применением переранжирования.
Платформа Compressa предоставляет Rerank модель для реализации такого подхода.
Процесс работы может выглядеть следующим образом:
- Сначала система берет вопрос пользователя и извлекает топ-100 документов из датасета, используя либо лексический, либо семантический поиск.
- Затем эти 100 документов вместе с исходным вопросом передаются в Compressa Rerank.
- Для каждого документа вычисляется оценка релевантности.
- На основе полученных оценок документы переранжируются, предоставляя пользователю наиболее подходящие результаты.
Особенно эффективным этот метод может быть в случаях, когда отсутствуют обучающие данные для настройки поисковой системы.
В этом руководстве мы рассмотрим, как использовать Compressa Rerank для улучшения результатов поиска, и продемонстрируем её применение на практических примерах.
Весь представленный ниже код можно получить в виде .ipynb ноутбука здесь.
# Установка необходимых библиотек
!pip install langchain-compressa
!pip install langchain
# Импорт необходимых библиотек
import os
import requests
import numpy as np
from time import time
from typing import List
from pprint import pprint
from langchain_compressa import CompressaRerank
from langchain.schema import Document
Для ячейки ниже вам понадобится API ключ Compressa. Вы можете получить его после регистрации.
os.environ["COMPRESSA_API_KEY"] = "ваш_ключ"
# Инициализация Compressa Rerank
reranker = CompressaRerank()
# Пример запроса и "документов"
query = "Кто является автором картины 'Черный квадрат'?"
docs = [
"Казимир Малевич создал 'Черный квадрат' в 1915 году, что стало революционным событием в мире искусства.",
"Илья Репин известен своими реалистичными картинами, такими как 'Бурлаки на Волге' и 'Иван Грозный и сын его Иван'.",
"'Черный квадрат' Малевича считается одним из самых влиятельных произведений абстрактного искусства XX века.",
"Василий Кандинский, современник Малевича, также работал в жанре абстрактного искусства.",
"Малевич написал несколько версий 'Черного квадрата' между 1915 и 1930 годами.",
"Картина 'Черный квадрат' впервые была выставлена на футуристической выставке '0,10' в Петрограде.",
"Помимо 'Черного квадрата', Малевич известен своими работами в стиле супрематизма.",
"Марк Шагал, еще один известный русский художник, работал в стиле модернизма и сюрреализма.",
"В Третьяковской галерее в Москве хранится одна из версий 'Черного квадрата' Малевича.",
"Картина 'Черный квадрат' вызвала множество дискуссий и интерпретаций в мире искусства."
]
# Создаем объекты типа Langchain Document из наших вопросов
doc_objects = [
Document(page_content=doc, metadata={"index": idx})
for idx, doc in enumerate(docs)
]
Используем Compressa Rerank
В следующей ячейке мы вызовем Compressa Rerank для ранжирования docs
на основе их релевантности запросу query
results = reranker.compress_documents(query=query, documents=doc_objects)
top_n = 3 # Измените top_n, чтобы изменить количество возвращаемых результатов.
sorted_results = sorted(results, key=lambda x: x.metadata['relevance_score'], reverse=True)
selected_results = sorted_results[:top_n]
print(query)
for idx, r in enumerate(selected_results):
doc_index = r.metadata["index"]
doc_text = r.page_content if doc_index < len(docs) else "Текст не найден"
print(f"Ранг документа: {idx + 1}, Индекс документа: {doc_index}")
print(f"Документ: {doc_text}")
print(f"Оценка релевантности: {r.metadata['relevance_score']:.2f}")
print("\n")
Поиск по Википедии - End2end демо
В следующем примере мы покажем, как использовать Rerank модель для улучшения поиска по статьям русскоязычной Wikipedia. Для создания удобного датасета мы уменьшили mrtydi-v1.1-russian до порядка 500к отрывков из статей, сохранив "правильные" ответы для всех вопросов, которые будем использовать ниже, и добавили другие рандомные статьи.
Мы будем использовать лексический поиск BM25 для извлечения топ-100 отрывков, соответствующих запросу, а затем отправим эти 100 отрывков и запрос в Compressa Rerank, чтобы получить отранжированные результаты.
Мы выведем топ-3 результата согласно BM25 (как это используется, например, в Elasticsearch) и улучшенный результат от нашей модели Compressa Rerank.
Для начала установим и импортируем дополнительные библиотеки.
!pip install -U rank_bm25
!pip install gdown
import gdown
import json
import gzip
import os
from rank_bm25 import BM25Okapi
from sklearn.feature_extraction import _stop_words
import string
from tqdm.autonotebook import tqdm
#Скачиваем датасет c google диска Сompressa, он уже нарезан на отрывки
file_id = '1u-3EQ4yoYys1wSSK_EifIPPRyh_6oaR6'
url = f'https://drive.google.com/uc?id={file_id}'
gdown.download(url, 'mrtydi-russian-subset.jsonl', quiet=False)
with open('mrtydi-russian-subset.jsonl', 'r', encoding='utf-8') as f:
passages = [json.loads(line) for line in tqdm(f)]
print(f"Всего отрывков в подмножестве: {len(passages)}")
print(f"Пример первого отрывка:")
print(f"ID: {passages[0]['id']}")
print(f"Содержание: {passages[0]['contents'][:300]}...") # Показываем первые 200 символов содержания