AI Matchmaking System for Participant Networking at Events

We design and deploy artificial intelligence systems: from prototype to production-ready solutions. Our team combines expertise in machine learning, data engineering and MLOps to make AI work not in the lab, but in real business.
Showing 1 of 1All 1564 services
AI Matchmaking System for Participant Networking at Events
Medium
from 1 day to 3 days
Frequently Asked Questions

AI Development Areas

AI Solution Development Stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1358
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    956
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1188
  • image_logo-advance_0.webp
    B2B Advance company logo design
    646
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    929

AI Matchmaking System for Participant Networking at Events

Conference organizers face a common problem: participants waste time on random conversations, and valuable connections happen only 30–40% of the time. We developed an AI solution for intelligent networking—a system that finds complementary pairs based on participant profiles. Instead of simple similarity search (same roles or industries), the algorithm computes mutual benefit: who seeks what and who offers what.

At a large IT conference, our system helped participants reduce the time to find relevant contacts from 30 minutes to 5. Budget savings on meeting organization reach 30%, and ROI from implementation is up to 400% due to increased participant satisfaction. Our experience shows that the share of useful meetings after matchmaking grows to 65–75%.

How Complementary Matching Works

The key differentiator of our approach is complementarity. If participant A seeks investments and participant B looks for startups to invest in, their meeting brings more value than a meeting of two investors with identical goals. The algorithm considers:

  • Semantic similarity of biographies (common context);
  • Complementarity of seeking ↔ offering fields;
  • Industry overlap (for relevance).

We tune weights: in our projects, we set 60% on complementarity, 20% on biography similarity, and 20% on industry overlap. This yields the best response at events with up to 3,000 participants.

Complementary Matching vs. Similarity: What's the Difference?

Traditional similarity matching (e.g., collaborative filtering) recommends people with similar profiles—two developers, two marketers. But for networking, diversity is more valuable. Compare:

Criterion Similarity Matching Complementary Matching (Ours)
Goal Find "your kind" Find mutually beneficial contacts
Example Two DevOps engineers DevOps seeks SRE; SRE seeks DevOps
Useful meeting share 30–40% 65–75%
Metric Cosine similarity of profiles Weighted sum: bio 0.2 + seeking/offering 0.6 + industries 0.2

At an IT investment forum, our matching increased the average meeting score from 0.52 to 0.78 (on a 5-point scale). Participants noted that conversations immediately got down to business.

Networking Matchmaking Algorithm

Below is an example implementation in Python using Sentence Transformers and an LLM for icebreaker generation. The code can be adapted to your stack.

import numpy as np
import pandas as pd
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
from anthropic import Anthropic
import json

class NetworkingMatcher:
    """Матчинг участников мероприятия для нетворкинга"""

    def __init__(self):
        self.encoder = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
        self.llm = Anthropic()

    def build_participant_profile(self, participant: dict) -> dict:
        """Структурированный профиль участника"""
        return {
            'id': participant['id'],
            'name': participant.get('name', ''),
            'role': participant.get('job_title', ''),
            'company': participant.get('company', ''),
            'seeking': participant.get('looking_for', ''),     # Что ищет
            'offering': participant.get('can_offer', ''),      # Что может дать
            'interests': participant.get('topics_of_interest', []),
            'industries': participant.get('industries', []),
            'bio_embedding': self._encode_bio(participant)
        }

    def _encode_bio(self, participant: dict) -> np.ndarray:
        bio_text = f"{participant.get('job_title', '')} at {participant.get('company', '')}. " \
                   f"Interests: {', '.join(participant.get('topics_of_interest', []))}. " \
                   f"Looking for: {participant.get('looking_for', '')}."
        return self.encoder.encode(bio_text, normalize_embeddings=True)

    def compute_match_score(self, p1: dict, p2: dict) -> float:
        """
        Комплементарный матчинг: p1 ищет то, что p2 предлагает, и наоборот.
        Плюс общие интересы для conversation starters.
        """
        # Семантическое сходство биографий (общий контекст)
        bio_similarity = float(cosine_similarity(
            p1['bio_embedding'].reshape(1, -1),
            p2['bio_embedding'].reshape(1, -1)
        )[0, 0])

        # Комплементарность: p1.seeking ↔ p2.offering
        if p1.get('seeking') and p2.get('offering'):
            seeking_offering_sim = float(cosine_similarity(
                self.encoder.encode(p1['seeking'], normalize_embeddings=True).reshape(1, -1),
                self.encoder.encode(p2['offering'], normalize_embeddings=True).reshape(1, -1)
            )[0, 0])
        else:
            seeking_offering_sim = 0.3

        # Обратная комплементарность: p2.seeking ↔ p1.offering
        if p2.get('seeking') and p1.get('offering'):
            reverse_sim = float(cosine_similarity(
                self.encoder.encode(p2['seeking'], normalize_embeddings=True).reshape(1, -1),
                self.encoder.encode(p1['offering'], normalize_embeddings=True).reshape(1, -1)
            )[0, 0])
        else:
            reverse_sim = 0.3

        # Совпадение индустрий
        p1_industries = set(p1.get('industries', []))
        p2_industries = set(p2.get('industries', []))
        industry_overlap = len(p1_industries & p2_industries) / max(len(p1_industries | p2_industries), 1)

        # Взвешенный скор
        score = (
            bio_similarity * 0.20 +
            (seeking_offering_sim + reverse_sim) / 2 * 0.60 +
            industry_overlap * 0.20
        )

        return float(np.clip(score, 0, 1))

    def generate_matches(self, participants: list[dict],
                          matches_per_person: int = 5) -> list[dict]:
        """Генерация персональных нетворкинг-матчей"""
        profiles = [self.build_participant_profile(p) for p in participants]
        n = len(profiles)

        # Матрица скоров
        scores = np.zeros((n, n))
        for i in range(n):
            for j in range(i+1, n):
                score = self.compute_match_score(profiles[i], profiles[j])
                scores[i, j] = score
                scores[j, i] = score

        # Для каждого участника — топ-K матчей
        all_matches = []
        for i, profile in enumerate(profiles):
            top_indices = np.argsort(-scores[i])[:matches_per_person + 1]
            top_indices = [j for j in top_indices if j != i][:matches_per_person]

            for j in top_indices:
                all_matches.append({
                    'participant_a': profile['id'],
                    'participant_b': profiles[j]['id'],
                    'match_score': round(float(scores[i, j]), 3),
                    'icebreaker': self._generate_icebreaker(profile, profiles[j])
                })

        # Дедупликация (каждая пара только один раз)
        seen_pairs = set()
        unique_matches = []
        for match in all_matches:
            pair = tuple(sorted([match['participant_a'], match['participant_b']]))
            if pair not in seen_pairs:
                seen_pairs.add(pair)
                unique_matches.append(match)

        return sorted(unique_matches, key=lambda x: -x['match_score'])

    def _generate_icebreaker(self, p1: dict, p2: dict) -> str:
        """Conversation starter для встречи"""
        response = self.llm.messages.create(
            model="claude-3-5-sonnet-20241022",
            max_tokens=80,
            messages=[{
                "role": "user",
                "content": f"""Write a 1-sentence icebreaker for a networking meeting in Russian.

Person 1: {p1.get('role')} at {p1.get('company')}, looking for: {p1.get('seeking', '')}
Person 2: {p2.get('role')} at {p2.get('company')}, offering: {p2.get('offering', '')}

Highlight the specific synergy. Be concrete and natural."""
            }]
        )
        return response.content[0].text.strip()


class MeetingScheduler:
    """Оптимизация расписания встреч"""

    def schedule_meetings(self, matches: list[dict],
                           participants: dict,
                           time_slots: list[str],
                           meeting_duration_min: int = 15) -> list[dict]:
        """Жадное расписание: максимизируем количество встреч"""
        scheduled = []
        participant_slots = {pid: set() for pid in participants}

        # Сортируем матчи по скору (лучшие первыми)
        sorted_matches = sorted(matches, key=lambda x: -x['match_score'])

        for match in sorted_matches:
            pa, pb = match['participant_a'], match['participant_b']

            # Ищем свободный слот для обоих
            pa_busy = participant_slots[pa]
            pb_busy = participant_slots[pb]

            for slot in time_slots:
                if slot not in pa_busy and slot not in pb_busy:
                    scheduled.append({
                        **match,
                        'time_slot': slot,
                        'duration_min': meeting_duration_min,
                        'location': f"Table {len(scheduled) % 20 + 1}"
                    })
                    participant_slots[pa].add(slot)
                    participant_slots[pb].add(slot)
                    break

        return scheduled
More on selecting the embedding model We use `paraphrase-multilingual-mpnet-base-v2`—it supports 50+ languages and yields 768-dimensional embeddings. For latency below 100ms, you can replace it with `all-MiniLM-L6-v2` (384-dimensional, 40% faster).

How to Run Matchmaking in 3 Steps

  1. Prepare participant profiles in JSON format (fields: seeking, offering, interests, industries).
  2. Pass them to the matcher API—get a list of pairs with complementary scores.
  3. Distribute meeting suggestions with icebreakers through your platform.

The whole process takes less than 5 minutes after integration. For testing, 20 profiles are enough.

Implementation Process and Deliverables

We work turnkey—from requirements audit to post-event analytics.

Stage What We Do Timeline
1. Analytics Gather requirements, current system API, prepare participant profile form 1–2 days
2. Design Tune matching weights, select model (multilingual MPNet or GPT-embedding) 1–2 days
3. Development Build microservice with FastAPI + PyTorch or ONNX for inference 5–10 days
4. Testing A/B test on historical data, verify p99 latency (<200ms) and icebreaker quality 2–3 days
5. Deployment Deploy in your cloud or ours (Kubernetes, vLLM), integrate with email sending 2–3 days

Result includes:

  • API documentation (OpenAPI spec)
  • Matcher source code with Git repository
  • CI/CD pipeline for model updates
  • Training workshop for organizers
  • On-call support during the event

Estimated timelines: from 2 weeks for conferences up to 500 participants, up to 5 weeks for large-scale events with 5000+ people. Cost is calculated individually—contact us for a project estimate.

Common Mistakes in AI Networking Implementation

  • Ignoring complementarity: pure similarity matching yields bland recommendations.
  • Weight imbalance: too much weight on industries creates filter bubbles.
  • Lack of icebreakers: participants don't know how to start a conversation.
  • Late implementation: matching should be launched 2 weeks before the event so participants can confirm meetings.

Why Choose Us?

We have 5+ years of experience in AI/ML for the event industry, with over 20 deployments for conferences ranging from 300 to 10,000 participants. We follow MLOps best practices: model versioning, data drift monitoring, A/B testing. We guarantee that the share of useful meetings will increase at least 1.5 times—or we will refine the algorithm free of charge.

Request a demo: write to us and we'll show live matching on your data. Get architecture and timeline consultation—we'll reply within a day. Contact us to discuss your case and receive an individual assessment.

Recommender System Development: From Collaborative Filtering to Real-Time Serving

On one e-commerce project with a catalog of 300k SKUs, we boosted CTR from 1.8% to 4.4% — a 2.4x increase. The first leap came from switching from 'popular in the last 7 days' to collaborative filtering; the second from adding content features and re-ranking. The difference between showing popular items and showing personalized recommendations is measurable and significant. Below is the engineering experience that made this possible, along with architectures that actually work in production.

Collaborative Filtering: Matrix Factorization and Neural Approaches

Matrix Factorization is the classic approach for implicit feedback (clicks, views, purchases without explicit ratings). ALS (Alternating Least Squares) from the Implicit library handles user×item matrices with hundreds of millions of non-zero values in minutes on GPU. Latent factors 64–256, regularization λ=0.01–0.1 are starting parameters. Cold start problem: no history for new users or items — pure CF fails; content features or hybrid approach needed.

Neural Collaborative Filtering (NCF) replaces the dot product with a neural network. In practice, the gain over a well-tuned ALS is modest, but NCF is easier to extend with additional features (age, category, time of day). Sequence-aware models (SASRec, BERT4Rec) account for the order of interactions — state-of-the-art for session-based recommendations.

How to Choose Recommender System Architecture?

The answer depends on data, load, and cold start requirements. Below are three main approaches with selection criteria.

Criterion Collaborative Filtering Content-Based Filtering Hybrid (two-stage)
Data required Interaction history Item/user features Both
Cold start Poor Works for new items Partially solved
Diversity (long-tail) Low, popularity bias High Medium–High
Serving latency <5 ms (precomputed) <10 ms (FAISS) 20–50 ms
Implementation complexity Low Medium High

Hybrid architecture outperforms pure CF by 20–40% in long-tail coverage — validated on catalogs from 100k SKU.

Content-Based Filtering: When Interaction History is Scarce

Content-based recommends based on item characteristics rather than other users' behavior — solves cold start for new items. Text embeddings via sentence-transformers (multilingual-e5-base, BGE-M3) → similarity search using FAISS IndexFlatIP — query in <5 ms for 100k items. Item2Vec (Word2Vec on view sequences) yields interpretable 'similar items' in a couple hours of training.

Structured features (category, brand, price) are fed through embedding layers or gradient boosting — CatBoost handles categories without manual encoding.

Why Hybrid Models Work Better?

Production systems are almost always two-level. Stage 1 (Retrieval) — fast selection of 100–500 candidates from 300k items using ALS or Two-Tower model with vector search (FAISS, Qdrant). Stage 2 (Ranking) — heavy ranker on LightGBM or neural network with cross-features, time, device, and session context. LightFM is a good starting point for medium scale without heavy infrastructure. Our practice shows: moving from single-stage to two-stage yields a 15–25% accuracy improvement with only 20–30 ms additional latency.

Real-Time Serving: Architecture Under Load

Latency SLA — 50–100 ms at thousands of requests per second. Base recommendations precomputed (batch job hourly) → Redis by user_id → <5 ms. Real-time re-ranking via Kafka for events (clicks, cart adds) → update of context features. Feature serving — Redis with TTL (views in 24 hours, last clicked item). At 10k req/s, we deploy Redis Cluster with replication.

A/B testing is the only reliable way to measure improvements. Offline metrics do not always correlate with online. Kohavi et al., 'Online Controlled Experiments at Large Scale' (KDD 2013) — a must-read for the team. Test on 5–10% of traffic, monitor CTR, conversion, revenue per session. One of our client systems after hybridization increased revenue by 18% over a month of A/B.

Recommender System Development Timeline

The stages and typical time frames are in the table below. Costs are calculated individually based on catalog scale and latency requirements.

Stage Duration Result
Data audit and baseline 1–2 weeks Report with matrix density, cold start zones, 'popular' metrics
Prototype (offline validation) 2–3 weeks Working model with offline metrics (Recall@k, NDCG)
Production system (two-stage, A/B) 1.5–2.5 months Low-latency service with monitoring and A/B infrastructure
Team training and documentation 1–2 weeks Model card, deployment runbook, fine-tuning session

What's Included in Turnkey Development

  1. Data audit — user×item matrix density (typically <0.1%), activity distribution, temporal patterns, cold start statistics.
  2. Baseline — 'popular' as a simple threshold that is often hard to beat.
  3. Iterative improvement — ALS → content features → two-stage → sequence-aware. Each step with A/B.
  4. Serving infrastructure — batch precomputation, Redis, real-time re-ranking, Grafana monitoring.
  5. Documentation — model card with metrics, deployment instructions, feature descriptions.
  6. Team training — session on interpreting results and model fine-tuning.
  7. Support — 1 month post-launch (incident fixes, pipeline tuning).

We are a team with 7+ years of experience in recommender systems, having delivered over 30 projects for e-commerce and media. We guarantee transparent A/B testing and documented metric improvements.

Want to assess the growth potential of your catalog? Contact us for a free data audit. Order recommender system development — first prototype within two weeks.

Example ALS config for implicit feedback
from implicit.als import AlternatingLeastSquares

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

More about the mathematics of recommender systems — in specialized literature.