ATLAS CEO
🏗️Стройка 3 февраля 2026 г.

Supabase + pgvector: семантический поиск без боли

Станислав Виниченко · 5 мин чтения
Поделиться
Supabase pgvector — семантический поиск для AI-приложений

Когда LIKE-поиск перестаёт работать

Обычный поиск ищет по словам. Пользователь вводит «автоматизация маркетинга» — и если в статье нет именно этих слов, результатов ноль. При этом у вас может лежать идеальная статья «Content Factory заменяет отдел из 20 человек», которая отвечает на этот запрос на 100%.

Семантический поиск понимает смысл. Он работает с embedding-векторами — математическими представлениями текста в многомерном пространстве. Похожие по смыслу тексты оказываются рядом, даже если не содержат одинаковых слов.

Мы внедрили семантический поиск в Atlas OS через Supabase pgvector. Вот подробный разбор — архитектура, код, грабли и результаты.

15-30ms
время поиска
📈
+40%
релевантность vs LIKE
💰
$0
сверх Supabase подписки
🧮
~$2/мес
стоимость embeddings
Supabase pgvector визуализация
Генерация: FAL.ai FLUX Schnell — векторное пространство embeddings

Почему Supabase + pgvector, а не Pinecone

Мы долго выбирали между тремя вариантами. Вот честное сравнение на февраль 2026.

Отдельные vector DB

Pinecone $70+/мес, managed, быстрый, vendor lock
ChromaDB Бесплатно, open-source, не production-ready
Weaviate $25+/мес, хороший, отдельный сервис
Qdrant Open-source, Rust, нужен отдельный хостинг
Итого Ещё один сервис в стеке = ещё один point of failure

Supabase pgvector

Стоимость $0 сверх Supabase (включено)
Архитектура В одной БД с основными данными
Производительность 15-30ms для 100K векторов
Масштабирование До 1M+ с HNSW-индексом
Итого Один сервис = один источник правды
Если вы уже на Supabase — pgvector. Если нет и нужен managed — Pinecone. Для прототипа — ChromaDB.
🔑

Главный аргумент

Мы уже используем Supabase для всех данных Atlas OS. Добавить pgvector = одна SQL-команда. Без нового сервиса, без нового API, без нового billing. JOIN между embeddings и бизнес-данными — бесплатно и мгновенно.

#1
🗄️

Настройка pgvector

SQL, который делает магию

Vector embeddings кластеры
Генерация: FAL.ai FLUX Schnell — кластеры embedding-векторов в пространстве

Три шага. Пять минут. Готово.

-- Шаг 1: Включаем extension
create extension if not exists vector;

-- Шаг 2: Таблица для embeddings
create table content_embeddings (
  id uuid primary key default gen_random_uuid(),
  content_id text not null,
  content_type text not null, -- 'article', 'product', 'persona'
  embedding vector(1536),     -- OpenAI text-embedding-3-small
  metadata jsonb,
  created_at timestamptz default now()
);

-- Шаг 3: Индекс для быстрого поиска
-- IVFFlat — для коллекций до 500K записей
create index on content_embeddings
  using ivfflat (embedding vector_cosine_ops)
  with (lists = 100);

-- Для 500K+ записей используйте HNSW:
-- create index on content_embeddings
--   using hnsw (embedding vector_cosine_ops)
--   with (m = 16, ef_construction = 64);
⚠️

IVFFlat vs HNSW

IVFFlat быстрее строится, но HNSW даёт лучший recall при больших объёмах. Правило: до 500K записей — IVFFlat. Больше — HNSW. Для Atlas OS с 50K записей IVFFlat более чем достаточно.

#2
🧠

Генерация embeddings

Выбор модели в 2026 году

Ландшафт embedding-моделей на февраль 2026:

💲
$0.02
OpenAI small / 1M tokens
💲
$0.13
OpenAI large / 1M tokens
📐
1536
размерность small
📐
3072
размерность large

Мы используем text-embedding-3-small — оптимальное соотношение цена/качество. Для 90% бизнес-задач разница с large незаметна, а стоимость в 6.5 раз ниже.

Альтернативы:

  • Voyage AI 3 — специализированные embeddings для RAG, чуть лучше quality
  • Cohere Embed v3 — мультиязычный, хорош для русского текста
  • BGE-M3 (BAAI) — open-source, бесплатный, self-hosted
import OpenAI from 'openai';
import { createClient } from '@supabase/supabase-js';

const openai = new OpenAI();
const supabase = createClient(
  process.env.SUPABASE_URL!,
  process.env.SUPABASE_SERVICE_KEY!
);

async function embedAndStore(
  contentId: string,
  contentType: string,
  text: string,
  metadata?: Record<string, unknown>
) {
  const { data } = await openai.embeddings.create({
    model: 'text-embedding-3-small',
    input: text,
  });

  await supabase.from('content_embeddings').upsert({
    content_id: contentId,
    content_type: contentType,
    embedding: data[0].embedding,
    metadata,
  });
}
PostgreSQL + Neural Network
Генерация: FAL.ai FLUX Schnell — PostgreSQL как движок для AI-поиска

📬 Стек Atlas OS — в подробностях. Подписывайтесь.

Подписаться в TG →
#3
🔍

Функция поиска

PostgreSQL RPC для семантического поиска

PostgreSQL-функция, вызываемая через Supabase RPC:

create or replace function search_content(
  query_embedding vector(1536),
  match_count int default 10,
  match_threshold float default 0.7,
  filter_type text default null
)
returns table (
  content_id text,
  content_type text,
  similarity float,
  metadata jsonb
)
language plpgsql as $$
begin
  return query
  select
    ce.content_id,
    ce.content_type,
    1 - (ce.embedding <=> query_embedding) as similarity,
    ce.metadata
  from content_embeddings ce
  where
    (filter_type is null or ce.content_type = filter_type)
    and 1 - (ce.embedding <=> query_embedding) > match_threshold
  order by ce.embedding <=> query_embedding
  limit match_count;
end;
$$;
💡

Threshold 0.7 — магическое число

Cosine similarity 0.7+ для text-embedding-3-small даёт хороший баланс между релевантностью и полнотой. Ниже 0.6 — слишком много шума. Выше 0.8 — пропускаете релевантные результаты.

#4
📊

Результаты в production

Реальные метрики Atlas OS

Семантический поиск работает 3 месяца. Результаты:

LIKE / Full-Text Search (было)

Время отклика 200-500ms
Релевантность 55-60%
Пустые результаты 25% запросов
Стоимость $0
Итого Медленно, часто мимо, четверть запросов — пусто

pgvector семантический (стало)

Время отклика 15-30ms
Релевантность 85-90%
Пустые результаты 3% запросов
Стоимость ~$2/мес embeddings
Итого В 10x быстрее, в 1.5x релевантнее
pgvector превосходит FTS по всем метрикам. Trade-off: поддержка embedding pipeline.

Грабли, на которые мы наступили

✂️

Чанкинг текста

Статья на 5000 слов целиком → embedding теряет специфику. Оптимально: 500-800 токенов с overlap 100 токенов.

🔄

Обновление embeddings

Изменили статью — забыли обновить embedding. Решение: триггер в Supabase на UPDATE.

📏

IVFFlat на малых данных

При менее 10K записей IVFFlat хуже brute-force. Не создавайте индекс до 10K записей.

🧮

Миграция embedding-модели

С ada-002 на text-embedding-3-small — пересоздание всех embeddings. Выбирайте актуальную модель сразу.

"

Семантический поиск — не роскошь и не фича для enterprise. Это базовая функция для любого AI-продукта в 2026 году. Если ваш поиск не понимает смысл — вы теряете пользователей каждый день.

Стас, Atlas CEO

📬 Хотите получать такие разборы каждый день?

Подписаться в TG →
#Supabase #pgvector #embeddings #поиск #AI-инфраструктура #PostgreSQL
Поделиться
Станислав Виниченко

Станислав Виниченко

Основатель Atlas CEO

"Будущее строится сейчас."

📬

Рассылка Atlas CEO

Фронтовые сводки Сингулярности. Каждый день в 9:00. Бесплатно.

Подписаться в Telegram

Atlas Graph

Что открыть дальше

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

Похожие статьи

Весь журнал →