Векторные базы данных: объяснение на пальцах.

Что такое векторные базы данных, зачем они нужны и как работают - объясняем простым языком без единой формулы. Если вы хоть раз гуглили "как работает поиск по смыслу" - эта статья для вас.

Начнём с простого: зачем вообще нужна ещё одна база данных?

Есть обычные базы данных - MySQL, PostgreSQL и другие. Они хранят таблички с данными: имена, числа, даты. Ищешь что-то - задаёшь точный запрос: "найди всех пользователей с именем Иван". Просто и понятно.

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

  • "Найди фотографии, похожие на эту"
  • "Найди статьи по теме, которую я описал своими словами"
  • "Найди товары, похожие на то, что купил клиент"

Обычная база данных тут разведёт руками. А векторная - легко справится. И сейчас мы разберём, как именно.

Что такое вектор (без математики, обещаем)

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

Представьте, что вы описываете кошку числами:

// Описываем кошку числами (это и есть "вектор")
// Каждое число - это какая-то характеристика

кошка = [
  0.9,   // пушистость (от 0 до 1)
  0.2,   // размер (0 - маленький, 1 - огромный)
  0.8,   // милота (субъективно, но пусть)
  0.1,   // опасность
  0.95,  // домашность
]

// А теперь опишем тигра теми же характеристиками
тигр = [
  0.7,   // тоже пушистый
  0.9,   // но сильно больше
  0.3,   // мило, но страшновато
  0.95,  // очень опасный
  0.05,  // совсем не домашний
]

// И собаку
собака = [
  0.6,   // средняя пушистость
  0.5,   // средний размер
  0.85,  // очень мило
  0.15,  // немного опасна (может облизать до смерти)
  0.9,   // домашняя
]

Видите? Кошка и собака по числам ближе друг к другу, чем кошка и тигр. Хотя кошка и тигр - оба кошачьи! Но по "характеру" (домашность, опасность) - кошка ближе к собаке.

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

Как создаются настоящие векторы

Окей, кошек и собак мы описали вручную. Но как описать числами текст? Или картинку? Тут на помощь приходят нейросети.

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

// Берём текст и превращаем его в вектор с помощью AI
// Это называется "эмбеддинг" (embedding)

const text = "Как приготовить борщ"

// Отправляем в нейросеть, получаем вектор
const vector = await openai.embeddings.create({
  model: "text-embedding-3-small",  // модель для создания векторов
  input: text                        // наш текст
})

// Результат - массив из 1536 чисел!
// vector.data[0].embedding = [0.023, -0.041, 0.067, 0.012, ... ещё 1532 числа]

// Для человека эти числа - бессмыслица
// Но для компьютера они ОПИСЫВАЮТ СМЫСЛ текста

Магия в том, что похожие по смыслу тексты будут иметь похожие векторы:

// Эти тексты будут иметь ПОХОЖИЕ векторы (близкие числа):
"Как приготовить борщ"
"Рецепт украинского борща"
"Как сварить свекольный суп"

// А этот текст будет иметь ДАЛЁКИЙ вектор:
"Как починить велосипед"

// Потому что ремонт велосипеда - это совсем другая тема

Как работает поиск по смыслу

Теперь собираем всё вместе. Векторная база данных работает в три шага:

  1. Загрузка - берём все наши данные (тексты, описания товаров, статьи), превращаем каждый в вектор через нейросеть и сохраняем в базу
  2. Запрос - пользователь пишет вопрос, мы тоже превращаем его в вектор
  3. Поиск - база находит векторы, которые ближе всего к вектору запроса
// Шаг 1: Заранее загрузили в базу наши статьи
// (каждая статья превращена в вектор и сохранена)

// Шаг 2: Пользователь спрашивает
const userQuestion = "как защитить сайт от хакеров"

// Превращаем вопрос в вектор
const questionVector = await getEmbedding(userQuestion)

// Шаг 3: Ищем в базе ближайшие векторы
const results = await vectorDB.search({
  vector: questionVector,  // вектор нашего вопроса
  limit: 5                 // хотим 5 самых похожих результатов
})

// Результат:
// 1. "Защита от SQL-инъекций в Node.js"     - похожесть: 0.92
// 2. "Безопасность веб-приложений"           - похожесть: 0.87
// 3. "Настройка HTTPS и SSL"                 - похожесть: 0.81
// 4. "Аутентификация и авторизация"          - похожесть: 0.74
// 5. "Как приготовить борщ"                  - похожесть: 0.12 (не то!)

Заметьте: пользователь написал "как защитить сайт от хакеров", а база нашла статью "Защита от SQL-инъекций" - хотя слова совсем разные! Потому что смысл похожий. Обычный текстовый поиск такое не умеет.

Их несколько, и каждая со своим характером:

Pinecone - "Облачный простачок"

Работает полностью в облаке. Не нужно ничего устанавливать - зарегистрировался, получил ключ, работаешь. Идеально для начала.

// Pinecone - самый простой старт
// npm install @pinecone-database/pinecone

import { Pinecone } from "@pinecone-database/pinecone"

// Подключаемся (нужен только API-ключ)
const pc = new Pinecone({ apiKey: "ваш-ключ" })

// Выбираем "коллекцию" (индекс) для хранения
const index = pc.index("my-articles")

// Сохраняем вектор
await index.upsert([{
  id: "article-1",                    // уникальный ID
  values: [0.023, -0.041, ...],       // вектор (1536 чисел)
  metadata: {                         // дополнительные данные
    title: "Защита от SQL-инъекций",
    url: "/articles/sql-injection"
  }
}])

// Ищем похожие
const results = await index.query({
  vector: questionVector,  // вектор запроса
  topK: 5,                 // сколько результатов
  includeMetadata: true    // включить title, url и т.д.
})

ChromaDB - "Локальный друг"

Работает прямо на вашем компьютере. Бесплатный, открытый код. Отлично подходит для экспериментов и небольших проектов.

// ChromaDB - запускается локально
// pip install chromadb (это Python)

import chromadb

# Создаём клиент (данные хранятся на диске)
client = chromadb.PersistentClient(path="./my_data")

# Создаём коллекцию
collection = client.create_collection("articles")

# Добавляем документы - ChromaDB сам создаст векторы!
collection.add(
    documents=[
        "Защита от SQL-инъекций в Node.js",
        "Как оптимизировать React-приложение",
        "Docker для начинающих"
    ],
    ids=["doc1", "doc2", "doc3"]  # уникальные ID
)

# Ищем по смыслу
results = collection.query(
    query_texts=["безопасность сайта"],  # просто текст!
    n_results=2  # хотим 2 результата
)
# Найдёт: "Защита от SQL-инъекций" (ближе всего по смыслу)

pgvector - "Расширение для PostgreSQL"

Если у вас уже есть PostgreSQL (а он есть почти у всех) - можно просто добавить расширение и хранить векторы прямо рядом с обычными данными. Удобно!

-- pgvector - векторный поиск прямо в PostgreSQL
-- Устанавливаем расширение
CREATE EXTENSION vector;

-- Создаём таблицу с колонкой для векторов
CREATE TABLE articles (
  id SERIAL PRIMARY KEY,
  title TEXT,
  content TEXT,
  -- vector(1536) - колонка для хранения вектора из 1536 чисел
  embedding vector(1536)
);

-- Ищем 5 ближайших статей к нашему вектору
-- <=> это оператор "расстояние между векторами"
SELECT title, content
FROM articles
ORDER BY embedding <=> $1  -- $1 - вектор нашего запроса
LIMIT 5;

Где это используется в реальной жизни

Векторные базы данных - это не просто модная игрушка. Вот реальные примеры:

  • ChatGPT и другие AI-чаты - когда вы спрашиваете что-то, система ищет релевантную информацию через векторный поиск
  • Рекомендации Netflix/Spotify - "вам может понравиться" работает на похожести векторов
  • Поиск по фото - загружаете фото, находите похожие (Google Images так и работает)
  • Служба поддержки - клиент пишет вопрос, система находит похожие решённые тикеты
  • Онлайн-магазины - "похожие товары" и "с этим товаром покупают"
Кстати, мы в ENOT.SOFTWARE активно используем векторные базы данных в проектах наших клиентов. Один из кейсов - умный поиск по базе знаний компании, который понимает вопросы на человеческом языке. Если вам нужно что-то подобное - напишите нам, расскажем подробнее.

Делаем свой поиск по смыслу за 20 минут

Давайте соберём простой пример - поиск по статьям с использованием OpenAI и ChromaDB. Это реально работает, можете попробовать:

// Полный рабочий пример: умный поиск по статьям
// Нужно: npm install openai chromadb

import OpenAI from "openai"
import { ChromaClient } from "chromadb"

// 1. Подключаемся к сервисам
const openai = new OpenAI({ apiKey: "ваш-ключ-openai" })
const chroma = new ChromaClient()

// 2. Функция для создания вектора из текста
async function getEmbedding(text) {
  // Отправляем текст в OpenAI, получаем вектор
  const response = await openai.embeddings.create({
    model: "text-embedding-3-small",
    input: text
  })
  return response.data[0].embedding  // массив из 1536 чисел
}

// 3. Загружаем наши статьи в базу
async function loadArticles() {
  const collection = await chroma.createCollection({ name: "articles" })

  // Наши статьи
  const articles = [
    { id: "1", text: "Как защитить сайт от SQL-инъекций" },
    { id: "2", text: "Оптимизация React-приложений" },
    { id: "3", text: "Docker: контейнеры для начинающих" },
    { id: "4", text: "TypeScript: типы и интерфейсы" },
  ]

  // Для каждой статьи создаём вектор и сохраняем
  for (const article of articles) {
    const vector = await getEmbedding(article.text)
    await collection.add({
      ids: [article.id],
      embeddings: [vector],
      documents: [article.text]
    })
  }

  console.log("Загружено статей:", articles.length)
}

// 4. Ищем по смыслу
async function search(question) {
  const collection = await chroma.getCollection({ name: "articles" })

  // Превращаем вопрос в вектор
  const questionVector = await getEmbedding(question)

  // Ищем ближайшие
  const results = await collection.query({
    queryEmbeddings: [questionVector],
    nResults: 2  // хотим 2 лучших результата
  })

  console.log("Вопрос:", question)
  console.log("Найдено:", results.documents[0])
}

// 5. Запускаем!
await loadArticles()
await search("безопасность веб-приложений")
// Найдёт: "Как защитить сайт от SQL-инъекций" - потому что смысл совпадает!

await search("как ускорить фронтенд")
// Найдёт: "Оптимизация React-приложений" - и снова по смыслу!

Чтобы было совсем понятно, сравним:

КритерийТекстовый поиск (LIKE/FULLTEXT)Векторный поиск
Запрос "безопасность сайта"Ищет точные слова "безопасность" и "сайта"Понимает СМЫСЛ и найдёт статью про SQL-инъекции
ОпечаткиНе найдёт "безопастность"Найдёт (смысл-то тот же)
Синонимы"защита" не найдёт "безопасность"Найдёт - это похожие по смыслу слова
СкоростьОчень быстрыйЧуть медленнее (но всё равно быстро)
НастройкаПростоНужна нейросеть для создания векторов

Подводные камни (куда без них)

Всё звучит красиво, но есть нюансы:

  1. Стоимость эмбеддингов - создание векторов через OpenAI стоит денег (хоть и копейки - около $0.02 за миллион токенов). Для большой базы это может набежать
  2. Размер хранилища - один вектор из 1536 чисел занимает ~6 КБ. Миллион записей - это ~6 ГБ только под векторы
  3. Качество зависит от модели - если модель для создания эмбеддингов плохая, то и поиск будет так себе
  4. Не замена обычной базе - векторная база дополняет обычную, а не заменяет. Для точных запросов ("найди заказ #12345") обычная база лучше

Бонус: что такое RAG (и зачем вам это знать)

RAG (Retrieval-Augmented Generation) - это когда AI-чатбот сначала ищет релевантную информацию в векторной базе, а потом генерирует ответ на основе найденного. Это как если бы ChatGPT сначала прочитал вашу документацию, а потом ответил на вопрос клиента.

// Упрощённая схема RAG:

// 1. Клиент спрашивает: "Как вернуть товар?"
const question = "Как вернуть товар?"

// 2. Ищем в векторной базе релевантные документы
const relevantDocs = await vectorDB.search(question)
// Нашли: "Политика возврата: товар можно вернуть в течение 14 дней..."

// 3. Отправляем в ChatGPT вопрос + найденные документы
const answer = await openai.chat.completions.create({
  model: "gpt-4",
  messages: [
    {
      role: "system",
      // Говорим AI: "отвечай только на основе этих документов"
      content: `Ты - помощник компании. Отвечай ТОЛЬКО на основе этих данных:
        ${relevantDocs.join("\n")}`
    },
    { role: "user", content: question }
  ]
})

// 4. AI отвечает точно и по делу, используя ВАШУ информацию
// "Вы можете вернуть товар в течение 14 дней с момента покупки..."

RAG - это, пожалуй, самое популярное применение векторных баз данных прямо сейчас. Практически каждый "умный чат-бот" работает по этой схеме.

Мы в ENOT.SOFTWARE уже внедрили RAG-системы в несколько реальных проектов - от чат-ботов техподдержки до внутренних ассистентов для компаний. Если хотите узнать, как это работает в деле - читайте нашу статью "Как мы внедрили RAG в реальный продукт", или просто свяжитесь с нами.

Итого

Давайте подведём итоги простым языком:

  • Вектор - это набор чисел, который описывает смысл текста (или картинки, или чего угодно)
  • Векторная база данных - это хранилище, которое умеет быстро находить похожие векторы
  • Поиск по смыслу - главная суперспособность. Находит похожее, даже если слова разные
  • Нейросеть создаёт векторы - мы не придумываем числа руками, это делает AI
  • RAG - самое популярное применение: AI-бот, который отвечает на основе ваших данных

Векторные базы данных - это не волшебство и не rocket science. Это просто умный способ искать похожие вещи. И сейчас это одна из самых востребованных технологий в мире AI.

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

Все статьи
Векторные базы данных: объяснение на пальцах | Enot Software