Agent Runtime:运行状态、执行预算与终止条件
《Agent 大模型 0 到 1 系统课》 · 程序员 Sunday
你正在阅读本节的免费试读。完整课程 ¥499,可在文末添加作者微信购买。
上一节,咱们实现了一个可以规划任务的 Agent。
它先生成 Plan,再把计划保存成 Plan State。每执行完一个步骤,程序都会记录 Observation,再让 Replanner 判断后面的计划要不要调整。
为了防止代码一直循环,上一节还写了一个最大执行次数:
const MAX_EXECUTED_STEPS = 6
if (executedSteps >= MAX_EXECUTED_STEPS) {
throw new Error(
`达到最大工具执行次数 ${MAX_EXECUTED_STEPS},任务仍未满足结束条件。`
)
}
这个限制的目的是为了防止 Agent 一直循环下去
但是,这样的一个解决方式还是比较糙的。
那比如说:
- 如果模型连续好几次调用同一个工具咋办呢?
- 如果工具名称和参数每次都不一样,但是拿回来的始终是同一份资料呢?
还有,模型已经调用了多少次、消耗了多少 Token、整个任务运行了多长时间,这些数据又应该放在哪里?
只靠一个 MAX_EXECUTED_STEPS = 6 ,肯定是不行的。
所以,这一节咱们需要在 Agent Loop 外面,再增加一层由应用程序控制的运行环境。
这个运行环境就是本节要实现的 Agent Runtime。
Agent Runtime 到底是什么
这一节所说的 Agent Runtime,指的是:
负责驱动 Agent Loop、保存整次运行状态、统计资源消耗,并根据确定性规则决定任务是否继续的一层应用程序代码。
也就是说:模型负责具体的操作,但是当前还剩多少工具调用次数、任务有没有超时、相同查询已经执行过几次,这些都应该由程序判断。
现在主流 Agent 框架里面,也能看到类似设计。
比如说,在 OpenAI 的 Agents SDK 文档 里面,提到了 Runner 的概念
他提到 Runner 会通过 maxTurns 限制 Agent Loop。达到最大轮次以后,默认会抛出 MaxTurnsExceededError:
LangChain 和 LangGraph 也提供了对应的 Runtime 的概念,点这里直达
虽然每个框架的实现方式不一样,但是殊途同归嘛,理念是一样的
即:Agent 不能只靠一个 while 循环一直跑,应用程序必须管理这次运行。
Agent Runtime 到底需要管理什么
对于一次完整的 Agent 任务,Runtime 至少要做好两件事:
- 第一:保存整次任务的运行状态
- 第二:限制整次任务可以消耗的资源
第一:保存整次任务的运行状态
上一节,咱们讲了 messages 和 Plan State。
但是,这两份数据都不能完整表示一次 Agent 运行。
messages 保存的是模型当前能够看到的上下文。里面可能包含用户问题、模型回答、Tool Call 和 Tool Message。
不过,随着对话越来越长,历史消息可能会被删除、压缩或者替换成摘要。
Plan State 保存的是任务计划。
比如哪个步骤已经完成、哪个步骤被取消、后面的步骤依赖什么条件。
但是,Plan State 也不会记录:
- 模型已经调用了多少次?
- 工具已经执行了多少次?
- 当前一共消耗了多少 Token?
这样的数据
所以,Runtime 还需要维护一份范围更大的状态。
这份状态就叫作 Agent Run State。
`Agent Run State 是 Runtime 在一次 Agent 运行期间维护的全局状态,用于统一记录消息上下文、任务计划、执行进度、调用次数、Token 消耗等运行信息。
看着挺高级的对吧。
但是,体现在代码里面,其实并不复杂,就是一段 JSON 格式数据。
比如,咱们这一节会把 Agent Run State 设计成下面这样:
{
runId: '本次运行的唯一 ID',
goal: '用户目标',
status: 'running',
stopReason: null,
startedAt: 1785299400000,
endedAt: null,
// 注意看这里:plan state
planState: {
version: 1,
status: 'active',
steps: []
},
limits: {
maxSteps: 8,
maxModelCalls: 8,
maxToolCalls: 6,
maxDurationMs: 10000,
maxTotalTokens: 12000,
maxSameAction: 2,
maxNoProgress: 2
},
usage: {
steps: 0,
modelCalls: 0,
toolCalls: 0,
totalTokens: 0
},
actions: [],
trace: []
}
Plan State 放进了 Agent Run State
本节试读已结束
继续学习,解锁完整课程
购买《Agent 大模型 0 到 1 系统课》,
继续阅读本节剩余内容与后续课程。
