写在前面

上周和做HR的朋友吃饭,她跟我吐槽:"每次招聘季,光看简历就要看到吐,100份里能有10份合适就不错了。" 我当时就想,这不就是个典型的AI应用场景吗?

于是周末两天,我撸了个简历智能筛选工具。成本不到10块钱,准确率能达到80%以上。今天把整个开发过程分享出来,代码全开源,你也能做一个。

一、我想要什么功能?

先别急着写代码,我花了半小时梳理了需求:

核心流程

上传PDF简历 → 提取文本内容 → AI分析能力匹配度 → 输出结构化评分 → 按分数排序

技术选型思路

  • PDF解析:PyPDF2够用了,别整那些花里胡哨的

  • AI大模型:用Claude API,理解能力强,关键是便宜

  • 后端语言:Python,库多好上手

  • 数据格式:JSON,方便后续对接前端

有个问题困扰了我挺久:到底是让AI直接打分,还是我自己写规则? 后来发现两者结合效果最好,后面会细说。

二、开发过程拆解

模块1:把PDF变成文字

一开始我想用OCR,后来发现大部分简历都是可复制的文本型PDF,直接提取就行。

import PyPDF2

def extract_resume_text(pdf_path):
    """提取PDF简历文本"""
    text = ""
    with open(pdf_path, 'rb') as file:
        reader = PyPDF2.PdfReader(file)
        # 遍历每一页
        for page in reader.pages:
            text += page.extract_text()
    return text.strip()

遇到的第一个坑:有些简历是扫描件,PyPDF2提取出来是乱码。解决方案是加个判断,如果提取文本少于100字,就调用OCR库(我用的paddleocr)作为补充方案。

模块2:设计Prompt让AI干活

这是整个项目的核心。我的Prompt经过了3次迭代:

第一版(太简单,效果差):

分析这份简历是否适合Python开发岗位

第二版(加了结构化要求):

你是资深HR,分析简历匹配度。
岗位要求:Python开发,3年经验,熟悉Django
请从技能匹配、经验年限、项目经历三个维度打分(每项10分)

第三版(当前使用,效果最好):

PROMPT_TEMPLATE = """
你是10年经验的技术招聘专家。请分析简历与岗位的匹配度。

【岗位需求】
{job_requirements}

【候选人简历】
{resume_text}

【评分标准】
1. 技术栈匹配度(40分):关键技术必须覆盖80%以上
2. 工作经验(30分):年限要求±1年可接受
3. 项目质量(30分):是否有类似项目经验

请以JSON格式输出:
{{
  "score": 总分,
  "tech_match": 技术栈得分,
  "experience": 经验得分,
  "project": 项目得分,
  "reason": "一句话评价",
  "highlights": ["亮点1", "亮点2"]
}}
"""

调用API的代码:

import anthropic

def analyze_resume(resume_text, job_desc):
    client = anthropic.Anthropic(api_key="你的API密钥")
    
    message = client.messages.create(
        model="claude-sonnet-4-5-20250929",
        max_tokens=1024,
        messages=[{
            "role": "user",
            "content": PROMPT_TEMPLATE.format(
                job_requirements=job_desc,
                resume_text=resume_text
            )
        }]
    )
    
    # 解析JSON结果
    return json.loads(message.content[0].text)

模块3:加点规则提高准确率

纯靠AI有时候会"脑补",我加了关键词硬匹配:

def keyword_bonus(resume_text, keywords):
    """关键词加分机制"""
    bonus = 0
    for word in keywords:
        if word.lower() in resume_text.lower():
            bonus += 2  # 每个关键词+2分
    return min(bonus, 10)  # 最多加10分

比如招Python岗,简历里必须有"Django"或"Flask",否则直接-20分。这个小机制让误判率下降了15%

模块4:批量处理和结果输出

import os
import pandas as pd

def batch_process(resume_folder, job_desc):
    results = []
    
    for filename in os.listdir(resume_folder):
        if filename.endswith('.pdf'):
            # 提取文本
            text = extract_resume_text(
                os.path.join(resume_folder, filename)
            )
            
            # AI分析
            analysis = analyze_resume(text, job_desc)
            
            # 关键词加分
            bonus = keyword_bonus(text, ["Django", "FastAPI"])
            analysis['score'] += bonus
            
            results.append({
                'name': filename,
                'total_score': analysis['score'],
                'reason': analysis['reason']
            })
    
    # 按分数排序
    df = pd.DataFrame(results)
    df = df.sort_values('total_score', ascending=False)
    df.to_excel('ranking.xlsx', index=False)
    
    return df

三、踩过的三个大坑

坑1:Token成本失控

最开始我把整份简历(5000字)全扔给AI,一份简历花3毛钱。后来优化成只提取工作经历和技能部分,成本降到5分钱。

坑2:JSON解析老出错

AI有时候返回的不是标准JSON(比如多了注释),加了try-except + 正则清洗才稳定:

import re

def clean_json(text):
    # 去掉markdown代码块标记
    text = re.sub(r'```json\s*|\s*```', '', text)
    return json.loads(text.strip())

坑3:中文简历识别差

发现AI对中文简历的理解不如英文,解决方案是Prompt里加一句:"如遇中文,请先理解语义再评分"。

四、效果怎么样?

拿朋友公司真实的30份简历测试:

  • 准确率:与HR人工筛选对比,前10名重合度83%

  • 速度:30份简历3分钟搞定(人工要2小时)

  • 成本:总共花了1.5元(Claude API费用)

有个有意思的发现:AI会发现人类忽略的亮点。比如有个候选人虽然经验只有2年,但GitHub有个8k stars的开源项目,AI给了高分,HR差点漏掉。

五、还能怎么优化?

周末的时间只够做个Demo,后续我打算加这些功能:

  1. Web界面:用Streamlit搞个拖拽上传的页面,5分钟能做出来

  2. 简历去重:检测重复投递的候选人

  3. 岗位模板库:预设10个常见岗位的评分标准

  4. 导出HR报告:生成PDF版筛选报告

你觉得还缺什么功能?评论区说说你的想法,点赞前三的我下周实现!

六、完整代码获取

代码已上传GitHub(搜"resume-ai-screener"),包含:

  • 完整源码(200行)

  • 测试简历样本

  • Docker一键部署脚本

  • 视频教程链接

小提示:如果你是AI开发新手,建议先跑通这个项目,再去改。遇到问题先看Issue区,80%的坑别人踩过了。


写在最后

这个项目让我感受到:AI应用的门槛真的降低了。三年前做这个需要训练模型、标注数据,现在只要会写Prompt和调API就行。

你有什么想用AI解决的重复性工作?评论区告诉我,说不定下一篇就是你的点子!

记得关注我,每周更新AI实战项目,咱们一起在2026年把AI玩明白 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐