🚀 Попробуйте Zilliz Cloud, полностью управляемый Milvus, бесплатно — ощутите 10-кратное увеличение производительности! Попробовать сейчас>

milvus-logo
LFAI
Главная
  • Интеграции
  • Home
  • Docs
  • Интеграции

  • Модели встраивания

  • ПриговорТрансформеры

Поиск фильмов с помощью Milvus и SentenceTransformers

В этом примере мы будем искать краткие описания сюжетов фильмов с помощью Milvus и библиотеки SentenceTransformers. В качестве базы данных мы будем использовать Wikipedia Movie Plots with Summaries, размещенную на HuggingFace.

Давайте приступим!

Необходимые библиотеки

В этом примере мы будем использовать pymilvus для подключения к Milvus, sentence-transformers для генерации векторных вкраплений и datasets для загрузки набора данных примера.

pip install pymilvus sentence-transformers datasets tqdm
from datasets import load_dataset
from pymilvus import MilvusClient
from pymilvus import FieldSchema, CollectionSchema, DataType
from sentence_transformers import SentenceTransformer
from tqdm import tqdm

Мы определим некоторые глобальные параметры,

embedding_dim = 384
collection_name = "movie_embeddings"

Загрузка и открытие набора данных

В одной строке datasets можно загрузить и открыть набор данных. Библиотека будет кэшировать набор данных локально и использовать эту копию при следующем запуске. Каждая строка содержит информацию о фильме, к которому прилагается статья в Википедии. Мы используем столбцы Title, PlotSummary, Release Year и Origin/Ethnicity.

ds = load_dataset("vishnupriyavr/wiki-movie-plots-with-summaries", split="train")
print(ds)

Подключение к базе данных

На этом этапе мы приступаем к настройке Milvus. Для этого необходимо выполнить следующие шаги:

  1. Создайте базу данных Milvus Lite в локальном файле. (Замените этот URI на адрес сервера для Milvus Standalone и Milvus Distributed).
client = MilvusClient(uri="./sentence_transformers_example.db")
  1. Создайте схему данных. В ней указываются поля, из которых состоит элемент, включая размерность векторного вложения.
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),
    FieldSchema(name="year", dtype=DataType.INT64),
    FieldSchema(name="origin", dtype=DataType.VARCHAR, max_length=64),
]

schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
client.create_collection(collection_name=collection_name, schema=schema)
  1. Определите алгоритм индексирования векторного поиска. Milvus Lite поддерживает тип индекса FLAT, в то время как Milvus Standalone и Milvus Distributed реализуют широкий спектр методов, таких как IVF, HNSW и DiskANN. Для небольшого объема данных в этой демонстрации достаточно любого типа поискового индекса, поэтому здесь мы используем самый простой FLAT.
index_params = client.prepare_index_params()
index_params.add_index(field_name="embedding", index_type="FLAT", metric_type="IP")
client.create_index(collection_name, index_params)

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

Вставка данных

В этом примере мы будем использовать модель SentenceTransformers miniLM для создания вкраплений текста сюжета. Эта модель возвращает 384-мерные вкрапления.

model = SentenceTransformer("all-MiniLM-L12-v2")

Мы перебираем строки данных, встраиваем поле краткого описания сюжета и вставляем сущности в векторную базу данных. Как правило, этот шаг следует выполнять над партиями элементов данных, чтобы максимизировать производительность CPU или GPU для модели встраивания, как мы и сделали здесь.

for batch in tqdm(ds.batch(batch_size=512)):
    embeddings = model.encode(batch["PlotSummary"])
    data = [
        {"title": title, "embedding": embedding, "year": year, "origin": origin}
        for title, embedding, year, origin in zip(
            batch["Title"], embeddings, batch["Release Year"], batch["Origin/Ethnicity"]
        )
    ]
    res = client.insert(collection_name=collection_name, data=data)

Вышеописанная операция занимает относительно много времени, поскольку встраивание требует времени. Этот шаг занимает около 2 минут на CPU на MacBook Pro 2023 и будет намного быстрее при использовании специализированных GPU. Сделайте перерыв и насладитесь чашечкой кофе!

Когда все данные введены в Milvus, мы можем приступить к выполнению поиска. В этом примере мы будем искать фильмы на основе краткого описания сюжета из Википедии. Поскольку мы выполняем пакетный поиск, время поиска распределяется между всеми фильмами. (Можете ли вы догадаться, какой фильм я хотел найти по тексту описания запроса?)

queries = [
    'A shark terrorizes an LA beach.',
    'An archaeologist searches for ancient artifacts while fighting Nazis.',
    'Teenagers in detention learn about themselves.',
    'A teenager fakes illness to get off school and have adventures with two friends.',
    'A young couple with a kid look after a hotel during winter and the husband goes insane.',
    'Four turtles fight bad guys.'
    ]

# Search the database based on input text
def embed_query(data):
    vectors = model.encode(data)
    return [x for x in vectors]


query_vectors = embed_query(queries)

res = client.search(
    collection_name=collection_name,
    data=query_vectors,
    filter='origin == "American" and year > 1945 and year < 2000',
    anns_field="embedding",
    limit=3,
    output_fields=["title"],
)

for idx, hits in enumerate(res):
    print("Query:", queries[idx])
    print("Results:")
    for hit in hits:
        print(hit["entity"].get("title"), "(", round(hit["distance"], 2), ")")
    print()

Результаты таковы:

Query: An archaeologist searches for ancient artifacts while fighting Nazis.
Results:
Love Slaves of the Amazons ( 0.4 )
A Time to Love and a Time to Die ( 0.39 )
The Fifth Element ( 0.39 )

Query: Teenagers in detention learn about themselves.
Results:
The Breakfast Club ( 0.54 )
Up the Academy ( 0.46 )
Fame ( 0.43 )

Query: A teenager fakes illness to get off school and have adventures with two friends.
Results:
Ferris Bueller's Day Off ( 0.48 )
Fever Lake ( 0.47 )
Losin' It ( 0.39 )

Query: A young couple with a kid look after a hotel during winter and the husband goes insane.
Results:
The Shining ( 0.48 )
The Four Seasons ( 0.42 )
Highball ( 0.41 )

Query: Four turtles fight bad guys.
Results:
Teenage Mutant Ninja Turtles II: The Secret of the Ooze ( 0.47 )
Devil May Hare ( 0.43 )
Attack of the Giant Leeches ( 0.42 )

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?