基于Flask和AI的智能简历分析系统开发全流程

先看效果!!

1. 项目简介

随着企业招聘需求的不断增加,HR每天需要处理大量简历,如何高效筛选匹配度高的候选人成为一大挑战。本文介绍一个基于Flask框架和AI技术的智能简历分析系统,能够自动评估简历与职位要求的匹配度,大幅提高招聘效率。

2. 项目功能

2.1 核心功能

  1. 简历批量上传:支持PDF、DOCX、TXT格式及ZIP压缩包
  2. 职位要求设置:可自定义职位描述和要求
  3. 智能匹配分析:利用AI模型评估简历匹配度
  4. 可视化结果展示:图表和排名展示候选人匹配情况
  5. 报告导出:支持导出详细分析报告和Excel排名表

2.2 技术亮点

  • 多线程并发处理大量简历
  • 智能重试机制保证分析可靠性
  • 响应式前端界面适配多种设备
  • 完善的错误处理和日志记录

3. 技术架构

3.1 前端技术

html 复制代码
<!-- 主要前端技术 -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css">
<script src="https://unpkg.com/dropzone@5/dist/min/dropzone.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  • Bootstrap 5:构建响应式界面
  • Font Awesome:图标库
  • Animate.css:动画效果
  • Dropzone.js:文件上传组件
  • Chart.js:数据可视化

3.2 后端技术

python 复制代码
# 主要后端技术栈
from flask import Flask, render_template, request, jsonify, send_file
from flask_dropzone import Dropzone
import pdfplumber
from docx import Document
from concurrent.futures import ThreadPoolExecutor
import requests
  • Flask:轻量级Web框架
  • pdfplumber:PDF解析库
  • python-docx:Word文档处理
  • ThreadPoolExecutor:多线程处理
  • Requests:HTTP请求库

4. 核心代码解析

4.1 简历解析模块

python 复制代码
def parse_resume(file_path):
    """解析多种格式的简历文件"""
    try:
        if file_path.endswith('.pdf'):
            with pdfplumber.open(file_path) as pdf:
                text = "\n".join([page.extract_text() or "" for page in pdf.pages])
        elif file_path.endswith('.docx'):
            doc = Document(file_path)
            text = "\n".join([para.text for para in doc.paragraphs])
        elif file_path.endswith('.txt'):
            encodings = ['utf-8', 'gbk', 'gb2312', 'iso-8859-1']
            for encoding in encodings:
                try:
                    with open(file_path, 'r', encoding=encoding) as f:
                        text = f.read()
                    break
                except UnicodeDecodeError:
                    continue
        # 文本清洗处理
        text = re.sub(r'\s+', ' ', text)
        return text.strip()
    except Exception as e:
        logger.error(f"解析失败 [{os.path.basename(file_path)}]: {str(e)}")
        return None

4.2 AI分析模块

python 复制代码
def call_gpt_api(prompt, attempt=1):
    """调用AI分析API,带重试机制"""
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }
    data = {
        "model": "deepseek-v3-250324",
        "messages": [
            {"role": "system", "content": "简历分析专家,专注评估候选人与职位要求的匹配度"},
            {"role": "user", "content": prompt}
        ],
        "temperature": 0.2
    }
    
    try:
        response = requests.post(API_URL, headers=headers, json=data, timeout=REQUEST_TIMEOUT)
        response.raise_for_status()
        return {
            "status": "success",
            "result": response.json()['choices'][0]['message']['content'],
            "attempt": attempt
        }
    except Exception as e:
        logger.error(f"API请求错误 (尝试 {attempt}/{MAX_RETRIES}): {str(e)}")
        return {"status": "retry", "error": str(e), "attempt": attempt}

4.3 多线程处理

python 复制代码
def process_resumes(resume_files, position_requirements):
    """多线程处理简历分析"""
    results = []
    with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
        futures = {executor.submit(analyze_resume, path, position_requirements): path 
                  for path in resume_files}
        
        for future in as_completed(futures):
            path = futures[future]
            try:
                result = future.result()
                with FILE_LOCK:  # 线程锁保证数据安全
                    results.append(result)
            except Exception as e:
                logger.error(f"分析过程出错: {str(e)}")
    
    return results

5. 前端交互设计

系统采用现代化UI设计,关键界面包括:

html 复制代码
<div class="upload-area">
    <div id="upload-button" class="upload-btn">
        <i class="fas fa-plus"></i>
    </div>
    <p class="upload-text">
        点击<b>+</b>按钮或将文件拖拽到此处上传
    </p>
</div>
html 复制代码
<div class="chart-container">
    <canvas id="matchChart"></canvas>
</div>

<!-- 排名卡片 -->
<div class="row g-4 mb-5">
    {% for resume in top_resumes %}
    <div class="col-md-4 col-lg-3">
        <div class="position-relative">
            <div class="rank-badge top-3-badge rank-{{ loop.index }}">
                {{ loop.index }}
            </div>
            <div class="card result-card h-100">
                <!-- 卡片内容 -->
            </div>
        </div>
    </div>
    {% endfor %}
</div>

6. 部署与配置

系统使用Flask内置的配置管理系统:

python 复制代码
class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') 
    DEBUG = False
    UPLOADED_PATH = os.path.join(os.path.dirname(__file__), 'uploads')
    MAX_CONTENT_LENGTH = 50 * 1024 * 1024  # 50MB
    
    # API配置
    API_URL = "ht"
    API_KEY = os.environ.get('API_KEY')

7. 项目收获与改进方向

通过开发这个项目

  1. Flask框架的深入理解
  2. 文件处理的多格式兼容经验
  3. 多线程编程实践
  4. API集成与错误处理技巧

未来改进方向:

  1. 增加更详细的候选人技能标签
  2. 实现自动生成面试问题功能
  3. 添加多用户和权限管理系统
  4. 优化AI提示词提高分析准确率