Install
openclaw skills install @yangchao228/resume-interview-generator基于候选人简历自动生成面试题、笔试题、追问路径和评分标准的 AI Skill。当用户需要准备技术面试、生成笔试题目、评估候选人简历、或设计面试评估方案时使用。输入简历内容和岗位信息后,自动输出结构化的题目与评估内容,支持面试题模式、笔试题模式、综合评估模式等多种输出形式。 Follow/关注作者:微信公众号「AI生命克劳德」|X @yangchao228|GitHub https://github.com/yangchao228
openclaw skills install @yangchao228/resume-interview-generator基于候选人简历内容,自动生成面试题、笔试题、追问路径与评分标准,帮助面试官快速完成候选人评估准备。
技能内置 5 个难度等级:
| 等级 | 工作年限 | 核心要求 |
|---|---|---|
| 实习生 | 应届/在校 | 基础概念、学习能力、项目参与真实性 |
| 初级 | 1-3 年 | 独立完成需求、技术栈熟练度、代码质量 |
| 中级 | 3-5 年 | 复杂业务处理、性能优化、跨模块协作 |
| 高级 | 5-8 年 | 架构设计、系统治理、技术决策 |
| 资深 | 8 年以上 | 技术战略、组织效能、业务技术融合 |
项目经历(3 题,含追问与行为协作考察)
基础能力(5 题)
场景设计(中级及以上,2 题)
代码能力(2 题,手写代码)
收集以下信息(带 * 为必填):
分析简历,形成"简历画像":
技术画像:
项目画像:
风险识别:
根据目标级别,按以下维度生成题目:
按题型生成:
客观题(5-6道)
简答题(3-4道)
编程题(2-3道)
设计题(2-3道,中级及以上)
每道题必须提供 3 个版本(版本A/版本B/版本C),方便面试官根据候选人情况选择。每个版本包含:
3 个版本的设计原则:
## 候选人画像
- **工作年限**:X 年
- **目标级别**:实习生/初级/中级/高级/资深
- **岗位方向**:从岗位信息或简历中识别的方向
## 核心技术栈
- **语言**:从简历中提取的主要编程语言
- **框架**:从简历中提取的主要框架
- **中间件**:从简历中提取的缓存、消息队列、搜索等组件
- **数据库**:从简历中提取的数据库
## 重点项目
1. **项目名称**:从简历中提取的项目名
- **角色**:候选人在项目中的角色
- **技术亮点**:项目中最值得追问的技术点
- **量化成果**:简历中明确出现的结果数据;如没有,标注“未提供”
## 亮点识别
- 列出候选人最值得验证的亮点
## 风险点与待验证项
- 列出简历中模糊、夸大或需要追问验证的表述,并给出验证方式
## 建议重点验证方向
1. 最值得深挖的方向
2. 第二优先级验证方向
## 一、项目经历考察(融合行为协作)
### 题目 1:[考察主题,如"Redis缓存设计"]
**【版本A】标准版**
**具体问题**:
你在项目中使用 Redis 做缓存时,是怎么设计缓存更新策略的?
**出题原因**:
考察候选人对缓存一致性的理解,以及是否真正处理过实际业务场景。
**重点考察点**:
- 技术能力:缓存一致性策略(Cache Aside/Write Through等)
- 行为协作:是否与产品/业务方沟通过期策略
**参考答案**:
1. 首先应该说明选用的策略,最常用的是 Cache Aside(旁路缓存)
2. 需要说明缓存穿透、击穿、雪崩的应对方案
3. 应该提到过期时间的设置策略和业务场景的结合
4. 如果涉及分布式锁,说明使用场景和实现方式
**追问方向**:
- 技术追问:如果缓存和数据库数据不一致,你们是怎么发现的?怎么处理?
- 行为追问:这个过期策略是你定的还是和业务方一起定的?如果业务方要求数据实时性很高,你怎么沟通?
- 压力追问:你说你们系统QPS很高,能说一下具体多高吗?缓存命中率是多少?
**回答质量判断**:
- **优秀**:能清晰说出策略选择原因,主动提及三种缓存问题及解决方案,有具体数据支撑
- **合格**:能说出基本策略,知道缓存穿透等问题,但解决方案不够完善
- **风险**:只说用了Redis做缓存,说不清楚更新策略,或说"用的框架自动处理"
**建议评分**:15分(满分20分)
---
**【版本B】深入版**
**具体问题**:
你们系统中 Redis 缓存和数据库是如何保证最终一致性的?有没有遇到过不一致的情况,当时是怎么发现和解决的?
**出题原因**:
深入考察候选人对分布式系统一致性的理解,以及问题排查和解决能力。
**重点考察点**:
- 技术能力:分布式一致性、问题排查、监控告警
- 行为协作:推动问题解决的能力
**参考答案**:
1. 说明具体的缓存更新策略,以及为什么选择这种策略
2. 描述可能出现不一致的场景(如更新失败、并发竞争等)
3. 说明监控手段:如何发现不一致(对账、校验、报警)
4. 说明解决方案:重试机制、补偿机制、人工介入流程
5. 提及预防措施:事务、分布式锁、消息队列等
**追问方向**:
- 技术追问:你们有没有做缓存和数据库的对账?是怎么做的?频率如何?
- 行为追问:如果发现了数据不一致,但影响范围不确定,你会怎么处理?
- 压力追问:如果老板说"缓存绝对不能和数据库不一致",你会怎么回应?
**回答质量判断**:
- **优秀**:能系统性地描述完整方案,包括预防、发现、解决全流程,有实际案例
- **合格**:能说出几种不一致场景和基本解决方案,但对监控和对账描述不清
- **风险**:否认会出现不一致,或说"我们没遇到过这种情况"
**建议评分**:20分(满分20分)
---
**【版本C】基础版**
**具体问题**:
你们项目里为什么要用 Redis?用它做了什么事情?
**出题原因**:
验证候选人是否真实使用过 Redis,了解其对基础概念的掌握。
**重点考察点**:
- 技术能力:Redis 基础使用场景
- 行为协作:在团队中承担的角色
**参考答案**:
1. 说明使用 Redis 的业务场景(如缓存热点数据、Session存储等)
2. 说明选择 Redis 的原因(速度快、数据结构丰富等)
3. 提及使用过程中的注意事项(如内存限制、持久化等)
4. 说明自己在其中的具体工作
**追问方向**:
- 技术追问:Redis 是什么类型的数据库?和 MySQL 有什么区别?
- 行为追问:这个 Redis 是你自己搭的还是运维搭建的?遇到问题找谁?
- 压力追问:Redis 是单线程的,你们怎么知道性能够不够用?
**回答质量判断**:
- **优秀**:能清晰说明场景和原因,主动对比其他方案,提到实际使用细节
- **合格**:能说出基本使用场景,但细节不够丰富
- **风险**:说不清楚具体做了什么,或场景明显不合理
**建议评分**:12分(满分20分)
---
**【面试官选用建议】**
- 候选人基础较弱或简历描述较模糊 → 选用 **版本C**
- 候选人表现正常,需要标准考察 → 选用 **版本A**
- 候选人表现优秀,希望深入挖掘 → 选用 **版本B**
## 二、基础能力考察
每个题目延续版本A/版本B/版本C结构,覆盖具体问题、出题原因、重点考察点、参考答案、追问方向、回答质量判断和建议评分。
## 三、场景设计考察(中级及以上)
每个题目延续版本A/版本B/版本C结构,重点考察系统设计、方案取舍、边界条件、故障处理和长期演进能力。
## 四、代码能力考察(手写代码)
**总时长**:10-20 分钟
### 题目:实现一个 LRU 缓存
**【版本A】标准版**
**具体问题**:
请手写代码实现一个简单的 LRU(最近最少使用)缓存,支持 get 和 put 操作。
**要求**:
- 使用你熟悉的编程语言
- get 和 put 操作时间复杂度为 O(1)
- 考虑容量限制,超出容量时淘汰最久未使用的数据
**参考思路**:
1. 使用 HashMap + 双向链表实现
2. HashMap 存储 key 到链表节点的映射
3. 双向链表维护访问顺序,头部为最近使用,尾部为最久未使用
4. get 时移动到头部,put 时如果已满则移除尾部
**参考答案**(Java示例):
```java
class LRUCache {
class Node {
int key, value;
Node prev, next;
Node(int k, int v) { key = k; value = v; }
}
private int capacity;
private Map<Integer, Node> map;
private Node head, tail;
public LRUCache(int capacity) {
this.capacity = capacity;
map = new HashMap<>();
head = new Node(0, 0);
tail = new Node(0, 0);
head.next = tail;
tail.prev = head;
}
public int get(int key) {
if (!map.containsKey(key)) return -1;
Node node = map.get(key);
moveToHead(node);
return node.value;
}
public void put(int key, int value) {
if (map.containsKey(key)) {
Node node = map.get(key);
node.value = value;
moveToHead(node);
} else {
if (map.size() >= capacity) {
Node toRemove = tail.prev;
removeNode(toRemove);
map.remove(toRemove.key);
}
Node newNode = new Node(key, value);
map.put(key, newNode);
addToHead(newNode);
}
}
private void moveToHead(Node node) {
removeNode(node);
addToHead(node);
}
private void removeNode(Node node) {
node.prev.next = node.next;
node.next.prev = node.prev;
}
private void addToHead(Node node) {
node.next = head.next;
node.prev = head;
head.next.prev = node;
head.next = node;
}
}
评分标准:
【版本B】进阶版
具体问题: 请实现一个支持过期时间的 LRU 缓存,每个 key 可以设置独立的过期时间,过期后自动清理。
附加要求:
参考思路:
评分重点:
【版本C】简化版
具体问题: 请实现一个固定大小的缓存,支持插入和查询操作,当缓存满时新数据替换最旧的数据。
要求:
参考思路:
评分重点:
【面试官选用建议】
### 笔试题输出模板
```markdown
## 编程题
### 题目:实现一个带过期时间的本地缓存
**难度**:初级/中级/高级
**建议时长**:30 分钟
**题目描述**:
请实现一个本地缓存,支持写入键值对、读取键值对,并支持为每个 key 设置过期时间。读取已过期 key 时应返回不存在,并清理该 key。
**示例**:
输入:`put("a", 1, ttl=1000ms)`,500ms 后 `get("a")`
输出:`1`
**解题思路**:
1. 使用 Map 存储 key 到 value、expireAt 的映射
2. get 时判断当前时间是否超过 expireAt,过期则删除并返回不存在
**评分点**:
- 基础实现(10分):能正确 put / get
- 边界处理(5分):能处理过期、覆盖写入、空值等情况
- 复杂度优化(5分):能说明惰性删除与定时清理的取舍
**参考答案**:
```语言
代码示例
## 不同级别出题深度指南
参考 [references/level-guidelines.md](references/level-guidelines.md) 了解 5 个级别的详细出题深度要求。
## 岗位专项题库参考
参考 [references/tech-questions.md](references/tech-questions.md) 获取常见技术栈的出题参考。
## 作者入口
- 微信公众号:`AI生命克劳德`
- X:[@yangchao228](https://x.com/yangchao228)
- GitHub:[yangchao228](https://github.com/yangchao228)