Notes · 2025.12.27

一个智能体挂了怎么办

评委原话。

1 min · agent

评委问:一个智能体挂了怎么办。问的时候演示还在投屏上。天气、住宿、景点、预算拆给不同智能体,画面很完整。完整的画面让这个问题更尖。拆得越开,单点越明显。我当时有重试的代码,讲不利落。讲不出来,就还是演示。演示可以过场。过场之后系统还要活。活的最低标准我后来写进接口:超时有返回,空有返回,挂了承认挂了。转圈是不承认。不承认的挂,评委只会记住崩。

评委问的不是日志

我以为会问用了什么框架。LangGraph、LangChain、AgentKit,简历上有。评委不问。评委问挂了怎么办。这是产品问题。产品问题要用用户能听见的句子答:重试几次、超时怎么显示、哪一步改走规则、什么时候交给人确认。

智在旅途演示崩过。收成一条路线的时候断了。断完接着改。改到评委点头。竖大拇指的时候手心是湿的。湿的原因不是模型偶发胡话,是没有失败路径。成功路径我演示过很多遍。失败路径我假设不会在台上发生。台上发生了。

后来做检测接口,我先写超时和空结果,再写成功路径。顺序是从这个问题倒逼的。模型推理封在 FastAPI 里。评委换一组样本,接口不能只转圈。转圈就是挂了,而且不承认。

重试、降级、人工确认

重试要有次数和间隔。无限重试是另一种挂,只是更慢。间隔太短,会把已经撑住的服务打穿。这些数不必装成论文结果,但要能讲:我试几次,试完仍失败就停。

降级要提前想好替身。天气节点挂了,是不是用「天气未知」继续排路线,还是整单失败。两种都能成立,不能到台上才选。景点节点挂了,不能默默少三个点还装成完整行程。少了要说少了。

人工确认不是认输。预算超了、工具连续失败、用户输入不像地点,这些该停给人口头确认。智能体全自动听起来高级。高级在评委追问时,若没有人手接,高级会变成无人负责。无人负责的系统,课设和竞赛里都不好讲。

超时当功能

我后来写接口,把超时当功能。功能的意思是:有返回,有文案,有状态码或字段,界面知道该提示什么。异常日志里的一行,只有我能看见。评委看不见日志。看得见的是转圈。

超时时长按场景。检索可以短。生成可以长。长也要有顶。本机没有 timeout 命令,和接口超时不是一层。外壳没有 GNU timeout,我用 gtimeout 或后台加 kill 保护终端。接口层用框架自己的超时。两层都要,因为挂的方式不同。终端挂了是我的下午没了。接口挂了是演示没了。

空结果也当功能。工具调用成功但列表为空,和工具调用失败,提示不能一样。一样了,用户会用错下一句指令。智能体就会在错的前提下继续编。

拆开的代价要能讲

拆成多智能体,是为了职责清楚,也是为了能单独换一个节点。代价是多几个会挂的点。讲架构时要把代价讲出来。讲出来才像做过。只讲「我们用了图」,像复述文档。

失败路径要存在于代码,也要存在于我能画的那张图。图上只有快乐的箭头,评委会指一个圆:这个呢。这个呢,就是原话。

现在仍会讲不利落的部分

降级策略随任务变。旅行路线和文本检测的降级完全不同。我没有一份通用的「智能体挂了」手册。有的是几次现场,和接口里真实存在的超时、空结果。限制:不把评委点头写成系统永不挂。挂还会发生。发生时要有一句人话,和一条不转圈的返回。

我后来把这个问题写进接口设计,也写进自己要能画的那张图。图上除了快乐的箭头,要有超时、空、降级、交给人。四条都没有的图,只适合内部高兴。内部高兴过了,评委仍会指一个圆。圆被指到的时候,能讲出来的人,才像做过。讲不出来的人,框架名字写得再满,也还是演示。演示可以过场。过场之后系统还要活。活的最低标准是:挂了承认挂了,并且给下一句。