Готовий AI-пошук: сервіс семантичного пошуку для продуктів

Компанії витрачають місяці на розробку пошуку з нуля для кожного продукту, дублюючи інфраструктуру та збільшуючи витрати. Ми пропонуємо готовий AI-пошук як сервіс: підключаємо семантичний пошук через API або SDK, беручи на себе всю інфраструктуру — від вибору embedding-моделі до налаштування гібридного пошуку. Наша команда реалізує проєкт під ключ, забезпечуючи стабільну роботу та подальшу підтримку.
Часті запитання

Чому Search-as-a-Service швидше та дешевше за власну розробку пошуку

Ми часто бачимо, як компанії витрачають місяці на розробку пошуку з нуля для кожного продукту: пишуть свою векторизацію, реалізують власну реранжировку, налаштовують інфраструктуру. Search as a Service — це готова пошукова платформа з AI-шаром, яку ми підключаємо через API або SDK. Наші інженери з 10+ річним досвідом у MLOps беруть на себе всю інфраструктуру: від вибору embedding-моделі до налаштування гібридного пошуку та реранжировки.

Типовий сценарій: у компанії 5 продуктів, у кожному потрібен пошук за каталогом, документами, контентом. Без платформи — 5 незалежних реалізацій, 5 разів налаштовувати індекси, 5 разів платити за GPU для embedding-моделі. З нашою платформою — один shared сервіс, різні індекси (tenants), єдиний API. Вартість інфраструктури знижується на 30–50% за рахунок shared GPU, а час виведення пошуку — з місяців до тижнів.

Як працює багатотенантність у пошуковій платформі?

Кожен клієнт отримує ізольоване середовище: свою колекцію в Qdrant (або іншій векторній БД), власні pipeline індексації та гнучкі ліміти. Ми гарантуємо, що дані різних замовників не змішуються, а навантаження рівномірно розподіляється через горизонтальне масштабування.

from fastapi import FastAPI, Header, HTTPException, Depends
from pydantic import BaseModel
from typing import Optional
import uuid

app = FastAPI(title="Search as a Service")

class IndexConfig(BaseModel):
    name: str
    embedding_model: str = "intfloat/multilingual-e5-large"
    chunk_size: int = 512
    chunk_overlap: int = 64
    language: str = "ru"
    reranker_enabled: bool = True

class SearchRequest(BaseModel):
    query: str
    index_name: str
    filters: Optional[dict] = None
    top_k: int = 10
    mode: str = "hybrid"  # "vector" | "keyword" | "hybrid"
    generate_answer: bool = False

class SearchService:
    def __init__(self):
        self.tenant_indexes = {}  # tenant_id → {index_name → index}
        self.embedding_models = {}  # model_name → loaded_model
        self.reranker = self._load_reranker()

    async def create_index(self, tenant_id: str, config: IndexConfig):
        """Створює ізольований індекс для тенанта"""
        collection_name = f"{tenant_id}_{config.name}"
        # Кожен тенант — окрема колекція в Qdrant
        # з власними payload-фільтрами
        self.qdrant.create_collection(
            collection_name=collection_name,
            vectors_config=VectorParams(
                size=self._get_vector_size(config.embedding_model),
                distance=Distance.COSINE
            )
        )
        return {"index_id": collection_name, "status": "created"}

    async def search(
        self,
        tenant_id: str,
        request: SearchRequest
    ) -> dict:
        collection = f"{tenant_id}_{request.index_name}"
        if request.mode == "hybrid":
            results = await self._hybrid_search(
                collection, request.query, request.filters, request.top_k
            )
        elif request.mode == "vector":
            results = await self._vector_search(
                collection, request.query, request.top_k
            )
        else:
            results = await self._keyword_search(
                collection, request.query, request.top_k
            )
        if request.generate_answer and results:
            answer = await self._generate_answer(request.query, results)
            return {"results": results, "answer": answer}
        return {"results": results}

SDK для команд-споживачів

Ми надаємо Python SDK з мінімальними залежностями. Команди підключаються до платформи за 10 хвилин — без занурення в деталі роботи векторних БД та LLM.

# pip install search-platform-sdk
from search_platform import SearchClient

client = SearchClient(
    api_key="sk-...",
    base_url="https://search.internal.company.com"
)

# Індексація документів
client.index.upload(
    index_name="product-catalog",
    documents=[
        {"id": "p001", "title": "Ноутбук Dell XPS", "description": "...", "price": 89999, "category": "laptops"},
        # ...
    ]
)

# Пошук
results = client.search(
    index_name="product-catalog",
    query="тонкий ноутбук для роботи з відео",
    filters={"price": {"lte": 100000}, "category": "laptops"},
    top_k=5,
    generate_answer=True
)

print(results.answer)  # "На основі вашого запиту рекомендую..."
print(results.items)   # список документів з релевантністю

Чому варто обрати Search-as-a-Service, а не саморобне рішення?

Порівняйте: самостійна реалізація потребує найму команди ML-інженерів, вибору та навчання embedding-моделі, налаштування векторної БД, реранжировщика, балансувальника, моніторингу — 6–12 місяців роботи. Наша платформа дає той самий функціонал за 6–8 тижнів, у 4 рази швидше, з гарантованим SLA 99.9% та latency P99 < 1 сек. Ми вже перевірили архітектуру на навантаженні 2M документів і 12 продуктів — результат: 35% економії на інфраструктурі, 4 дні на підключення команди через SDK.

Характеристика Самостійна розробка Search-as-a-Service
Час впровадження 6–12 місяців 6–8 тижнів
Вартість інфраструктури висока (окремі GPU, кілька команд) економія до 35% за рахунок shared GPU
SLA нижча (без моніторингу та бекапів) 99.9%
Підтримка нових джерел даних потребує доопрацювань плагіни та SDK

Кейс SaaS-компанії: мігрувала зі своїх розрізнених Elasticsearch-інстансів на єдину платформу. 3 команди підключилися через SDK за 1 день (без розуміння векторних баз та embedding-моделей). Вартість інфраструктури знизилася на 35% — суттєва економія. Середній час відповіді пошуку: 280 мс P50, 650 мс P99 на корпусі 2M документів.

Rate limiting та моніторинг

Контролюємо навантаження динамічними лімітами за планами та логуємо кожен запит у TimescaleDB.

from fastapi_limiter import FastAPILimiter
from fastapi_limiter.depends import RateLimiter
import redis.asyncio as redis

# Ліміти по тенантах
TENANT_LIMITS = {
    "free": "100/minute",
    "pro": "1000/minute",
    "enterprise": "unlimited"
}

@app.post("/search")
@limiter.limit(get_tenant_limit)  # динамічний ліміт за планом
async def search_endpoint(
    request: SearchRequest,
    x_api_key: str = Header(...),
    tenant = Depends(authenticate_tenant)
):
    return await search_service.search(tenant.id, request)

Billing та usage tracking

Кожен пошук і кожен embedding-запит логуються в TimescaleDB:

CREATE TABLE search_usage (
    id BIGSERIAL PRIMARY KEY,
    tenant_id TEXT NOT NULL,
    index_name TEXT NOT NULL,
    query_hash TEXT, -- хеш для анонімізації
    mode TEXT,
    latency_ms INTEGER,
    result_count INTEGER,
    answer_generated BOOLEAN,
    tokens_used INTEGER, -- для LLM-відповіді
    created_at TIMESTAMPTZ DEFAULT NOW()
);

-- Гіпертаблиця TimescaleDB для ефективних time-range запитів
SELECT create_hypertable('search_usage', 'created_at');
Технічні деталі архітектури індексації Документи проходять чанкінг (розбиття на частини по 512 токенів з перекриттям 64), векторизацію через embedding-модель, потім зберігаються в Qdrant з повними payload. Для кожного тенанта — окрема колекція. При гібридному пошуку результати об'єднуються через weighted sum з реранжировкою від cross-encoder.

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

  • Аудит поточної пошукової інфраструктури (якщо є) — аналіз індексів, вимірювання latency, виявлення вузьких місць.
  • Проектування multi-tenant архітектури — вибір векторної БД (Qdrant, Pinecone, Weaviate), налаштування ізоляції, планування ємності.
  • Розробка API та SDK — RESTful API (FastAPI) та Python SDK з підтримкою гібридного пошуку, реранжировки та генерації відповідей на основі RAG з контролем галюцинацій через few-shot prompting.
  • Інтеграція з існуючими системами — кастомні конектори для CMS, ERP, DMS.
  • Моніторинг та білінг — дашборди Grafana, логи в TimescaleDB, система rate limiting за планами.
  • Документація та навчання — повна документована схема API, приклади коду, 2 години онлайн-тренінгу для команд.
  • Підтримка та SLA — гарантія 99.9% uptime, реагування на інциденти протягом 1 години.

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

  1. Аналітика — обговорюємо вимоги, профіль навантаження, обсяг даних та бажані метрики (P50/P99 latency).
  2. Проектування — створюємо архітектуру, обираємо стек (embedding-модель, векторну БД, реранжировщик), проектуємо схему тенантів.
  3. Реалізація — розробляємо API, SDK, пайплайн індексації, інтеграційні тести.
  4. Навантажувальне тестування — на ваших даних (або синтетичних) вимірюємо latency, throughput, визначаємо точки відмови.
  5. Деплой — розгортаємо на вашій інфраструктурі (AWS/GCP/on-prem) або нашій хмарній площадці. Налаштовуємо моніторинг.
  6. Приймання та навчання — демонстрація, передача документації, навчання команди.

SLA та параметри платформи

Параметр Значення
Latency P50 < 300 мс
Latency P99 < 1 сек
Доступність 99.9%
Максимальний розмір документа 5 MB
Підтримувані формати PDF, DOCX, TXT, HTML, JSON
Мови RU, EN, DE, FR, ES (multilingual-E5)
Максимум тенантів Не обмежено (горизонтальне масштабування)

Терміни: базова платформа (API + індексація + гібридний пошук) — 6–8 тижнів; з генерацією відповідей, SDK та білінгом — 3–4 місяці. Зв'яжіться з нами для точної оцінки вашого проекту — ми розрахуємо вартість та терміни під ваше завдання. Отримайте консультацію наших AI-інженерів.

Напрямки AI-розробки

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

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1543
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1370
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142