vivo Agent 秋招线下面:Harness 与工程诊断
面经与参考答法
公司:vivo;方向:Agent 开发秋招;形式:线下面试,作者记录约 22 分钟。原文日期为 9.22,日期文字未注明年份,也没有明确说明第几轮;帖子发表于 2026 年 9 月。
以下问题按作者可见记录归纳;答题思路是独立整理,不代表作者实际作答或企业标准答案。原文要求讲一次 Harness 故障,但没有公开具体事故或修复记录。
先用一个只读订单任务定位 Harness 的职责
以下是教学设定,不是作者经历,也没有在真实订单系统运行。用户要查租户 A 的订单 o1,数据库事实是 status=paid, amount=100;当前用户只具备查询权限。成功条件是返回有证据的订单状态,不是替用户发起退款。
模型可以提出 get_order(o1),执行 Harness 根据服务端认证身份补入租户 A,检查工具是否允许、参数是否合规,再调用只读查询。工具返回订单状态和记录版本,Harness 将这份观察与调用结果关联保存,让模型据此回答“订单已支付,金额100”。会话、工具输入、结果和后续状态之间能沿同一次运行追溯;查不到或调用失败时必须保留失败状态,不能拿预期返回值替代实际返回。
设想旧实现把上一段摘要中的“允许退款”当作权限依据,将模型提出的 refund(o1) 发给业务服务。业务服务按当前只读身份返回 permission_denied,没有生成退款记录;Harness 却遗漏这个失败观察,最终答复“退款完成”。这条教学轨迹能分别定位过期权限被采信、执行器未预先拦截越权提议、失败结果未反馈和验收器只检查答复文字。修复应按边界逐一确认:摘要只作工作视图,授权由当前服务端身份和 ACL 决定;执行器拒绝越权动作;工具失败回到下一步观察;验收器查询环境终态,并检查答复是否与查到的事实一致。即便模型写出了漂亮的“成功”句子,这一试次仍然失败。
排查时记录同一输入、运行版本、工具轨迹、权限判定与环境状态。先重放这个只读请求,再加租户 B 请求 o1 的反例,确认它不能读到 A 的订单。仅更换模型或多写一句提示,无法验证状态隔离、授权和验收三个环节都修好了。
原面试问题与答题思路
(1)对 Agent 和 Harness 如何理解,能否详细说明 Harness?
Agent 在观察后选择行动;执行 Harness 把模型提议接到可运行的工具、上下文、状态和反馈链路上。上例中模型负责提出查询,执行器负责判断能否执行及实际调用,外部系统返回事实,状态层保存结果供下一步使用。Harness 不是模型本身,也不只是提示词;不同产品的术语范围可以不同,先说明自己讨论的是哪一层。
评测 Harness 则负责准备任务与环境、运行试次、采集轨迹和判分。两者要配合,但“提供工具可供调用”和“检查任务是否真的完成”不是同一个职责。
(2)Harness 不当导致过什么问题,怎样排查与解决?
只能讲自己真实遇到的问题。选择事故时先交代输入、应该发生的状态变化和实际观察,再沿上下文、模型决策、工具参数、授权、执行结果与恢复状态追踪。摘要丢约束、工具调用失败和跨会话状态串用需要不同证据;不能仅因最后答复错误就断定都是模型能力不足。
教学例中可以从轨迹确认退款提议被发出、业务服务拒绝,以及拒绝结果未反馈,再查为何执行器采信了摘要权限,最后检查验收器为何接受了“退款完成”。修复后保留原失败输入并增加权限变化和跨租户反例;模型、提示和输入夹具的版本一致,才更容易判断改动的作用。不把本例讲成作者实际处理的生产事故。
(3)做过哪些 Agent 实践?
原文括注的 AI pipeline 建设是候选人对自己回答的描述,不是面试官另外提出的题目。下面以实践说明的方法展开。
先明确用户任务和终态验收,再说明确定性节点、模型决策、工具与共享状态各自负责什么。状态带输入版本与运行身份,恢复前核对当前权限;Schema 合法只能说明结构满足接口,不能证明金额、对象或业务动作正确。个人贡献用自己实际设计、实现或验证的接口和结果说明,原文未披露的项目规模与收益不补造。
持久化也要限定范围:LangGraph 当前文档中,checkpointer 保存 thread 图状态,store 保存跨 thread 的应用数据;这不是自动认证或授权合同。仅用内存保存器时,进程重启不会保留状态。选择恢复方案时要说清谁持有事实、哪些状态可重放,以及工具失败如何反馈。
(4)如何学习 AI/Agent,怎样表达后端与 Agent 的方向选择?
用一个真实任务建立最小循环,读对应官方文档,记录工具和状态失败,再用固定任务与反例验证理解。只有遇到当前系统解释不了的需求,再扩展框架和复杂度。方向选择依据自己愿意长期处理的问题与实际做过的工作,没有统一的标准回答;不替作者补教育背景或职业经历。
面试口述迁移
可以这样说明技术依据:“我把 Harness 分成输入与状态、模型循环、工具执行和验收边界。模型只提出行动,执行器用当前身份、权限和参数合同决定能否执行;外部返回成为下一步观察,最终成功用真实环境状态检查。只读订单却答复退款完成时,我先查工具调用和失败结果,再查权限与状态来源,最后查判分依据。摘要和 checkpoint 能帮助恢复,但不能替代当前授权和业务事实。”
教学补充:改变条件再判断
以下是模拟追问,不是原帖记录的题目:
- 租户 B 复用同一个 thread_id,增加一个唯一会话 ID 就能解决授权吗? 会话命名可减少状态碰撞,但不等于授权。状态存取和订单查询都要按已认证租户检查,不能信任模型或请求正文传来的租户字段。
- 从旧 checkpoint 恢复时用户已经失去退款权限,还能用原摘要继续执行吗? 不能。恢复可重用历史上下文,敏感动作仍需在执行时查当前权限;旧状态中的许可不是当前授权证明。
- 工具成功返回 paid100,答复却说 refunded,Schema 校验通过算成功吗? 不算。结构校验、调用成功和业务结论是三层判据,应分别检查,并用实际工具结果与环境终态校验答复。
原帖记录边界
原帖还包含教育与方向提问、反问、业务转述和个人面试感受。没有公开项目接口、事故轨迹或技术答案,本文不替作者填补这些事实;关于面试态度和业务建议的个人判断不视为可证实企业事实。
参考资料与适用环境
- Anthropic:Demystifying evals for AI agents:Definitions 区分 agent harness、evaluation harness 与 outcome;Design eval harness 讨论环境隔离和终态判分。2026-01-09 原文,核验于 2026-10-02,本文采用机制说明,不移植厂商收益数字。
- LangGraph:Persistence:Checkpointer vs. store 与 MemorySaver troubleshooting。滚动文档,核验于 2026-10-02;没有据此认定原项目使用 LangGraph。
- OWASP:Authorization Cheat Sheet:Validate the Permissions on Every Request、Verify that Authorization Checks are Performed in the Right Location,以及对象级访问检查。支持当前服务端身份与权限检查;会话 ID、摘要和结构校验不能替代授权。滚动指南,核验于 2026-10-02。
- 本文租户、ACL、订单状态及故障轨迹是教学合同,未在完整运行环境执行。原面试只有要求举事故的提问,不含上述事故细节。