外观
Agent 核心机制
目录
- 1. 学习目标
- 2. 面试结论
- 3. 面试官为什么问
- 4. 概念与边界
- 5. 原理剖析
- 6. 实现与代码
- 7. 实际项目案例
- 8. 方案权衡与常见误区
- 9. 面试题与参考答案
- 10. 递进追问
- 11. 实践任务
- 12. 相关知识与参考资料
- 13. 简明总结
1. 学习目标
- 理解 Agent、Tool Calling、Workflow 和普通 LLM 调用的边界;
- 能解释 Agent Loop、状态、工具、记忆、上下文和终止条件;
- 能实现一个最小工具调用循环,并识别它与生产实现的差距;
- 能结合 AI 面试教练项目讲清 Agent 如何规划、执行和追问;
- 能排查错误工具调用、上下文膨胀和循环无法终止等问题。
2. 面试结论
2.1 30 秒回答
Agent 是一个由模型驱动决策、由运行时管理状态和工具的循环系统。模型根据目标与当前观察选择“直接回答、调用工具、继续规划或结束”,运行时负责执行工具、保存结果、实施权限与终止规则,再把新观察交回模型。Agent 的关键不是 Prompt 更长,而是把概率性决策限制在可观察、可控制、可恢复的执行边界内。
2.2 一分钟复述版
一个完整 Agent 至少包含目标、模型、工具、状态、上下文、记忆、执行循环和终止条件。典型过程是“观察 → 推理/规划 → 选择动作 → 执行工具 → 获得结果 → 更新状态 → 决定继续或结束”。Tool Calling 是结构化动作表达机制,本身既不限制一次还是多个调用,也不自动提供状态、观察反馈和终止循环;Workflow 由代码预先定义路径;Agent 则由运行时组织循环,并允许模型根据中间结果动态选择下一步。实际项目中应由代码掌握权限、预算、重试、幂等和终止权,不能让模型自行决定所有副作用。
3. 面试官为什么问
- 核心考察点:是否理解 Agent 是系统设计问题,而不只是模型调用;
- 对应岗位:AI 应用工程师、Agent 工程师、AI 后端工程师;
- 区分度:能否讲清模型职责与运行时职责,以及确定性和概率性的边界;
- 项目深挖点:工具如何定义、状态如何持久化、循环如何终止、失败如何恢复;
- 安全深挖点:谁拥有执行权限,如何防止越权和重复副作用。
4. 概念与边界
4.0 小白先这样理解:会看路况的旅行助理
你让旅行助理安排“明晚到杭州并住进公司协议酒店”。他先查车票,发现高铁停运后再查航班和酒店,依据每次新结果调整下一步,而不是机械执行旧计划。这里,旅行目标是 Goal,助理的大脑是 LLM,查票与订房接口是 Tools,查询结果是 Observation,行程本是 State,反复查看结果再行动就是 Agent Loop;公司的差旅制度和付款确认则由外部运行时把关。
类比边界: Agent 像助理,只能提出下一步,不天然拥有订票、付款或读取全部客户资料的权限。鉴权、预算、参数校验、幂等、人工确认和终止条件必须由确定性代码控制;若路线固定且错误代价高,应优先用 Workflow,而不是为了“智能”强行让模型自由规划。
4.1 Agent 是什么
Agent 是围绕某个目标运行的闭环:模型读取上下文并提出下一步动作,运行时验证并执行动作,再将观察结果反馈给模型,直到满足终止条件。
4.2 Agent 不是什么
- 不是所有带 System Prompt 的聊天机器人;
- 不是只调用一次函数的 Tool Calling;
- 不是固定节点顺序的普通工作流;
- 不是模型拥有无限权限的自动化脚本;
- 不是必须由多个模型组成,多 Agent 只是可选组织方式。
4.3 Agent、Tool Calling 与 Workflow
| 形态 | 路径由谁决定 | 是否依赖中间观察 | 适合场景 | 主要风险 |
|---|---|---|---|---|
| 普通 LLM 调用 | 代码固定 | 否 | 生成、分类、抽取 | 输出不稳定 |
| Tool Calling | 模型提出一个或多个结构化工具动作,外层代码决定是否继续 | 可选 | 查询、计算、动作表达 | 参数错误、越权 |
| Workflow | 代码或 DAG 预定义 | 是 | 稳定业务流程 | 分支维护成本 |
| Agent | 模型动态选择下一步 | 是 | 开放问题、动态工具组合 | 循环、成本、不可预测 |
| Multi-Agent | 多个 Agent 协作或移交 | 是 | 明确专长分工 | 协调、上下文和责任边界 |
4.4 输入、输出与前置条件
- 输入:目标、用户请求、可用工具、策略、历史状态和环境观察;
- 输出:最终回答、结构化结果、工具副作用和完整执行轨迹;
- 前置条件:工具 Schema 清晰、权限可控、终止条件明确、执行可观测;
- 不适用:步骤稳定、规则明确且错误代价高时,优先使用确定性 Workflow。
教学插图:Agent 与固定 Workflow 的控制边界

替代文本: 左侧固定轨道表示 Workflow 的节点和分支由代码预定义,其中仍可包含模型调用;右侧 Agent 根据目标和 Observation 动态选择 Tool,但动作必须依次通过 Schema、资源权限、预算、重复动作和终止条件检查,高风险工具还需人工确认,工具结果再作为 Observation 返回循环。
读图结论: Workflow 与 Agent 的核心差别是“下一步路径由代码预定义还是由模型根据观察动态选择”,不是“是否使用 LLM”;无论哪种模式,真正的执行权限都属于确定性运行时。
图片是职责边界的视觉类比,不表示 Agent 可以绕过业务状态机。高风险、副作用强且规则稳定的节点应继续使用确定性 Workflow、服务端授权和幂等控制。
5. 原理剖析
5.1 Agent Loop
一次循环可以抽象为:
其中:
是目标; 是第 步状态; 是模型产生动作的策略; 是直接回答、工具调用、移交或停止等动作; 是工具或环境返回的观察; 是由代码实现的状态更新函数。
模型负责提出候选动作,运行时负责判断该动作是否允许、如何执行以及是否应继续。
5.2 状态、上下文与记忆
| 概念 | 作用 | 常见内容 | 主要边界 |
|---|---|---|---|
| 运行状态 | 保证当前执行可恢复 | 当前步骤、预算、工具结果、错误 | 必须由运行时持久化 |
| 模型上下文 | 本轮决策可见信息 | 指令、最近对话、工具 Schema、观察 | 受上下文窗口和噪声限制 |
| 短期记忆 | 跨步骤保留工作信息 | 当前计划、临时结论、待办 | 需要压缩和失效 |
| 长期记忆 | 跨会话复用 | 用户偏好、稳定事实、经验 | 需要权限、来源和更新策略 |
| 外部知识 | 按需检索事实 | 文档、数据库、搜索结果 | 不是未经验证的“模型记忆” |
不要把完整日志全部塞回上下文。状态用于恢复,日志用于审计,上下文只保留下一步决策真正需要的信息。
5.3 工具定义与执行
高质量工具应具备:
- 单一清晰职责;
- 可验证的输入 Schema;
- 明确的输出和错误结构;
- 只读、可逆、不可逆的风险分级;
- 超时、幂等和审计信息;
- 对模型友好的名称和描述;
- 最小权限以及服务端二次校验。
工具描述影响模型“会不会选”,权限校验决定工具“能不能做”,二者不能混为一谈。
5.4 规划模式
- ReAct:交替进行推理与动作,适合根据观察动态调整;
- Plan-and-Execute:先生成高层计划,再逐项执行,便于展示进度;
- Router:先分类,再交给固定专家或 Workflow;
- Agent as Tool:主 Agent 保留控制权,把子 Agent 当作一个工具;
- Handoff:将后续控制权移交给另一个 Agent。
规划并非越长越好。简单任务直接执行;长任务才需要显式计划、检查点和重规划。
5.5 终止条件
终止必须由模型信号和运行时硬条件共同决定:
- 目标满足且输出通过 Schema/规则校验;
- 达到最大步数、Token、时间或费用预算;
- 连续动作或观察重复;
- 工具返回不可重试错误;
- 需要用户补充输入或批准高风险操作;
- 运行时检测到越权、注入或策略违规。
5.6 可视化辅助
Agent 概念本身不绑定框架。下面把本文最小 Python 示例与生产参考实现分开:最小栈用于验证循环、结构化动作和硬终止,生产栈还要补持久状态、策略执行、可观测性和恢复。
技术清单
| 技术点 ID | 技术点/环节 | 类型 | 采用方案 | 链路职责 | 版本/证据边界 |
|---|---|---|---|---|---|
| TP-AGENT-LOOP | 观察—行动循环 | 运行时/框架 | Python 受控循环;生产可接 OpenAI Agents SDK 等 Agent Runtime | 组装上下文、调用模型、回灌 Observation,并实施步数与预算终止 | 循环机制与 ReAct 论文一致;具体 SDK API 以项目锁定版本和官方文档为准 |
| TP-AGENT-ACTION | 结构化工具动作 | 协议 | JSON Schema Tool Calling + 服务端白名单 | 约束工具名和参数形状,在副作用发生前完成解析与校验 | Schema 只能约束结构,不能替代资源级授权、业务校验和人工确认 |
| TP-AGENT-STATE | 状态与恢复 | 存储 | 关系数据库状态快照 + 追加事件/工具结果 | 保存步骤、预算、动作指纹、Observation 和终止原因,支持重启恢复与审计 | 本文代码只使用进程内 State;生产选型需按并发、一致性和保留周期实测 |
横向选型对比
| 技术点 ID | 候选方案 | 优点 | 缺点/代价 | 适用场景 | 不适用场景 | 选择结论与依据 |
|---|---|---|---|---|---|---|
| TP-AGENT-LOOP | Python 自研受控循环 | 依赖少、控制面清晰、便于理解最小机制 | Handoff、Trace、恢复和评测能力需自行建设 | 教学、工具少、流程边界明确的原型 | 多 Agent、长任务和生产观测要求高的系统 | 本文最小示例采用,先证明机制再评估框架 |
| TP-AGENT-LOOP | OpenAI Agents SDK 等成熟 Runtime | Tool、Handoff、Guardrail 和 Trace 等原语较完整 | 引入框架约束、版本升级和供应商接口成本 | 需要快速建设可观测 Agent 服务 | 只有一次模型调用或固定简单流程 | 生产候选;必须用目标任务、权限与恢复测试验证 |
| TP-AGENT-ACTION | JSON Schema Tool Calling | 参数可机器校验,错误可结构化回灌模型 | 复杂跨字段业务规则仍需代码实现 | 模型需要在受控工具集合中选择动作 | 下游只接受自然语言且无副作用的生成 | 默认选择;Schema 与服务端授权共同生效 |
| TP-AGENT-ACTION | 自由文本动作 + 正则解析 | 接入快、演示成本低 | 格式漂移、歧义和注入风险高,难以审计 | 一次性无副作用实验 | 写操作、支付、删除和长期运行服务 | 仅作探索备选,生产工具调用不采用 |
| TP-AGENT-STATE | 关系数据库快照 + 追加事件 | 条件更新、审计和恢复边界清晰 | Schema、迁移、归档和写放大成本 | 长任务、并发 Worker、需要对账与恢复 | 可丢弃的单进程实验 | 生产默认候选,以状态一致性与恢复演练验收 |
| TP-AGENT-STATE | 仅进程内内存状态 | 实现简单、单步延迟低 | 崩溃即丢失,无法跨进程恢复或可靠审计 | 教学与短生命周期本地实验 | 外部副作用、长任务和多实例服务 | 仅用于本文最小示例,不作为生产状态源 |
图:架构|Agent 运行时的组件边界与依赖
替代文本: 用户目标进入 Agent Runtime;Runtime 组装上下文并调用模型,模型只返回候选动作。结构化动作经过 Tool Registry、Schema、策略和预算检查后才进入工具适配器;状态存储保存步骤、Observation 与终止原因,外部系统结果回到 Runtime,审计与观测组件旁路记录整条链路。
图表加载中…
读图结论: 模型只位于候选动作决策层;循环控制、工具权限、持久状态和真实副作用都属于可审计的确定性运行时。
这张架构图强调静态职责边界:替换模型不应绕过 Policy,替换工具也不应改变状态与终止规则的单一事实源。
图:技术调用流程|Agent 从目标到终止的核心循环
图表加载中…
替代文本: 模型选择动作,运行时验证工具并更新状态,循环受预算、重复检测和结果校验约束。
读图结论: 模型只是决策者,真正控制权限、状态和终止的是 Agent 运行时。
流程中的拒绝、等待用户和工具错误都会形成新的 Observation;只有输出校验通过或运行时达到明确终止边界,循环才可以结束。
6. 实现与代码
6.1 最小可运行示例
下面使用标准库模拟一个工具调用循环,重点展示状态和终止逻辑,不依赖真实模型 API:
python
from dataclasses import dataclass, field
from datetime import datetime, timezone
from typing import Any, Callable
def utc_time() -> str:
return datetime.now(timezone.utc).isoformat(timespec="seconds")
TOOLS: dict[str, Callable[..., Any]] = {"utc_time": utc_time}
@dataclass
class State:
goal: str
observations: list[str] = field(default_factory=list)
steps: int = 0
def mock_model(state: State) -> dict[str, Any]:
if not state.observations:
return {"type": "tool", "name": "utc_time", "arguments": {}}
return {
"type": "final",
"content": f"当前 UTC 时间是 {state.observations[-1]}",
}
def run(goal: str, max_steps: int = 3) -> str:
state = State(goal=goal)
while state.steps < max_steps:
state.steps += 1
action = mock_model(state)
if action["type"] == "final":
return str(action["content"])
if action["type"] != "tool" or action["name"] not in TOOLS:
raise ValueError(f"unsupported action: {action}")
result = TOOLS[action["name"]](**action["arguments"])
state.observations.append(str(result))
raise TimeoutError("agent exceeded max_steps")
if __name__ == "__main__":
print(run("查询当前 UTC 时间"))6.2 关键实现说明
State与模型消息分开,便于恢复和审计;- 工具从白名单获取,不能执行模型任意生成的函数名;
max_steps是运行时硬终止条件;- 生产实现还需 Schema 校验、超时、幂等、持久化、权限和观测;
- 真实模型应返回结构化动作,不能用脆弱的正则解析自由文本。
6.3 边界条件与验证
- 未知工具:拒绝并生成结构化错误观察;
- 参数错误:不执行工具,向模型返回可修复字段;
- 工具超时:按错误类型重试,不能无限重试;
- 重复动作:比较动作签名和观察,触发重规划或终止;
- 最终输出:通过 Schema、引用、安全和业务规则校验。
7. 实际项目案例
7.1 示例项目:AI 面试教练
项目接收目标岗位和主题,选择一道题,分析候选人回答,再根据遗漏动态追问。它适合 Agent,因为下一问依赖用户上一轮回答,无法完全预先写死。
7.2 调用链
图:业务时序|受控 AI 面试教练的一轮决策
替代文本: 用户回答先进入分析工具提取事实点、遗漏和不确定项;Agent Runtime 根据当前状态决定追问、讲解、切换或结束。只有需要外部事实时才检索知识库,评分由确定性量表执行,状态存储在达到轮次、预算或用户停止条件后输出复盘,否则生成下一题。
图表加载中…
读图结论: 模型负责选择追问方向,但事实检索、评分口径、状态更新和终止预算由外层系统控制;这正是 Agent 决策与确定性 Workflow 组合,而不是让模型包办全部流程。
7.3 关键方案
- Agent 负责根据回答选择追问;
- 评分规则、最大轮次和通过阈值由代码控制;
- 检索结果携带来源,模型不能把无来源推测当事实;
- 每轮只保留结构化摘要和关键证据,避免上下文无限增长;
- 用户要求停止或切换主题时立即终止当前循环。
7.4 异常处理与验证
| 失败 | 处理 | 验证 |
|---|---|---|
| 重复提问 | 保存问题指纹并检测相似度 | 固定对话回归测试 |
| 评分漂移 | 确定性量表 + 示例锚点 + 双评审 | 同一答案多次评测方差 |
| 检索无结果 | 明确证据不足,转人工或基础问题 | 空召回测试集 |
| 上下文超长 | 结构化摘要、阶段归档、按需检索 | 长对话压力测试 |
| 无限追问 | 最大轮次、主题完成条件、用户退出 | 故障注入测试 |
该案例是设计方案,不代表已有线上指标或真实用户结果。
8. 方案权衡与常见误区
8.1 何时使用 Agent
适合:下一步取决于中间观察、工具组合难以预先枚举、允许在受控范围内探索。
不适合:支付、删除、审批等路径固定且错误代价高的流程。此时使用 Workflow,把模型限制在分类、抽取或建议节点。
8.2 常见误区
- “接了工具就是 Agent”:缺少循环、状态和动态决策时只是 Tool Calling;
- “模型负责重试”:重试分类、预算和幂等应由运行时负责;
- “上下文就是记忆”:上下文是本轮输入,记忆需要持久化、来源和失效;
- “多 Agent 一定更强”:协作会增加延迟、成本、上下文损失和责任模糊;
- “模型说完成就完成”:必须经过代码、Schema 或业务验收条件。
8.3 生产风险与诊断
| 现象 | 常见根因 | 解决方向 | 验证方式 |
|---|---|---|---|
| 无限循环 | 无硬终止、重复观察、工具错误不可识别 | 步数/预算上限、动作指纹、错误分类 | 注入重复观察和持续失败工具,确认在上限内终止并保留原因 |
| 工具选错 | 描述重叠、工具太多、缺少路由 | 精简工具面、命名空间、路由层 | 用带标准工具标签的固定样本计算选择正确率并复查混淆对 |
| 参数幻觉 | Schema 模糊、枚举不完整 | 严格 Schema、服务端校验、错误反馈 | 构造缺字段、越界和非法枚举参数,确认副作用执行前被拒绝 |
| 记忆污染 | 未验证内容写入长期记忆 | 来源、置信度、审核、TTL、删除 | 写入冲突和低可信内容,检查检索隔离、过期和删除链路 |
| 成本失控 | 长上下文、多轮自我反思、重复工具 | 摘要、预算、缓存、确定性节点 | 运行长会话与重复动作压测,确认 Token、步数和费用门禁生效 |
8.3.1 故障演练:工具已成功执行但 Agent 因超时重复调用
- 现象与影响:外部系统已经创建订单或发送消息,但 Agent 只收到超时观察,随后用相同参数再次调用,产生重复副作用。
- 定位证据:关联 Run ID、step_id、工具参数指纹、业务幂等键、外部请求 ID、服务端审计和状态存储,确认超时发生在执行前还是响应返回阶段。
- 根因:Runtime 把所有超时都当可重试错误,工具缺少幂等与对账接口,Observation 也没有表达“结果未知”状态。
- 临时止损:暂停当前 Run 和自动重试,按业务键或外部任务 ID 查询真实状态;必要时转人工补偿。
- 长期修复:工具契约区分未执行、明确失败、成功和结果未知;写操作使用幂等键,未知状态优先对账,重试由确定性策略和总预算控制。
- 回归验证:分别注入执行前失败、执行后响应丢失、重复回调和并发同参调用,确认最终副作用唯一且 Agent 能在预算内终止。
- 防复发:监控重复动作、未知状态、对账和补偿率;高风险工具必须通过幂等、授权、超时和恢复测试才能注册。
9. 面试题与参考答案
9.1 Agent 与 Workflow 的核心区别是什么?
- 合格答案:Workflow 路径主要由代码预定义,Agent 允许模型根据观察动态选择下一步;
- 加分项:说明高风险副作用仍应由 Workflow 和权限门禁控制;
- 常见错误:把“是否调用 LLM”当成两者区别。
9.2 Tool Calling 为什么不等于 Agent?
- 合格答案:Tool Calling 是动作表达机制,Agent 还需要循环、状态、观察反馈和终止规则;
- 加分项:举例说明单次天气查询与多步旅行规划的差异;
- 常见错误:认为调用两个工具就自动成为 Agent。
9.3 Agent 的状态、上下文和记忆有什么区别?
- 合格答案:状态用于执行与恢复,上下文用于当前推理,记忆用于跨步骤或会话复用;
- 加分项:提到来源、压缩、TTL、访问控制和遗忘;
- 常见错误:把全部历史消息直接称为长期记忆。
9.4 如何防止 Agent 无限循环?
- 合格答案:步数、时间、Token 和费用上限,动作重复检测,目标验收,错误分类;
- 加分项:区分模型停止信号与运行时硬终止;
- 常见错误:只在 Prompt 中写“不要循环”。
9.5 多 Agent 的两种常见组织方式是什么?
- 合格答案:Manager 将子 Agent 当工具;Handoff 将控制权移交给专家;
- 加分项:比较上下文、责任、回收控制和 Guardrail 边界;
- 常见错误:按角色数量堆 Agent,却没有清晰接口。
10. 递进追问
- 基础概念:一次函数调用和一个 Agent Loop 的最小差别是什么?
- 原理细节:工具结果为什么要作为 Observation,而不是直接返回用户?
- 实现边界:模型成功调用外部接口但服务在落库前崩溃,如何恢复?
- 工程权衡:上下文压缩可能丢信息,如何设计可回溯摘要?
- 系统设计:一百个工具如何避免全部注入上下文?
- 项目复盘:AI 面试教练为什么某些环节适合 Agent、某些环节必须固定 Workflow?
11. 实践任务
- [ ] 将最小示例替换为真实结构化模型调用;
- [ ] 增加两个只读工具和一个需要确认的写工具;
- [ ] 实现最大步数、动作重复检测和总预算;
- [ ] 将状态序列化到 JSON,并模拟进程重启后恢复;
- [ ] 为未知工具、参数错误、超时和重复观察编写测试;
- [ ] 用 3 分钟讲清 Agent、Tool Calling 和 Workflow 的区别。
12. 相关知识与参考资料
12.1 相关知识
- 前置:Prompt 与结构化输出
- 后续:Agent 工程化与安全
- 架构:AI 应用系统设计
- 项目:AI 面试教练项目
12.2 一手参考资料
以下资料于 2026-07-10 核对:
- ReAct: Synergizing Reasoning and Acting in Language Models
- Toolformer: Language Models Can Teach Themselves to Use Tools
- OpenAI Agents SDK - Tools
- OpenAI Agents SDK - Handoffs
13. 简明总结
一句话记忆: Agent 是“模型动态决策 + 运行时受控执行”的观察—行动循环。
- Tool Calling 是动作机制,Agent 还需要状态、循环和终止条件;
- 模型提出动作,代码控制权限、预算、幂等和最终验收;
- 状态用于恢复,上下文用于推理,记忆需要来源与失效策略;
- 动态开放问题适合 Agent,固定高风险流程优先 Workflow;
- 面试重点是边界、失败恢复和项目证据,而不是框架名。