Інтеграція LLM API в бекенд: надійний production-процес

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

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

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

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

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Інтеграція LLM API в бекенд: надійний production-процес
Середній
~3-5 днів
Часті запитання

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

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

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

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1251
  • 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

Інтеграція LLM API в бекенд: надійний production-процес

Підключити LLM API через HTTP-запит — справа п'яти хвилин. Але через місяць у продакшні ви ризикуєте зіткнутися з неконтрольованим зростанням витрат, таймаутами, деградацією якості відповідей і навіть атаками через prompt injection. Наприклад: один наш клієнт запустив чат-бота на GPT-4, не передбачивши кешування — рахунок за перший місяць перевищив плановий у 8 разів. Інший проект зіткнувся з витоком системного промпту через недостатню санітизацію введення користувача. Production-ready інтеграція вимагає продуманої архітектури: retry-логіки, fallback між провайдерами, захисту введення та контролю токенів. Ми беремо на себе всі ці завдання — від вибору провайдера до моніторингу витрат. Особливу увагу приділяємо часу відповіді: при правильному налаштуванні середня затримка не перевищує 1–2 секунд.

Однією з найсерйозніших загроз є prompt injection (Wikipedia). Без належного захисту зловмисник може змусити модель ігнорувати системні інструкції. У нашій практиці це одна з ключових перевірок перед запуском.

Як вибрати провайдера LLM?

Провайдер Модель Сильні сторони Обмеження
OpenAI GPT-4o, GPT-4o-mini Зріле API, найкраща екосистема Дорожче аналогів
Anthropic Claude 3.5 Sonnet, Claude Haiku Довгий контекст, точність Немає embedding API
Google Gemini 1.5 Pro/Flash Ціна, мультимодальність Менш стабільне API
Mistral Mistral Large, Mixtral Європейський провайдер, GDPR Менше інструментів
Groq Llama 3, Mixtral Швидкість (300+ token/s) Обмежений вибір моделей

Для більшості завдань GPT-4o-mini або Claude Haiku покривають 90% випадків при в 5–10 разів меншій вартості флагманських моделей. Семантичне кешування скорочує кількість запитів до API в 3–5 разів порівняно зі звичайним кешуванням, що прямо знижує витрати.

Сценарій Рекомендована модель Альтернатива
Чат-бот підтримки GPT-4o-mini Claude Haiku
Аналіз документів Claude 3.5 Sonnet Gemini 1.5 Pro
Генерація контенту GPT-4o Mistral Large

Для підбору оптимальної комбінації зв'яжіться з нами — ми врахуємо ваше навантаження та бюджет.

Як захистити бекенд від prompt injection?

Введення користувача не можна вставляти безпосередньо в системний промпт. Ізоляція:

def build_safe_messages(system_prompt: str, user_input: str) -> list[dict]:
    return [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": user_input}  # ніколи не форматувати user_input в system
    ]

def sanitize_user_input(text: str) -> str:
    # Видаляємо спроби змінити роль
    dangerous_patterns = [
        r"ignore previous instructions",
        r"you are now",
        r"forget everything",
        r"system:",
        r"<\|im_start\|>"
    ]
    for pattern in dangerous_patterns:
        text = re.sub(pattern, "[filtered]", text, flags=re.IGNORECASE)
    return text[:4000]  # обмежуємо довжину

Наш підхід до production-ready інтеграції

Ми будуємо клієнт із retry та fallback між провайдерами. Код перевірено в десятках проектів.

import asyncio
from openai import AsyncOpenAI, APIError, RateLimitError, APITimeoutError
from anthropic import AsyncAnthropic
import time

class LLMClient:
    def __init__(self):
        self.openai = AsyncOpenAI(api_key=OPENAI_API_KEY, timeout=30.0)
        self.anthropic = AsyncAnthropic(api_key=ANTHROPIC_API_KEY, timeout=30.0)

    async def complete(
        self,
        messages: list[dict],
        model: str = "gpt-4o-mini",
        temperature: float = 0.7,
        max_tokens: int = 1000,
        retries: int = 3
    ) -> str:
        last_error = None

        for attempt in range(retries):
            try:
                if model.startswith("gpt") or model.startswith("o1"):
                    response = await self.openai.chat.completions.create(
                        model=model,
                        messages=messages,
                        temperature=temperature,
                        max_tokens=max_tokens
                    )
                    return response.choices[0].message.content

                elif model.startswith("claude"):
                    system = next((m["content"] for m in messages if m["role"] == "system"), None)
                    user_messages = [m for m in messages if m["role"] != "system"]
                    response = await self.anthropic.messages.create(
                        model=model,
                        system=system,
                        messages=user_messages,
                        max_tokens=max_tokens
                    )
                    return response.content[0].text

            except RateLimitError:
                wait = 2 ** attempt
                await asyncio.sleep(wait)
                last_error = "rate_limit"

            except APITimeoutError:
                last_error = "timeout"
                if attempt < retries - 1:
                    await asyncio.sleep(1)

            except APIError as e:
                if e.status_code >= 500:
                    await asyncio.sleep(2 ** attempt)
                    last_error = f"server_error_{e.status_code}"
                else:
                    raise

        raise RuntimeError(f"LLM call failed after {retries} attempts: {last_error}")

Управління промптами та контроль витрат

Промпти зберігаємо в коді, версіонуємо через git. Використовуємо шаблони:

from string import Template

PROMPTS = {
    "product_description": Template("""
Напиши продаючий опис товару для інтернет-магазину.
Категорія: $category
Характеристики: $specs
Цільова аудиторія: $audience
Обсяг: 150–200 слів.
Тон: $tone
Не використовуй кліше типу "інноваційний", "унікальний", "найкращий".
"""),

    "review_response": Template("""
Напиши відповідь на відгук покупця від імені магазину.
Оцінка: $rating/5
Текст відгуку: $review
Тон: ввічливий, конкретний, без шаблонних фраз.
""")
}

def get_prompt(name: str, **kwargs) -> str:
    return PROMPTS[name].substitute(**kwargs)

Рахуємо токени до відправки через tiktoken та логуємо кожен запит. Ставимо добові ліміти на рівні dashboard провайдера. Для економії використовуємо семантичне кешування:

import hashlib
import json
from redis import Redis

cache = Redis()

def cached_llm_call(messages: list[dict], **kwargs) -> str:
    cache_key = "llm:" + hashlib.sha256(
        json.dumps(messages, sort_keys=True).encode()
    ).hexdigest()

    cached = cache.get(cache_key)
    if cached:
        return cached.decode()

    result = await llm_client.complete(messages, **kwargs)
    cache.setex(cache_key, 3600, result)  # 1 година
    return result

# Аналітика та моніторинг
async def tracked_llm_call(messages, user_id: str, feature: str, **kwargs) -> str:
    start = time.time()
    try:
        result = await llm_client.complete(messages, **kwargs)
        latency = time.time() - start

        await db.llm_logs.insert({
            "user_id": user_id,
            "feature": feature,
            "model": kwargs.get("model"),
            "input_tokens": count_tokens(str(messages)),
            "output_tokens": count_tokens(result),
            "latency_ms": int(latency * 1000),
            "success": True,
            "timestamp": datetime.utcnow()
        })
        return result

    except Exception as e:
        await db.llm_logs.insert({"feature": feature, "error": str(e), "success": False})
        raise

Семантичне кешування дозволяє окупити інтеграцію протягом першого місяця використання. Замість точного збігу запитів ми порівнюємо embedding вхідних даних. Якщо схожий запит вже був, повертаємо кешовану відповідь. Це знижує витрати на 30–70% без втрати якості.

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

  • Архітектура та вибір провайдера — аналіз ваших завдань і рекомендація оптимальних моделей.
  • Розробка клієнта з retry та fallback — підтримка декількох API з автоматичним перемиканням.
  • Захист від prompt injection — ізоляція введення, санітизація, обмеження.
  • Кешування та контроль витрат — семантичний кеш, ліміти, логування.
  • Документація та навчання — опис інтеграції, інструкція з експлуатації, навчання команди.
  • Підтримка після запуску — гарантія 30 днів, супровід.

Процес роботи та терміни

  1. Аналітика — обговорюємо сценарії, вибираємо провайдерів, оцінюємо навантаження.
  2. Проектування — архітектура клієнта, схема кешування, логування.
  3. Реалізація — написання коду, налаштування CI/CD, інтеграція з вашим бекендом.
  4. Тестування — навантажувальне тестування, перевірка безпеки, налагодження граничних випадків.
  5. Деплой — розгортання на вашому сервері або хмарі, моніторинг.

Орієнтовні терміни: базова інтеграція одного API — 1–2 дні, мультипровайдерний клієнт із fallback — 4–5 днів, повна інфраструктура — 7–8 днів. Вартість розраховується індивідуально після оцінки проекту.

Гарантії та досвід

Наші інженери мають сертифікати з OpenAI та Anthropic, більше 5 років досвіду в розробці бекендів та 100+ успішних проектів. Ми гарантуємо стабільну роботу інтеграції та надаємо документацію українською. Для складних випадків впроваджуємо кастомні рішення (наприклад, семантичний кеш на базі GPTCache). Отримайте консультацію — оцінимо ваш проект та запропонуємо оптимальне рішення.

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