AI

Понимание векторных баз данных: Двигатель, стоящий за современным искусственным интеллектом

Узнайте, как работают векторные базы данных, какова их роль в искусственном интеллекте и как использовать их с реальными данными для семантического поиска и интеллектуальных приложений.
8 мин. чтения
Understanding Vector Databases blog image

Векторные базы данных позволяют хранить и индексировать высокоразмерные вкрапления данных, созданные моделями машинного обучения. Они являются краеугольным камнем современного ИИ, поддерживая хранение контекстной информации и осмысленный семантический поиск.

Хотя их часто ассоциируют с генерацией с расширенным поиском (RAG), их применение выходит далеко за эти рамки. В частности, они используются в семантическом поиске, рекомендательных системах, системах обнаружения аномалий и многих других приложениях.

Следуя этому руководству, вы поймете, что такое векторные базы данных, как они работают, как использовать их в полном примере и какое будущее их ожидает!

Что такое векторные базы данных?

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

В отличие от традиционных баз данных, векторные базы хранят высокоразмерные данные в виде плотных числовых векторов и индексируют их в N-мерном пространстве, что позволяет оптимизировать поиск на основе сходства.

Растущее значение векторных баз данных в AI/ML

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

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

Хотя наиболее распространенным сценарием применения этой технологии является генерация с расширением поиска (RAG), возможны и другие варианты использования:

  • Семантические поисковые системы
  • Рекомендательные системы
  • Обнаружение аномалий в данных временных рядов
  • Классификация и поиск изображений в компьютерном зрении
  • Приложения для обработки естественного языка (NLP)

Как работают векторные базы данных

Векторные базы данных управляют данными в виде векторных вкраплений, которые существуют в высокоразмерном пространстве. Каждое измерение представляет собой характеристику данных, соответствующую определенной характеристике исходных данных (представленных в виде вкраплений) в интерпретации ML-модели. Чем выше размерность вкрапления, тем детальнее представление, что позволяет лучше понять структуру данных.

От документов с исходными данными к векторной базе данных

Чтобы найти семантически схожие данные, векторные базы данных используют такие метрики сходства, как:

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

Подобно тому, как базы данных SQL и NoSQL используют индексы для ускорения запросов к данным, векторные базы данных могут использовать такие передовые методы индексирования, как:

  • Приближенный ближайший сосед (ANN): Ускоряет поиск сходства за счет аппроксимации ближайших векторов, снижая вычислительные затраты по сравнению с точным поиском.
  • Иерархический перемещаемый малый мир (HNSW): Представляет векторы в виде графовой структуры для более быстрой навигации в больших, высокоразмерных пространствах.

Кроме того, можно применить методы разбиения и кластеризации для организации векторных данных в более мелкие и управляемые группы. Эти методы повышают как эффективность хранения, так и производительность поиска.

Популярные варианты баз данных векторов

Теперь, когда вы понимаете, что такое векторные базы данных и как работает их инфраструктура данных AI, вы готовы изучить наиболее популярные варианты векторных баз данных. Мы проанализируем каждую из них по следующим аспектам:

  • Архитектура
  • Эксплуатационные характеристики
  • Возможности интеграции
  • Модель ценообразования
  • Лучшие примеры использования

Если вы хотите узнать, какие векторные базы данных выделяются на фоне других, взгляните на сводную таблицу ниже:

Имя базы данных Открытый исходный код/коммерческий Варианты хостинга Лучшее для Особые аспекты Интеграционная сложность
Pinecone Коммерческая Полностью управляемое бессерверное облако Семантический поиск, вопросы и ответы, чат-боты Параллельное чтение/запись, бесшовная интеграция OpenAI/Vercel, поддержка долговременной памяти Низкая – SDK для многих языков, интеграция “plug-and-play”.
Weaviate Открытый исходный код и коммерческие продукты Самостоятельное, бессерверное облако, управляемое корпоративное облако Поиск медиа/текста, классификация, распознавание лиц HNSW + плоская векторная индексация, инвертированные индексы, богатая интеграция экосистем Средний – широкая интеграционная поверхность, некоторая кривая обучения
Милвус Открытый исходный код и коммерческие продукты Самостоятельное размещение, Zilliz Cloud RAG, рекомендации, медиапоиск, обнаружение аномалий Разделение данных, потоковое вхождение, мультимодальное индексирование данных Средний – много SDK, работает с основными AI/LLM-фреймворками
Chroma Открытый исходный код и коммерческие продукты Самостоятельное размещение, Chroma Cloud Легкие приложения, поиск резюме, чат-боты с искусственным интеллектом Режим работы с памятью, REST API через Swagger, богатые возможности интеграции встраивания. Низкий уровень – SDK для Python и TypeScript, созданные для простоты использования
Qdrant Открытый исходный код и коммерческие продукты Самостоятельное размещение, управляемое облако, гибридное облако, частное облако RAG, расширенный поиск, аналитика, агенты искусственного интеллекта Модульное индексирование полезной нагрузки/векторов, HNSW, тонкие обновления Средний – широкая поддержка API/клиентов, масштабируемость и модульность

Пора покопаться в выбранных опциях векторной базы данных!

Pinecone

Pinecone
  • Архитектура: Полностью управляемая, бессерверная
  • Рабочие характеристики
    :Polylang placeholder не модифицировать
  • Возможности интеграции
    :Polylang placeholder do not modify
  • Модель ценообразования
    :Polylang placeholder do not modify
  • Лучшие варианты использования
    :Polylang placeholder do not modify

Weaviate

  • Архитектура: Модульная, облачно-нативная
  • Рабочие характеристики
    :Polylang placeholder не модифицировать
  • Возможности интеграции
    :Polylang placeholder do not modify
  • Модель ценообразования
    :Polylang placeholder do not modify
  • Лучшие варианты использования
    :Polylang placeholder do not modify

Милвус

Милвус
  • Архитектура: Архитектура с общим хранилищем и дезагрегацией систем хранения и вычислений для горизонтального масштабирования
  • Рабочие характеристики
    :Polylang placeholder не модифицировать
  • Возможности интеграции
    :Polylang placeholder do not modify
  • Модель ценообразования
    :Polylang placeholder do not modify
  • Лучшие варианты использования
    :Polylang placeholder do not modify

Chroma

Chroma
  • Архитектура: Одноузловой сервер для небольших приложений или распределенное облако для больших приложений
  • Рабочие характеристики
    :Polylang placeholder не модифицировать
  • Возможности интеграции
    :Polylang placeholder do not modify
  • Модель ценообразования
    :Polylang placeholder do not modify
  • Лучшие варианты использования
    :Polylang placeholder do not modify

Qdrant

Qdrant
  • Архитектура: Локальное самостоятельное размещение или распределенное облачное развертывание для крупных приложений и приложений с несколькими ресурсами.
  • Рабочие характеристики
    :Polylang placeholder не модифицировать
  • Возможности интеграции
    :Polylang placeholder do not modify
  • Модель ценообразования
    :Polylang placeholder do not modify
  • Лучшие варианты использования
    :Polylang placeholder do not modify

Векторные базы данных с яркими данными

Два ключевых аспекта, влияющих на качество векторных вкраплений, – это:

  1. Модель машинного обучения, используемая для генерации вкраплений.
  2. Качество исходных данных, используемых в этой модели.

Это подчеркивает, что мощность конвейера векторных баз данных зависит только от данных, на основе которых он работает. Если вкрапления создаются на основе низкокачественных, неполных или зашумленных данных, даже самые лучшие ML-модели и векторные базы данных дадут плохие результаты.

Теперь вы понимаете, почему сбор чистых, богатых и полных данных так важен – и вот тут-то на помощь приходит Bright Data!

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

Основное преимущество такого подхода к поиску данных заключается в том, что Bright Data берет на себя все заботы. Она управляет инфраструктурой, обрабатывает ротацию IP-адресов, обходит защиту от ботов, анализирует HTML-данные и обеспечивает полное соответствие требованиям.

Эти инструменты для веб-скреппинга помогают получить доступ к свежим структурированным данным непосредственно с веб-страниц. Учитывая, что веб-страницы являются крупнейшим источником данных, их использование идеально подходит для создания богатых контекстом векторных вкраплений. Эти вкрапления могут использоваться в широком спектре приложений искусственного интеллекта и поиска, таких как:

  • Информация о продукте для рекомендаций по электронной коммерции
  • Новостные статьи для семантического и контекстного поиска
  • Содержание социальных сетей для выявления и анализа тенденций
  • Бизнес-листинги с учетом местоположения

От сырых данных к векторным вкраплениям: Процесс преобразования

Процесс преобразования исходных данных в векторные вкрапления состоит из двух этапов:

  1. Предварительная обработка данных
  2. Генерация встраивания

Давайте разделим их, чтобы лучше понять, как работает каждый этап и что он за собой влечет.

Шаг 1. Предварительная обработка данных

Необработанные данные, как правило, зашумлены, избыточны или неструктурированы. Первым шагом в преобразовании исходных данных в вкрапления является их очистка и нормализация. Этот процесс повышает качество и согласованность исходных данных перед тем, как передать их в модель машинного обучения для генерации вкраплений.

Например, когда речь идет об использовании веб-данных в машинном обучении, обычно выполняются следующие шаги по предварительной обработке:

  • Разбор необработанного HTML для извлечения структурированного содержимого.
  • Обрезание пробелов и стандартизация форматов данных (например, цен, дат и символов валют).
  • Нормализация текста путем преобразования в строчные буквы, удаления знаков препинания и обработки специальных символов HTML.
  • Дублирование контента, чтобы избежать избыточной информации.

Шаг 2. Генерация вкраплений

После очистки и предварительной обработки данных их можно пропустить через модель встраивания ML. Это позволит преобразовать их в плотный числовой вектор.

Выбор модели встраивания зависит от типа входных данных и желаемого качества выходных данных. Ниже приведены некоторые популярные методы:

  • Модели встраивания OpenAI: Они генерируют высококачественные векторы общего назначения с отличным семантическим пониманием.
  • Sentence Transformers: Python-фреймворк с открытым исходным кодом для современных вкраплений предложений, текстов и изображений. Он работает локально и поддерживает множество предварительно обученных моделей.
  • Модели встраивания, ориентированные на конкретные области: Тонкая настройка на нишевых наборах данных, таких как финансовые отчеты, юридические документы или биомедицинские тексты, для достижения высокой производительности в конкретных сценариях.

Например, вот как можно использовать модели встраивания OpenAI для генерации встраивания

# requirement: pip install openai

from openai import OpenAI

client = OpenAI() # Reading the OpenAI key from the "OPENAI_API_KEY" env

# Sample input data (replace it with your input data)
input_data = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
"""

# Use an OpenAI embedding model for embedding generation
response = client.embeddings.create(
    model="text-embedding-3-large",
    input=input_data
)

# Get the embedding and print it
embedding = response.data[0].embedding
print(embedding)

На выходе мы получим 3072-мерный вектор:

[
  -0.005813355557620525,  
  # other 3070 elements..., 
  -0.006388738751411438
]

Аналогично, вот как можно создавать вкрапления с помощью трансформаторов предложений:

# requirement: pip install sentence_transformers

from sentence_transformers import SentenceTransformer

# Sample input data (replace it with your input data)
input_data = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
"""
# Load a pretrained Sentence Transformer model
model = SentenceTransformer("all-MiniLM-L6-v2")

# Embedding generation
embedding = model.encode(input_data)
# Print the resulting embedding
print(embedding)

На этот раз результатом будет более короткий 384-мерный вектор:

[
  -0.034803513, 
  # other 381 elements..., 
  -0.046595078
]

Обратите внимание, что существует компромисс между качеством встраивания и вычислительной эффективностью. Большие модели, такие как предлагаемые OpenAI, дают богатые, высокоточные вкрапления, но могут занимать некоторое время и даже требовать сетевых звонков к моделям ИИ премиум-класса. С другой стороны, локальные модели, такие как модели SentenceTransformers, бесплатны и работают гораздо быстрее, но при этом могут жертвовать семантическими нюансами.

Выбор правильной стратегии встраивания зависит от ваших требований к производительности и уровня семантической точности, которого вы хотите достичь.

Практическая интеграция: Пошаговое руководство

Следуйте приведенным ниже инструкциям и узнайте, как с помощью сценария Python перейти от необработанных данных на веб-странице к эффективному семантическому поиску.

В этом учебном разделе вы пройдете через весь процесс:

  1. Использование API Web Scraper от Bright Data для получения новостных статей с BBC.
  2. Предварительная обработка отсканированных данных и подготовка их к созданию вставки.
  3. Генерация текстовых вкраплений с помощью SentenceTransformers.
  4. Настройка Милвуса.
  5. Наполнение векторной базы данных обработанным текстом и вкраплениями.
  6. Выполнение поиска для получения семантически релевантных новостных статей на основе поискового запроса.

Давайте погрузимся!

Пререквизиты

Прежде чем приступить к работе, убедитесь, что у вас есть все необходимое:

  • Python 3+ установлен локально
  • Docker установлен локально
  • Учетная запись Bright Data

Если вы еще не сделали этого, установите Python и Docker на свою машину и создайте бесплатную учетную запись Bright Data.

Шаг 1: Сбор данных с помощью API веб-скребка Bright Data

Скраппинг новостных статей не всегда прост, поскольку многие новостные порталы защищают свои страницы от скраппинга и ботов. Чтобы надежно обойти эти меры защиты и получить свежие данные с BBC, мы будем использовать API Web Scraper от Bright Data.

Этот API предоставляет специальные конечные точки для сбора структурированных данных с более чем 120 популярных сайтов, включая BBC. Вот как происходит процесс сбора данных:

  1. Вы отправляете POST-запрос на соответствующую конечную точку, чтобы запустить задание по поиску указанных URL-адресов на заданном домене.
  2. Bright Data выполняет задачу скраппинга в облаке.
  3. Вы периодически опрашиваете другую конечную точку, пока не будут готовы собранные данные (в форматах JSON, CSV или других).

Прежде чем приступить к работе с кодом на Python, обязательно установите библиотеку Requests:

pip install requests

Далее обратитесь к документации Bright Data, чтобы ознакомиться с API Web Scraper. Кроме того, получите свой ключ API.

Теперь используйте приведенный ниже код для получения данных из новостей BBC:

import requests
import json
import time


def trigger_bbc_news_articles_scraping(api_key, urls):
    # Endpoint to trigger the Web Scraper API task
    url = "https://api.brightdata.com/datasets/v3/trigger"

    params = {
      "dataset_id": "gd_ly5lkfzd1h8c85feyh", # ID of the BBC web scraper
      "include_errors": "true",
    }

    # Convert the input data in the desired format to call the API
    data = [{"url": url} for url in urls]

    headers = {
      "Authorization": f"Bearer {api_key}",
      "Content-Type": "application/json",
    }

    response = requests.post(url, headers=headers, params=params, json=data)

    if response.status_code == 200:
        snapshot_id = response.json()["snapshot_id"]
        print(f"Request successful! Response: {snapshot_id}")
        return response.json()["snapshot_id"]
    else:
        print(f"Request failed! Error: {response.status_code}")
        print(response.text)

def poll_and_retrieve_snapshot(api_key, snapshot_id, output_file, polling_timeout=20):
    snapshot_url = f"https://api.brightdata.com/datasets/v3/snapshot/{snapshot_id}?format=json"
    headers = {
        "Authorization": f"Bearer {api_key}"
    }

    print(f"Polling snapshot for ID: {snapshot_id}...")

    while True:
        response = requests.get(snapshot_url, headers=headers)

        if response.status_code == 200:
            print("Snapshot is ready. Downloading...")
            snapshot_data = response.json()

            # Write the snapshot to an output json file
            with open(output_file, "w", encoding="utf-8") as file:
                json.dump(snapshot_data, file, indent=4)

            print(f"Snapshot saved to {output_file}")
            return
        elif response.status_code == 202:
            print(F"Snapshot is not ready yet. Retrying in {polling_timeout} seconds...")
            time.sleep(polling_timeout)
        else:
            print(f"Request failed! Error: {response.status_code}")
            print(response.text)
            break

if __name__ == "__main__":
    BRIGHT_DATA_API_KEY = "<YOUR_BRIGHT_DATA_API_KEY>" # Replace it with your Bright Data's Web Scraper API key
    # URLs of BBC articles to retrieve data from
    urls = [
        "https://www.bbc.com/sport/formula1/articles/c9dj0elnexyo",
        "https://www.bbc.com/sport/formula1/articles/cgenqvv9309o",
        "https://www.bbc.com/sport/formula1/articles/c78jng0q2dxo",
        "https://www.bbc.com/sport/formula1/articles/cdrgdm4ye53o",
        "https://www.bbc.com/sport/formula1/articles/czed4jk7eeeo",
        "https://www.bbc.com/sport/football/articles/c807p94r41do",
        "https://www.bbc.com/sport/football/articles/crgglxwge10o",
        "https://www.bbc.com/sport/tennis/articles/cy700xne614o",
        "https://www.bbc.com/sport/tennis/articles/c787dk9923ro",
        "https://www.bbc.com/sport/golf/articles/ce3vjjq4dqzo"
    ]
    snapshot_id = trigger_bbc_news_articles_scraping(BRIGHT_DATA_API_KEY, urls)
    poll_and_retrieve_snapshot(BRIGHT_DATA_API_KEY, snapshot_id, "news-data.json")

Обратите внимание, что все выбранные нами входные URL-адреса относятся к спортивным статьям BBC. Запустите приведенный выше скрипт и получите на выходе вот такой результат:

Request successful! Response: s_m9in0ojm4tu1v8h78
Polling snapshot for ID: s_m9in0ojm4tu1v8h78...
Snapshot is not ready yet. Retrying in 20 seconds...
# ...
Snapshot is not ready yet. Retrying in 20 seconds...
Snapshot is ready. Downloading...
Snapshot saved to news-data.json

Как вы видите, скрипт продолжает опрашивать, пока данные не будут готовы. По завершении процесса в папке проекта вы найдете файл news-data.json, содержащий данные о статьях в структурированном формате JSON.

Шаг 2: Очистка и подготовка полученных данных

Если вы откроете файл выходных данных, то увидите массив новостей, похожий на этот:

[
    {
        "input": {
            "url": "https://www.bbc.com/sport/football/articles/c807p94r41do",
            "keyword": ""
        },
        "id": "c807p94r41do",
        "url": "https://www.bbc.com/sport/football/articles/c807p94r41do",
        "author": "BBC",
        "headline": "Man City Women: What has gone wrong for WSL side this season?",
        "topics": [
            "Football",
            "Women's Football"
        ],
        "publication_date": "2025-04-13T19:35:45.288Z",
        "content": "With their Women's Champions League qualification ...",
        "videos": [],
        "images": [
            // ...
        ],
        "related_articles": [
            // ...
        ],
        "keyword": null,
        "timestamp": "2025-04-15T13:14:27.754Z"
    }
    // ...
]

Теперь, когда вы получили данные, следующим шагом будет импорт этого файла, очистка содержимого и подготовка его к генерации ML-встроек.

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

Вместо этого вам нужно сделать следующее:

  • Нормализуйте пробельные символы, новые строки и табуляции в текстовом содержимом.
  • Объедините заголовок статьи с основным содержанием, чтобы получилась единая чистая текстовая строка, пригодная для встраивания.

Чтобы упростить работу с данными, рекомендуется использовать Pandas. Вы можете установить его с помощью:

pip install pandas

Загрузите файл news-data.json из предыдущего шага и выполните логику обработки данных:

import pandas as pd
import json
import re


# Load your JSON array
with open("news-data.json", "r") as f:
    news_data = json.load(f)

# Normalize whitespaces/newlines/tabs for better embedding quality
def clean_text(text):
    text = re.sub(r"\s+", " ", text)
    return text.strip()

# Create a DataFrame
df = pd.DataFrame(news_data)

# Combine headline and cleaned content for embedding input
df["text_for_embedding"] = df["headline"].map(clean_text) + ". " + df["content"].map(clean_text)

# Ensure ID is a string
df["id"] = df["id"].astype(str)

Обратите внимание, что новое поле text_for_embedding содержит агрегированный и очищенный текстовый контент, готовый для создания вставки.

Шаг 3: Генерация вкраплений

Используйте SentenceTransformer для генерации вкраплений из поля text_for_embedding:

from sentence_transformers import SentenceTransformer

# Step 2 ...

# Initialize a model for embedding generation
model = SentenceTransformer("all-MiniLM-L6-v2")

# Generate embeddings
texts = df["text_for_embedding"].tolist()
embeddings = model.encode(texts, show_progress_bar=True, batch_size=16)

# Store the resulting emebeddings in the DataFrame
df["embedding"] = embeddings.tolist()

Поскольку для параметра show_progress_bar установлено значение True, предложения_трансформеры будут отображать в терминале индикатор выполнения во время генерации вставки. Это особенно полезно при обработке больших массивов данных, так как операция может занять некоторое время.

Сгенерированные векторные вкрапления непосредственно сохраняются в столбце вкраплений исходного DataFrame с шага 1.

Шаг 4: Выбор и настройка базы данных векторов

Milvus – отличный выбор для векторной базы данных в этом примере, потому что он бесплатный, с открытым исходным кодом и поддерживает семантический поиск в качестве одного из основных вариантов использования.

Чтобы установить Milvus на локальную машину, следуйте страницам официальной документации:

У вас должен быть экземпляр Milvus, запущенный локально на порту 19530.

Затем установите pymilvus -клиент Python Milvus:

pip install pymilvus

Примечание: Версия сервера Milvus должна совпадать с версией клиента Python. Несовместимые версии могут привести к ошибкам подключения. Вы можете найти поддерживаемые комбинации версий на странице релизов Milvus GitHub. На данный момент работает следующая комбинация:

  • Версия сервера Milvus: 2.5.9
  • Версияpymilvus: 2.5.6

Шаг 5: Загрузка вкраплений в базу данных векторов

С помощью pymilvus подключитесь к локальному серверу Milvus, создайте коллекцию news_articles, определите ее схему и индекс, а также заполните ее вкраплениями:

from pymilvus import connections, utility, CollectionSchema, FieldSchema, DataType, Collection

# Step 4...

# Connect to Milvus
connections.connect("default", host="localhost", port="19530")

# Drop the "news_articles" collection if it already exists
if utility.has_collection("news_articles"):
    utility.drop_collection("news_articles")

# Define the collection's schema
fields = [
    FieldSchema(name="id", dtype=DataType.VARCHAR, is_primary=True, max_length=64),
    FieldSchema(name="url", dtype=DataType.VARCHAR, max_length=65535),
    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=65535),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=384),
]
schema = CollectionSchema(fields, description="News article embeddings for semantic search")
collection = Collection(name="news_articles", schema=schema)

# Create an index on the embedding field
index_params = {
    "metric_type": "COSINE",
    "index_type": "HNSW",
}
collection.create_index(field_name="embedding", index_params=index_params)

# Load the collection for the first time
collection.load()

# Prepare data for insertion
ids = df["id"].tolist()
urls = df["url"].tolist()
texts = df["text_for_embedding"].tolist()
vectors = df["embedding"].tolist()

# Insert the data into the Milvus collection
collection.insert([ids, urls, texts, vectors])
collection.flush()

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

Шаг 6: Выполнение семантического поиска

Определите функцию для выполнения семантического поиска по коллекции news_articles:

# Step 5... 

def search_news(query: str, top_k=3, score_threshold=0.5):
    query_embedding = model.encode([query])
    search_params = {"metric_type": "COSINE"}

    results = collection.search(
        data=query_embedding,
        anns_field="embedding",
        param=search_params,
        limit=top_k,
        output_fields=["id", "url", "text"]
    )

    for hits in results:
        for hit in hits:
            if hit.score >= score_threshold:
                print(f"Score: {hit.score:.4f}")
                print(f"URL: {hit.fields["url"]}")
                print(f"Text: {hit.fields["text"][:300]}...\n")

Это поиск трех лучших результатов, которые семантически соответствуют заданному запросу, возвращая только те, у которых балл сходства выше 0,5. Поскольку мы используем косинусоидальное сходство, оценка варьируется от -1 (полностью противоположное) до 1 (идеальное совпадение).

Теперь вы можете выполнить семантический поиск по запросу “Будущее гоночной команды Red Bull в Формуле 1“:

search_news("Future of the Red Bull racing team in Formula 1")

Выходные данные будут такими:

Score: 0.5736
URL: https://www.bbc.com/sport/formula1/articles/c9dj0elnexyo
Text: Max Verstappen: Red Bull adviser Helmut Marko has 'great concern' about world champion's future with team. Saudi Arabian Grand PrixVenue: Jeddah Dates: 18-20 April Race start: 18:00 BST on SundayCoverage: Live radio commentary of practice, qualifying and race online and BBC 5 Sports Extra; live text...

Score: 0.5715
URL: https://www.bbc.com/sport/formula1/articles/czed4jk7eeeo
Text: F1 engines: A return to V10 or hybrid - what's the future?. Christian Horner's phone rang. It was Bernie Ecclestone. Red Bull's team principal picked up, switched to speakerphone and placed it on the table in front of the assembled Formula 1 bosses.We're in the F1 Commission, Horner told Ecclestone....

Если вы прочитаете найденные статьи, то увидите, что запрос не присутствует в тексте буквально. Тем не менее, найденные статьи явно посвящены будущему Red Bull в Формуле 1, чтопоказывает силу векторных вкраплений!

Оптимизация производительности базы данных Vector

Чтобы получить максимальную отдачу от векторной базы данных, начните с организации данных в значимые коллекции. Затем рассмотрите возможность реализации разделения и кластеризации данных, а также определения стратегий индексирования, оптимизированных для конкретных шаблонов запросов.

Не забывайте, что многие из этих оптимизаций будут наиболее эффективны, когда процесс работы с векторной базой данных станет зрелым. Это происходит, когда у вас есть четкое понимание того, какие данные запрашиваются чаще всего. Только тогда вы сможете оптимизировать производительность, основываясь на реальных моделях использования, а не на преждевременных предположениях.

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

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

И наконец, для оптимизации одноузловых баз данных рассмотрите возможность настройки таких параметров, как точность индексов, размерность векторов и количество черепков. По мере роста рабочей нагрузки горизонтальное масштабирование обычно предпочтительнее вертикального. Таким образом, вы можете получить несколько распределенных узлов – как правило, в облаке.

Будущие тенденции в области векторных баз данных

Современные системы искусственного интеллекта еще относительно новы, и их экосистема быстро развивается. Поскольку векторные базы данных служат движущей силой многих движений в области ИИ, сама технология постоянно адаптируется для поддержки все более сложных реальных приложений.

Заглядывая вперед, можно отметить интересные тенденции, определяющие будущее векторных баз данных:

  • Интеграция гибридного поиска: Сочетание векторного поиска с традиционными реляционными или NoSQL-системами для обеспечения более гибких запросов по структурированным и неструктурированным данным.
  • Встроенная мультимодальная поддержка: Позволяет унифицированно хранить и запрашивать вкрапления из различных источников, таких как текст, изображения, аудио и видео.
  • Более разумное индексирование и настройка: Использование таких функций, как автоматическая настройка параметров, экономичное хранение и интеграция с базами данных SQL, для повышения масштабируемости и готовности к работе на предприятии.

Заключение

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

Вы также увидели, как перейти от необработанных данных к вкраплениям, хранящимся в векторной базе данных, для использования в семантическом поиске. Это подчеркнуло важность того, чтобы начинать работу с полных, надежных и актуальных данных – именно здесь и пригодятся решения Bright Data для веб-скрепинга.

Начните бесплатную пробную версию Bright Data, чтобы получить высококачественные данные для работы ваших приложений с векторными базами данных!

Кредитная карта не требуется