Реалізація AI-пошуку по контенту сайту (Semantic Search)

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Реалізація AI-пошуку по контенту сайту (Semantic Search)
Складний
~1-2 тижні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    956
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    947

Звичайний пошук по сайту видає статті лише якщо в них зустрічаються точні слова запиту. Користувач шукає «як оплатити» — не знаходить статтю «способи розрахунку». Семантичний пошук вирішує цю проблему: він розуміє сенс, а не рядки. Ми впроваджуємо такі системи для інтернет-магазинів, документації та порталів. Наш досвід — 5+ років у AI-пошуку та понад 10 успішних проєктів. Команда сертифікованих інженерів PostgreSQL. Зв'яжіться з нами, щоб обговорити ваш сценарій.

Чому семантичний пошук кращий за повнотекстовий? — реалізація AI пошуку

Повнотекстовий пошук (PostgreSQL tsvector, Elasticsearch) шукає за збігом слів. Семантичний — за змістом. Він перетворює текст у векторні ембеддинги — числові масиви з 768–3072 чисел, що кодують семантичну близькість. Тексти з близькими векторами семантично схожі. Це дає приріст точності релевантних результатів у 2–3 рази, тобто семантичний пошук кращий за повнотекстовий у 2-3 рази за точністю, особливо для довгих та розмовних запитів.

Як ми це робимо: стек і кейс

Для інтернет-магазину з 50 000 товарів ми впровадили гібридний пошук на базі OpenAI embeddings та pgvector. Результат: середній час відповіді 0,3 секунди, точність 92%. Вартість базового рішення від $5000.

Вибір моделі. Використовуємо text-embedding-3-small (1536 вимірів) — оптимальний баланс швидкості та якості. Для української та російської мов він дає чудові результати.

Векторна база даних. PostgreSQL з розширенням pgvector та HNSW-індексом:

CREATE EXTENSION vector;

CREATE TABLE content_chunks (
  id BIGSERIAL PRIMARY KEY,
  content_id BIGINT REFERENCES content(id),
  chunk_text TEXT NOT NULL,
  chunk_index INT,
  embedding vector(1536),
  metadata JSONB
);

CREATE INDEX ON content_chunks USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);

Індексація контенту. Розбиваємо текст на чанки по 400 токенів з перекриттям 50 слів, отримуємо ембеддинги через OpenAI API та зберігаємо в таблицю:

import OpenAI from 'openai';
const openai = new OpenAI();

async function indexContent(contentItem) {
  const chunks = chunkText(contentItem.body, { maxTokens: 400, overlap: 50 });
  const { data: embeddings } = await openai.embeddings.create({
    model: 'text-embedding-3-small',
    input: chunks,
  });
  // Зберігаємо в pgvector батчами по 100
  for (let i = 0; i < chunks.length; i += 100) {
    const batchChunks = chunks.slice(i, i + 100);
    const batchEmbeds = embeddings.slice(i, i + 100);
    await db.query(`
      INSERT INTO content_chunks (content_id, chunk_text, chunk_index, embedding, metadata)
      VALUES ($1, $2, $3, $4::vector, $5)
    `, [contentItem.id, batchChunks, /* ... */]);
  }
}

Пошук за змістом. Комбінуємо векторний та повнотекстовий пошук через RRF (Reciprocal Rank Fusion):

async function semanticSearch(query, { limit = 10, threshold = 0.7 } = {}) {
  const { data: [{ embedding }] } = await openai.embeddings.create({
    model: 'text-embedding-3-small',
    input: query,
  });
  const results = await db.query(`
    WITH semantic AS (
      SELECT content_id, chunk_text,
             1 - (embedding <=> $1::vector) AS score,
             ROW_NUMBER() OVER (ORDER BY embedding <=> $1::vector) AS rank
      FROM content_chunks
      ORDER BY embedding <=> $1::vector
      LIMIT 20
    ),
    fulltext AS (
      SELECT id AS content_id, body AS chunk_text,
             ts_rank(to_tsvector('russian', body), plainto_tsquery('russian', $2)) AS score,
             ROW_NUMBER() OVER (ORDER BY ts_rank(...) DESC) AS rank
      FROM content
      WHERE to_tsvector('russian', body) @@ plainto_tsquery('russian', $2)
      LIMIT 20
    )
    SELECT COALESCE(s.content_id, f.content_id) AS id,
           COALESCE(s.chunk_text, f.chunk_text) AS text,
           (COALESCE(1.0 / (60 + s.rank), 0) + COALESCE(1.0 / (60 + f.rank), 0)) AS rrf_score
    FROM semantic s FULL OUTER JOIN fulltext f ON s.content_id = f.content_id
    ORDER BY rrf_score DESC
    LIMIT $3
  `, [`[${embedding.join(',')}]`, query, limit]);
  return results.rows;
}

Гібридний пошук: що це і навіщо?

Гібридний пошук об'єднує результати векторного та повнотекстового методів через RRF. Це компенсує слабкості кожного: векторний пошук знаходить за змістом, але може пропустити точне входження терміну; повнотекстовий — навпаки. Разом вони забезпечують високу релевантність навіть для складних запитів. Ми використовуємо цей підхід у всіх проєктах. Важливо: якісне впровадження потребує досвіду — наші інженери гарантують результат.

Вибір embedding-моделі для української/російської мови

Вибір моделі критичний. Multilingual-моделі (наприклад, Cohere) часто поступаються спеціалізованим на українській/російській. Ми тестували кілька варіантів і рекомендуємо:

Модель Розмірність Якість для укр/рос Швидкість Вартість
OpenAI text-embedding-3-small 1536 відмінно висока низька
OpenAI text-embedding-3-large 3072 чудово середня середня
Cohere embed-multilingual-v3 1024 добре висока середня
BGE-M3 (self-hosted) 1024 добре залежить від GPU безкоштовно

Source: OpenAI Embeddings documentation

Процес роботи

  1. Аудит контенту — виділяємо типи текстів, розмір, частоту оновлень.
  2. Вибір моделі та векторної бази даних — визначаємо компроміс між якістю та бюджетом.
  3. Налаштування індексації контенту — чанкінг, конфігурація індексу, batch-обробка.
  4. Розробка API пошуку — endpoint з параметрами: запит, фільтри, пагінація.
  5. Створення UI — пошуковий рядок, снипети з підсвіткою, прогресивне завантаження.
  6. Тестування — A/B-тест з поточним пошуком, моніторинг метрик.
  7. Деплой та моніторинг — алерти по затримках, запити без результатів.
Приклад реалізації інкрементальної переіндексації Щоб не переіндексовувати всі документи при кожній зміні, використовуємо тригери на таблиці контенту та чергу задач (Bull/PGBoss). При додаванні або оновленні запису ставимо задачу на переіндексацію лише цього документа. Фоновий воркер забирає задачу, отримує ембеддинги та оновлює відповідний чанк. Це дозволяє підтримувати актуальність без повної переіндексації навіть при тисячах змін на день.

Строки орієнтовно

Етап Строк (днів)
Семантичний пошук по 10К документів (pgvector) 4–5
Гібридний пошук (вектор + повнотекст) +1–2
Переранжування через Cohere Rerank +1
UI з підсвіткою та аналітикою +2–3
Інкрементальна переіндексація +1–2

Разом: від 8 до 12 робочих днів. Вартість розраховується індивідуально, орієнтовно від $5000.

Що входить в роботу

  • Повна документація архітектури (схема БД, API специфікація, інструкція з розгортання).
  • Вихідний код під ключ з CI/CD.
  • Доступ до репозиторію, дампу даних, моніторинг-дашборду.
  • Навчання команди (2–3 години).
  • Технічна підтримка 3 місяці.

Типові помилки при впровадженні

  • Неправильний чанкінг: занадто довгі чанки (>1000 токенів) знижують точність, занадто короткі — втрачають контекст. Оптимум: 300–500 токенів з перекриттям 50–100.
  • Вибір моделі без урахування мови: multilingual-моделі (наприклад, Cohere) часто працюють гірше на українській/російській, ніж спеціалізовані OpenAI embeddings.
  • Відсутність переранжування: навіть хороший векторний пошук іноді видає нерелевантні топ-результати. Cross-encoder rerank виправляє це.

Хочете впровадити семантичний пошук? Зв'яжіться з нами — обговоримо ваш проєкт. Отримайте консультацію за вашим сценарієм використання.

Інтеграція AI у веб-додатки: чат-боти, RAG, семантичний пошук

У 8 з 10 проектів «AI-чат-бот» виявляється дорогою обгорткою над GPT-4o з системним промптом. Без доступу до реальних даних компанії. Користувач питає «скільки коштує тариф Преміум» — бот галюцинує ціну з повітря. Питає «коли прийде замовлення» — отримує ввічливе «напишіть у підтримку». Це не інтеграція AI у веб-додатки — це імітація. Ми за 5 років впровадили RAG-рішення в 30+ проектах: від інтернет-магазинів до медичних порталів. Гарантуємо: корисна AI-допомога починається там, де модель читає ваші документи, а не загальні відповіді. Закажіть консультацію, щоб отримати план інтеграції для вашого проекту.

Побудова RAG-систем: чанкінг, ембедінги, векторна БД

Retrieval-Augmented Generation — стандартна архітектура: запит → пошук релевантних фрагментів у векторній БД → вставка знайденого в контекст → відповідь моделі. Але диявол у деталях реалізації.

Чанкінг. Різати документ на шматки по 500 токенів без огляду на структуру — гарантія втрати сенсу. Якщо розріз припав на середину абзацу, контекст розривається. Рішення — рекурсивний RecursiveCharacterTextSplitter з overlap 10–15% для документації. Для контрактів та інструкцій використовуємо семантичний спліттер: виділяємо заголовки, списки, блоки коду — кожен розділ стає незалежним чанком. Результат: на медичному проекті precision зріс з 0.55 до 0.84 лише завдяки правильному нарізанню, скорочення витрат на підтримку на 40% заощадило 80 000 грн на місяць.

Модель ембедингів. Для україномовних текстів intfloat/multilingual-e5-large дає помітний приріст точності проти застарілої text-embedding-ada-002. Наші виміри: NDCG@10 на 12% вищий. text-embedding-3-large хороший для англомовного контенту, але для української рекомендуємо BAAI/bge-m3.

Векторна БД. Якщо вже стоїть PostgreSQL — pgvector заощаджує ресурси. Ставимо розширення CREATE EXTENSION vector, додаємо колонку vector(1024), створюємо HNSW-індекс. На проекті з 80 000 статей p95 пошуку — 12 мс. Для каталогів з мільйонами одиниць — Qdrant або Weaviate: нативний гібридний пошук і шардування «з коробки».

Технічна реалізація pgvector Індекс будується за 3 хвилини на 100 000 позицій, займає ~400 МБ (1536-вимірні вектори). Пошук cosine distance з HNSW-індексом — 20 мс.

Кроки реалізації RAG:

  1. Збір та структурування даних (очищення, метадані).
  2. Вибір моделі ембедингів (multilingual-e5-large або bge-m3).
  3. Створення чанків (семантичний спліт із 10–15% overlap).
  4. Індексація в pgvector (або Qdrant).
  5. Інтеграція пошуку (гібрид BM25 + векторний через RRF) та реранкінг.

Що дає гібридний пошук?

Лише векторний пошук сліпий до точних збігів: артикули «ABC-123», власні назви, абревіатури губляться. Лише повнотекстовий не вловлює синоніми та перефразування. Комбінація через RRF (Reciprocal Rank Fusion) дає краще з двох світів: BM25 + векторний пошук, результати змішуються. На практиці recall@20 зростає з 0.65 до 0.92 — на 30% вищий за чисто векторний. Реранкінг через cross-encoder cross-encoder/ms-marco-MiniLM-L-6-v2 додає 50–100 мс до відповіді, але relevance піднімає ще на 5–10%.

Як реалізувати семантичний пошук у веб-додатку?

Пошук «зручні шкіряні крісла» має знаходити товари з описом «м'які стільці з натуральної шкіри» — звичайний LIKE-пошук не здатний. Архітектура: при додаванні товару/посту автоматично генеруємо ембединг через multilingual-e5-large, зберігаємо в pgvector. На запиті — ембедимо його тією ж моделлю, шукаємо найближчих сусідів через cosine distance з HNSW-індексом. Середній час пошуку — 20 мс.

Рекомендаційні системи: коли потрібна гібридна модель?

Колаборативна фільтрація («користувачі, схожі на вас, купували X») вимагає історії — мінімум 2–3 місяці даних із 1000+ активних користувачів. Для стартапів або малих проектів використовуємо content-based: ембединг поточного товару → пошук найближчих сусідів. Коли накопичується статистика (15–20 взаємодій на користувача), переключаємося на LightFM. Вона об'єднує поведінку та ознаки товарів. У e-commerce проекті з 50 000 SKU гібридна модель підвищила конверсію в рекомендаційний блок на 18% (A/B‑тест 2 тижні, що додатково принесло 250 000 грн прибутку за місяць).

Стрімінг відповідей через SSE

Користувач не зобов'язаний чекати, поки модель згенерує весь текст — це вбиває UX. Server-Sent Events (SSE) — протокол для стрімінгу токенів. OpenAI SDK підтримує stream: true, повертаючи AsyncIterator. На фронтенді — Vercel AI SDK (useChat) або самописний EventSource. Типова помилка: використовувати WebSocket для односпрямованого стріму — SSE простіше (менше коду, вбудований реконнект). Стек: Node.js + SSE + React.

Оркестрація агентів

Простий чат-бот відповідає. Агент — виконує дії: створює тікет у Jira, перевіряє статус замовлення в CRM, бронює слот у календарі. Для оркестрації використовуємо LangGraph: граф станів, кожен вузол — виклик моделі або інструменту. Vercel AI SDK дозволяє додати інтеграцію в 10 рядків коду. Головна складність — надійність: модель іноді викликає не той інструмент або передає криві параметри. Захист — Zod-схеми на кожен інструмент і structured outputs для гарантії JSON.

Процес роботи

Етап Результат Термін
Аудит даних та бізнес-логіки Карта джерел, формат документів, оцінка якості 1–2 дні
Прототип RAG або рекомендаційної системи Демонстрація з метриками (recall, precision, latency) 1–2 тижні
Інтеграція в існуючий веб-додаток API-ендпоінти, інтерфейс для чат-бота/пошуку 1–2 тижні
A/B-тестування та оптимізація Звіт за метриками (CTR, конверсія, hallucination rate) 1 тиждень
Документація та навчання команди Керівництво з експлуатації, код-рев'ю 2–3 дні

Додатково: передаємо вихідний код векторизатора, дашборди моніторингу (Langfuse), доступ до адмінки для оновлення бази знань. Постпродакшн-підтримка — 1 місяць безкоштовно.

Терміни

Задача Орієнтовний термін
RAG-чат-бот на базі існуючої бази знань 3–6 тижнів
Семантичний пошук по каталогу 2–4 тижні
Рекомендаційна система з A/B-тестуванням 6–10 тижнів
Мультиагентна система з інтеграціями від 8 тижнів

Вартість розраховується індивідуально після знайомства з проектом. Оцінимо ваш проект за 1 день. Зв'яжіться з нами — розкажемо, як перетворити AI з іграшки на інструмент, що приносить прибуток. Закажіть консультацію, щоб дізнатись, як інтегрувати AI у ваш веб-додаток.