Впровадження RAG для корпоративного AI-бота на сайті

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

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

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

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

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Впровадження RAG для корпоративного AI-бота на сайті
Складний
~2-4 тижні
Часті запитання

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

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

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

  • 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

Впровадження RAG для корпоративного AI-бота на сайті

Типовий AI-бот, навчений лише на загальних даних, не знає ваш продукт. Він вигадує відповіді — галюцинує. RAG (Retrieval-Augmented Generation) — архітектурний патерн — вирішує цю проблему: бот знаходить релевантні фрагменти з вашої бази знань (документація, FAQ, статті) і формує відповідь строго по них. Результат — точні, перевірені відповіді без вигадок. Наш досвід: понад 5 років розробки NLP-систем, 10+ впроваджених RAG-ботів.

Наприклад, компанія з 5000 сторінками технічної документації витрачала 20 людино-годин на тиждень на відповіді однотипних питань. Після впровадження RAG-бота час скоротився до 2 годин, а точність відповідей перевищила 95%. При цьому бот використовує лише перевірені дані, виключаючи ризик витоку.

Як працює RAG-система?

RAG складається з кількох компонентів:

  • Knowledge base — джерело даних: документація, FAQ, статті бази знань, сторінки сайту, PDF-файли, тікети підтримки.
  • Ingestion pipeline — процес завантаження, розбиття на чанки та індексації документів.
  • Vector store — база даних, що зберігає ембеддінги та забезпечує семантичний пошук.
  • Retrieval — за запитом користувача знаходимо топ-N релевантних чанків.
  • Generation — надсилаємо знайдені чанки + питання в LLM, отримуємо відповідь.

Кожен етап налаштовується індивідуально під ваш обсяг даних і вимоги до швидкості.

Ingestion Pipeline

Розбиття документів на чанки — критичний етап. Занадто маленькі чанки втрачають контекст, занадто великі — знижують точність пошуку. Оптимально: 500–1000 токенів з перекриттям 100–200 токенів.

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import (
    WebBaseLoader, PyPDFLoader, UnstructuredMarkdownLoader
)

def load_and_chunk_documents(sources: list[dict]) -> list:
    documents = []

    for source in sources:
        if source["type"] == "url":
            loader = WebBaseLoader(source["path"])
        elif source["type"] == "pdf":
            loader = PyPDFLoader(source["path"])
        elif source["type"] == "markdown":
            loader = UnstructuredMarkdownLoader(source["path"])

        docs = loader.load()
        documents.extend(docs)

    splitter = RecursiveCharacterTextSplitter(
        chunk_size=800,
        chunk_overlap=150,
        separators=["\n\n", "\n", ". ", " ", ""]
    )

    return splitter.split_documents(documents)

Ембеддінги та векторне сховище

Моделі ембеддінгів:

  • text-embedding-3-small (OpenAI) — 1536 вимірів, $0.02 за 1M токенів, чудове співвідношення ціни та якості
  • text-embedding-3-large — 3072 вимірів, краще для складних запитів
  • multilingual-e5-large (локально, Hugging Face) — безкоштовно, добре для української мови

Векторні сховища:

Рішення Тип Масштаб Особливості
pgvector PostgreSQL розширення до 10M векторів Знайомий SQL, транзакції
Qdrant Self-hosted / Cloud сотні мільйонів Фільтрація по payload
Weaviate Self-hosted / Cloud сотні мільйонів GraphQL API
Pinecone SaaS будь-який Повністю керований
Chroma In-process / Server до 1M Зручний для старту

Для сайту із середнім навантаженням і базою до 100 000 документів — pgvector або Qdrant. Не потрібно піднімати окремий сервіс.

import psycopg2
from pgvector.psycopg2 import register_vector
import numpy as np

def store_embeddings(chunks: list, embeddings: list[list[float]]):
    conn = psycopg2.connect(DATABASE_URL)
    register_vector(conn)
    cur = conn.cursor()

    cur.execute("""
        CREATE TABLE IF NOT EXISTS documents (
            id SERIAL PRIMARY KEY,
            content TEXT,
            embedding vector(1536),
            metadata JSONB,
            source_url TEXT,
            created_at TIMESTAMP DEFAULT NOW()
        )
    """)
    cur.execute("CREATE INDEX IF NOT EXISTS documents_embedding_idx ON documents USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100)")

    for chunk, embedding in zip(chunks, embeddings):
        cur.execute(
            "INSERT INTO documents (content, embedding, metadata, source_url) VALUES (%s, %s, %s, %s)",
            (chunk.page_content, np.array(embedding), json.dumps(chunk.metadata), chunk.metadata.get("source", ""))
        )

    conn.commit()

Пошук: семантичний та гібридний

Семантичний пошук повертає чанки за косинусною схожістю ембеддінгів. Для точних запитів (артикули, імена) він іноді промахується — тоді підключаємо гібридний пошук з повнотекстовим індексом (BM25).

def hybrid_search(query: str, top_k: int = 5) -> list[dict]:
    # Семантичний пошук
    query_embedding = get_embedding(query)
    conn = psycopg2.connect(DATABASE_URL)
    register_vector(conn)
    cur = conn.cursor()

    cur.execute("""
        SELECT content, source_url, metadata,
               1 - (embedding <=> %s::vector) AS similarity
        FROM documents
        WHERE 1 - (embedding <=> %s::vector) > 0.75
        ORDER BY embedding <=> %s::vector
        LIMIT %s
    """, (query_embedding, query_embedding, query_embedding, top_k * 2))
    semantic_results = cur.fetchall()

    # Повнотекстовий пошук
    cur.execute("""
        SELECT content, source_url, ts_rank(to_tsvector('ukrainian', content), query) AS rank
        FROM documents, to_tsquery('ukrainian', %s) query
        WHERE to_tsvector('ukrainian', content) @@ query
        ORDER BY rank DESC LIMIT %s
    """, (prepare_ts_query(query), top_k * 2))
    keyword_results = cur.fetchall()

    # Reciprocal Rank Fusion
    return reciprocal_rank_fusion(semantic_results, keyword_results, top_k)

Generation: формування відповіді

from openai import OpenAI

client = OpenAI()

SYSTEM_PROMPT = """Ти помічник служби підтримки компанії.
Відповідай ТІЛЬКИ на основі наданого контексту.
Якщо відповіді немає в контексті — чесно скажи про це.
Не вигадуй інформацію. Вказуй джерело з контексту."""

def generate_answer(query: str, context_chunks: list[dict]) -> dict:
    context = "\n\n".join([
        f"[Джерело: {c['source']}]\n{c['content']}"
        for c in context_chunks
    ])

    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": f"Контекст:\n{context}\n\nПитання: {query}"}
        ],
        temperature=0.1,
        max_tokens=800
    )

    sources = list({c["source"] for c in context_chunks if c.get("source")})

    return {
        "answer": response.choices[0].message.content,
        "sources": sources,
        "chunks_used": len(context_chunks)
    }

Re-ranking та оцінка якості

Векторний пошук повертає кандидатів за косинусною схожістю, але не завжди найсемантичніше близький чанк — найкорисніший. Cross-encoder re-ranking переоцінює кандидатів з урахуванням питання, піднімаючи релевантні чанки в топ. Ми використовуємо модель cross-encoder/ms-marco-MiniLM-L-6-v2 з бібліотеки Sentence Transformers.

Метрики RAG-системи включають Faithfulness (чи не суперечить відповідь контексту), Answer Relevance (чи відповідає на питання), Context Recall (чи всі потрібні факти знайдені) та Context Precision (чи немає зайвого в контексті). Для оцінки застосовуємо RAGAS (open-source) та LangSmith (платний SaaS). Налаштований моніторинг гарантує стабільну якість.

Оновлення індексу

При зміні контенту на сайті потрібно перерахувати ембеддінги. Стратегії:

  • Повна переіндексація — раз на добу, при обсязі до 50 000 документів займає 15–30 хвилин.
  • Інкрементальна — при зміні сторінки видаляємо старі чанки по source_url, додаємо нові. Підходить для CMS з webhook на публікацію.
  • М'яке видалення — позначаємо застарілі чанки прапорцем, не видаляємо негайно. Дозволяє відкотитися при помилці.

Скільки часу займає впровадження RAG?

Терміни залежать від обсягу даних та вимог. Орієнтовні етапи:

Етап Термін
Ingestion pipeline + ембеддінги + pgvector 5–7 днів
Retrieval + базова генерація 3–4 дні
Гібридний пошук + re-ranking 3–4 дні
Чат-інтерфейс на сайті (віджет) 4–5 днів
Інкрементальна переіндексація 2–3 дні
Метрики якості + моніторинг 3–4 дні

Мінімально робочий RAG-бот з одним джерелом даних — 2 тижні. Продуктова система з кількома джерелами, гібридним пошуком і моніторингом — 4–5 тижнів.

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

При замовленні впровадження RAG ви отримуєте:

  • Повноцінний ingestion pipeline під ваші джерела даних
  • Векторне сховище (pgvector або Qdrant)
  • Семантичний та гібридний пошук
  • Генерацію відповідей із зазначенням джерел
  • Re-ranking для підвищення точності
  • Інтеграцію з сайтом (віджет чату)
  • Документацію з архітектури та налаштування
  • Навчання співробітників роботі з системою
  • Гарантію 3 місяці на роботу системи

Ми маємо досвід впровадження RAG для інтернет-магазинів, корпоративних порталів та служб підтримки. Реалізували 10+ проектів.

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

Інтеграція 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 у ваш веб-додаток.