冲刺模拟面试 1 · 简历技术一面#
面试官画像: AI 团队 Tech Lead,招 Agent 开发实习生,手里拿着你的简历 时长: 45-50 分钟 · 难度: ★★★★☆ 风格: 从简历出发自然追问,每个点追到你说”这个我没做”为止
暖场(3 分钟)#
面试官: 家龙你好,做个简单自我介绍吧。
候选人: 面试官好。我是电子科技大学在读硕士,专业是生物医学工程,目前研二。主要精力在 AI Agent 工程方向——做了两个完整项目:一个是跨境电商购物 Agent(ShoppingX),用户自然语言说需求,系统跨 Amazon、Shopee 等平台并行检索、比价、算到手价,给出带选购理由的商品卡片清单。另一个是智能运维诊断平台(SREOps),从告警到根因定位到自动修复的全流程 Agent。目前在找 Agent 开发方向的实习。
面试官: 生物医学工程转 AI Agent,跨度挺大的,怎么走到这条路的?
候选人: 本科是智能医学工程,有编程和机器学习的基础。研究生阶段接触到大模型后发现 Agent 是把 AI 能力落地成产品的关键环节——不只是调 API,而是要解决工程上的可靠性、可观测性、成本控制。所以从去年 10 月开始做 SREOps 练手,今年 2 月开始做 ShoppingX 系统性地把 Agent 工程的各个模块走通。
第一轮 · ShoppingX 项目概览(8 分钟)#
面试官: 我看你简历里 ShoppingX 写了挺多细节。先整体介绍一下这个项目?
候选人: 核心功能:用户输入”想买便宜又抗造的旅行三件套,预算 300,不要塑料”,系统做四件事——planner 拆解意图成结构化字段,跨平台并行检索 150 万商品数据,算到手价(含关税运费),按偏好精挑出 Top-N 带理由的清单。用户偏好会沉淀为长期记忆,下次自动生效。
技术栈 FastAPI + LangGraph + Qdrant + OpenSearch + BGE-M3 + Langfuse。已公网部署,可注册体验。
面试官: 150 万数据是从哪来的?
候选人: Kaggle 公开数据集,6 个平台的商品 CSV。用 ETL 脚本清洗后灌入 Qdrant 向量库。数据不入 Git,靠脚本复现。其中 Amazon 占了 99%——这是数据偏斜的问题,我们知道但没有去补,因为重点在 Agent 架构而非数据治理。
面试官: 你说”我们”——这个项目是团队还是个人?
候选人: 个人项目,“我们”是口误。从架构设计到代码实现到部署都是我一个人。有一套 18 章的教学文档做设计参考,但代码全部自己写——参考文档的代码片段是网上扒的、不完整也过时,所以定位是学它的设计思想,不照抄代码。
第二轮 · Agent 核心机制深挖(12 分钟)#
面试官: 简历里写”多 Agent 并行调度与安全收敛”——什么叫安全收敛?
候选人: Agent 最常见的失败模式是不收敛——死循环或无限递归。比如子 Agent 不停换关键词重搜,或者自己调终结工具输出推荐文案。安全收敛就是保证 Agent 一定会终止,且终止时有有用的输出。
四层防护:深度闸限制 fork 嵌套层数,迭代上限限制单个 Agent 的 Think-Act 循环次数,循环检测发现连续重复的工具调用模式,结果截断防止单个工具返回过大的文本撑爆上下文。
面试官: 为什么不直接限制总 token 就行了?
候选人: token 限制是最后一道墙,但粒度太粗。子 Agent 可能在 token 限制内跑 20 圈无意义的搜索——每圈 token 不多但浪费时间和 API 调用。迭代上限和循环检测能更早介入。就像你不能只靠 OOM Killer 管内存——得在应用层就有限制。
面试官: 你说”同质 fork”——子 Agent 和父 Agent 完全一样?
候选人: 能力同质但授权不同质。四点差异:第一,子 Agent 关 reasoning 省 token 和延迟。第二,子 Agent 有独立的 thread_id,对话历史隔离。第三,session_dir 继承父的——产物归同一会话目录。第四,深度闸硬拦子 Agent 调 dispatch_tool(防无限嵌套)和终结工具(防子 Agent 越权收尾)。
面试官: 上下文隔离具体怎么做的?
候选人: 两个机制。ContextVar 保存 thread_id 和 session_dir——每次 fork 用 thread_scope 上下文管理器设新值,退出时 reset。然后每次 fork 新建一个独立的 agent 实例——子 loop 的对话历史在自己 task 生命周期内的 messages 列表里,天然和父隔离。没有挂 LangGraph checkpointer——我们是”一请求一进程内 async task”,没有跨进程恢复的需求,挂 checkpointer 只会增加 Redis/Postgres 依赖。
面试官: 那如果进程挂了,任务就丢了?
候选人: 是的。当前设计不支持任务恢复——这是有意的 trade-off。购物查询是无状态的,重新发一次比维护持久化状态的复杂度低得多。将来真要做可恢复任务,加 checkpointer 就行。
第三轮 · Harness 与状态机(10 分钟)#
面试官: 简历里提到”统一 Harness 治理框架”,展开讲讲?
候选人: 核心问题是:修 Agent 的 bad case 时,改 prompt 效果不稳定——LLM 是概率模型,prompt 规则它可能不遵守。Harness 就是在 Agent 循环的关键节点挂确定性代码。
6 个 Hook 点覆盖全生命周期:session_start 初始化、pre_think 注入上下文、pre_tool_call 拦截越权、post_tool_call 断言校验、post_reflect 漂移检测、session_end 收尾。新增一个检查就是加一个文件加一行装饰器,不用改 Agent 主循环代码。
面试官: 给个具体例子?
候选人: 阶段状态机。四阶段:规划→搜索→比较→总结。模型在规划阶段调 item_search 被 pre_tool_call Hook 拦截——返回”当前阶段不允许此操作”。关键设计:拦截而不是摘除工具。因为摘除工具会改变 system prompt 的工具定义,破坏 prompt cache 的前缀匹配——cache miss 多付约 11000 token,而一次无效调用才 50 token。
面试官: 漂移检测怎么做的?
候选人: 每 3 轮在 post_reflect Hook 里触发。检测四类信号:目标遗忘(Agent 跑偏了原始需求)、探索发散(无限扩大搜索范围)、偏好丢失(忘了用户说”不要塑料”)、成本失控(token/API 调用超预期)。检测到后分级处理——轻度注入提示纠正,重度直接走 chat_fallback 终止。
第四轮 · SREOps 快速过(5 分钟)#
面试官: SREOps 也介绍一下?
候选人: 核心是运维告警从接入到修复的自动化。技术亮点在分层调查——三级递进。Tier 1 已知故障匹配 Runbook 直接处置。Tier 2 向量检索相似故障历史,限 3 轮定向验证。Tier 3 才进 ReAct 深度调查。每级未命中自动递进并继承已有证据。
修复操作的安全治理是另一个重点——不让 LLM 生成自由 shell 命令,而是调用参数受限的结构化工具,从源头消除命令注入。高风险操作走审批。
面试官: 这个项目落地了吗?
候选人: 没有接入真实生产环境。它是一个完整的架构实现,用模拟告警跑通了全流程。但缺乏真实运维场景的验证,这也是我做完它后转向 ShoppingX 的原因——ShoppingX 有真实数据、真实 LLM 调用、可以端到端验证效果。
第五轮 · 技能追问(5 分钟)#
面试官: 简历里写了 Java、MySQL、Redis,但项目都是 Python?
候选人: Java 是本科和研究生课程学的,集合框架、JUC 并发、JVM 原理都系统学过。MySQL 和 Redis 也是——索引优化、事务 MVCC、Redis 持久化和分布式锁都掌握。但两个项目确实选了 Python 生态——LangChain/LangGraph 的 Python SDK 更成熟,社区资源也更丰富。
面试官: 如果让你用 Java 重写 ShoppingX 的核心 Agent 循环,你觉得最大的挑战是什么?
候选人: 异步模型。Python 的 async/await 协程很轻量,fork 子 Agent 就是 asyncio.create_task。Java 要么用 CompletableFuture,要么用虚拟线程(Project Loom)。另外 LangChain/LangGraph 目前 Java 版本不成熟,工具声明、消息格式、流式回调这些都得自己封装。
面试官: 你写了”熟练使用 Claude Code”——怎么理解 AI Coding 在开发中的角色?
候选人: 它是生产力工具,不是替代品。我用 Claude Code 做原型验证、写测试、做代码审查。但架构设计、技术选型、故障排查这些需要判断力的工作还是自己做。具体来说——ShoppingX 的 Harness 框架、四层安全防护、阶段状态机这些核心设计都是我自己思考的,AI 工具帮我加速实现和迭代。
收尾(2 分钟)#
面试官: 你对这个实习岗位有什么问题想问的?
候选人: 两个问题。第一,团队目前在 Agent 工程方向最头疼的问题是什么——是可靠性、延迟、还是成本?第二,实习生的 ownership 边界大概是什么样——是参与现有系统的迭代,还是有机会负责一个独立模块?