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

Отметим: когда на платформе десятки открытых волонтёрских позиций и сотни зарегистрированных волонтёров, а fill rate не превышает 40%, проблема очевидна: несоответствие навыков, времени и локации. Ручной подбор — это N часов бэк-офиса, ошибки совместимости и низкий retention. Мы решаем это с помощью

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1440
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1264
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1002

Отметим: когда на платформе десятки открытых волонтёрских позиций и сотни зарегистрированных волонтёров, а 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', ['ru'])) 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%. Средняя экономия на подборе одной позиции — $70–100, а при 100 позициях в месяц — до $9k–13k. Заказчики экономят от $500–1.5k ежемесячно на ручном подборе — эти цифры подтверждаются 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% после внедрения. Свяжитесь с нами, чтобы мы оценили ваш проект.