招聘流程里最耗时间的环节是什么?不是发 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))
运行前需要:
pip install boto3- AWS 凭证已配置(
aws configure或环境变量) - 在 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),需法务评估 |
一个快速上手清单
如果你打算动手试这个架构,建议按这个顺序推进:
- 开通 Bedrock + 申请模型权限——这是前置条件,没权限什么都跑不了。
- 先用上面的 Python 脚本手动跑几份简历——验证 prompt 效果,调整评估维度和输出格式直到满意。
- 搭建 S3 + Lambda 自动化管道——简历上传自动触发评估,结果落 DynamoDB。
- 加面试题生成环节——串联在评估之后,用 Step Functions 编排更清晰。
- 加人类复核界面——哪怕是个简单的内部网页,让招聘团队能看到 AI 评估并做最终判断。
- 做偏见和幻觉测试——用已知简历验证模型是否捏造信息、是否对特定群体有倾向性输出。
AI 招聘助手的价值不在替代人,在于把机械的信息提取和整理工作压缩到秒级,让人类把时间花在真正需要判断力的环节。Bedrock 给了推理能力,AWS 服务给了工程管道,但招聘的公平性和准确性——这部分只能由人来兜底。