Разработка AI-системы поиска экспертизы внутри компании
Expertise Locator — система, которая помогает сотрудникам найти коллег с нужными знаниями и опытом. В крупной организации не очевидно, кто разбирается в конкретной технологии, отраслевом регулировании или имел опыт решения похожей задачи. AI строит граф экспертизы из неструктурированных данных.
Источники сигналов о экспертизе
Формальные: профиль в корпоративной системе, HR-данные о роли и образовании, сертификаты, история проектов.
Неформальные: публикации во внутренней wiki (Confluence), комментарии в code review (GitHub/GitLab), вопросы/ответы во внутреннем Slack, авторство документов, упоминания в email-переписке.
Внешние: LinkedIn (с согласия сотрудника), публикации в блогах, выступления на конференциях, GitHub профиль.
Построение профиля экспертизы
class ExpertiseProfileBuilder:
def build_profile(self, employee_id: str) -> ExpertiseProfile:
signals = []
# Confluence: анализ написанных страниц
wiki_pages = self.confluence.get_authored_pages(employee_id)
for page in wiki_pages:
topics = self.topic_extractor.extract(page.content)
signals.extend([ExpertiseSignal(
source="wiki",
topic=t.topic,
strength=t.score * page.views / 100, # популярные страницы = больший вес
evidence_url=page.url
) for t in topics])
# GitHub: коммиты по типам файлов и библиотекам
commits = self.github.get_commits(employee_id)
tech_usage = analyze_tech_stack(commits)
signals.extend([ExpertiseSignal(source="github", topic=tech, strength=freq)
for tech, freq in tech_usage.items()])
# Slack: темы обсуждений, на которые отвечает сотрудник
slack_answers = self.slack.get_answers_given(employee_id)
answer_topics = self.topic_extractor.extract_batch([a.text for a in slack_answers])
signals.extend(answer_topics)
# Агрегация: взвешенная сумма по источникам
expertise_map = aggregate_signals(signals)
return ExpertiseProfile(
employee_id=employee_id,
expertise=expertise_map,
top_skills=sorted(expertise_map.items(), key=lambda x: x[1], reverse=True)[:20],
last_updated=datetime.utcnow()
)
Поиск эксперта
def find_experts(
query: str,
filters: ExpertFilters = None,
top_k: int = 5
) -> list[ExpertMatch]:
# Семантическое сопоставление запроса с профилями экспертизы
query_embedding = encoder.encode(query)
expert_embeddings = load_expert_embeddings()
similarities = cosine_similarity(query_embedding, expert_embeddings)
top_indices = np.argsort(similarities)[-top_k:][::-1]
results = []
for idx in top_indices:
expert = experts[idx]
# Применение фильтров: отдел, локация, доступность
if filters and not filters.matches(expert):
continue
results.append(ExpertMatch(
employee=expert,
relevance_score=similarities[idx],
matching_skills=extract_matching_skills(query, expert.expertise),
availability=check_calendar_availability(expert.employee_id),
evidence=[s for s in expert.signals if s.relevance_to(query) > 0.6]
))
return results
Уведомление о конфиденциальности
Система строится на данных, которые сотрудники создают в рабочих инструментах. Важно: явное уведомление сотрудников о том, какие данные используются, возможность отказаться от отдельных источников, запрет на использование данных в HR-оценке (только для помощи коллегам).
Граф знаний компании
Помимо поиска людей — граф знаний показывает: какие технологии/темы покрыты хорошо, где есть риск single point of failure (один эксперт в области), кто является ключевыми коннекторами между командами. Для HR и топ-менеджмента — основа для решений о найме и развитии компетенций.







