Skip to main content
Glama
ak8x6

TalentBridge Lebanon

by ak8x6

TalentBridge Lebanon

ИИ-агент для подбора карьеры для ливанских выпускников компьютерных наук. Загрузите резюме, и LLM-агент анализирует профиль, извлекает вакансии из встроенного корпуса вакансий по семантическому сходству, вычисляет детерминированный разрыв навыков для каждой вакансии, переранжирует с учётом ливанских и уровневых сигналов и составляет персонализированный план повышения квалификации на 4 недели — от начала до конца за ~15–20 секунд.

Живое демо: https://talent-bridge-lebanon.lovable.app

Результаты (эталонный запуск: 2026-08-20 15:51)

Метрика

Значение

Среднее Precision@5

0,84 по 15 размеченным резюме

Этап поиска

467 мс на резюме (анализ резюме + эмбеддинг + векторный поиск)

Полный запуск агента

~15–20 секунд от начала до конца, включая шаги LLM

Покрытие индекса

180 из 180 вакансий встроено


Зачем этот проект

Ливанские выпускники CS подают заявки вслепую: доски вакансий основаны на ключевых словах, не понимают переносимых навыков и не говорят, почему вас отклонили или что учить дальше. TalentBridge замыкает этот цикл с помощью агента с дополненной генерацией (RAG), который измерим — каждое изменение ранжирования проверяется на размеченном эталоне из 15 резюме с встроенным механизмом Precision@5.

Related MCP server: bach-jsearch

Набор данных

Корпус из 180 вакансий и размеченные эталонные резюме являются синтетическими, созданными с помощью ИИ. Названия должностей, уровни старшинства и комбинации навыков были смоделированы на основе реальных вакансий из Ливана и региона, чтобы распределение отражало реальный рынок, при этом названия компаний вымышлены. Данные были созданы по двум причинам: не существует публичного набора данных о ливанских вакансиях, который можно было бы использовать, а эталон требует правильной метки трека для каждой вакансии, которой нет у собранных объявлений.

Прямое ограничение заключается в том, что результаты демонстрируются на чистых, хорошо структурированных записях. Производительность на реальных объявлениях, которые более хаотичны и часто неполны, не измерялась.

Возможности

  • Агентный конвейер — parse_cv → search_jobs → reflect_on_results → analyze_gap → build_plan, детерминированно оркестрируется с повторной попыткой на основе рефлексии.

  • Семантический поиск — эмбеддинги 384 измерений по 180 вакансиям, точный косинусный поиск в Postgres (pgvector).

  • Детерминированная, защищённая от галлюцинаций оценка — совпадающие/отсутствующие навыки и готовность вычисляются в коде из required_skills базы данных, а не моделью. Повествовательный текст выводится из этих точных наборов, поэтому текст никогда не может противоречить спискам.

  • Переранжирование с приоритетом Ливана — итоговый балл = 0.35·семантика + 0.20·готовность + 0.25·местоположение + 0.15·старшинство + 0.05·домен, с многоуровневым соответствием местоположения (ливанский город 1.0 → удалённо 0.95 → MENA 0.75) и штрафом за завышенный уровень.

  • Встроенная оценка — /eval запускает весь набор размеченных резюме и сообщает среднее Precision@5 и среднюю задержку поиска, с историей запусков в рамках сессии.

  • Анализ PDF в браузере — pdfjs-dist извлекает текст резюме на стороне клиента; ничего не сохраняется до начала сопоставления.

  • MCP-сервер — /mcp предоставляет search_jobs, get_job, assess_fit и job_index_stats, так что любой MCP-клиент (Claude, Cursor, …) может запрашивать корпус.

  • Загружаемый отчёт — страница результатов экспортирует отчёт в Markdown, идентичный тому, что на экране.

Архитектура

Browser (React 19 + TanStack Start)
  │  PDF text extraction (pdfjs-dist)
  ▼
Server functions (createServerFn, Cloudflare Workers runtime)
  ├─ parse_cv          LLM  → profile, skills (+inferred, cited), domains
  ├─ years/level       code → merged work periods, Intern/Junior/Mid
  ├─ search_jobs       embed query → match_jobs_vector() over pgvector
  ├─ reflect_on_results LLM → topical relevance check, max 1 retry (pooled results)
  ├─ analyze_gap       code → matched/missing skills, readiness %
  ├─ rerank            code → weighted blend (semantic/readiness/location/seniority/domain)
  └─ build_plan        LLM  → 4-week plan grounded in the missing skills
       ▼
Postgres (Supabase + pgvector): jobs, candidates, agent_runs, eval_cvs, eval_results

Технологический стек

Слой

Выбор

Фреймворк

TanStack Start v1 (React 19, Vite 7, SSR на Cloudflare Workers)

Стили

Tailwind CSS v4 + shadcn/ui

База данных

Postgres с pgvector (Supabase / Lovable Cloud)

LLM

google/gemini-2.5-flash (+ gemini-2.5-pro для шагов, требующих рассуждений) через Lovable AI Gateway

Эмбеддинги

openai/text-embedding-3-small, 384 измерения

Взаимодействие агента

Сервер Model Context Protocol на /mcp

Структура репозитория

src/routes/            file-based routes: / (run agent), /results, /admin, /eval, /mcp
src/lib/agent.server.ts   the agent: parsing, retrieval, gap analysis, re-ranking, planning
src/lib/agent.config.ts   single source of truth for models and prompt guardrails
src/lib/skill-match.ts    canonical skill normalisation + shared matched/missing logic
src/lib/eval.server.ts    Precision@5 benchmark harness across the labelled CV set
src/lib/mcp/             MCP server and its four tools
supabase/migrations/     full schema: tables, RLS, grants, match_jobs_vector()
data/                    exported datasets (180 jobs; 15 labelled benchmark CVs + 2 demo profiles)

Страницы

Маршрут

Назначение

/

Выберите эталонное резюме или загрузите своё, затем запустите агента.

/results

Разобранный профиль, топ-5 совпадений с процентом совпадения, анализ разрыва для каждого совпадения, план на 4 недели, загрузка отчёта. Только для сессии — посетители никогда не видят чужой запуск.

/admin

Индекс вакансий: импорт CSV, покрытие эмбеддингов, проверка целостности корпуса.

/eval

Запускает агента по каждому размеченному резюме и сообщает среднее Precision@5 и среднюю задержку поиска.

Оценка

Истинные метки хранятся в eval_cvs.relevant_job_ids. Для каждого резюме механизм запускает тот же самый конвейер, который получает посетитель (включая переранжирование), и вычисляет Precision@5 = |top5 ∩ relevant| / 5, затем усредняет по набору вместе с задержкой поиска для каждого резюме. Поскольку релевантность определяется треком и совместимым старшинством, изменения ранжирования проверяются, а не угадываются.

Запуск локально

git clone https://github.com/ak8x6/talent-bridge-lebanon.git
cd talent-bridge-lebanon
bun install
bun run dev            # http://localhost:8080

Если вы предпочитаете npm:

npm install
npm run dev            # http://localhost:8080

Переменные окружения (требуется .env, ни одна не закоммичена):

VITE_SUPABASE_URL=...
VITE_SUPABASE_PUBLISHABLE_KEY=...
LOVABLE_API_KEY=...        # server-side only: LLM + embedding gateway

Настройка базы данных: примените supabase/migrations/*.sql по порядку, импортируйте data/jobs.csv через /admin, затем нажмите Generate embeddings. Загрузите data/eval_cvs.csv в eval_cvs, чтобы включить эталон.

Замечания по безопасности

  • Никаких секретов в клиентском коде; ключи шлюза читаются только внутри обработчиков серверных функций.

  • Безопасность на уровне строк и явные привилегии для каждой публичной таблицы.

  • Столбец track никогда не раскрывается через поиск, интерфейс или MCP-инструменты — это только метка оценки.

  • Промпты запрещают вывод пола по именам; весь генерируемый текст гендерно нейтрален.

Лицензия

MIT © 2026 Ahmad Kassem — см. LICENSE.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server that exposes job search data from multiple boards, enabling clients to query and manage job listings via natural language.
    7
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for the WorkLink Partner API that enables searching live job vacancies and tenders in Syria.
    2 npm
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    GetJobzi MCP server for job search, application tracking, and career forecasting.
    -