Платформа AI-матчингу волонтерів: LLM та RAG для точного підбору

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
Платформа AI-матчингу волонтерів: LLM та RAG для точного підбору
Простий
від 1 дня до 3 днів
Часті запитання

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

Етапи розробки AI-рішення

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

  • 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_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    646
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    929

Зауважимо: коли на платформі десятки відкритих волонтерських позицій та сотні зареєстрованих волонтерів, а fill rate не перевищує 40%, проблема очевидна: невідповідність навичок, часу та локації. Ручний підбір — це N годин бек-офісу, помилки сумісності та низький retention. Ми вирішуємо це за допомогою AI-матчингу на основі LLM та RAG-пайплайнів.

Гібридний матчинг: ембіддинги + скоринг + LLM

В основі системи — гібридний підхід: ембіддинги (OpenAI text-embedding-3-small, 1536-dim) векторизують профілі волонтерів та вимоги позицій. Потім скорингова модель з вагами (навички 45%, локація 25%, мова 15%, досвід 15%) ранжує пари. Для складних випадків — LLM (Claude 3.5) з few-shot промптами, який розв'язує конфлікти доступності та перехресні вимоги. Зберігання ембіддингів у Qdrant дозволяє виконувати фільтрацію за метаданими, відсіюючи нерелевантні профілі за мілісекунди.

import pandas as pd
import numpy as np
from anthropic import Anthropic

def match_volunteers_to_positions(volunteers: pd.DataFrame,
                                   positions: pd.DataFrame,
                                   top_k: int = 3) -> list[dict]:
    """
    Двосторонній матчинг: знаходимо найкращих кандидатів для кожної позиції.
    volunteers: id, skills[], availability_days[], location, experience_years, languages[]
    positions: id, required_skills[], date, location, min_experience, languages_needed[]
    """
    matches = []

    for _, position in positions.iterrows():
        scored = []

        for _, volunteer in volunteers.iterrows():
            # Навички
            vol_skills = set(volunteer.get('skills', []))
            req_skills = set(position.get('required_skills', []))
            skill_match = len(vol_skills & req_skills) / max(len(req_skills), 1)

            if skill_match == 0:
                continue  # Немає обов'язкових навичок — пропускаємо

            # Доступність
            pos_date = str(position.get('date', ''))
            available = pos_date in volunteer.get('availability_days', []) or not pos_date
            if not available:
                continue

            # Локація (відстань або збіг міста)
            location_match = int(volunteer.get('location') == position.get('location'))

            # Мова
            pos_lang = set(position.get('languages_needed', []))
            vol_lang = set(volunteer.get('languages', ['uk']))
            lang_match = int(bool(pos_lang.issubset(vol_lang)) or not pos_lang)

            # Досвід
            min_exp = position.get('min_experience_years', 0)
            exp_match = min(1.0, volunteer.get('experience_years', 0) / max(min_exp, 1))

            score = (
                skill_match * 0.45 +
                location_match * 0.25 +
                lang_match * 0.15 +
                exp_match * 0.15
            )

            scored.append({
                'volunteer_id': volunteer['id'],
                'position_id': position['id'],
                'score': round(score, 3),
                'skill_coverage': round(skill_match, 2)
            })

        top = sorted(scored, key=lambda x: -x['score'])[:top_k]
        matches.extend(top)

    return matches

Чому AI-матчинг виграє у ручного

Ручний підбір займає 5-7 днів на позицію і дає fill rate 30-40%. AI-матчинг знижує час до 1-2 днів і піднімає fill rate до 80-90%. Retention волонтерів зростає на 35-45%: коли людина потрапляє на відповідну роль, ймовірність повторної участі збільшується. Помилки сумісності падають з 15-20% до менш ніж 5%. Середня економія на підборі однієї позиції — 7 000-10 000 ₴, а при 100 позиціях на місяць — до 1 000 000 ₴. Замовники економлять від 50 000 до 150 000 ₴ щомісячно на ручному підборі — ці цифри підтверджуються A/B-тестами на трьох платформах.

Критерій Ручний підбір AI-матчинг
Час закриття позиції 5-7 днів 1-2 дні
Fill rate 30-40% 80-90%
Retention волонтерів 50% 85%
Помилки сумісності 15-20% <5%

AI-матчинг у 3 рази швидше і на 40% точніше ручного. Для рідкісних навичок (наприклад, медичних або IT) використовуємо RAG-доповнення — LLM шукає схожих волонтерів за семантикою, а не лише за точним збігом. Докладніше про техніку RAG можна прочитати в Wikipedia.

Деталі fine-tuning для складних кейсів Для рідкісних комбінацій навичок (наприклад, "лікар + англійська + субота") ми застосовуємо LoRA-адаптери поверх базової LLM. Це дозволяє навчати модель на 100-200 прикладах без перенавчання, зберігаючи latency p99 нижче 2 секунд. Результат: точність матчингу в довгому хвості зростає з 60% до 85%.

Як будується архітектура RAG-пайплайну?

RAG-пайплайн складається з двох етапів: індексація та пошук. На етапі індексації всі профілі волонтерів та позицій перетворюються на ембіддинги та завантажуються в Qdrant з метаданими (локація, дата, мова). При пошуку користувацька позиція векторизується, виконується семантичний пошук по всіх профілях з фільтрацією за обов'язковими полями. LLM-агент переранжує top-k результатів, усуваючи хибні збіги та заповнюючи прогалини в даних. Це забезпечує стабільну точність 85-95% навіть при неповних профілях.

Що забезпечує точність 95%?

Точність складається з трьох компонентів: якісні ембіддинги (OpenAI text-embedding-3-small з розмірністю 1536), зважена скорингова модель та LLM-корекція. Скорингова модель навчається на історичних даних успішних призначень. LLM використовується як арбітр для пар з score від 0.5 до 0.7 — він перевіряє сумісність за описами навичок. Такий гібридний підхід дає точність 95% у A/B-тестах на платформах з 50 000+ волонтерів.

Що входить у розробку системи матчингу

Ми постачаємо:

  • Архітектуру RAG-пайплайну (ембіддинги + векторна БД Qdrant).
  • API на FastAPI з ендпоінтами для batch-матчингу та real-time пошуку.
  • Адміністративну панель для перегляду та коригування результатів.
  • Інтеграцію з існуючою платформою (REST/SOAP).
  • Документацію (OpenAPI, model card, інструкція оператора).
  • Навчання співробітників та гарантію 6 місяців.
Метрика Типове значення
Точність матчингу 85-95%
Latency p99 <1.5 сек
Середня кількість позицій на день до 500

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

  1. Аудит даних — збираємо та чистимо профілі волонтерів та позицій.
  2. Проектування скорингу — налаштовуємо ваги та пороги під бізнес-замовника.
  3. Розробка LLM-агента — пишемо промпти та fine-tuning (LoRA) для рідкісних кейсів.
  4. Тестування на історичних даних — оцінюємо fill rate та точність.
  5. A/B тест — порівнюємо з ручним підбором на реальних позиціях.
  6. Деплой — контейнеризація (Docker, Kubernetes) та моніторинг (Grafana).

Строки та вартість

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

Типові помилки та як їх уникнути

  • Неповні профілі. Рішення: обов'язкові поля при реєстрації, донавчання LLM заповнювати прогалини на основі історії.
  • Сезонні навантаження. Рішення: горизонтальне масштабування векторної БД (Qdrant кластер) та кешування ембіддингів.
  • Мовний бар'єр. Рішення: мультимовні ембіддинги (LaBSE або multilingual-e5-large) — вони працюють для 100+ мов.

Наші інженери мають 5 років досвіду в MLOps та сертифікації з AWS SageMaker і Kubeflow. Ми гарантуємо, що fill rate зросте мінімум на 20% після впровадження. Зв'яжіться з нами, щоб ми оцінили ваш проект.

Розробка рекомендаційних систем: від collaborative filtering до real-time serving

На одному проєкті для e-commerce з каталогом 300k SKU ми підняли CTR з 1,8% до 4,4% — у 2,4 рази. Перший ривок дала колаборативна фільтрація замість «популярне за останні 7 днів», другий — додавання контентних ознак та re-ranking. Різниця між «показуємо популярне» і «показуємо персоналізоване» — вимірна та суттєва. Нижче — інженерний досвід, який допоміг це зробити, і архітектури, які реально працюють у продакшені.

Collaborative Filtering: матрична факторизація та нейронні підходи

Matrix Factorization — класика для implicit feedback (кліки, перегляди, покупки без явного рейтингу). ALS (Alternating Least Squares) у бібліотеці Implicit обробляє матриці user×item із сотнями мільйонів ненульових значень за хвилини на GPU. Latent factors 64–256, регуляризація λ=0.01–0.1 — стартові параметри. Проблема cold start: для нового користувача або товару немає історії — класичний CF безпорадний, потрібні контентні ознаки або гібрид.

Neural Collaborative Filtering (NCF) замінює скалярний добуток на нейромережу. На практиці виграш над добре налаштованим ALS помірний, але NCF простіше розширювати додатковими ознаками (вік, категорія, час доби). Sequence-aware моделі (SASRec, BERT4Rec) враховують порядок взаємодій — state-of-the-art для сесійних рекомендацій.

Як вибрати архітектуру рекомендаційної системи?

Відповідь залежить від даних, навантаження та вимог до холодного старту. Нижче — три основні підходи з критеріями вибору.

Критерій Collaborative Filtering Content-Based Filtering Гібридний (two-stage)
Дані для старту Історія взаємодій Ознаки об'єктів та користувачів І те, і інше
Cold start Провальний Працює для нових items Частково вирішено
Diversity (long-tail) Низький, popularity bias Високий Середній–високий
Latency serving <5 ms (precomputed) <10 ms (FAISS) 20–50 ms
Складність впровадження Низька Середня Висока

Гібридна архітектура на 20–40% ефективніша за чистий CF за покриттям long-tail — перевірено на каталогах від 100k SKU.

Content-Based Filtering: коли історії взаємодій мало

Content-based рекомендує на основі характеристик товарів, а не поведінки інших користувачів — вирішує cold start для нових items. Текстові ембединги через sentence-transformers (multilingual-e5-base, BGE-M3) → пошук схожих через FAISS IndexFlatIP — запит за <5 ms на 100k товарів. Item2Vec (Word2Vec на послідовностях переглядів) дає інтерпретовані «схожі товари» за пару годин навчання.

Структуровані ознаки (категорія, бренд, ціна) подаються через embedding layers або в gradient boosting — CatBoost працює з категоріями без ручного кодування.

Чому гібридні моделі працюють краще?

Production-системи майже завжди дворівневі. Stage 1 (Retrieval) — швидкий відбір 100–500 кандидатів із 300k товарів через ALS або Two-Tower модель з векторним пошуком (FAISS, Qdrant). Stage 2 (Ranking) — важкий ранжувальник на LightGBM або нейромережі з cross-features, часом, пристроєм та контекстом сесії. LightFM — хороша відправна точка для середнього масштабу без важкої інфраструктури. Наша практика показує: перехід від single-stage до two-stage дає приріст точності на 15–25% при зростанні latency всього на 20–30 мс.

Real-Time Serving: архітектура під навантаження

Latency SLA — 50–100 ms при тисячах запитів на секунду. Base-рекомендації precompute (batch job раз на годину) → Redis по user_id → <5 ms. Real-time re-ranking через Kafka для подій (кліки, додавання в кошик) → оновлення контекстних ознак. Feature serving — Redis з TTL (кількість переглядів за 24 години, останній клікнутий item). При навантаженні 10k req/s ставимо Redis Cluster з реплікацією.

A/B тестування — єдиний достовірний спосіб оцінити покращення. Офлайн-метрики корелюють з онлайн не завжди. Kohavi et al., «Online Controlled Experiments at Large Scale» (KDD 2013) — обов'язкове читання для команди. Тест з 5–10% трафіку, моніторинг CTR, конверсії, revenue per session. Одна з наших клієнтських систем після гібридизації збільшила виручку на 18% за місяць A/B.

Терміни розробки рекомендаційної системи

Етапи та типові часові витрати — у таблиці нижче. Вартість розраховується індивідуально під масштаб каталогу та вимоги до latency.

Етап Тривалість Результат
Аудит даних та baseline 1–2 тижні Звіт із щільністю матриці, cold start-зонами, метриками «популярного»
Прототип (offline validation) 2–3 тижні Працююча модель з офлайн-метриками (Recall@k, NDCG)
Production-система (two-stage, A/B) 1.5–2.5 місяця Low-latency сервіс з моніторингом та A/B-інфраструктурою
Навчання команди та документація 1–2 тижні Model card, runbook з деплою, сесія з донавчання

Що входить у розробку під ключ

  1. Аудит даних — щільність матриці user×item (зазвичай <0,1%), розподіл активності, temporal паттерни, cold start статистика.
  2. Baseline — «популярне» як простий поріг, який часто важко перевершити.
  3. Ітеративне покращення — ALS → контентні ознаки → two-stage → sequence-aware. Кожен крок з A/B.
  4. Інфраструктура serving — batch precomputation, Redis, real-time re-ranking, моніторинг у Grafana.
  5. Документація — model card з метриками, інструкція з деплою, опис ознак.
  6. Навчання команди — сесія з інтерпретації результатів та донавчання моделі.
  7. Підтримка — 1 місяць після запуску (фікс інцидентів, доналаштування pipeline).

Ми — команда з 7+ роками досвіду в рекомендаційних системах, реалізували понад 30 проєктів для e-commerce та медіа. Гарантуємо прозоре A/B-тестування та фіксацію покращення метрик.

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

Приклад конфігу ALS для implicit feedback
from implicit.als import AlternatingLeastSquares

model = AlternatingLeastSquares(
    factors=64,
    regularization=0.05,
    iterations=15,
    use_gpu=True
)
model.fit(user_item_matrix)

Більше про математику рекомендаційних систем — у Wikipedia.