字节 AI 应用开发一、二面:规划、结构化输出与部署取舍
本场面试题
- 输入输出怎样分层,为什么选 Plan-and-Execute,而不是 ReAct?
- 结构化是怎么做的,应该包含哪些内容?
- 失败案例是怎么做的?
- 为什么本地部署,显存由哪些部分构成?
面经与参考答法
字节 AI 应用开发一、二面:规划、结构化输出与部署取舍
原文明确岗位为 AI 应用开发、偏后端,记述一面细问项目,二面结合项目、基础知识和算法。下面四组选自二面的原题 2–5。具体面试日期未注明;发帖日期不作为面试日期。原文没有说明部门。
本文未展开原题 1 的业务背景、6 的 Transformer、7 的图像处理与 RAG、8 的个人 AI 工具使用、9–12 的 C++/网络/进程线程,以及 13 的三数之和。所有这些都是明确记录的原题,属于本稿未选录范围,并非关键词缺失。答案、数据结构和演算均为编辑补充,不代表原作者当时答过、项目已实现或实测通过。
(1)输入输出怎样分层,为什么选 Plan-and-Execute,而不是 ReAct?
先定义任务、计划、执行结果和验收四层合同。Plan-and-Execute 显式维护步骤与依赖,ReAct 根据最新观察选择下一行动;两者可组合,选型要用相同任务与总预算比较,不能只声称“先规划更聪明”。
可以用一个教学业务 Agent 说明边界:入口输入用户目标、对象、限制和允许动作;Planner 输出带步骤 ID、依赖、所需工具与成功条件的计划;Executor 接收一个已验证步骤,返回执行状态、结构化结果、证据和错误;Verifier 用任务合同检查最终状态。工具实际执行由运行时负责,模型提出的计划不能跳过授权或任意调用未注册能力。
例如“核对一份清单并生成差异报告”能先明确“解析、逐项查询、对比、汇总”,显式计划方便定位漏项与复用检查点。若查询发现对象不存在,需要根据结果追查别名,探索分支更适合观察驱动决策。可用外层计划维持完整性,内层 ReAct 查证某一步。
Plan-and-Execute 也能在执行反馈后重规划,不能把“不允许中途调整”当成定义。LangChain 的工程示例就包含执行后决定结束或修订后续计划的环节。LangChain:Plan-and-Execute Agents
比较时固定任务集、模型与总 token/工具/时间预算,报告合格任务率、遗漏步骤、无效调用、延迟和总成本;重规划与汇总也计成本。已提交的副作用不因重新规划而重跑。原问中的“每一层”没有披露作者实际模型架构,以上是应用层教学分层,不推断其神经网络层数或真实模块。
(2)结构化是怎么做的,应该包含哪些内容?
先说明结构化对象服务于哪个下游,再定义字段、版本、必填项、枚举、空值和错误状态。合法 JSON、符合 Schema 与事实正确分别验收;模型输出通过业务与权限检查后才能驱动操作。
原题未说明作者是在结构化计划、工具参数还是最终结果,不能替作者补造具体实现。面试答法应先明确这个范围,再展示真实对象。作为教学例子,报告结果可含 schema_version、status、items、evidence_refs 和 missing_fields;执行状态区分完成、缺参、部分成功与失败,避免用一个字符串同时承载报告与执行命令。
例如结果是 {"status":"need_input","items":[],"missing_fields":["object_id"]},应进入补参流程;它不是“生成了一份空报告所以任务完成”。定义 JSON Schema 时,用 required 显式要求字段、enum 收紧状态、数值边界限制范围,必要时以 additionalProperties: false 拒绝额外字段。仅在 properties 列出字段不会自动使它必填;缺字段与值为 null 也不同。JSON Schema:对象与必填属性
若模型 API 支持约束输出,核对实际模型、网关和支持的 Schema 子集;应用侧仍处理拒答、截断、解析错误与结构不符。结构校验通过后,再查引用是否属于当前允许证据、对象是否存在、值和单位是否正确、主体是否有权使用。模型自报 confidence=0.99 不能替代这些校验。
格式可修复的错误提供明确诊断并限次再生成;权限错误或引用伪造应阻断,不能用宽松解析器凑出对象后写库。Schema、Prompt、模型与消费者版本一起做契约回归,避免新增必填字段后旧客户端静默出错。
(3)失败案例是怎么做的?
把失败描述变成可观察断言,保存脱敏输入、版本、状态、工具观察与实际结果,在隔离环境复现并定位最早偏差。修复后比较同一案例与相关回归集;一次重新运行成功不能证明失败已消失。
原文只记录这句提问,没有给出作者具体 bad case,也没有明确问到重试或恢复。下面的复现、恢复和验收是编辑展开,不能标成原面试追加追问。
一份可教学的失败档案至少包含:预期结果、实际结果、输入与允许范围、代码/Prompt/模型/工具/索引版本、运行状态、关键 Trace、根因假设、最小修复和回归断言。先区分检索漏证据、模型误读、结构不符、工具异常、权限问题与业务结果错误,避免所有问题都用“加一句 Prompt”处理。
教学例子:用户要求只读核对,Agent 却选择了更新工具。冻结当时工具目录与输入,使用写入捕获器在沙箱复现;对齐“候选工具选择 → 参数 → 策略判断 → 执行结果”,找出最早可控偏差。修复可能是收窄工具集合或执行层拒绝写入,而非仅在最终回答里说“我不会修改”。回归断言检查实际没有写操作,并验证仍能完成合法只读任务。
若失败具有随机性,同一条件下运行多次,报告失败比例和样本,而非挑一条成功截图。另保留未参与调优的相邻任务,防止只记住坏例子措辞。作为恢复设计补充,外部写操作超时表示结果可能未知,先查询业务状态,再决定重试或补偿;不能为了复现错误再次影响真实资源。
(4)为什么本地部署,显存由哪些部分构成?
根据数据位置、离线要求、任务质量、延迟、吞吐和运维成本选择部署位置。推理显存至少包含权重、KV Cache、激活与临时工作区及运行时余量;模型文件装得下不代表目标并发和上下文都跑得动。
本地部署的理由必须落在实际约束上,例如数据不可离开受控环境、需要离线运行或已有稳定自有算力;不能泛称“本地一定更便宜、更安全、更快”。与托管 API 比较同一任务质量、峰值流量、排队、硬件利用率、升级监控与故障恢复总成本。原文未给模型名、参数规模、卡型或数字,不为作者虚构这些配置。
先分开推理与训练。推理权重粗估为“参数量 × 每参数字节数”:教学用 7B 模型,FP16/BF16 权重约 14 GB(约 13.0 GiB);4 bit 理论权重约 3.5 GB,但实际还要加量化 scale/元数据与未量化部分。训练还需梯度、优化器等,不能把训练的粗估直接当推理显存。
普通自回归注意力中,一批等长序列的 KV Cache 可粗估为 2 × 层数 × 序列长度 × KV头数 × 头维度 × 元素字节数 × 批量。教学设定 32 层、8 个 KV 头、头维度 128、缓存元素 2 字节、长度 8,192、批量 1,约为 1 GiB;批量 4 约 4 GiB。分页、预分配、共享前缀、滑窗或特殊模型架构会改变实际账,不能套用到所有引擎。KV 缓存用更多内存减少重复计算,量化压缩权重则是另一项资源取舍。Hugging Face:KV Cache、推理与量化
最后测实际峰值:长输入预填充、长输出、高并发、取消后释放与突发请求;记录显存 allocated/reserved 口径、OOM、首 token 延迟、吞吐和错误率,并给激活、工作区、框架、驱动与碎片留空间。只有满足目标负载与质量才算部署方案合格。