Фильтрация метаданных Milvus: фильтрация JSON и метаданных в Milvus
JSON, или JavaScript Object Notation, — это гибкий формат данных для хранения и передачи. Он адаптивно использует пары ключ-значение, что делает его идеальным для баз данных NoSQL и результатов API. Благодаря своей гибкости это популярный формат данных. Параметры поиска имеют решающее значение для определения особенностей каждого поискового запроса, таких как используемые векторные поля, векторы запроса и ограничения на количество возвращаемых результатов.
Многие демо Milvus начинаются с необработанных текстовых данных, таких как файлы типов .txt, .pdf или .csv. Но знаете ли вы, что с помощью Milvus можно загружать необработанный JSON и работать с ним? Подробнее см. на этой странице документации по JSON.
Milvus Client — это обертка вокруг объекта коллекции Milvus, которая использует гибкий формат JSON «key»:value, позволяя определять данные без схемы. Подробнее см. в документации Milvus Client.
Milvus Client без схемы и бесплатный облачный уровень Zilliz — отличный способ быстро начать использовать Milvus! Milvus Client почти так же быстр, как предварительное определение полной схемы, но требует меньше кода, склонного к ошибкам. По сравнению с “enable_dynamic_field”, Milvus Client намного быстрее и предлагает более удобный подход к использованию меньшего объема предварительного определения схемы. Схема без схемы выглядит так:
- id (str): имя поля первичного ключа.
- vector (str): имя векторного поля.
Вот и всё! Остальные поля можно гибко определять при вставке данных в Milvus.
Чтобы сделать это более конкретным, перейдем к нескольким примерам кода, показывающим, как использовать Milvus Client. Полный код находится в моем репозитории Bootcamp на github.
Пример кода — загрузка необработанных JSON-данных напрямую в Milvus
Сами необработанные данные могут быть в формате JSON. Это полезно, например, если ваши данные поступают из базы данных NoSQL, такой как MongoDB. Ниже используются JSON-данные классификации жанров фильмов IMDB с Kaggle
# !pip install numpy pandas json pprint pymilvus torch sentence-transformers
# Import common libraries.
import pandas as pd
import json
# Read JSON data.
df = pd.read_json('data/tiny_parsed_data.json')
# Concatenate Title and Description into 'text' column.
df['text'] = df['title'] + ' ' + df['description']
display(df.head(2))
Запустите бесплатный пробный сервер Zilliz cloud. В рамках бесплатного пробного периода у вас одновременно может быть до 2 коллекций, каждая до 1 миллиона векторов. Код в этом ноутбуке использует полностью управляемый
- Выберите стандартный вариант "Starter" при создании > Create collection > Give it a name > Create cluster and collection.
- На главной странице Cluster скопируйте свой
API Keyи сохраните его локально в переменной .env ‘ZILLIZ_API_KEY’. - Также на главной странице Cluster скопируйте
Public Endpoint URI.
import os
from pymilvus import connections, utility
TOKEN = os.getenv("ZILLIZ_API_KEY")
# Connect to Zilliz cloud using endpoint URI and API key TOKEN.
CLUSTER_ENDPOINT="https://in03-xxxx.api.gcp-us-west1.zillizcloud.com:443"
connections.connect(
alias='default',
token=TOKEN,
uri=CLUSTER_ENDPOINT,)
# Check if the server is ready and get collection name.
print(f"Type of server: {utility.get_server_version()}")
Выберите embedding model. Ниже я выбрала одну из HuggingFace. Я запускаю это на своем ноутбуке, поэтому мне нужно убедиться, что DEVICE=cpu.
import torch
from sentence_transformers import SentenceTransformer
# Initialize torch settings
torch.backends.cudnn.deterministic = True
DEVICE = torch.device('cuda:3' if torch.cuda.is_available() else 'cpu')
# Загрузите модель из хаба моделей Hugging Face.
model_name = "WhereIsAI/UAE-Large-V1"
encoder = SentenceTransformer(model_name, device=DEVICE)
# Get the model parameters and save for later.
EMBEDDING_DIM = encoder.get_sentence_embedding_dimension()
MAX_SEQ_LENGTH_IN_TOKENS = encoder.get_max_seq_length()
# View model parameters.
print(f"model_name: {model_name}")
print(f"EMBEDDING_DIM: {EMBEDDING_DIM}")
print(f"MAX_SEQ_LENGTH: {MAX_SEQ_LENGTH}")
Импортируйте MilvusClient и создайте коллекцию. Обратите внимание, что нам не нужно указывать схему! Кроме того, вы можете просто использовать наш системный индекс по умолчанию, называемый AUTOINDEX. В open source и бесплатном тарифе по умолчанию используется HNSW. В платном облаке Zilliz AUTOINDEX будет дополнительно оптимизирован с использованием проприетарных индексов.
from pymilvus import MilvusClient
import pprint
# Set the Milvus collection name.
COLLECTION_NAME = "imdb_metadata"
# Use no-schema Milvus client.
mc = MilvusClient(
uri=CLUSTER_ENDPOINT,
token=TOKEN)
# Check if the collection already exists, if so drop it.
has = utility.has_collection(COLLECTION_NAME)
if has:
drop_result = utility.drop_collection(COLLECTION_NAME)
print(f"Successfully dropped collection: `{COLLECTION_NAME}`")
# Create the collection.
mc.create_collection(COLLECTION_NAME,
EMBEDDING_DIM,
consistency_level="Eventually",
auto_id=True,
overwrite=True,
# skip setting params, if using AUTOINDEX
)
print(f"Successfully created collection: `{COLLECTION_NAME}`")
pprint.pprint(mc.describe_collection(COLLECTION_NAME))
Простая стратегия разбиения на фрагменты — сохранять поле ‘text’ как один фрагмент, если его длина не превышает 512 символов. Ниже мы видим, что текстовое поле JSON-данных было довольно коротким. Ни одну строку не пришлось разбивать на более мелкие фрагменты.
# Use the embedding model parameters.
chunk_size = 512
chunk_overlap = np.round(chunk_size * 0.10, 0)
# Chunk a batch of data from pandas DataFrame and inspect it.
BATCH_SIZE = 100
batch = imdb_chunk_text(BATCH_SIZE, df, chunk_size)
display(batch.head(2))
Теперь, когда у нас есть фрагменты текста, векторные эмбеддинги для каждого фрагмента текста и все исходные метаданные, давайте вставим эти данные в векторную базу данных Milvus.
# Convert the DataFrame to a list of dictionaries
chunk_list = batch.to_dict(orient='records')
# Insert data into the Milvus collection.
start_time = time.time()
insert_result = mc.insert( COLLECTION_NAME, data=chunk_list, progress_bar=True )
end_time = time.time()
print(f"Milvus Client insert time for {batch.shape[0]} vectors: {end_time - start_time} seconds")
Давайте зададим вопрос и извлечем ответы из наших данных о фильмах.
SAMPLE_QUESTION = "Dystopia science fiction with a robot."
# Embed the question using the same encoder.
query_embeddings = _utils.embed_query(encoder, [SAMPLE_QUESTION])
TOP_K = 2
# Run semantic vector search using your query and the vector database.
start_time = time.time()
results = mc.search(
COLLECTION_NAME,
data=query_embeddings,
output_fields=OUTPUT_FIELDS,
limit=TOP_K,
consistency_level="Eventually",
filter='film_year >= 2019', )
elapsed_time = time.time() - start_time
print(f"Milvus Client search time for {len(chunk_list)} vectors: {elapsed_time} seconds")
время поиска
Просматривая 2 лучших результата, мы видим.
Выглядит довольно хорошо. Но что, если мы хотим выполнить фильтрацию метаданных по JSON-массиву ‘Genres’?
Фильтрация метаданных по JSON-полям и JSON-массивам
Новая функция в Milvus 2.3 — возможность фильтровать необработанные JSON-метаданные. Ниже я покажу пример использования фильтрации метаданных с полем и массивом.
Допустим, я хотел бы увидеть более старые, более ретро-фильмы и строго жанр Sci-Fi.
SAMPLE_QUESTION = "Dystopia science fiction with a robot."
# Embed the question using the same encoder.
query_embeddings = _utils.embed_query(encoder, [SAMPLE_QUESTION])
TOP_K = 2
# Run semantic vector search using your query and the vector database.
start_time = time.time()
results = mc.search(
COLLECTION_NAME,
data=query_embeddings,
output_fields=OUTPUT_FIELDS,
limit=TOP_K,
consistency_level="Eventually",
filter='json_contains(Genres, "Sci-Fi") and film_year < 2019',
)
elapsed_time = time.time() - start_time
print(f"Milvus Client search time for {len(chunk_list)} vectors: {elapsed_time} seconds")
При переборе 2 лучших результатов рекомендации фильмов теперь изменились, чтобы соответствовать фильтру.
Многие демо Milvus начинаются с необработанных текстовых данных, таких как файлы типов .txt, .pdf или .csv. На этот раз мы увидели, как загружать JSON-данные напрямую в коллекцию векторной базы данных Milvus. Мы также увидели, как использовать удобную фильтрацию метаданных по JSON-полям и фильтрациюjson_contains() по типам данных JSON-массивов. Полный код для этой статьи блога находится в моем репозитории Bootcamp на GitHub.
Введение в гибридный поиск
Гибридный поиск — это мощная функция в Milvus, которая позволяет пользователям объединять несколько векторных полей в один поиск. Эта функция особенно полезна в сложных поисковых сценариях, где сущность может быть представлена несколькими разнообразными векторами. Интегрируя результаты нескольких векторных поисков с использованием стратегий reranking, гибридный поиск позволяет пользователям достигать более высокой точности и более релевантных результатов.
В Milvus гибридный поиск можно использовать для объединения разных типов данных, таких как текст, изображения и аудио, в один поисковый запрос. Это позволяет пользователям выполнять более комплексные поиски и получать более релевантные результаты. Например, гибридный поиск может объединять текстовые embeddings с image embeddings, чтобы находить продукты, соответствующие как текстовому описанию, так и визуальному примеру.
Чтобы эффективно использовать гибридный поиск в Milvus, важно понимать различные векторные поля и то, как их можно объединять. Тщательно выбирая и комбинируя векторные поля, пользователи могут повысить точность и релевантность своих результатов поиска. Кроме того, использование стратегий reranking может помочь дополнительно уточнить результаты поиска и гарантировать, что будут возвращены наиболее релевантные результаты.
Управление данными с помощью метаданных
Метаданные играют ключевую роль в управлении данными в Milvus. Метаданные используются для описания структуры и организации данных, что упрощает поиск, фильтрацию и анализ. В Milvus метаданные используются для управления файлами данных, включая информацию о данных, такую как имя коллекции, векторное поле и тип индекса.
Эффективно используя метаданные, пользователи могут повысить производительность и точность своих поисков. Метаданные позволяют пользователям организовывать свои данные таким образом, чтобы их было легко извлекать и анализировать. Например, используя метаданные для пометки данных релевантными ключевыми словами, пользователи могут быстро фильтровать и искать конкретные точки данных.
Помимо улучшения производительности поиска, метаданные также могут помочь обеспечить целостность и согласованность данных. Используя метаданные для отслеживания изменений и обновлений данных, пользователи могут гарантировать, что их данные остаются точными и актуальными. Это особенно важно в крупномасштабных средах данных, где данные постоянно обновляются и изменяются.
JSON и фильтрация метаданных
JSON (JavaScript Object Notation) — это гибкий формат данных, который широко используется в базах данных NoSQL и результатах API. Milvus поддерживает загрузку и работу с необработанными данными JSON, что упрощает интеграцию с другими системами. Фильтрация метаданных — это мощная функция в Milvus, которая позволяет пользователям фильтровать необработанные метаданные JSON на основе конкретных условий.
Используя фильтрацию метаданных, пользователи могут повысить точность своих поисков и сократить объем нерелевантных данных. Например, пользователи могут фильтровать данные JSON на основе конкретных полей или значений, например фильтровать фильмы по жанру или году выпуска. Это позволяет пользователям выполнять более целенаправленные поиски и получать более релевантные результаты.
В Milvus фильтрацию метаданных можно использовать в сочетании с векторным поиском для дальнейшего уточнения результатов поиска. Применяя фильтры метаданных к запросам векторного поиска, пользователи могут гарантировать, что будут возвращены только наиболее релевантные данные. Это может помочь повысить точность поиска и уменьшить объем нерелевантных данных, которые необходимо обработать.
Создание индексов для векторного поиска и управление ими
Создание индекса — это критически важный шаг в оптимизации производительности векторного поиска в Milvus. Индекс — это структура данных, которая повышает скорость извлечения данных, позволяя базе данных быстро находить конкретные данные. В Milvus индексы могут создаваться для векторных полей, чтобы повысить производительность векторных поисков.
В Milvus доступны разные типы индексов, каждый со своими преимуществами и сценариями использования. Например, индекс HNSW (Hierarchical Navigable Small World) обычно используется для поиска по высокоразмерным векторам благодаря своей эффективности и точности. Другие типы индексов, такие как IVF (Inverted File) и PQ (Product Quantization), предлагают разные компромиссы между скоростью и точностью поиска.
Чтобы эффективно создавать индексы и управлять ими, важно понимать характеристики данных и конкретные требования к поиску. Выбирая подходящий тип индекса и настраивая параметры индекса, пользователи могут значительно повысить производительность своих поисков. Кроме того, регулярное обновление и обслуживание индексов может помочь обеспечить оптимальную производительность поиска по мере изменения данных.
Оптимизация производительности гибридного поиска
Производительность гибридного поиска можно оптимизировать с помощью различных методов, включая создание индексов, фильтрацию метаданных и оптимизацию запросов. Создавая индексы для векторных полей, пользователи могут повысить производительность векторных поисков. Индексы позволяют базе данных быстро находить релевантные данные, сокращая время, необходимое для выполнения поисков.
Фильтрация метаданных — еще один важный метод оптимизации производительности гибридного поиска. Используя фильтры метаданных, пользователи могут сократить объем нерелевантных данных, которые необходимо обработать, повышая точность и скорость поиска. Например, фильтрация данных на основе конкретных полей или значений может помочь сузить результаты поиска и гарантировать, что будут возвращены только наиболее релевантные данные.
Оптимизация запросов также имеет решающее значение для повышения производительности гибридного поиска. Оптимизируя структуру и параметры поисковых запросов, пользователи могут сократить вычислительные ресурсы, необходимые для поиска, и повысить производительность. Это может включать такие методы, как пакетная обработка запросов, использование эффективных структур данных и настройка параметров запросов.
В этом разделе мы обсудили лучшие практики оптимизации производительности гибридного поиска в Milvus. Используя такие методы, как создание индексов, фильтрация метаданных и оптимизация запросов, пользователи могут повысить точность и скорость своих поисков, гарантируя получение наиболее релевантных результатов.
Читать далее

Vector Databases vs. Key-Value Databases
Use a vector database for AI-powered similarity search; use a key-value database for high-throughput, low-latency simple data lookups.

Legal Document Analysis: Harnessing Zilliz Cloud's Semantic Search and RAG for Legal Insights
Enhance legal document analysis with Zilliz Cloud’s Semantic Search and RAG. Improve accuracy, efficiency, and scalability for contracts, case law, and compliance.

Why Deepseek is Waking up AI Giants Like OpenAI And Why You Should Care
Discover how DeepSeek R1's open-source AI model with superior reasoning capabilities and lower costs is disrupting the AI landscape and challenging tech giants like OpenAI.



