第1节 面试与作品集:Agent循环工程师的高频问题全解
一句话总结:Agent岗位面试题库解析——循环设计/验证器/上下文管理/失效模式四大高频主题+系统设计题答题框架+手撕代码题。
本文导航
- 一、2026年的Agent面试,考的已经不是"会不会调API"
- 二、四大高频主题逐题拆解(含参考答案)
- 三、系统设计题:七步答题框架实战
- 四、手撕代码题:15分钟写一个能跑的ReAct循环
- 五、反问环节与谈薪:别在这一轮掉链子
- 六、作品集:让面试官主动想聊的东西
- 小结
一、2026年的Agent面试,考的已经不是"会不会调API"
第15章的八个行业场景讲完,这门课的技术内容就全部交付了。但技术讲完不等于事情完了——所有能力最终都要落回同一个问题:它怎么变成你的职业筹码。所以最后一章我们回到你自己:面试怎么答、简历怎么写、团队怎么推、企业怎么落,最后再聊聊风险和远方。先从面试说起。
我在2024年底面过一轮"AI应用工程师",面试官让我讲怎么用LangChain拼一个Chain,我讲得挺顺,对方也挺满意。到2026年再面"Agent循环工程师",画风完全变了:没人关心你用什么框架,所有人都盯着一件事——当模型不确定、工具会失败、上下文会爆炸的时候,你的系统怎么办。
这就是这门课反复强调的判断:Agent开发的竞争重心,已经从"提示词技巧"迁移到"循环工程"。写一个好提示词,一个下午就能学会;设计一个能整夜自己跑、跑错了自己纠、跑不完会熔断的循环,需要的是系统设计能力。面试官心里都很清楚这一点,所以题目也全往这个方向出。
把这两年的岗位画像放在一起对比,变化一目了然:
| 对比维度 | 2024年的"AI应用工程师" | 2026年的"Agent循环工程师" |
|---|---|---|
| 核心考点 | 提示词模板、API调用、Chain编排 | 循环设计、验证器、上下文管理、失效模式 |
| 典型题目 | “怎么让模型输出JSON?” | “怎么判断Agent真的完成了?” |
| 工程要求 | 能跑通Demo | 有预算、有熔断、有审计、可无人值守 |
| 简历筛选 | 看框架关键词 | 看量化指标:成功率、成本、MTTR |
| 薪资水位 | 普通后端+10%~20% | 高级工程师档,中位$217K(课程第2章的数据) |
第1章我们聊过128亿美元的市场和六个百亿独角兽,钱流向哪里,岗位要求就跟到哪里。你如果仔细翻2026年的JD,会发现一个高频词:production-grade(生产级)。没人再为"能演示"的Agent付高级薪资,大家要的是"敢让它半夜无人值守跑"的Agent。这一点直接决定了后面所有面试题的出题逻辑。
我用一张图概括现在Agent面试的考察层次。注意最底下那层——大部分人挂在它上面,而不是挂在上面两层:
踩坑提示:我见过不少候选人(包括当年的我)把80%的准备时间花在背概念名词上,什么ReAct、Plan-and-Execute、Reflexion背得滚瓜烂熟,结果面试官一句"你的循环在第7步开始复读,怎么办"就哑火了。概念是入场券,失效模式才是决胜局。
二、四大高频主题逐题拆解(含参考答案)
把最近一年我收集到的面试题(自己的+朋友们的+网上整理的)摊开看,高度集中在四个主题。先给总览表,再逐题拆:
| 主题 | 典型问题 | 答题要点 | 出现频率 |
|---|---|---|---|
| 循环设计 | “设计一个自动修Bug循环” | 目标+验证器+终止条件 | 几乎必考 |
| 验证器 | “如何判断Agent完成了?” | 确定性>模型自评 | 几乎必考 |
| 上下文管理 | “上下文满了怎么办?” | 剪枝/压缩/外置记忆 | 高频 |
| 失效模式 | “循环死循环怎么防?” | 三维预算+熔断 | 高频 |
2.1 循环设计题:“设计一个自动修Bug循环”
这是开场题,答好了后面全顺,答砸了面试官就开始看表。
我的参考答案骨架:任何循环都由三件套构成——可验证的目标、验证器、终止条件。修Bug循环的目标是"让指定测试全绿";验证器就是测试套件本身(确定性验证,不是问模型"你觉得修好了吗");终止条件是三维预算:步数上限、token上限、时间上限,任何一个触顶就熔断退出并升级人工。
讲完三件套,再主动补两个细节,面试官眼睛会亮:一是失败信息工程——每轮把测试失败的报错原文喂回给模型,报错本身就是最好的提示词(第7章的核心观点);二是票据库——用SQLite记录每个任务的进度,循环崩了可以从断点恢复,而不是从头再来。
追问一般是:"如果模型连续三轮都在改同一个文件但测试不过,怎么办?"标准答案是检测震荡:对轨迹做指纹(动作+观察的哈希),重复出现就触发降级策略——换提示词、换模型、或直接升级人工。这题考的就是你有没有真实跑过循环,跑过的人都见过这种复读机现场。
2.2 验证器题:“如何判断Agent完成了?”
这题是分水岭,因为答案分两档。
低档答案:让模型自评,“请检查任务是否完成,回答yes或no”。高档答案:确定性验证器优先于模型自评。测试通过就是通过,编译报错就是报错,linter有告警就是有告警——这些信号不依赖模型的自我认知,不会说谎。
| 验证方式 | 可靠性 | 成本 | 适用场景 |
|---|---|---|---|
| 单元测试/集成测试 | 高(确定性) | 低 | 代码类任务 |
| 编译/类型检查 | 高(确定性) | 极低 | 代码类任务 |
| 规则校验(pydantic) | 高(确定性) | 极低 | 结构化输出 |
| 模型自评(LLM as judge) | 中(会自我开脱) | 中 | 开放性任务兜底 |
| 人工审查 | 最高 | 最高 | 高风险变更终审 |
我在面试里被追问过:"什么时候必须用模型自评?"好问题——写文案、做摘要这类没有确定性判据的任务,只能用Checker模型做交叉评审,也就是课程里讲的Maker/Checker双模型架构:生成用强模型,审查用另一个模型,两者独立,互相制衡。第7章调优实录里那条从71%提到90%+的曲线,相当一部分提升就来自这种分层结构——光换更贵的模型,远做不到这一步。
2.3 上下文管理题:“上下文满了怎么办?”
这题答得好坏,直接暴露你有没有跑过长任务。我自己的真实经历:一个夜间循环跑到凌晨两点,上下文塞满,模型开始"失忆",把已经修好的测试又改回去,来回横跳。
参考答案是分层的三级策略:
- 剪枝:把早期步骤的原始工具输出替换成一行摘要(“步骤3:跑了测试,2失败”),保留最近的完整观察;
- 压缩(Compaction):整段历史压成结构化摘要+当前任务状态,这就是Claude Code的compaction机制;
- 外置记忆:细节落到磁盘(文件、SQLite票据库),上下文里只放指针(“详见 tickets/42.json”),模型需要时再读——第9章讲的"摘要+指针"模式。
加分项:提上下文预算审计——在每轮循环前检查token水位,超过70%主动触发压缩,而不是等爆了再救。被动compaction会丢关键信息,主动的有选择权。
2.4 失效模式题:“循环死循环怎么防?”
标准答案三层防线,我按课程第12章的框架背给你:
- 第一层,三维预算:步数(比如最多10步)、token(比如最多5万)、时间(比如最多10分钟),任一触顶就熔断;
- 第二层,震荡检测:轨迹指纹重复=N次即判定死循环,触发策略切换;
- 第三层,人工升级:熔断后不是静默退出,而是带上完整轨迹和失败摘要升级到人,Slack/邮件通知(第11章的通知与升级机制)。
面试官如果继续追"为什么是三个维度而不是一个",答案是:三个维度失效的形态不同。步数防的是逻辑死循环,token防的是成本失控,时间防的是悬挂任务占资源。只设一个,另两种失效就会在半夜找上你。我的一次真实事故就是只设了步数,模型每步生成超长思考,步数没超但token烧穿了预算——从此我三个维度一个都不敢省。
三、系统设计题:七步答题框架实战
系统设计题通常是45~60分钟的大题,题目类似:“设计一个夜间修复流水线:白天积累的失败测试和线上小Bug,夜里自动修复,早上开发者上班能看到待审的PR。”
我在多次模拟和实战之后固定了一套七步框架,好处是时间可控、不会漏关键项:
1. 需求分析(5分钟):输入/输出/约束——输入是什么(失败测试、报错日志),输出是什么(PR),硬约束是什么(不许直接push主干、预算多少) 2. 架构设计(10分钟):画出主循环+外围组件,先粗后细 3. 核心模块(10分钟):分诊器/修复循环/验证器/交付器各自怎么实现 4. 终止条件与预算(5分钟):三维预算+震荡检测+熔断策略 5. 监控与告警(5分钟):指标埋点、通知渠道、人工接管点 6. 安全与权限(5分钟):沙箱、白名单、审计日志 7. 扩展性讨论(5分钟):多仓库、多语言、优先级队列架构图建议直接按这个画,别过度发挥:
几个容易被追问的点,提前备好答案:
- “分诊器为什么存在?”——不是所有失败都值得AI修,环境问题、依赖缺失这类先过滤掉,避免浪费预算(这也呼应第13章的分诊设计)。
- “PR会不会淹没开发者?”——限制每夜PR数量上限,按置信度排序,低置信度的直接进"废案归档"而不是进审查队列。
- “怎么防止它把测试改绿而不是把Bug修好?”——验证器里加防线:测试文件改动需要额外人工确认,或干脆只读测试目录。这个追问极其高频,因为它是"作弊式完成"的经典案例。
时间分配上有个惨痛教训分享:我第一次模拟时把20分钟花在画一个华丽的架构图上,结果终止条件和安全设计只能各给两分钟草草收场,被模拟面试官一针见血:"你的系统晚上跑炸了谁负责?"从此我严格按七步的分钟数走,宁可图画得糙,不可漏掉熔断和审计。
四、手撕代码题:15分钟写一个能跑的ReAct循环
手撕题最常见的题目就是"实现最小ReAct循环"。面试官想看的不是功能多全,而是你有没有工程直觉:模型输出要不要校验?循环要不要上限?日志要不要留?
下面是我打磨过的标准答案,离线mock版,面试现场可以直接跑,换成真实client只改一处。代码遵循这门课的统一工程规范:Python 3.12 + uv、pydantic校验、logging控制台+文件双输出按月分割保留12个月。
# min_react_loop.py —— 手撕题标准答案:最小可运行 ReAct 循环(离线 mock 版)# Python 3.12 + uv:uv init demo && uv add pydantic && uv run min_react_loop.pyfrom__future__importannotationsimportloggingfromdatetimeimportdatetimefrompathlibimportPathfrompydanticimportBaseModel,Field,ValidationError# ---------- 日志:控制台 + 文件双输出,按月分割,保留 12 个月 ----------classMonthlyFileHandler(logging.FileHandler):"""按月落盘:logs/react-YYYY-MM.log;启动时清理 12 个月前的历史文件。"""def__init__(self,d:Path,keep:int=12):self._dir,self._keep=d,keep d.mkdir(exist_ok=True)foroldinsorted(d.glob("react-*.log"))[:-keep]:old.unlink()# 只保留最近 keep 个月super().__init__(d/f"react-{datetime.now():%Y-%m}.log",encoding="utf-8")defemit(self,record:logging.LogRecord)->None:# 跨月自动切换文件want=self._dir/f"react-{datetime.now():%Y-%m}.log"ifstr(want)!=self.baseFilename:self.close()self.baseFilename=str(want)self.stream=Nonesuper().emit(record)log=logging.getLogger("react")_h=logging.Formatter("%(asctime)s | %(levelname)s | %(message)s")forhin(logging.StreamHandler(),MonthlyFileHandler(Path("logs"))):h.setFormatter(_h)log.addHandler(h)log.setLevel(logging.INFO)# ---------- pydantic:把模型输出当外部数据严格校验 ----------classAction(BaseModel):tool:str=Field(pattern=r"^(grep|patch|pytest|done)$")# 工具白名单args:str=""done:bool=FalseclassStepBudget(BaseModel):# 三维预算:步数 / token / 时间max_steps:int=5max_tokens:int=50_000deadline_s:float=120.0# ---------- mock LLM:脚本化回放,面试现场换成真实 client 即可 ----------SCRIPT=['{"tool":"grep","args":"def parse"}','{"tool":"pytest","args":"tests/"}','{"tool":"done","args":"修复完成,3 passed"}']defreact_loop(goal:str,steps:int=5)->str:budget=StepBudget(max_steps=steps)used=0foriinrange(budget.max_steps):try:action=Action.model_validate_json(SCRIPT[i%len(SCRIPT)])except(IndexError,ValidationError)ase:returnf"终止:非法输出{e}"used+=100+len(action.args)# 演示用 token 估算log.info("step=%d tool=%s args=%s",i,action.tool,action.args)ifaction.doneoraction.tool=="done":# 踩坑:别只信布尔字段log.info("LOOP DONE steps=%d tokens~%d",i+1,used)returnaction.args# 真实场景在此执行工具并把 Observation 拼回上下文log.warning("预算耗尽,熔断退出")return"超时"if__name__=="__main__":print("结果:",react_loop("修复解析模块的空指针"))真实运行输出(这就是贴在面试共享屏幕上的效果):
2026-09-30 12:06:15,914 | INFO | step=0 tool=grep args=def parse 2026-09-30 12:06:15,914 | INFO | step=1 tool=pytest args=tests/ 2026-09-30 12:06:15,914 | INFO | step=2 tool=done args=修复完成,3 passed 2026-09-30 12:06:15,914 | INFO | LOOP DONE steps=3 tokens~328 结果: 修复完成,3 passed讲一个这段代码里真实发生过的坑。我第一版写的是if action.done:,跑起来循环死活不停,明明第三步模型都喊done了,第四步还在grep。盯了两分钟才发现:mock数据里只给了"tool":"done",而pydantic模型里done字段默认False——我信任了一个我根本没验证的布尔字段。这个坑本身就是面试金句:终止信号不能只依赖单一字段,tool == "done"和显式布尔要同时兜底。面试官听完这个故事的反应普遍不错,因为它证明你真的跑过、真的踩过、真的想过。
面试官常见的追问链也备一下:
- “真实场景里Observation怎么拼回上下文?”——追加到消息列表尾部,同时做水位检查,超阈值先剪枝再拼接。
- “预算为什么要建成一个类?”——pydantic校验防止配置写错(比如max_steps传成负数),配置错误在生产环境是重大失效源。
- “这个循环缺什么?”——缺震荡检测、缺人工升级、缺审计落盘。主动说出来,比被问出来强十倍。
五、反问环节与谈薪:别在这一轮掉链子
技术面全过,栽在反问环节的亏我吃过。反问环节不是客套,是双向尽调。我的固定三问:
- “团队的Agent现在能无人值守跑的最长任务是什么规模?”——问出对方是真生产还是Demo阶段;
- “验证器体系建设到什么程度?人工审查占比多少?”——判断工程成熟度;
- “这个岗位未来半年最想解决的核心问题是什么?”——判断你进去是做核心还是做边角。
谈薪的锚点用课程第1、2章的数据:美国市场Agent方向高级岗位中位$217K,国内一线大厂AI Infra/Agent方向普遍比同级后端高30%~50%。谈的时候用区间不用单点(“我了解到这个水位在X到Y之间,结合我在循环工程上的项目积累,我期望偏上沿”),并且把作品集甩出来——量化的成功率数据比任何形容词都有说服力。第2节会专门讲怎么把课程项目包装成简历上的量化弹药。
还有一个小提醒:2026年的面试流程里,现场编码环节越来越多要求你展示自己的项目仓库。面试官会让你打开GitHub,随便挑一个文件问"这段为什么这么写"。所以作品集不是面试后才准备的东西,它就是面试本身。这就引出第六节的内容。
六、作品集:让面试官主动想聊的东西
作品集的核心逻辑一句话:面试官没有时间信你,但他有时间信证据。我的清单如下,按优先级排序:
## 作品集必备清单 - [ ] GitHub仓库:一个完整的循环项目(分诊→修复→验证→交付) - [ ] README:架构图 + 快速上手(三条命令内跑通) - [ ] AGENTS.md:项目意图外置,本身就是课程技术的展示 - [ ] 量化数据:成功率、平均步数、成本、耗时,做成表格 - [ ] Evals:可复跑的评估集(evals/目录 + results.json) - [ ] 技术博客:2~3篇深度文章(踩坑复盘最受欢迎) - [ ] 轨迹日志:一次真实夜间运行的完整日志片段这里有个心理关要过:很多人觉得"课程项目不算项目"。错。面试官分不清也不在乎你的项目是不是课程作业,他在乎的是里面有没有真工程。你能在README里写清"为什么用SQLite做票据库而不是直接内存状态"、“为什么验证器用pytest而不是模型自评”,这就比80%的公司内部项目更有含金量。
为了把"自检"变成习惯,我写了个作品集完备度脚本,投简历之前跑一遍,低于60分就别投:
# portfolio_check.py —— 作品集完备性自检:照着清单扫仓库,输出量化评分# Python 3.12 + uv:uv run portfolio_check.py <仓库路径>from__future__importannotationsimportloggingfrompathlibimportPathfrompydanticimportBaseModelclassArtifact(BaseModel):name:strweight:int=10# 单项分值required:bool=True# False 表示加分项classCheckResult(BaseModel):name:strok:boolscore:inttotal:intlog=logging.getLogger("portfolio")fmt=logging.Formatter("%(asctime)s | %(levelname)s | %(message)s")forhin(logging.StreamHandler(),logging.FileHandler("portfolio.log",encoding="utf-8")):h.setFormatter(fmt)log.addHandler(h)log.setLevel(logging.INFO)ARTIFACTS=[Artifact(name="README.md",weight=15),Artifact(name="AGENTS.md",weight=10),Artifact(name="docs/architecture.png",weight=10),Artifact(name="evals/results.json",weight=15),Artifact(name="tests/",weight=10),Artifact(name="logs/sample_run.log",weight=10,required=False),]defcheck(root:Path)->list[CheckResult]:return[CheckResult(name=a.name,ok=(root/a.name).exists(),score=a.weightif(root/a.name).exists()else0,total=a.weight)forainARTIFACTS]if__name__=="__main__":importsys root=Path(sys.argv[1])iflen(sys.argv)>1elsePath.cwd()results=check(root)forrinresults:flag="PASS"ifr.okelse"MISS"log.info("[%-4s] %-26s %2d/%d",flag,r.name,r.score,r.total)got=sum(r.scoreforrinresults)full=sum(r.totalforrinresults)log.info("作品集完备度:%d/%d(低于 60 分先别投简历)",got,full)我拿一个课程学员的真实仓库跑出来的输出:
2026-09-30 12:07:33,918 | INFO | [PASS] README.md 15/15 2026-09-30 12:07:33,918 | INFO | [PASS] AGENTS.md 10/10 2026-09-30 12:07:33,918 | INFO | [MISS] docs/architecture.png 0/10 2026-09-30 12:07:33,918 | INFO | [PASS] evals/results.json 15/15 2026-09-30 12:07:33,918 | INFO | [PASS] tests/ 10/10 2026-09-30 12:07:33,918 | INFO | [MISS] logs/sample_run.log 0/10 2026-09-30 12:07:33,918 | INFO | 作品集完备度:50/70(低于 60 分先别投简历)50分,差两个东西:一张架构图和一份真实运行日志。补齐它们只要一小时,但这恰恰是"课程项目"和"工程作品"的分界线。尤其那个logs/sample_run.log,面试官看到一份带时间戳的夜间运行轨迹,比看到十段"精通Agent开发"的形容词都管用。
博客选题给三个被验证过有效的方向:一是《我的Agent循环在凌晨两点为什么疯了》这类失效复盘(点击率最高);二是验证器设计对比实验(模型自评vs确定性验证的数据);三是成本优化实录(怎么把单任务成本打下来60%)。共同点:有真实数据、有失败过程、有结论。没有人爱看成功学,人人都爱看事故报告。
小结
- 面试重心已迁移:从提示词技巧到循环工程,四大高频主题——循环设计、验证器、上下文管理、失效模式,其中失效模式是决胜局;
- 答题有框架:系统设计七步走(需求→架构→模块→终止→监控→安全→扩展),手撕题三件套(校验+预算+日志),宁可图画糙,不可漏熔断;
- 作品集即面试:GitHub项目+量化数据+运行日志+踩坑博客,用脚本自检完备度,证据比形容词有说服力。
下节预告
面试的高频问题你有了,但所有问题的弹药都来自同一个地方——简历上那几行项目描述。下一节《简历项目包装:把课程项目写成面试官想看的样子》,我们聊STAR结构改写、量化指标怎么算、三个版本模板,让HR初筛和面试官深聊都能接得住。
如果觉得本文对你有帮助,欢迎点赞、收藏、关注三连!
本系列持续更新中,关注不迷路~
文章编号:第16章第1节 | 总进度:113/120 | 预计阅读时间:15分钟