Overseas Portal – 海外学者智能推荐
Vue 3ViteLangChainPuppeteerMySQL

Overseas Portal – 海外学者智能推荐

自研爬虫抓取 5 万+ 导师信息,LangChain + GPT-4 实现多条件匹配

  • 用户查询响应准确率提升 2×
  • 自动化数据采集和更新机制

项目概述

海外学者智能推荐平台是一个为国内学生提供海外导师匹配服务的 Web 应用。通过自研的爬虫系统收集全球知名高校的导师信息,结合 AI 技术实现智能匹配和个性化推荐。

核心架构

技术栈

  • 前端: Vue 3 + Vite + TypeScript + Element Plus
  • 后端: Node.js + Express + MySQL
  • AI 处理: LangChain + OpenAI GPT-4
  • 数据采集: Puppeteer + 自定义爬虫引擎
  • 部署: Docker + Nginx + PM2

系统架构

核心功能

🕷️ 智能数据采集

// 爬虫核心逻辑
class UniversitySpider {
  async crawlProfessorInfo(universityUrl) {
    const browser = await puppeteer.launch({ headless: true })
    const page = await browser.newPage()

    try {
      await page.goto(universityUrl)

      // 等待页面加载
      await page.waitForSelector('.faculty-list')

      // 提取导师信息
      const professors = await page.evaluate(() => {
        return Array.from(document.querySelectorAll('.professor-item')).map(
          (item) => ({
            name: item.querySelector('.name')?.textContent,
            title: item.querySelector('.title')?.textContent,
            department: item.querySelector('.department')?.textContent,
            research: item.querySelector('.research')?.textContent,
            email: item.querySelector('.email')?.textContent,
            homepage: item.querySelector('.homepage')?.href,
          })
        )
      })

      // 详细信息抓取
      for (let prof of professors) {
        if (prof.homepage) {
          prof.details = await this.crawlProfessorDetails(prof.homepage)
        }
      }

      return professors
    } finally {
      await browser.close()
    }
  }

  async crawlProfessorDetails(profileUrl) {
    // 抓取详细的研究方向、发表论文、项目经历等
    // ...
  }
}

🤖 智能匹配系统

// 智能匹配服务
export class ProfessorMatchingService {
  async matchProfessors(userQuery: UserQuery) {
    // 1. 用户需求分析
    const requirements = await this.parseUserRequirements(userQuery)

    // 2. 向量化查询条件
    const queryVector = await this.vectorizeQuery(requirements)

    // 3. 数据库检索
    const candidates = await this.searchCandidates(queryVector)

    // 4. LLM 增强匹配
    const matches = await this.llmEnhancedMatching(requirements, candidates)

    // 5. 结果排序和过滤
    return this.rankAndFilter(matches, userQuery.preferences)
  }

  private async parseUserRequirements(query: UserQuery) {
    const prompt = `
分析以下用户查询,提取关键信息:
- 研究领域:${query.researchField}
- 目标学位:${query.targetDegree}
- 地区偏好:${query.region}
- 其他要求:${query.otherRequirements}

请提取:研究关键词、学术要求、地理位置、导师特质等维度。
`

    return await this.llm.invoke(prompt)
  }
}

📊 多维度推荐

  • 研究领域匹配: 基于关键词和语义相似度
  • 学术背景: 导师声誉、发表记录、获奖情况
  • 地理位置: 国家、城市、校园环境
  • 个人偏好: 导师风格、实验室规模、资助情况

🔍 高级搜索功能

  • 智能搜索: 自然语言查询支持
  • 多条件筛选: 学校排名、研究方向、招生状态
  • 相似推荐: 基于已选导师推荐相似候选人
  • 收藏管理: 个人导师收藏和对比功能

技术亮点

数据采集优化

  • 数据清洗: 去重、格式标准化、信息补全
  • 增量更新: 只爬取变更内容,提高效率
  • 容错机制: 网络异常重试、数据验证

AI 增强匹配

# 匹配算法核心逻辑
class SmartMatcher:
    def calculate_match_score(self, user_profile, professor_profile):
        scores = {}

        # 1. 研究领域相似度
        research_similarity = self.calculate_research_similarity(
            user_profile.research_interests,
            professor_profile.research_areas
        )
        scores['research'] = research_similarity * 0.4

        # 2. 学术水平匹配度
        academic_match = self.calculate_academic_fit(
            user_profile.academic_background,
            professor_profile.requirements
        )
        scores['academic'] = academic_match * 0.3

        # 3. 地理位置偏好
        location_score = self.calculate_location_preference(
            user_profile.preferred_locations,
            professor_profile.university.location
        )
        scores['location'] = location_score * 0.2

        # 4. 其他因素
        other_factors = self.calculate_other_factors(user_profile, professor_profile)
        scores['others'] = other_factors * 0.1

        return sum(scores.values())

前端优化

  • 虚拟滚动: 处理大量导师数据的展示
  • 懒加载: 图片和详细信息按需加载
  • 缓存策略: 用户搜索结果缓存
  • 响应式设计: 移动端适配

数据规模与质量

数据覆盖

  • 高校数量: 覆盖全球 200+ 知名高校
  • 导师信息: 50,000+ 导师详细档案
  • 研究领域: 覆盖 STEM、人文、社科等各领域
  • 更新频率: 每月全量更新,重要信息实时更新

数据质量

  • 信息完整度: 95% 导师包含基本信息,80% 包含详细研究方向
  • 准确性: 人工抽检准确率 > 92%
  • 时效性: 90% 信息为近一年内数据

用户体验设计

搜索体验

<!-- 智能搜索组件 -->
<template>
  <div class="smart-search">
    <el-input
      v-model="searchQuery"
      placeholder="例如:机器学习方向的美国导师,偏向计算机视觉..."
      @input="handleSearch"
      :loading="searching"
    >
      <template #prefix>
        <el-icon><Search /></el-icon>
      </template>
    </el-input>

    <!-- 搜索建议 -->
    <div class="search-suggestions" v-if="suggestions.length">
      <div
        v-for="suggestion in suggestions"
        :key="suggestion.id"
        @click="selectSuggestion(suggestion)"
        class="suggestion-item"
      >
        {{ suggestion.text }}
      </div>
    </div>
  </div>
</template>

结果展示

  • 卡片式布局: 导师信息一目了然
  • 交互式筛选: 实时筛选结果
  • 对比功能: 多个导师并排对比
  • 详情页: 完整的导师档案展示

业务价值

🎯 用户价值

  • 效率提升: 传统搜索需要数小时,平台 5 分钟完成初筛
  • 信息整合: 一站式获取全球导师信息
  • 智能推荐: AI 推荐准确率比关键词搜索提升 2 倍
  • 决策支持: 多维度对比帮助用户做出明智选择

技术挑战与解决

大规模数据处理

  • 挑战: 50 万条导师信息的存储和检索
  • 解决: 数据库索引优化 + 分页查询
  • 效果: 查询响应时间 < 200ms

反爬虫应对

  • 问题: 部分高校网站有严格的反爬虫机制
  • 策略: 多 IP 代理池 + 模拟真实用户行为 + 分布式爬取
  • 成果: 成功率保持在 85% 以上

数据质量保证

  • 难点: 网站结构差异导致的数据提取错误
  • 方案: 通用模板 + 站点特定规则 + 人工校验
  • 改进: 建立数据质量监控和自动修正机制

🌍 这个项目是我在 AI + 教育领域的早期实践,通过技术手段解决信息不对称问题,为用户创造实际价值。项目展示了我在全栈开发、数据处理和 AI 应用方面的综合能力。