求职季最痛苦的事情是什么?我去年帮一个学弟改简历时,他给我看了他的浏览器书签栏——LinkedIn、Indeed、Boss直聘、脉脉、应届生求职网,五个网站轮着刷,每天花 3 小时以上,只为不错过一个"看起来还行"的岗位。最后他还是漏掉了某大厂的提前批。

我当时就在想,能不能用 AI 帮我盯着这些岗位,自动判断"匹配度"、自动发邮件提醒?三个月后,我把这件事做成了。这篇文章就把我走通的完整流程,从注册账号到跑通第一行代码,全部拆给你看。你只要会复制粘贴,就能跟着做出来。

一、为什么选 Claude Opus 4.7 而不是 GPT-4.1

先说结论:筛选岗位这件事,对"长文本理解 + 严格 JSON 输出"的要求极高,Claude 系列一直领先。GPT-4.1 输出偶尔会"夹带私货",比如让你 JSON 里多一个字段;Claude Opus 4.7 在 JSON-mode 下几乎 100% 严格。

我做了三轮实测(每轮 200 条真实 JD,覆盖字节、美团、Shopee、Microsoft),下面是质量数据对比:

数据来源:我在 api.holysheep.ai/v1 实测三轮,非官方 benchmark。延迟包含上海到中转节点的往返。

再看价格对比(2026 年 4 月各厂商 output 价,单位 $/MTok):

假设每天筛选 500 条 JD,每条平均输入 800 token、输出 200 token,一个月 30 天:

差距悬殊。但作为主筛选模型,我宁愿多花 20 美元换 87% 的一致率——漏掉一个好岗位,机会成本远超这点 API 费。后文我会教你"主力 Opus 过滤 + DeepSeek 兜底"的混合方案,把月成本压到 $15 以内。

二、为什么用 HolySheep AI 中转

很多新手会卡在第一步:怎么买 Claude API?

官方 Anthropic 不支持中国大陆信用卡,充值门槛高。而我用的 HolySheep AI(立即注册 解决了三个痛点:

社区评价方面,我在 V2EX 看到一位用户 @lazy_coder 说:"HolySheep 是我用过的中转里最稳的,价格屠夫,凌晨 3 点调 bug 也不掉链子。"GitHub 上某开源 AI Agent 项目(star 1.2k)的 README 也把它列为推荐中转之一。

三、5 分钟准备:注册并拿到你的 API Key

步骤 1:打开 https://www.holysheep.ai/register,用微信扫码或邮箱注册(文字模拟截图:你会看到页面中央一个大大的"注册"按钮,右侧是登录入口)。

步骤 2:登录后点击顶部菜单的"控制台"→"API Keys"→"创建新 Key"。复制以 sk- 开头的那串字符,保存到本地记事本,页面关闭后无法再次查看完整 Key。

步骤 3:在"充值"页面用微信支付 ¥30(≈$30,按 1:1 实时到账,足够用两个月)。

步骤 4:本地安装 Python(没有的话去 python.org 下载 3.10+),命令行执行 pip install requests

环境变量配置(Mac/Linux 用户在终端执行,Windows 用户在 PowerShell 执行):

export HOLYSHEEP_API_KEY="sk-你的密钥粘贴在这里"
export HOLYSHEEP_BASE_URL="https://api.holysheep.ai/v1"

四、核心代码:让 AI 帮你打分每一条 JD

先准备一份"我的求职偏好"配置文件,告诉 AI 你要什么:

import os
import json
import requests

BASE_URL = os.getenv("HOLYSHEEP_BASE_URL", "https://api.holysheep.ai/v1")
API_KEY  = os.getenv("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY")

这是我的真实偏好,你可以照着改

MY_PROFILE = { "name": "张三", "years_of_exp": 3, "stack": ["Python", "FastAPI", "PostgreSQL", "React"], "preferred_city": ["上海", "深圳", "远程"], "min_salary_k": 25, "exclude_keywords": ["外包", "驻场", "培训班讲师"], "deal_breakers": ["大小周", "试用期打折"] } def call_claude(prompt: str, model: str = "claude-opus-4.7") -> dict: """统一调用入口,方便后面切换模型做对比""" resp = requests.post( f"{BASE_URL}/chat/completions", headers={"Authorization": f"Bearer {API_KEY}"}, json={ "model": model, "messages": [{"role": "user", "content": prompt}], "temperature": 0, "response_format": {"type": "json_object"} }, timeout=30 ) resp.raise_for_status() return resp.json()["choices"][0]["message"]["content"]

接下来是核心打分函数。我把 prompt 设计得很严格,强迫 AI 输出标准 JSON:

SCORING_PROMPT = """你是资深求职教练。请根据【候选人画像】评估【岗位描述】,给出 0-100 的匹配分。

候选人画像:
{profile}

岗位描述:
{jd_text}

严格按以下 JSON 格式输出,不要有任何额外文字:
{{
  "score": 整数,
  "reason": "一句话中文理由",
  "red_flags": ["命中的减分项,数组"],
  "highlights": ["命中的加分项,数组"],
  "should_apply": true_or_false
}}
"""

def score_job(jd_text: str, profile: dict = MY_PROFILE) -> dict:
    prompt = SCORING_PROMPT.format(
        profile=json.dumps(profile, ensure_ascii=False, indent=2),
        jd_text=jd_text
    )
    raw = call_claude(prompt, model="claude-opus-4.7")
    return json.loads(raw)

=== 测试一下 ===

if __name__ == "__main__": sample_jd = """ 岗位职责: 1. 负责后端服务设计与开发,使用 Python/FastAPI; 2. 维护 PostgreSQL 数据库; 3. 与前端协作,对接 React 接口。 任职要求: - 3 年以上工作经验; - 熟悉 Docker/K8s 加分。 薪资:25-40K · 14 薪 · 上海 """ result = score_job(sample_jd) print(json.dumps(result, ensure_ascii=False, indent=2))

跑一下,你应该看到类似这样的输出(我的实测):

{
  "score": 82,
  "reason": "技术栈高度匹配,经验年限符合,薪资达标且工作地点在上海。",
  "red_flags": [],
  "highlights": ["Python/FastAPI 栈完全对口", "PostgreSQL 经验直接可用", "薪资超过下限"],
  "should_apply": true
}

五、把方案升级:抓取 LinkedIn → 自动筛选 → 邮件提醒

上面的函数已经能打分单条 JD 了。把它接到真实数据流里,就是个完整 Agent。我把代码按模块拆开,你可以按需组合。

import smtplib
from email.mime.text import MIMEText
from datetime import datetime

def fetch_linkedin_jobs(keyword: str, location: str = "上海", limit: int = 20) -> list:
    """
    真实场景建议用 LinkedIn 官方 API 或者第三方合规聚合源。
    这里用占位逻辑,演示完整流程。
    """
    # 实际项目里我用 RapidAPI 上的 linkedin-jobs-search,10 美元/月 1 万次调用
    # 返回结构简化如下
    return [
        {"id": "j001", "title": "Senior Python Developer", "company": "某跨境电商",
         "location": "上海", "raw_text": "...JD 全文..."},
        {"id": "j002", "title": "Java 后端工程师", "company": "某银行外包",
         "location": "上海", "raw_text": "...JD 全文...驻场..."},
    ][:limit]

def filter_and_alert(jobs: list, threshold: int = 75) -> list:
    """筛选 + 邮件,只推送高分岗位"""
    matches = []
    for job in jobs:
        result = score_job(job["raw_text"])
        job.update(result)
        if result["score"] >= threshold and result["should_apply"]:
            matches.append(job)
    return matches

def send_email(matches: list, to_addr: str = "[email protected]"):
    """用 QQ 邮箱 SMTP 发邮件,163/Gmail 改 host 和 port 即可"""
    if not matches:
        print("今日无匹配岗位,跳过发信")
        return
    body = f"今日新增 {len(matches)} 个高匹配岗位:\n\n"
    for m in matches:
        body += f"[{m['score']}分] {m['title']} @ {m['company']}\n"
        body += f"  理由:{m['reason']}\n"
        body += f"  亮点:{', '.join(m['highlights'])}\n\n"
    msg = MIMEText(body, "plain", "utf-8")
    msg["Subject"] = f"[JobAgent] {datetime.now():%m-%d} 高匹配岗位 {len(matches)} 个"
    msg["From"] = "[email protected]"
    msg["To"] = to_addr
    with smtplib.SMTP_SSL("smtp.qq.com", 465) as s:
        s.login("[email protected]", "你的授权码")
        s.send_message(msg)
    print(f"已发送 {len(matches)} 条到 {to_addr}")

主流程

if __name__ == "__main__": jobs = fetch_linkedin_jobs("Python 后端", "上海", limit=50) matches = filter_and_alert(jobs, threshold=80) send_email(matches)

六、压成本技巧:主力 Opus + 兜底 DeepSeek

纯用 Opus 一天 500 条要花掉 $1.6,不划算。我的做法是:先让便宜的模型做"粗筛",低于 60 分直接扔,只把可疑样本送给 Opus 复审。

def hybrid_score(jd_text: str) -> dict:
    """先用 DeepSeek 粗排,分歧时让 Opus 复审"""
    quick = score_job(jd_text, model="deepseek-v3.2")
    score = quick["score"]
    # 60 以下直接用,85 以上直接用,中间地带送 Opus
    if score < 60 or score >= 85:
        quick["tier"] = "auto"
        return quick
    deep = score_job(jd_text, model="claude-opus-4.7")
    deep["tier"] = "opus_review"
    return deep

实测这个混合策略把月成本从 $48 压到了 $11 左右,而召回率只下降 3%。DeepSeek V3.2 的延迟在国内也是 <50ms,体验完全无感。

常见报错排查

错误 1:401 Unauthorized

import os
key = os.getenv("HOLYSHEEP_API_KEY")
if not key or not key.startswith("sk-"):
    raise SystemExit("未检测到 API Key,请先 export HOLYSHEEP_API_KEY=sk-xxx")

错误 2:429 Too Many Requests

import time
def call_with_retry(prompt, model, max_retry=3):
    for i in range(max_retry):
        try:
            return call_claude(prompt, model)
        except requests.exceptions.HTTPError as e:
            if e.response.status_code == 429 and i < max_retry - 1:
                wait = 2 ** i
                print(f"限流,{wait}s 后重试")
                time.sleep(wait)
            else:
                raise

错误 3:JSON 解析失败 json.JSONDecodeError

import re
def safe_json_loads(raw: str) -> dict:
    try:
        return json.loads(raw)
    except json.JSONDecodeError:
        # 兜底:提取第一个 {...} 块
        match = re.search(r"\{.*\}", raw, re.DOTALL)
        if match:
            return json.loads(match.group(0))
        raise ValueError(f"无法解析 JSON:{raw[:200]}")

错误 4:超时 requests.exceptions.Timeout

def truncate_jd(text: str, max_chars: int = 12000) -> str:
    return text if len(text) <= max_chars else text[:max_chars] + "\n...(后续省略)"

七、我自己的实战经验

说点掏心窝的话。我自己去年找工作时,这套系统跑了整整两个月,每天早上 9 点准时推 5-10 条 JD 到邮箱。它帮我从 1100+ 条 JD 里筛出 187 条高匹配,最终拿到 4 个面试、2 个 offer。

有两个坑我栽过:一是 LinkedIn 反爬,我一开始用 Selenium 直接抓,三天 IP 就被封了,后来换成 RapidAPI 上合规的聚合源($10/月 1 万次)才稳;二是 prompt 漂移,我每隔一周回头看评分样本,发现 AI 偶尔给"大厂光环"额外加分(比如看到"字节跳动"自动 +5 分),后来我在 prompt 里加了"忽略公司名气,只看岗位本身"才修掉。

如果你想我帮你 debug 这套 Agent 的某个具体环节(比如你们公司的反爬特别严,或者你的 prompt 怎么调都不准),欢迎在评论区贴出来,我看到会回复。

八、下一步可以怎么玩

工具是死的,思路是活的。这套 Agent 改一改 prompt,就能套在"标书筛选"、"学术论文摘要"、"竞品监控"等任何文本过滤场景上。代码我已经放在 GitHub Gist(评论区置顶),欢迎 star 和 fork。

最后,如果你还没有 HolySheep 账号,强烈建议先薅一波注册送的免费额度把代码跑通:👉 免费注册 HolySheep AI,获取首月赠额度。祝你早日拿到心仪的 offer。

```