Функция MinHashCompatible with Milvus 3.0.x
Функция MinHash преобразует необработанный текст в двоичные векторы, аппроксимирующие сходство Жаккарда между документами. Она применяет шинглинг текста и несколько хэш-функций для получения векторов подписей фиксированной длины, что позволяет быстро обнаруживать почти дубликаты и дедублировать документы в масштабе.
Будучи встроенной функцией, MinHash работает внутри Milvus и не требует внешнего вывода модели или предварительной обработки. Вы вставляете необработанный текст, и Milvus автоматически генерирует векторы подписи MinHash.
Ограничения
Выходное поле должно быть
BINARY_VECTORс размерностью, удовлетворяющейdim % 32 == 0, поскольку каждая подпись MinHash представляет собой 32-битное хэш-значение.Поле
dimдвоичного вектора должно быть равно32 * num_hashes. Несоответствие приводит к ошибке.При использовании индекса
MINHASH_LSHс выходом функции MinHash,mh_element_bit_widthдолжен быть установлен на32.
Как работает MinHash
MinHash - это техника хеширования, чувствительная к локальности, которая оценивает сходство по Жаккарду между множествами. В Milvus функция MinHash работает следующим образом: вы предоставляете исходный текст на вход, а Milvus производит двоичный вектор на выходе, обрабатывая все промежуточные шаги внутри.
Общий рабочий процесс состоит из общего конвейера обработки текста, используемого как при вводе документов, так и при обработке запросов, за которым следуют специфические операции для хранения и поиска.
Iaqkbfeh8oqggsx6nsocfosondo
Общий конвейер обработки текста
И при вводе документов, и при обработке запросов необработанный текст проходит через одно и то же четырехэтапное преобразование:
Анализ текста: Текст обрабатывается анализатором (когда
token_level-"word") или используется напрямую (когдаtoken_level-"char"). Токенизация на уровне слов применяет анализатор, настроенный на поле ввода, для сегментации текста на термины - например,"milvus is vector db"становится["milvus", "is", "vector", "db"].Шингование: Токены разбиваются на перекрывающиеся n-граммы (шинглы) размером
shingle_size. Например, при использовании 3-грамм на уровне слов, лексемы["information", "retrieval", "is", "a", "field"]превращаются в шинглы типа["information retrieval is", "retrieval is a", "is a field"].Генерация подписи MinHash: К набору шинглов применяется несколько хэш-функций (H1, H2, ..., Hn, где n =
num_hashes). Для каждой хэш-функции выбирается минимальное значение хэша для всех черепиц. Совокупность этих минимальных значений образует подпись MinHash - представление фиксированной длины, аппроксимирующее сходство по Жаккарду исходного документа.Кодирование двоичного вектора: Каждое значение подписи представляет собой 32-битный хэш, а полная подпись упаковывается в вектор
BINARY_VECTORразмерности32 * num_hashes.
Вставка документа
При вставке двоичный вектор, созданный общим конвейером, хранится в индексе MINHASH_LSH. В индексе хранится таблица LSH (Locality-Sensitive Hashing), которая группирует похожие подписи в одинаковые ведра, что позволяет быстро находить кандидатов при запросе.
Обработка запроса
Во время поиска текст запроса проходит через один и тот же общий конвейер для создания двоичного вектора. Этот вектор используется для выполнения поиска LSH в индексе MINHASH_LSH, который быстро определяет пары кандидатов, которые, вероятно, похожи. Затем кандидаты ранжируются по сходству Жаккарда, и возвращаются результаты из топ-K.
Поскольку оба пути используют одну и ту же логику преобразования, два документа с сильно пересекающимся содержимым создают похожие подписи MinHash. Это делает функцию эффективной для поиска близких дубликатов, даже если документы отличаются порядком слов, форматированием или незначительными формулировками.
Перед началом работы
Прежде чем использовать функцию MinHash, спланируйте схему коллекции таким образом, чтобы она включала следующее:
Текстовое поле для необработанного содержимого
Ваша коллекция должна включать поле
VARCHARдля хранения необработанного текста. Это поле служит входом для функции MinHash.Анализатор для текстового поля (при использовании токенизации на уровне слов).
Если для
token_levelустановлено значение"word"(по умолчанию), в текстовом поле должен быть включен анализатор. Анализатор определяет, как текст будет токенизирован перед шинглированием. По умолчанию Milvus использует анализаторstandard. Чтобы настроить другой анализатор, обратитесь к разделу Выбор правильного анализатора для вашего случая использования.Бинарное векторное поле для вывода MinHash
Ваша коллекция должна включать поле
BINARY_VECTORдля хранения бинарных векторов, генерируемых функцией MinHash. Размерность должна быть равна32 * num_hashes.
Шаг 1: Создайте коллекцию с функцией MinHash
Чтобы использовать функцию MinHash, определите ее при создании коллекции. Функция станет частью схемы коллекции и будет автоматически применяться при вставке и поиске данных.
Определение полей схемы
Схема коллекции должна включать не менее трех полей:
Основное поле: Уникально идентифицирует каждую сущность в коллекции.
Текстовое поле (
VARCHAR): Хранит необработанные текстовые документы. Установите значениеenable_analyzer=True, чтобы Milvus мог обрабатывать текст для генерации подписи MinHash. По умолчанию Milvus использует анализаторstandardдля анализа текста. Чтобы настроить другой анализатор, обратитесь к разделу Выбор правильного анализатора для вашего случая использования.Поле двоичных векторов (
BINARY_VECTOR): Хранит двоичные векторы, автоматически сгенерированные функцией MinHash. Размерность должна быть равна32 * num_hashes.
from pymilvus import MilvusClient, DataType, Function, FunctionType
client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")
schema = client.create_schema()
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)
schema.add_field(field_name="document_content", datatype=DataType.VARCHAR, max_length=9000, enable_analyzer=True)
schema.add_field(field_name="binary_vector", datatype=DataType.BINARY_VECTOR, dim=8192)
// java
// nodejs
// go
# restful
Определение функции MinHash
Функция MinHash преобразует анализируемый текст в двоичные векторы, которые приблизительно соответствуют сходству Жаккара между документами.
Определите функцию и добавьте ее в свою схему:
minhash_function = Function(
name="minhash_function",
input_field_names=["document_content"], # Name of the VARCHAR field containing raw text
output_field_names=["binary_vector"], # Name of the BINARY_VECTOR field for generated signatures
function_type=FunctionType.MINHASH,
params={
"num_hashes": 256, # Number of hash functions; produces dim = 32 * 256 = 8192
"shingle_size": 3, # N-gram size for shingling
}
)
schema.add_function(minhash_function)
// java
// nodejs
// go
# restful
Параметры конфигурации
Словарь params функции MinHash принимает следующие параметры. Все имена параметров не чувствительны к регистру.
Параметр |
Тип |
По умолчанию |
Описание |
|---|---|---|---|
|
int |
Производное от |
Количество хэш-функций для генерации подписи. Размерность выходного двоичного вектора равна |
|
int |
|
Размер N-граммы для шинглов. Уровень слов: обычно 1-3. Уровень символов: обычно 2-6. |
|
str |
|
Используемая хэш-функция. Варианты:
|
|
str |
|
Уровень токенизации. Варианты:
|
|
int |
|
Случайное семя для инициализации функции MinHash. |
Настройка индекса
Рекомендуемый тип индекса для бинарных векторов MinHash - MINHASH_LSH, с метрическим типом MHJACCARD.
index_params = client.prepare_index_params()
index_params.add_index(
field_name="binary_vector",
index_type="MINHASH_LSH",
metric_type="MHJACCARD",
params={
"mh_lsh_band": 128,
"mh_element_bit_width": 32,
"with_raw_data": True,
},
)
// java
// nodejs
// go
# restful
Создание коллекции
Создайте коллекцию, используя схему и параметры индекса, определенные выше:
client.create_collection(
collection_name="dedup_collection",
schema=schema,
index_params=index_params,
)
// java
// nodejs
// go
# restful
Шаг 2: Вставка документов
После настройки коллекции вставьте текстовые данные. Вам нужно только предоставить необработанный текст - функция MinHash автоматически генерирует двоичный вектор для каждого документа.
client.insert(
"dedup_collection",
[
{"document_content": "information retrieval is a field of study that helps users find relevant information in large datasets"},
{"document_content": "information retrieval is a research field focused on helping users find relevant data in large collections"},
{"document_content": "information retrieval is a field of research helping users search for relevant information in large datasets"},
],
)
// java
// nodejs
// go
# restful
Шаг 3: Поиск с помощью MinHash
После того как вы вставили данные, выполните поиск близких к дублированию документов, предоставив необработанные текстовые запросы. Milvus автоматически преобразует текст запроса в двоичный вектор MinHash и извлекает наиболее похожие документы, используя оценку сходства по Жаккарду.
search_params = {
"metric_type": "MHJACCARD",
"params": {},
}
results = client.search(
collection_name="dedup_collection",
data=["information retrieval is a research field focused on helping users find relevant data in large collections"],
anns_field="binary_vector",
limit=3,
output_fields=["document_content"],
search_params=search_params,
)
for hits in results:
for hit in hits:
print(f"ID: {hit['id']}, Distance: {hit['distance']}")
print(f"Document: {hit['entity']['document_content']}")
// java
// nodejs
// go
# restful
Что дальше
Полнотекстовый поиск: Использование BM25 для ранжирования лексической релевантности вместо обнаружения близких дубликатов.
Обзор анализаторов: Настройка пользовательских анализаторов для токенизации текста.
Индекс MINHASH_LSH: Узнайте о настройке параметров LSH для повышения запоминаемости и производительности.