用 Amazon Bedrock 搭一个 AI 招聘助手:从简历筛选到面试题生成

2026-05-22 32 预计阅读时间:1 分钟
来源:aws.amazon.com AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:14 分钟

招聘流程里最耗时间的环节是什么?不是发 JD,不是安排日程,而是反复阅读大量简历、逐个提炼候选人亮点、再为每个人准备针对性的面试问题。这些工作机械但需要判断力,恰好是 AI 辅助的切入点。本文基于 AWS 官方给出的参考架构,拆解如何用 Amazon Bedrock 构建一个招聘助手——它能加速简历评估、生成个性化面试题、并为人类决策提供数据支撑。注意,这是学习用途的参考架构,不是可直接上线的生产方案。

整体架构:Bedrock 做推理大脑,AWS 服务做管道

核心思路很简单:把招聘流程中需要"理解+生成"的环节交给 Bedrock 上的大模型,外围用 AWS 服务串联数据流转和权限控制。

典型架构包含这些组件:

  • Amazon Bedrock:调用 Claude 或其他基础模型,完成简历摘要、面试题生成、候选人对比等推理任务。
  • Amazon S3:存储原始简历(PDF/DOCX)、职位描述、输出结果。
  • Amazon Lambda:事件驱动的处理节点——简历上传触发解析、面试安排触发题目生成。
  • Amazon DynamoDB:存结构化的候选人评估结果、面试反馈,方便后续查询和对比。
  • Amazon API Gateway:对外暴露 REST 接口,供招聘系统或内部工具调用。
  • Amazon OpenSearch(可选):对简历和评估结果做语义检索,支持"找类似背景的候选人"这类查询。

数据流大致是:简历上传到 S3 → Lambda 触发提取文本 → Bedrock 分析并输出结构化评估 → 结果写入 DynamoDB → 前端通过 API Gateway 查询。

三个核心能力拆解

简历快速评估

传统做法是 HR 逐份阅读,标记关键词。AI 辅助的做法是让模型读取简历全文,输出一份结构化摘要:技能匹配度、经验亮点、潜在短板、与 JD 的对齐评分。

关键在于 prompt 设计——你需要明确告诉模型评估维度和输出格式,而不是让它自由发挥。比如:

你是一位技术招聘评估助手。请根据以下职位描述和候选人简历,输出 JSON 格式的评估结果,包含:
- skills_match:技能匹配度(0-10)
- experience_highlights:经验亮点列表
- concerns:潜在顾虑列表
- overall_alignment:整体对齐评分(0-10)
- summary:一段话摘要

强制 JSON 输出可以让下游 Lambda 直接解析写入 DynamoDB,避免人工二次整理。

个性化面试题生成

批量面试最尴尬的是所有候选人被问同一套题,既无法深挖个人背景,也容易泄露题目。AI 辅助的做法是:基于简历评估结果 + 职位要求,为每个候选人生成定制化问题。

模型拿到候选人技能短板和亮点后,可以生成两类问题:

  • 深挖题:针对简历中声称的经验,追问细节和场景。
  • 补盲题:针对 JD 要求但简历未体现的领域,试探真实水平。

这步同样需要约束输出格式,比如指定问题数量、难度分布、每题附带考察点说明。

数据驱动的候选人对比

当候选人数量多时,人类很难横向对比所有维度。AI 可以把多个候选人的结构化评估汇总成对比矩阵——哪些维度谁领先、整体排名建议、以及需要人类重点判断的模糊地带。

这步不是让 AI 替人做决定,而是把信息压缩成人类能快速消费的形式,最终决策权仍在招聘团队。

实践:一个可运行的 Bedrock 调用示例

下面用 Python + AWS SDK 演示核心环节:调用 Bedrock Claude 模型做简历评估。假设你已经开通 Bedrock 并启用了 Claude 模型访问权限。

import json
import boto3

# 初始化 Bedrock Runtime 客户端
bedrock_runtime = boto3.client(
    service_name="bedrock-runtime",
    region_name="us-east-1"  # 根据你开通的区域调整
)

MODEL_ID = "anthropic.claude-3-sonnet-20240229"

def evaluate_resume(jd_text: str, resume_text: str) -> dict:
    """调用 Bedrock Claude 对简历做结构化评估"""

    system_prompt = """你是一位技术招聘评估助手。
请根据职位描述和候选人简历,严格按以下 JSON 格式输出评估结果:
{
  "skills_match": <0-10的整数>,
  "experience_highlights": [<字符串列表>],
  "concerns": [<字符串列表>],
  "overall_alignment": <0-10的整数>,
  "summary": "<一段话摘要>"
}
只输出 JSON,不要输出其他内容。"""

    user_message = f"""## 职位描述
{jd_text}

## 候选人简历
{resume_text}

请评估该候选人与职位的匹配度。"""

    # Claude 的请求体格式
    request_body = {
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 1024,
        "system": system_prompt,
        "messages": [
            {"role": "user", "content": user_message}
        ]
    }

    response = bedrock_runtime.invoke_model(
        modelId=MODEL_ID,
        body=json.dumps(request_body),
        contentType="application/json",
        accept="application/json"
    )

    response_body = json.loads(response["body"].read())

    # Claude 返回的文本在 content[0].text 中
    raw_output = response_body["content"][0]["text"]

    # 解析 JSON 输出
    try:
        evaluation = json.loads(raw_output)
    except json.JSONDecodeError:
        # 模型偶尔会在 JSON 前后加说明文字,做一次清理
        start = raw_output.index("{")
        end = raw_output.rindex("}") + 1
        evaluation = json.loads(raw_output[start:end])

    return evaluation


# ===== 使用示例 =====
jd = """
高级后端工程师
- 5年以上 Python/Go 开发经验
- 熟悉分布式系统设计和微服务架构
- 有大规模数据处理经验(Spark/Flink)
- 了解 AWS 核心服务
"""

resume = """
张三,8年开发经验
- 6年 Python 后端开发,2年 Go
- 主导过电商订单系统微服务拆分,日均订单量 50万+
- 使用 AWS Lambda + DynamoDB 构建过实时库存同步服务
- 无 Spark/Flink 经验,数据处理主要用 Pandas + PostgreSQL
"""

result = evaluate_resume(jd, resume)
print(json.dumps(result, indent=2, ensure_ascii=False))

运行前需要:

  1. pip install boto3
  2. AWS 凭证已配置(aws configure 或环境变量)
  3. 在 AWS Console 的 Bedrock 中已申请 Claude 模型访问权限(默认需要手动申请,通常几小时内批准)

预期输出大致如下:

{
  "skills_match": 7,
  "experience_highlights": [
    "6年 Python + 2年 Go,语言栈匹配",
    "主导微服务拆分,有实际分布式系统经验",
    "使用 AWS Lambda + DynamoDB,云服务经验对齐"
  ],
  "concerns": [
    "无 Spark/Flink 经验,大规模数据处理能力存疑",
    "数据处理停留在单机工具层面"
  ],
  "overall_alignment": 7,
  "summary": "张三在后端开发和微服务架构上经验扎实,AWS 实践也对齐,但大规模数据处理经验缺失是主要短板,需面试中重点验证学习能力和补盲意愿。"
}

拿到这个结构化结果后,Lambda 可以直接写入 DynamoDB,后续查询和对比都基于这些字段,不再依赖人工阅读原始简历。

面试题生成的 Lambda 集成思路

评估完成后,下一步是生成面试题。可以在同一个 Lambda 中串联调用,或者用 Step Functions 编排两步流程。核心改动只是 prompt:

def generate_interview_questions(evaluation: dict, jd_text: str) -> list:
    """基于评估结果生成个性化面试题"""

    system_prompt = """你是一位技术面试设计助手。
根据候选人评估结果和职位要求,生成5道面试题,严格按以下 JSON 格式输出:
{
  "deep_dive_questions": [
    {"question": "<问题文本>", "target": "<考察的简历亮点>", "difficulty": "medium"}
  ],
  "gap_probe_questions": [
    {"question": "<问题文本>", "target": "<考察的技能缺口>", "difficulty": "hard"}
  ]
}
只输出 JSON。"""

    user_message = f"""## 职位描述
{jd_text}

## 候选人评估
{json.dumps(evaluation, ensure_ascii=False)}

请生成面试题。深挖题针对简历亮点追问细节,补盲题针对缺失技能试探真实水平。"""

    # 调用逻辑与 evaluate_resume 相同,仅替换 prompt
    request_body = {
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 1024,
        "system": system_prompt,
        "messages": [{"role": "user", "content": user_message}]
    }

    response = bedrock_runtime.invoke_model(
        modelId=MODEL_ID,
        body=json.dumps(request_body),
        contentType="application/json",
        accept="application/json"
    )

    raw_output = json.loads(response["body"].read())["content"][0]["text"]
    return json.loads(raw_output[raw_output.index("{"):raw_output.rindex("}")+1])

上线前必须考虑的边界

这个架构是学习参考,搬上生产需要补几层:

维度 参考架构状态 生产需要补什么
简历隐私 S3 默认加密 需加 KMS 加密 + 严格 IAM 策略,简历是敏感个人信息
模型偏见 未处理 招聘场景偏见风险高,需做输出审查、多模型交叉验证
幻觉控制 依赖 prompt 需加事实校验层——模型可能编造简历中不存在的信息
并发与成本 未优化 Bedrock 按 token 计费,大批量简历需做预算控制和限流
人类复核 未设计 AI 评估必须作为辅助输入,最终决策流程需强制人类审批节点
合规 未覆盖 不同地区对 AI 参与招聘有法规要求(如欧盟 AI Act),需法务评估

一个快速上手清单

如果你打算动手试这个架构,建议按这个顺序推进:

  1. 开通 Bedrock + 申请模型权限——这是前置条件,没权限什么都跑不了。
  2. 先用上面的 Python 脚本手动跑几份简历——验证 prompt 效果,调整评估维度和输出格式直到满意。
  3. 搭建 S3 + Lambda 自动化管道——简历上传自动触发评估,结果落 DynamoDB。
  4. 加面试题生成环节——串联在评估之后,用 Step Functions 编排更清晰。
  5. 加人类复核界面——哪怕是个简单的内部网页,让招聘团队能看到 AI 评估并做最终判断。
  6. 做偏见和幻觉测试——用已知简历验证模型是否捏造信息、是否对特定群体有倾向性输出。

AI 招聘助手的价值不在替代人,在于把机械的信息提取和整理工作压缩到秒级,让人类把时间花在真正需要判断力的环节。Bedrock 给了推理能力,AWS 服务给了工程管道,但招聘的公平性和准确性——这部分只能由人来兜底。


相关推荐