Обзор встраивания
Встраивание - это концепция машинного обучения для отображения данных в высокоразмерном пространстве, где данные с похожей семантикой располагаются близко друг к другу. Обычно это глубокая нейронная сеть из семейства BERT или других трансформаторов, модель встраивания может эффективно представлять семантику текста, изображений и других типов данных с помощью ряда чисел, известных как векторы. Ключевой особенностью этих моделей является то, что математическое расстояние между векторами в высокоразмерном пространстве может указывать на сходство семантики исходного текста или изображения. Это свойство открывает множество возможностей для поиска информации, таких как веб-поисковые системы Google и Bing, поиск товаров и рекомендаций на сайтах электронной коммерции, а также недавно популярная парадигма Retrieval Augmented Generation (RAG) в генеративном ИИ.
Существует две основные категории вкраплений, каждая из которых дает свой тип вектора:
Плотное встраивание: Большинство моделей встраивания представляют информацию в виде вектора с плавающей точкой, имеющего от сотен до тысяч измерений. Выходные данные называются "плотными" векторами, поскольку большинство измерений имеют ненулевые значения. Например, популярная модель встраивания с открытым исходным кодом BAAI/bge-base-en-v1.5 выводит векторы из 768 чисел с плавающей точкой (768-dimension float vector).
Разреженное встраивание: В отличие от этого, выходные векторы разреженных вкраплений имеют большинство размерностей, равных нулю, а именно "разреженные" векторы. Эти векторы часто имеют гораздо большую размерность (десятки тысяч и более), которая определяется размером словаря лексем. Разреженные векторы могут быть сгенерированы глубокими нейронными сетями или статистическим анализом текстовых корпораций. Благодаря своей интерпретируемости и лучшим возможностям обобщения за пределы области, разреженные вкрапления все чаще используются разработчиками в качестве дополнения к плотным вкраплениям.
Milvus - это векторная база данных, предназначенная для управления, хранения и поиска векторных данных. Благодаря интеграции основных моделей встраивания и ранжирования вы можете легко преобразовать исходный текст в векторы, пригодные для поиска, или ранжировать результаты с помощью мощных моделей для получения более точных результатов RAG. Эта интеграция упрощает преобразование текста и устраняет необходимость в дополнительных компонентах встраивания или ранжирования, тем самым упрощая разработку и проверку RAG.
Чтобы увидеть, как создаются вкрапления в действии, обратитесь к разделу Использование модели PyMilvus для генерации вкраплений текста.
Функция встраивания | Тип | API или открытый источник |
---|---|---|
openai | Плотный | API |
преобразователь предложений | Плотный | Открытый источник |
Splade | Sparse | Открытый источник |
bge-m3 | Гибрид | Открытый ресурс |
voyageai | Плотный | API |
jina | Плотный | API |
cohere | Плотный | API |
Инструктор | Dense | Открытый ресурс |
Мистраль ИИ | Dense | API |
Nomic | Плотный | API |
mGTE | Гибрид | Открытый ресурс |
Пример 1: Использование функции встраивания по умолчанию для генерации плотных векторов
Чтобы использовать функции встраивания в Milvus, сначала установите клиентскую библиотеку PyMilvus с подпакетом model
, который содержит все утилиты для генерации встраивания.
pip install "pymilvus[model]"
Подпакет model
поддерживает различные модели встраивания, от OpenAI, Sentence Transformers, BGE M3 до предварительно обученных моделей SPLADE. Для простоты в данном примере используется DefaultEmbeddingFunction
, который представляет собой модель трансформатора предложений All-MiniLM-L6-v2. Модель занимает около 70 МБ и будет загружена при первом использовании:
from pymilvus import model
# This will download "all-MiniLM-L6-v2", a light weight model.
ef = model.DefaultEmbeddingFunction()
# Data from which embeddings are to be generated
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
embeddings = ef.encode_documents(docs)
# Print embeddings
print("Embeddings:", embeddings)
# Print dimension and shape of embeddings
print("Dim:", ef.dim, embeddings[0].shape)
Ожидаемый результат похож на следующий:
Embeddings: [array([-3.09392996e-02, -1.80662833e-02, 1.34775648e-02, 2.77156215e-02,
-4.86349640e-03, -3.12581174e-02, -3.55921760e-02, 5.76934684e-03,
2.80773244e-03, 1.35783911e-01, 3.59678417e-02, 6.17732145e-02,
...
-4.61330153e-02, -4.85207550e-02, 3.13997865e-02, 7.82178566e-02,
-4.75336798e-02, 5.21207601e-02, 9.04406682e-02, -5.36676683e-02],
dtype=float32)]
Dim: 384 (384,)
Пример 2: Генерация плотных и разреженных векторов за один вызов с помощью модели BGE M3
В этом примере мы используем гибридную модель BGE M3 для встраивания текста в плотные и разреженные векторы и использования их для извлечения релевантных документов. Общие действия выглядят следующим образом:
Встраивание текста в плотные и разреженные векторы с помощью модели BGE-M3;
Создание коллекции Milvus для хранения плотных и разреженных векторов;
Вставка данных в Milvus;
Поиск и проверка результатов.
Сначала нам нужно установить необходимые зависимости.
from pymilvus.model.hybrid import BGEM3EmbeddingFunction
from pymilvus import (
utility,
FieldSchema, CollectionSchema, DataType,
Collection, AnnSearchRequest, RRFRanker, connections,
)
Используйте BGE M3 для кодирования документов и запросов для поиска по вставке.
# 1. prepare a small corpus to search
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
query = "Who started AI research?"
# BGE-M3 model can embed texts as dense and sparse vectors.
# It is included in the optional `model` module in pymilvus, to install it,
# simply run "pip install pymilvus[model]".
bge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
docs_embeddings = bge_m3_ef(docs)
query_embeddings = bge_m3_ef([query])