尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Agent 工程化深水区:状态、并发与长任务(10 题)

Agent 工程化深水区:状态、并发与长任务(10 题) 题目结构说明:每题四部分。考点定位讲面试官在考察什么;深拆是机制加数字加失败模式,数字是可信度的来源;工程方案给 Python 风格伪代码,逐行中文注释,注释就是面试时口述的话术;追问链是答完后大概率跟上的问题,附答法。标记:⭐ 高频(出现率过半)、🔥 近两年新增。Q1 Agent 状态机:隐式循环为什么难运维 ⭐考点定位:验的是把 Agent 从「能跑的脚本」带到「可运维的服务」的意识。常见丢分姿势:写得出 while 循环调工具,说不出循环崩在第 17 步时系统处于什么阶段、重启从哪继续。深拆:显式状态机把「循环走到哪了」变成一等公民:状态集合(规划、执行工具、等审批、完成、失败)、转移条件(事件驱动)、持久化(每次转移前落库,类比数据库 WAL)。生产级单 Agent 通常 5 到 8 个状态就够,超出说明编排逻辑该下放工具层。隐式循环的失败是「黑盒死」:重启后上下文全丢,重试从零开始,副作用再来一遍。对照后端,就是把长事务改成 Saga,每步有补偿、有痕迹。工程方案:# 状态集合:PLANNING / TOOL_RUNNING / AWAITING_HUMAN / DONE / FAILED def step(run): # 转移前先落库:状态 + 上下文摘要 + 待处理调用,WAL 思路 persist(run.id, run.state, digest(run.context)) if run.state == PLANNING: reply = llm(run.context) if reply.tool_calls: transition(run, TOOL_RUNNING, pending=reply.tool_calls) else: transition(run, DONE, output=reply.text) elif run.state == TOOL_RUNNING: results = execute_all(run.pending) # 副作用工具须配幂等键 run.context.append(results) transition(run, PLANNING) # 结果回上下文,回到规划态追问链:「状态和消息历史的边界在哪?」- 状态是控制面(走到哪个阶段),历史是数据面(说了什么);状态理论上可从历史重放推导,但重放贵,生产上分开存。「状态机会不会限制模型自主性?」- 工具选哪个仍由模型决定,状态机只管阶段流转;LangGraph 的 StateGraph 就是这套思路。Q2 Durable Execution:进程崩了任务怎么续 ⭐🔥考点定位:2024 年起被 Temporal、Restate 这些持久化执行引擎带热。看的是候选人知不知道「恢复」不等于「重跑」,核心词是确定性重放。深拆:机制是事件溯源:不存状态本身,存导致状态转移的事件序列(LLM 请求响应对、工具调用结果),恢复时按序重放。难点在 LLM 调用非确定,重放绝不能真调模型,必须命中执行日志里的缓存。Temporal 单事件 payload 上限约 50KB,大结果放外部存储、日志只存引用;恢复代价等于重放 N 个事件,通常亚秒级。两大坑:代码里直接用时间或随机数做分支,重放走岔路;副作用工具在重放时又执行一遍,退化成 at-least-once,必须配幂等键。工程方案:def durable_step(run, action): # 先查执行日志:同 run_id + 步骤序号已有记录,直接取,不真执行 cached = event_log.lookup(run.id, run.seq) if cached: return cached.result # 确定性重放:LLM 响应原样返回 result = action.execute() # 首次执行:LLM 调用或带副作用的工具 event_log.append(run.id, run.seq, action.input, result) return result ​ # 恢复 = 新建空 run,按序重放执行日志到断点,再继续往下跑追问链:「和工作流引擎什么关系?」- Airflow 重跑粒度是任务级,durable execution 粒度是单次函数调用,后者专为 LLM 长链路设计。「恰好一次怎么达成?」- 重放保证 LLM 侧不重复计费,副作用侧靠幂等键去重,合起来才是端到端恰好一次,和 Kafka 的语义推导同构。Q3 并发工具调用与竞态 ⭐🔥考点定位:2024 年起主流模型 API 原生支持一次返回多个工具调用,并发执行成了默认行为。查两件事:结果回填按什么对齐、两个写操作撞车怎么办。深拆:模型一次输出 N 个 tool_call,各自带 tool_call_id;并发执行后结果必须按
返回列表