Начнём с простого: зачем вообще нужна ещё одна база данных?
Есть обычные базы данных - 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: Пользователь спрашивает
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-приложений" - и снова по смыслу!
Векторный поиск vs обычный текстовый поиск
Чтобы было совсем понятно, сравним:
| Критерий | Текстовый поиск (LIKE/FULLTEXT) | Векторный поиск |
|---|---|---|
| Запрос "безопасность сайта" | Ищет точные слова "безопасность" и "сайта" | Понимает СМЫСЛ и найдёт статью про SQL-инъекции |
| Опечатки | Не найдёт "безопастность" | Найдёт (смысл-то тот же) |
| Синонимы | "защита" не найдёт "безопасность" | Найдёт - это похожие по смыслу слова |
| Скорость | Очень быстрый | Чуть медленнее (но всё равно быстро) |
| Настройка | Просто | Нужна нейросеть для создания векторов |
Подводные камни (куда без них)
Всё звучит красиво, но есть нюансы:
- Стоимость эмбеддингов - создание векторов через OpenAI стоит денег (хоть и копейки - около $0.02 за миллион токенов). Для большой базы это может набежать
- Размер хранилища - один вектор из 1536 чисел занимает ~6 КБ. Миллион записей - это ~6 ГБ только под векторы
- Качество зависит от модели - если модель для создания эмбеддингов плохая, то и поиск будет так себе
- Не замена обычной базе - векторная база дополняет обычную, а не заменяет. Для точных запросов ("найди заказ #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.
Если после прочтения этой статьи вам захотелось внедрить векторный поиск в свой проект - вы знаете, к кому обратиться. Мы любим такие задачки.