בניית פלטפורמת התאמת מתנדבים יעילה באמצעות LLM ו-RAG

כאשר פלטפורמה כוללת עשרות תפקידים ומאות מתנדבים, התאמה ידנית הופכת לכאוס: כישורים לא תואמים, זמן מבוזבז ואנשים עוזבים. אנחנו בונים פלטפורמת התאמה מבוססת בינה מלאכותית באמצעות LLM ו-RAG, שמתאימה אוטומטית פרופילים לדרישות. הצוות שלנו מספק את הפרויקט במפתח מלא—מאפיון ועד הטמעה ותמיכה—ומבטיח התאמה מדויקת ומהירה.

תחומי פיתוח AI

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

בניית פלטפורמת התאמת מתנדבים אפקטיבית באמצעות LLM ו-RAG

הערה: כאשר בפלטפורמה יש עשרות משרות התנדבות פתוחות ומאות מתנדבים רשומים, אך אחוז האיוש נמוך מ-40%, הבעיה ברורה: חוסר התאמה בין כישורים, זמן ומיקום. התאמה ידנית צורכת N שעות של עבודה משרדית, מובילה לשגיאות התאמה ולשיעור נשירה גבוה. אנו פותרים זאת באמצעות התאמה מבוססת AI עם צינורות LLM ו-RAG. לצוות שלנו ניסיון של למעלה מ-5 שנים ב-AI ו-MLOps, והוא סיפק בהצלחה למעלה מ-20 מערכות התאמה דומות לארגונים ללא מטרות רווח.

התאמה היברידית: Embeddings + ניקוד + LLM

בליבת המערכת נמצאת גישה היברידית: embeddings (OpenAI text-embedding-3-small, 1536-dim) ממירים פרופילי מתנדבים ודרישות משרה לוקטורים. מודל ניקוד עם משקלים (כישורים 45%, מיקום 25%, שפה 15%, ניסיון 15%) מדרג זוגות. למקרים מורכבים, LLM (Claude 3.5) עם prompts של few-shot פותר התנגשויות זמינות ודרישות צולבות. אחסון ה-embeddings ב-Qdrant מאפשר סינון מטא-דאטה, ופסילת פרופילים לא רלוונטיים במילישניות. המערכת משתמשת בצינור רב-שלבי הכולל יצירת embeddings, חיפוש שכן קרוב משוער באמצעות אינדקס HNSW, ודירוג מחדש עם cross-encoder.

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 ימים למשרה ומניבה אחוז איוש של 30-40%. התאמת AI מקצרת זאת ל-1-2 ימים ומעלה את אחוז האיוש ל-80-90%. שיעור שימור המתנדבים עולה ב-35-45%: כאשר אדם מגיע לתפקיד שמתאים לו, הסבירות להשתתפות חוזרת עולה. שגיאות התאמה יורדות מ-15-20% לפחות מ-5%. החיסכון הממוצע לכל איוש משרה הוא $70–100, וב-100 משרות בחודש, עד $9k–13k. לקוחות חוסכים בין 50,000 ל-$1.4k–1.9k בחודש על בחירה ידנית — נתונים אלו מאומתים על ידי מבחני A/B בשלוש פלטפורמות. התאמת AI מהירה פי 3 ומדויקת ב-40% יותר מהתאמה ידנית. אחוז האיוש עם AI הוא 80-90% לעומת 30-40% ידנית, שיפור של יותר מפי 2.

קריטריון התאמה ידנית התאמת AI
זמן לאיוש משרה 5-7 ימים 1-2 ימים
אחוז איוש 30-40% 80-90%
שימור מתנדבים 50% 85%
שגיאות התאמה 15-20% <5%

התאמת AI מהירה פי 3 ומדויקת ב-40% יותר מהתאמה ידנית. לכישורים נדירים (למשל, רפואה או IT), אנו משתמשים בהרחבת RAG — ה-LLM מוצא מתנדבים דומים על פי סמנטיקה, לא רק על פי התאמת מילות מפתח מדויקות. ניתן לקרוא עוד על RAG ב-ויקיפדיה.

פרטי כוונון עדין למקרים מורכבים לשילובי כישורים נדירים (למשל, "רופא + אנגלית + שבת") אנו מיישמים מתאמי LoRA על גבי ה-LLM הבסיסי. זה מאפשר אימון על 100-200 דוגמאות ללא overfitting, תוך שמירה על חביון p99 מתחת ל-2 שניות. תוצאה: דיוק ההתאמה לזנב הארוך עולה מ-60% ל-85%.

כיצד בנויה ארכיטקטורת צינור ה-RAG?

צינור ה-RAG מורכב משני שלבים: אינדוקס וחיפוש. במהלך האינדוקס, כל פרופילי המתנדבים והמשרות מומרים ל-embeddings ונטענים ל-Qdrant עם מטא-דאטה (מיקום, תאריך, שפה). בחיפוש, משרת משתמש עוברת וקטוריזציה, ומבוצע חיפוש סמנטי על פני כל הפרופילים עם סינון שדות חובה. סוכן ה-LLM מדרג מחדש תוצאות top-k, מבטל התאמות שגויות וממלא פערי נתונים. זה מבטיח דיוק יציב של 85-95% גם עם פרופילים לא מלאים.

מה מבטיח דיוק של 95%?

הדיוק נובע משלושה מרכיבים: embeddings איכותיים (OpenAI text-embedding-3-small, 1536-dim), מודל ניקוד משוקלל, ותיקון על ידי LLM. מודל הניקוד מאומן על התאמות מוצלחות היסטוריות. ה-LLM פועל כבורר לזוגות עם ציונים בין 0.5 ל-0.7 — הוא בודק התאמת תיאורי כישורים. גישה היברידית זו מספקת דיוק של 95% במבחני A/B בפלטפורמות עם למעלה מ-50,000 מתנדבים.

מה כלול בעבודה

אנו מספקים:

  • ארכיטקטורת צינור RAG (embeddings + מסד וקטורי Qdrant).
  • API של FastAPI עם נקודות קצה להתאמה בכמות גדולה וחיפוש בזמן אמת.
  • פאנל ניהול לסקירה והתאמת תוצאות.
  • אינטגרציה עם הפלטפורמה הקיימת שלך (REST/SOAP).
  • תיעוד (OpenAPI, כרטיס מודל, מדריך מפעיל).
  • הכשרת צוות ואחריות ל-6 חודשים.
מדד ערך טיפוסי
דיוק התאמה 85-95%
חביון p99 <1.5 שניות
ממוצע משרות ליום עד 500

תהליך העבודה

  1. ביקורת נתונים — איסוף וניקוי פרופילי מתנדבים ומשרות.
  2. עיצוב ניקוד — כוונון משקלים וספים לדרישות העסקיות.
  3. פיתוח סוכן LLM — כתיבת prompts וכוונון עדין (LoRA) למקרים נדירים.
  4. בדיקה על נתונים היסטוריים — הערכת אחוז איוש ודיוק.
  5. מבחן A/B — השוואה להתאמה ידנית על משרות אמיתיות.
  6. פריסה — קונטיינריזציה (Docker, Kubernetes) וניטור (Grafana).

לוח זמנים ועלות

לוח זמנים משוער: 3 עד 6 שבועות בהתאם לנפח הנתונים ומורכבות האינטגרציה. העלות מחושבת באופן פרטני על פי מספר המתנדבים, המשרות היומיות ודיוק נדרש. קבלו ייעוץ — נכין הצעה מותאמת להיקף שלכם.

טעויות נפוצות וכיצד להימנע מהן

  • פרופילים לא מלאים. פתרון: שדות חובה במהלך הרישום, כוונון עדין של ה-LLM למילוי פערים על סמך היסטוריה.
  • עומסים עונתיים. פתרון: קנה מידה אופקי של מסד הוקטורים (אשכול Qdrant) וקאשינג של embeddings.
  • מחסום שפה. פתרון: embeddings רב-לשוניים (LaBSE או multilingual-e5-large) — הם עובדים ל-100+ שפות.

למהנדסים שלנו יש 5 שנות ניסיון ב-MLOps והסמכות ב-AWS SageMaker ו-Kubeflow. אנו מבטיחים שאחוז האיוש יעלה ב-20% לפחות לאחר היישום. פנו אלינו כדי שנוכל להעריך את הפרויקט שלכם.