AI职位推荐系统

一个基于Python的职位推荐系统,结合生成式AI和模型上下文协议(MCP),提供个性化的、可解释的职位推荐。

  • by armster01
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 armster01/Generative_AI-Powered_Job_Recommender_System_with_MCP

使用说明

基于MCP的生成式人工智能作业推荐系统

一个基于Python的工作推荐系统,将生成式人工智能与模型上下文协议(MCP)相结合,以生成个性化、可解释的工作推荐。该存储库包含用于数据预处理、模型训练/推理、评估的代码、示例和工具,以及用于提供建议的轻量级API。

注:存储库标题中的“MCP”是指项目的模块化组件管道,用于组合数据处理、候选排名和生成解释模块。如果您更喜欢MCP的不同扩展,请在文档中替换它。

状态:原型/研究——适应和扩展生产。

特性

  • 使用机器学习和检索技术进行候选人生成和排名
  • 生成性解释模块,为每个推荐的工作创建清晰、个性化的理由
  • 用于混合和匹配组件的模型上下文协议(MCP):特征化器、检索器、排名器和解释器
  • 离线测试的评估指标和实用程序
  • 用于训练、推理和运行REST API的示例脚本

目录

  • 项目结构
  • 快速开始
  • 安装
  • 配置和环境变量
  • 数据准备
  • 训练
  • 运行推理/API
  • 评估
  • 开发笔记
  • 贡献
  • 许可证
  • 联系

项目结构(建议)

  • data/--原始和处理的数据集(未签入)
  • src/-包含模型、管道和API代码的Python包
    • src/pipeline/--MCP组件(检索器、排序器、解释器)
    • src/models/——模型定义和包装器(ML/排名/生成)
    • src/utils/--助手:预处理、指标、持久性
    • src/api/——FastAPI/Flask服务器提供推荐
  • 笔记本电脑/-EDA和模型原型
  • 测试/--单元/集成测试
  • 需求.txt
  • README.md
  • configs/--示例配置文件

快速启动(本地开发)

  1. 克隆仓库

    git clone https://github.com/armster01/Generative_AI-Powered_Job_Recommender_System_with_MCP.git
    cd Generative_AI-Powered_Job_Recommender_System_with_MCP
    
  2. 创建并激活虚拟环境(推荐)

    python -m venv .venv
    source .venv/bin/activate   # macOS/Linux
    .\.venv\Scripts\activate    # Windows (PowerShell)
    
  3. 安装依赖项

    pip install -r requirements.txt
    

    如果您还没有需求文件,典型的软件包包括:

    • fastapi/uvicorn
    • 变压器/句子变压器
    • scikit学习
    • 熊猫/numpy
    • faiss cpu(或faiss gpu)
    • 火炬/张量流(取决于模型)
    • pytest

配置和环境变量

  • OPENAI_API_KEY:(可选)用于使用OPENAI生成模型
  • APIFY_API_TOKEN:用于从NAUKRI&LINKEDIN中提取信息
  • HF_API_TOKEN:(可选)适用于抱脸私人模特
  • MLFLOW_ACKING_URI:(可选)如果使用MLFLOW进行实验
  • DATABASE_URL:(可选)用于持久化

在shell或.env文件中设置变量。例子:

export OPENAI_API_KEY="sk-..."
export HF_API_TOKEN="hf_..."

数据准备

  1. 将原始职位发布和用户交互放在data/raw/中。
  2. 运行预处理以创建特征和候选索引:
    python -m src.utils.preprocess --input data/raw/jobs.csv --output data/processed/jobs.parquet
    python -m src.pipeline.build_index --jobs data/processed/jobs.parquet --index-dir data/indexes/
    
  3. 示例脚本/笔记本显示了预期的格式(job_id、标题、描述、技能、位置、posted_date)和用户事件(user_id、job_id、event_type、时间戳)。

训练

  • 训练排名模型或微调编码器:
    python -m src.models.train_ranker --config configs/ranker.yaml
    
  • 微调句子编码器以进行检索:
    python -m src.models.train_encoder --data data/processed/train.parquet --output models/encoder
    

推理(CLI)

  • 运行一个简单的离线推理来获得前K名推荐:
    python -m src.pipeline.recommend --user-id 123 --top-k 10 --index data/indexes/ --model models/ranker
    
  • 输出是一个JSON/CSV,带有推荐的作业ID、分数和生成解释(如果启用)。

运行API(使用FastAPI的示例)

  1. 启动API服务器(如果不同,请替换入口点):
    uvicorn src.api.main:app --host 0.0.0.0 --port 8000 --reload
    
  2. HTTP请求示例: POST/推荐
    {
      "user_id": 123,
      "context": {
        "current_title": "Data Analyst",
        "skills": ["sql", "python", "tableau"]
      },
      "top_k": 5,
      "explain": true
    }
    
    回复包括推荐的工作、排名分数和每个工作的自然语言解释。

生成性解释模块

  • 解释者使用以下方式构建个性化的理由:
    • 用户资料信号(技能、头衔、历史)
    • 职位发布内容和标签
    • 排名特征和分数细分
  • 它可以使用本地模型(Transformers)或外部API(OpenAI/拥抱脸)。在环境变量中配置API键。

评估

  • 支持的离线指标:
    • 排名:NDCG@k地图,Precision@k, Recall@k
    • 多样性和新颖性指标
    • 可解释性:可选的人工评估或自动启发式
  • 运行评估:
    python -m src.utils.evaluate --predictions outputs/preds.json --ground-truth data/processed/gt.parquet --metrics ndcg@10,precision@5
    

开发笔记

  • 保持组件模块化:
    • 检索器:使用向量相似性或词汇过滤器生成候选项
    • Ranker:结合特征的监督模型
    • 解释者:基于模板或生成模型
  • 为每个组件的测试添加单元测试
  • 在数据/样本/中使用小样本数据进行快速迭代

最佳实践和提示

  • 使用嵌入和ANN(FAISS)进行可扩展检索;为大型语料库保持索引分片
  • 记录实验(流量/权重和偏差)并持久化模型伪影
  • 对生成模型的输入进行消毒,以避免产生幻觉;包括接地背景
  • 限制解释长度,确保敏感信息不泄露

贡献

  • 发现错误或想要功能?通过以下方式打开问题:
    • 复制步骤
    • 最小数据集/样本输入
    • 错误日志
  • 拉请求:fork→ 特性分支→ 打开PR。保持更改较小,并包括测试。
  • 在docs/和示例笔记本中添加或更新文档。

致谢

  • 受推荐系统和可解释人工智能研究的启发。
  • 使用开源库:拥抱脸、模糊、scikit-learn、FastAPI等。

联系

  • 维修人员:armster01
  • 如有疑问或合作想法,请打开问题或通过GitHub个人资料与我联系。

接下来要添加什么

  • Dockerfile+docker-compose用于一个命令运行
  • 用于测试和除尘的CI管道
  • 示例数据集和可重复实验笔记本
  • 更强大的评估工具(A/B模拟、在线指标)

如果你愿意,我可以:

  • 生成starter requirements.txt和示例配置文件
  • 为数据摄取和培训创建示例笔记本
  • Dockerfile草案和一个小型FastAPI应用程序支架 告诉我你接下来想要什么,我会准备文件的。