用 AI Agent 做面试准备和面试复盘:我写了一个Skill,把多轮面试当成系统来打
用 AI Agent 做面试准备和面试复盘:我写了一个Skill,把多轮面试当成系统来打
作为一个经历过无数次“技术面+HR面+交叉面”毒打的程序员,我深知面试不是单点战斗,而是一场多轮次的“系统游戏”。每一轮面试都有不同的“Boss”(面试官)、不同的“关卡目标”(考核点),以及不同的“技能树”(回答策略)。如果只是零散地背题,效率极低;如果只复盘单轮,又会丢失全局视角。后来我意识到:为什么不把面试当作一个可以“存档/读档”的RPG游戏,用AI Agent来当我的外挂教练? 于是我写了一个名为 InterviewBoss 的 Skill——它不只是问答机器人,而是一个能管理多轮面试状态、生成针对性题目、并在每轮结束后自动做复盘的系统。本文会从最基础的“AI Agent 是什么”讲起,逐步深入到如何用代码实现一个支持“多轮面试模拟+复盘”的 Agent Skill。全程附可运行代码,建议你边读边跑。### 1. 基础概念:AI Agent 和 Skill 到底是什么?简单说,AI Agent 是一个能感知环境、做出决策并执行动作的智能体。在编程语境下,它通常指一个“能调用工具、能记忆上下文、能自主规划步骤”的大模型应用。而 Skill 是我给这个 Agent 写的一组“技能包”——包含提示词模板、状态管理逻辑和工具函数,让 Agent 能完成特定任务(比如面试模拟)。最基础的一个 Skill 就是一个“面试官角色扮演”。我们不需要复杂框架,只用一个函数 + 大模型 API 就能跑通。看下面这个最小示例:python# 最小可运行的面试 Agent Skill(伪代码,依赖 openai 库)import openaidef interview_skill(question: str, context: list) -> str: """ 一个最简单的面试官 Agent。 :param question: 用户回答或提问 :param context: 历史对话列表 [{"role": "user"/"assistant", "content": ...}] :return: Agent 的回复(下一个面试问题或点评) """ system_prompt = """ 你是一位资深技术面试官,擅长考察系统设计和算法。 你的风格是:先追问细节,再给提示,最后才给答案。 每次只问一个问题,不要连续问多个。 """ messages = [{"role": "system", "content": system_prompt}] + context messages.append({"role": "user", "content": question}) response = openai.ChatCompletion.create( model="gpt-4", messages=messages, temperature=0.7 ) return response.choices[0].message.content# 使用示例history = [{"role": "assistant", "content": "请先简单描述一下你的项目架构。"}]user_input = "我用的是微服务架构,有用户服务、订单服务和库存服务。"reply = interview_skill(user_input, history)print(reply) # 输出:那么你觉得订单服务如何保证库存一致性?这个 Skill 已经很能“拷问”人了,但它没有记忆——每轮面试后状态就丢了。要把它升级成“多轮系统”,我们需要引入结构化状态管理。### 2. 进阶:把多轮面试当成“关卡系统”来设计真正的多轮面试,每一轮有不同的目标。比如:- 第一轮(电话初筛):基础技术栈 + 沟通能力。- 第二轮(技术面):算法 + 项目深度。- 第三轮(系统设计):架构能力。- 第四轮(HR面):软素质 + 薪资期望。我的 Skill 用了一个 BossState 字典来记录每轮的状态,包括当前轮次、已问问题、得分点、以及需要复盘的信息。这样 Agent 就能“记住”你答得不好的地方,在下一轮有针对性地出题。下面是一个升级版代码,展示如何用状态机管理多轮面试:python# 多轮面试状态管理 Agent Skill(核心逻辑)class InterviewBossAgent: def __init__(self, rounds_config: list): """ rounds_config: 例如 [ {"name": "技术面", "focus": ["算法", "数据结构"], "target_score": 8}, {"name": "系统设计", "focus": ["高并发", "缓存"], "target_score": 7}, {"name": "HR面", "focus": ["沟通", "文化匹配"], "target_score": 6}, ] """ self.rounds_config = rounds_config self.current_round = 0 self.state = { "score": 0, "answered_questions": [], "weak_points": set(), "feedback": [] } def start_next_round(self): """进入下一轮面试,重置部分状态但保留复盘信息""" if self.current_round >= len(self.rounds_config): return "所有轮次结束,系统生成总结报告。" round_info = self.rounds_config[self.current_round] self.state["score"] = 0 self.state["answered_questions"] = [] self.current_round += 1 return f"开始第 {self.current_round} 轮:{round_info['name']},重点考察 {round_info['focus']}" def submit_answer(self, user_answer: str) -> str: """ 提交一轮内的回答,Agent 内部评估并更新状态。 这里简化:用关键词匹配作为“评分模型”,实际可替换为LLM打分。 """ round_info = self.rounds_config[self.current_round - 1] focus_keywords = round_info["focus"] # 简单评分:回答中提到重点关键词越多,得分越高 score_this_answer = sum(1 for kw in focus_keywords if kw in user_answer) self.state["score"] += score_this_answer self.state["answered_questions"].append(user_answer) # 记录弱点 if score_this_answer < len(focus_keywords) / 2: self.state["weak_points"].update(focus_keywords) # 如果得分超过阈值,结束本轮 if self.state["score"] >= round_info["target_score"]: self.state["feedback"].append(f"第{self.current_round}轮通过,得分{self.state['score']}") return self.start_next_round() else: return f"继续回答,当前得分 {self.state['score']},还差 {round_info['target_score'] - self.state['score']}" def get_replay_report(self): """面试结束后的复盘报告""" report = "=== 面试复盘报告 ===\n" report += f"弱项:{list(self.state['weak_points'])}\n" report += "轮次表现:\n" for idx, fb in enumerate(self.state['feedback'], 1): report += f" {idx}. {fb}\n" return report# 使用示例agent = InterviewBossAgent([ {"name": "技术面", "focus": ["算法", "数据结构"], "target_score": 2}, {"name": "系统设计", "focus": ["高并发", "缓存"], "target_score": 2},])print(agent.start_next_round()) # 开始技术面print(agent.submit_answer("我熟悉排序算法,但不太懂哈希表"))print(agent.submit_answer("我会用动态规划解决背包问题"))print(agent.submit_answer("高并发用消息队列,缓存用Redis"))print(agent.get_replay_report())这段代码跑起来后,你会看到 Agent 自动管理轮次、记录弱点,并在最后生成复盘报告。但这里有个致命缺陷:评分逻辑太死板,实际面试中回答质量不是靠关键词就能衡量的。### 3. 高级:用大模型做智能评分与动态追问要把这个 Skill 变成真正好用的“面试外挂”,我们需要让 LLM 来评判回答,并基于上下文自动生成下一问。下面这个实现结合了状态管理 + LLM 判断,支持“答得不好就追问,答得好就换知识点”。python# 高级版:结合 LLM 进行动态评分和追问import jsonfrom openai import OpenAIclient = OpenAI() # 需要设置 OPENAI_API_KEYclass SmartInterviewAgent: def __init__(self, resume_summary: str): self.resume = resume_summary self.rounds_left = ["技术面", "系统设计", "HR面"] self.weaknesses = [] self.current_round_idx = 0 self.qa_history = [] def _call_llm(self, messages: list) -> str: resp = client.chat.completions.create( model="gpt-4", messages=messages, temperature=0.5 ) return resp.choices[0].message.content def evaluate_answer(self, question: str, answer: str) -> dict: """ 让 LLM 评估回答质量,返回得分(0-10)和弱点。 """ prompt = f""" 你是面试评分系统。问题:{question} 候选人回答:{answer} 请返回 JSON 格式:{{"score": 0-10, "weakness": "具体弱点描述"}} 只返回 JSON。 """ result_text = self._call_llm([{"role": "user", "content": prompt}]) try: result = json.loads(result_text) except: result = {"score": 5, "weakness": "无法解析"} if result["score"] < 6: self.weaknesses.append(result["weakness"]) return result def next_question(self, last_answer: str) -> str: """ 根据上一轮回答,动态生成下一问。 如果得分低,则追问同一知识点;如果得分高,则切换新领域。 """ if not self.qa_history: return "请先介绍你最熟悉的项目,我会深挖细节。" last_q, last_a = self.qa_history[-1] eval_result = self.evaluate_answer(last_q, last_a) if eval_result["score"] < 6: prompt = f"候选人回答得不够好,弱点:{eval_result['weakness']}。请针对同一知识点再追问一个更深入的问题。" else: prompt = f"候选人回答不错。请换一个不同的问题,当前轮次是{self.rounds_left[self.current_round_idx]}。" return self._call_llm([{"role": "system", "content": prompt}, {"role": "user", "content": last_a}])# 使用示例(伪代码,需真实API Key)# agent = SmartInterviewAgent("5年后端经验,擅长Java和分布式")# print(agent.next_question(""))# 之后每轮调用 agent.next_question(user_answer) 即可这个版本真正做到了“把多轮面试当成系统来打”:每一轮由 LLM 动态出题,根据回答质量自适应难度,并且自动记录弱点用于最终复盘。你甚至可以把 weaknesses 导出为 Markdown,形成一份专属的“面试错题本”。### 4. 实战:完整复盘报告生成最后,我写了一个工具函数,把整个面试过程中的所有 Q&A 和弱点汇总成一份结构化复盘文档,方便你面试后对照练习:pythondef generate_replay_report(agent: SmartInterviewAgent) -> str: """ 生成 Markdown 格式的面试复盘报告。 """ report = "# 面试复盘报告\n\n" report += f"## 弱项清单\n" for i, w in enumerate(agent.weaknesses, 1): report += f"{i}. {w}\n" report += "\n## 完整问答记录\n" for idx, (q, a) in enumerate(agent.qa_history, 1): report += f"### 问题 {idx}\n**Q:** {q}\n\n**A:** {a}\n\n" report += "---\n*由 InterviewBoss Skill 自动生成*" return report# 假设 agent 已经完成模拟面试# with open("replay.md", "w") as f:# f.write(generate_replay_report(agent))### 总结通过这篇文章,我带你从零构建了一个“面试系统”级别的 AI Agent Skill:1. 基础层:用最简单的函数实现“面试官角色扮演”。2. 进阶层:引入状态管理,把多轮面试拆解成可追踪的关卡,记录得分和弱点。3. 高级层:利用 LLM 做动态评分和追问,让 Agent 能自适应你的水平,像真人面试官一样深挖。4. 实战层:自动生成可读性强的复盘报告。这套 Skill 的核心思想是:面试不是一次性的问答,而是一个可管理、可优化的系统。你可以把它扩展成支持语音交互、接入真实面试录像分析、甚至和 LeetCode 题库联动。希望我的这个“面试外挂”思路能给你启发——毕竟,会写代码的人,连面试都能自动化。
更多推荐


所有评论(0)