FDE W4D1 学习手册 · Agent 核心与 Loop
W4 Week1 Day1 · A 级(必须掌握,面试核心)· 4h · 学完能讲清"Agent / Workflow / Agentic Workflow 的区别"并手写一个 Agent Loop
本日定位: W4 进入"Agent 工程化"阶段。Day1 打地基:先厘清 Agent 到底和 Workflow 有何不同,再吃透最朴素的"模型决策→调工具→回填→判断停止"循环(Agent Loop),这是所有 Agent 框架(包括 Day2 的 LangGraph)的底层逻辑。
学完能回答: ① 用一句话区分 Agent / Workflow / Agentic Workflow;② 讲清 ReAct、Tool Calling Loop、停止条件、最大步骤、Token 预算;③ 手写或口述一个带错误处理和工具回填的 Agent Loop;④ 结合特药理赔 Agent 说明"为什么需要循环"。
使用方法: 通读原理 → 重点看「面试话术」「易错点」→ 动手跑一遍 s9/s10 的代码 → 做自测清单 → 配合《FDE-W4D1-评测题.md》。选中不熟的词可标注(左下★重要 / 右下📌待查)。
一、概念区分:Agent / Workflow / Agentic Workflow
1.1 三者定义
Workflow(工作流) :流程是预先写死 的,由代码/配置固定每一步的先后顺序,模型只在某几个确定节点被调用(或完全不用模型)。本质是"确定性管道"。例:固定 7 步的 ETL 批处理。
Agent(智能体) :由模型自主决策 下一步做什么——决定调哪个工具、是否继续、何时停止。控制权在模型手里 ,流程是动态生成的。本质是一个"循环 + 自主决策"的系统。
Agentic Workflow(智能体化工作流 / 代理式工作流) :Workflow 与 Agent 的混合体 ——大框架是人工编排的图(有确定性骨架),但在某些节点把"该走哪条分支/怎么调工具"交给模型自主决定。兼具可预期性与灵活性。
1.2 对比表
维度 Workflow Agent Agentic Workflow
流程是否写死 完全写死 动态生成 骨架写死,分支/工具由模型决策
控制权 开发者 模型 开发者(骨架)+ 模型(节点内)
可预测性 高 低 中
灵活性 低 高 中高
适用 固定规则批处理 开放/探索性任务 企业可控的复杂业务(推荐)
1.3 关键判断:一个系统是不是 Agent?
核心看"下一步行动是否由模型在运行时动态决定" 。如果下一步永远是 if/else 写死的,那只是 Workflow;如果模型根据中间结果自己选下一步,就是 Agent;如果"整体走哪几条预设路径"由模型选,就是 Agentic Workflow。
工程上不要盲目上纯 Agent 。企业场景(理赔、风控)要可控、可复盘、可合规,纯 Agent 不可预测、难审计。最佳实践是把确定性的主流程写成 Workflow/图(Day2 LangGraph 的状态图),只在少数需要"判断/检索/决策"的节点交给模型——这就是 Agentic Workflow,也是特药理赔 Agent 采用的形态。
一句话:Workflow 是"代码定死每一步";Agent 是"模型自己决定每一步";Agentic Workflow 是"开发者定骨架、模型填细节"。判断标准就看"下一步是谁决定的"。企业里多数用 Agentic Workflow,因为要可控。
① Agent ≠ 调了大模型就等于 Agent。一个写了死的 for 循环、每步固定调一次 LLM 做摘要,那只是 Workflow。② Agentic Workflow 不是"降级版 Agent",而是更成熟的企业形态 ,别觉得"非 Agent 不高级"。③ 面试官常追问"你的理赔系统算哪种"——答:主链路是 Agentic Workflow(图骨架 + 风险/材料判断节点由模型决策),其中纯规则校验是 Workflow。
二、Agent 的四大核心特征
一个典型 LLM Agent 由四个要素构成,缺一不可:
模型(Model) :做决策的"大脑",通常是 LLM,负责理解、规划、选工具、生成结论。生产用低 Temperature(0~0.3)保证决策稳定。
工具(Tools) :Agent 能调用的外部能力,如 OCR、数据库查询、规则引擎、HTTP 接口。工具要有明确的 schema(名称、参数、返回)。
环境 / 记忆(Memory / State) :保存对话历史、工具返回、中间状态,供下一轮决策使用。
控制循环(Control Loop) :把"模型决策→执行工具→回填结果→再决策"串成循环,并决定何时停。这是 Agent 区别于"一次性问答"的本质。
候选视角(Java+大数据+医保): 你已有的 OCR 服务、理赔 DB 查询、规则引擎,本质上就是 Agent 的工具 ;你熟悉的"状态机/工作流引擎"对应 Agent 的控制循环 。Agent 不是推翻你旧系统,而是给旧系统套一层"会自己决策的编排层"。
Agent = 模型 + 工具 + 记忆 + 控制循环。核心是"控制循环"让它能在多轮里不断调用工具、逼近目标,而不是一问一答。
三、ReAct 范式(推理 + 行动)
3.1 原理
ReAct(Reason + Act )是 2022 年提出的经典 Agent 范式:让模型交替进行推理(Thought) 和行动(Action) ,每轮先把"我为什么这么做"想清楚(Thought),再决定调什么工具(Action),看到工具结果(Observation)后继续下一轮推理。
Thought(我该做什么)→ Action(调哪个工具+参数)→ Observation(工具返回)→ Thought → Action → ... → 最终答案
3.2 为什么重要
把"思考链"显式化,模型不容易瞎走,便于 debug(你能看到它的 Thought)。
是 Tool Calling Loop 的"思维模板"。现代 Agent 不一定在输出里打印 Thought,但内部逻辑一致:模型根据历史和工具结果决定下一步。
ReAct = 让模型一边"想"(Thought)一边"做"(Action),看到结果(Observation)再想再做,直到能回答。它是 Agent Loop 的思想原型;今天的 Tool Calling 只是把 Thought/Action 结构化成函数调用。
① ReAct 不是"多一个花哨功能",而是 Agent Loop 的通用模板,理解它能理解一切 Agent 框架。② 现代框架(LangChain/LangGraph)不一定让你手写 Thought 文本,而是用 tool_calls 字段表达 Action——别以为"没看到 Reason/Act 字样就不是 ReAct"。
四、Tool Calling Loop(工具调用循环)
4.1 循环骨架
一次 Agent 运行就是不断重复下面这条 Loop,直到模型不再请求工具、直接给最终答案:
初始化 messages(system + user)→ 循环:调模型 → 若模型返回 tool_calls → 逐个执行工具 → 把工具结果作为 tool 消息回填 → 回到循环;否则(模型返回普通文本)→ 结束
4.2 一次迭代里发生了什么
把完整 messages(含历史 + 之前工具结果)发给模型。
模型返回:要么是普通文本 (最终答案,循环结束),要么是 tool_calls(一组待执行工具)。
对每个 tool_call:按名字找到本地工具函数,把参数喂进去,拿到返回值。
把返回值封装成 role: "tool" 的消息,回填 进 messages。
带着更新后的 messages 再调模型——模型看到工具结果,决定下一步或结束。
4.3 消息结构(OpenAI 风格,业界通用)
# 模型请求调用工具(assistant 消息携带 tool_calls)
{ "role": "assistant", "tool_calls": [
{ "id": "call_1", "type": "function",
"function": { "name": "ocr_scan", "arguments": "{\"file_url\":\"...\"}" } } ] }
# 工具结果回填(tool 消息,必须带对应 tool_call_id)
{ "role": "tool", "tool_call_id": "call_1", "content": "{\"fields\": {...}}" }
这个 Loop 是 Agent 的全部。LangGraph、AutoGen、CrewAI 底层都是这个循环,只是加了"图编排、状态管理、并发、持久化"等外壳。面试中能纯手写这个 Loop,说明你懂 Agent 的本质,而不是只会调框架 API。企业生产里真正跑的也是它,框架只是帮你少写胶水代码。
Agent Loop 就三步循环:① 调模型看它要调什么工具;② 执行工具拿到结果;③ 把结果回填回对话,再问模型。模型不再要工具、直接给答案时,循环结束。
五、停止条件与循环终止
5.1 什么时候停
循环终止有三类信号,命中任一即停:
停止信号 含义 谁触发
模型返回最终答案(无 tool_calls) 任务完成 模型自主判断
达到最大步骤数(max_steps) 防死循环,强制退出 代码硬限制
达到 Token 预算 / max_tokens 防成本与超长 代码/API 限制
5.2 常见"停不下来"的隐患
工具反复返回"需要更多信息",模型反复调同一个工具 → 必须靠 max_steps 兜底。
模型陷入"调工具 A → A 说调 B → B 说调 A"的环 → 需要去重 / 循环检测。
模型一直不返回最终答案(持续 tool_calls)→ 靠 max_steps 强制收敛到"转人工/降级"。
停止靠三件事:模型自己说"做完了"(不再要工具)、达到最大步数、达到 Token 上限。生产必须设 max_steps,否则模型可能一直转圈烧钱。
① 永远不要只依赖"模型自觉停止"——必须设 max_steps 硬上限 ,否则遇上有 bug 的工具会无限循环、无限烧 token。② 达到 max_steps 时不能直接抛错给业务方 ,要降级(转人工 / 返回"处理超时,请补充材料")。③ max_steps 和 max_tokens 是两回事:前者是"循环轮数",后者是"单轮生成 token 数"。
六、最大步骤(max_steps)与 Token 预算
6.1 参数设计
参数 含义 经验值
max_steps 循环最多几轮 特药理赔建议 8~15 轮;开放任务可到 20+
max_tokens(每轮) 单轮模型输出上限 工具调用场景 800~2000
总 Token 预算 整次 Agent 运行的上限 按成本 SLA 设定,如 8000
6.2 预算为什么重要(成本 & 延迟)
每轮都要把完整 messages(含之前所有工具结果)重发给模型 ,所以 Token 消耗随轮数线性增长。10 轮、每轮历史 2000 token,输入就已 2 万 token。不控制预算,单次理赔可能花掉几毛到几块钱,量大了成本爆炸。
Agent 的成本主要来自"每轮重发历史"。工程上:① 工具结果只回填必要字段 (别把 50KB OCR 原文全塞回 messages);② 对长工具结果做截断/摘要后再回填;③ 设总 Token 预算,超限即降级。理赔日均百万单,省 500 token/单就是实打实的钱。
max_steps 管"转几圈",Token 预算管"总共花多少 token"。因为每轮都要重发历史,轮数越多越贵越慢。生产要压缩回填内容 + 设预算上限。
① 很多人忽略"工具结果回填也会进历史、被反复计费"——一个 50KB 的 OCR JSON 原样回填,10 轮就重复计费 500KB。② max_steps 设太小会让复杂案子提前失败;设太大又烧钱。要按业务分档(简单案 5 步、复杂案 15 步)。
七、错误处理与工具结果回填
7.1 回填的两条铁律
回填消息必须带 tool_call_id ,框架靠它把结果对应回那次调用。漏了会报错或直接忽略。
工具出错也要回填 (把错误信息文本作为 tool 消息返回),而不是让程序抛异常中断整个 Loop——让模型看到错误后自行决定重试 / 换工具 / 转人工。
7.2 错误处理矩阵
错误类型 处理 回填内容
工具超时 重试 1~2 次,仍超时回填错误 "OCR 服务超时,请重试或转人工"
参数校验失败 把错误反馈模型,让它改参数再调 "参数 file_url 缺失/格式错"
工具返回空/异常 回填异常,模型决定降级 "未识别到发票字段"
模型要了不存在的工具 代码拦截,回填"无此工具" "unknown_tool: xxx"
7.3 代码示例(回填错误而非抛异常)
for tool_call in assistant.tool_calls:
try:
result = dispatch(tool_call.function.name, **json.loads(tool_call.function.arguments))
except Exception as e:
result = f"[tool_error] {e}" # 错误也回填,让模型看见
messages.append({"role": "tool", "tool_call_id": tool_call.id, "content": str(result)})
把异常"喂回模型"而非"中断流程",是 Agent 健壮性的关键。模型看到 OCR 超时,可以自己选"换 OCR 工具 / 让用户输入 / 转人工"。这正是 Agent 比死代码优雅的地方:错误也是下一次决策的 Observation。但你也要在代码层加熔断(连续 N 次错误直接转人工),别无限信任模型的"自救"。
工具报错也要回填(带 tool_call_id),让模型看见错误后自己决定重试还是转人工——别直接让程序崩。同时要设失败熔断,避免无限重试。
① 漏填 tool_call_id 是新手最常见 bug,结果工具结果对不上调用,模型"瞎答"。② 不要把原始异常堆栈全回填(可能含密钥/SQL),要脱敏成"OCR 服务异常"。③ 不能只靠模型自救——必须代码层加"连续失败 N 次→转人工"的熔断。
八、Agent Loop 的工程含义(面试常问)
可观测性 :每一轮(输入、tool_calls、工具结果、输出)都要落 Trace,否则线上出问题无法复盘——这是 FDE(前端/全栈开发工程师?此处指 AI 工程)的核心能力。
幂等 :工具要幂等,因为模型可能重复调同一工具(尤其重试时)。你的 OCR / 查询接口必须支持重复调用不产生副作用。
可控性 :用 max_steps + Token 预算 + 熔断保证"不会失控",这是企业敢上 Agent 的前提。
降级 :任何一步失败都要有兜底路径(转人工 / 默认值 / 拒答),流程绝不能卡死。
与旧系统协同 :Agent 是"编排层",你的 Java 微服务、规则引擎、数仓都是它的工具,不是要重写,是要被挂载。
工程上 Agent Loop 不是写完循环就完事:要落 Trace 可观测、工具要幂等、要 max_steps/预算/熔断防失控、每步要有降级兜底。Agent 是编排层,复用你已有的 Java 服务和规则引擎。
九、实战:手写一个 Agent Loop(Python)
下面是不依赖任何框架的极简 Agent Loop,逻辑与 LangGraph 底层一致。以特药理赔场景为例:模型可调用 ocr_scan(识别材料)、query_policy(查保单)。
import json, openai
client = openai.OpenAI()
TOOLS = [
{"type":"function","function":{"name":"ocr_scan",
"description":"识别理赔材料图片,返回结构化字段","parameters":{
"type":"object","properties":{"file_url":{"type":"string"}},"required":["file_url"]}}}},
{"type":"function","function":{"name":"query_policy",
"description":"按保单号查保单与特药目录","parameters":{
"type":"object","properties":{"policy_no":{"type":"string"}},"required":["policy_no"]}}}},
]
def dispatch(name, args):
# 真实场景这里调你的 Java 微服务 / 规则引擎
if name == "ocr_scan": return {"patient":"张三","drug":"奥希替尼","amount":38000}
if name == "query_policy": return {"covered":True,"copay":0.3,"quota":50000}
raise ValueError("unknown_tool")
def run_agent(user_req, max_steps=10):
messages = [{"role":"system","content":"你是特药理赔审核助手,按需调用工具。"},
{"role":"user","content":user_req}]
for step in range(max_steps):
resp = client.chat.completions.create(
model="your-model", messages=messages, tools=TOOLS, temperature=0.1)
msg = resp.choices[0].message
if not msg.tool_calls: # 模型给出最终答案 → 停止
return msg.content
messages.append(msg) # 把 assistant(tool_calls) 加入历史
for tc in msg.tool_calls:
try:
args = json.loads(tc.function.arguments)
result = dispatch(tc.function.name, args)
except Exception as e:
result = f"[tool_error] {e}"
messages.append({"role":"tool","tool_call_id":tc.id,"content":json.dumps(result, ensure_ascii=False)})
return "已达最大步骤,转人工审核" # 降级兜底
print(run_agent("帮我审核这张特药理赔单,文件在 /tmp/claim1.png,保单号 P123"))
这段代码覆盖的考点: 循环结构、tool_calls 解析、tool_call_id 回填、错误处理回填、max_steps 终止、最终答案终止、降级兜底。面试手写版不必能跑,但要结构清晰。
十、实战:从 Java 工程师视角看 Agent Loop
你熟悉 Spring / 微服务,可以把 Agent Loop 映射成你会的模式:
Agent 概念 Java 对应物
messages 列表 一个 List<ChatMessage>,贯穿一次请求
tools 注册 一个 Map<String, Function<String,String>> 或 Spring Bean 容器
dispatch 策略模式 / 工厂:按 name 路由到对应 Service
tool 结果回填 构造 ToolMessage 加入 list
max_steps / 预算 for 循环上限 + 计数器(Guava RateLimiter 控成本)
熔断 Resilience4j 的 CircuitBreaker 包住工具调用
你的 Java 背景不是负担而是优势:Agent Loop 本质就是一个"带 LLM 决策的 while 循环 + 策略路由 + 熔断降级",和你们做过的"订单状态机 + 风控规则引擎"同构。面试时可以主动说:"我用 Spring 把工具做成 Bean,用 Resilience4j 做熔断,用 TraceId 串联每轮调用做可观测"——这比只会调 LangChain 更显工程深度。
Agent Loop 映射成 Java 就是:List 存对话、Map 注册工具、策略模式 dispatch、for 上限做 max_steps、Resilience4j 做熔断、TraceId 做可观测。你旧系统的能力直接当工具挂载。
十一、Agent Loop 高频易错点(综合)
① 把 Workflow 当 Agent 讲 :写死流程 + 每步固定调一次 LLM,不是 Agent,别在面试里混淆。② 漏 tool_call_id :工具结果回填必须带 id,否则模型对不上。③ 只靠模型自觉停止 :必须有 max_steps,否则死循环烧钱。④ 异常直接抛 :应脱敏后回填,让模型决策。⑤ 工具不幂等 :模型重试会放大副作用(重复扣减、重复发短信)。⑥ 回填超长原文 :OCR/DB 大结果原样回填导致成本翻倍。⑦ 无降级 :任何一步失败都应转人工/默认值,不能让理赔流程卡死。⑧ Temperature 太高 :工具参数要准,Agent 决策用 0~0.3,别用 0.9。
十二、学习资源(中文 / 非 OpenAI)
先看完李宏毅第2讲建立 Agent 直觉,再用 B站 LangGraph 视频看 Loop 怎么落地,最后翻官方文档查细节。三件套足够覆盖本日面试。
十三、面试达标线①:Agent / Workflow / Agentic Workflow 区别
问题 满分回答要点
三者区别? Workflow=流程写死、开发者控制;Agent=模型自主决策下一步;Agentic Workflow=骨架写死、关键分支/工具由模型决策。判断标准:下一步是谁决定的。
你们理赔系统算哪种? 主链路是 Agentic Workflow(图骨架 + 风险/材料判断节点由模型决策),纯规则校验是 Workflow。强调"企业用可控的混合形态"。
为什么不直接上纯 Agent? 不可预测、难审计、合规风险;企业偏好可控的 Agentic Workflow,确定性主流程 + 模型决策节点。
达标线①核心:能一句话区分三者(谁决定下一步),并能结合特药理赔说清"为什么用 Agentic Workflow 而非纯 Agent"。
十四、面试达标线②:写/讲清一个简单 Agent Loop
system+user 初始化 → while step < max_steps:调模型 → 有 tool_calls?逐个 dispatch 执行 → 脱敏错误也回填(tool_call_id) → 无 tool_calls?返回答案并 break → 超限返回降级(转人工)
循环 :重复"模型决策→执行工具→回填"直到模型给最终答案。
工具调用 :解析 tool_calls,按 name 路由到本地函数,参数 JSON 解析。
结果回填 :构造 role:tool 消息,带 tool_call_id,错误也回填(脱敏)。
停止判断 :模型无 tool_calls → 结束;达到 max_steps → 降级转人工。
工程保障 :max_steps、Token 预算、幂等工具、熔断、Trace、降级兜底。
达标线②核心:能口述或手写这个循环(决策→调工具→回填→判停),并提到 tool_call_id 回填、错误处理回填、max_steps 终止、降级兜底四个关键点。
十五、W4D1 自测清单
能一句话区分 Agent / Workflow / Agentic Workflow,并说清判断标准(下一步谁决定)。
能结合特药理赔说明为什么用 Agentic Workflow 而非纯 Agent。
能说出 Agent 四大要素(模型/工具/记忆/控制循环)。
能讲清 ReAct 的 Thought→Action→Observation 模板及其与 Tool Calling 的关系。
能口述 Tool Calling Loop 的完整循环(决策→执行→回填→再决策)。
能说清三种停止信号,并强调为什么必须设 max_steps。
能解释 max_steps 与 max_tokens(每轮/总量)的区别及成本来源(每轮重发历史)。
能说出工具结果回填的两条铁律(带 tool_call_id、错误也回填)及脱敏要求。
能讲清错误处理矩阵(超时/参数错/异常/未知工具)与失败熔断。
能默写或讲清一个带 max_steps+降级的 Agent Loop 骨架(达标线②)。
能从 Java 视角把 Agent Loop 映射到 List/Map/策略模式/Resilience4j/TraceId。
能说出 Agent Loop 的工程含义:可观测、幂等、可控、降级、复用旧系统。
十六、高频面试题速记卡
Q:Agent 和 Workflow 有什么区别?
Workflow 流程写死、开发者控制;Agent 下一步由模型自主决策。判断标准:"下一步是谁决定的"。
Q:什么是 Agentic Workflow?
骨架由开发者写死(图/流程),但关键分支和工具调用由模型在运行时决策,兼顾可控与灵活,企业最常用。
Q:一个系统调了 LLM 就是 Agent 吗?
不一定。如果每步都是 if/else 写死的,只是 Workflow。Agent 的核心是"模型动态决定下一步"。
Q:Agent Loop 为什么必须设 max_steps?
防止模型陷入死循环(反复调同一工具/互调)无限烧 token。命中上限要降级转人工,不能直接报错。
Q:工具调用结果回填要注意什么?
① 必须带 tool_call_id 对应回那次调用;② 工具报错也要脱敏后回填,让模型决策重试/转人工,别直接中断。
Q:Agent 成本高在哪?
每轮都要把完整历史(含之前工具结果)重发给模型,Token 随轮数线性增长。要压缩回填内容、设 Token 预算。
Q:ReAct 和 Tool Calling 什么关系?
ReAct 是"想(Thought)→做(Action)→看(Observation)"的范式原型;现代 Tool Calling 把 Action 结构化成 tool_calls,思想一致。
Q:工具不幂等会有什么问题?
模型可能重试调用,放大副作用(重复扣减、重复发短信)。工具必须幂等,Agent 才安全。
Q:Agent 温度为什么用低值?
工具参数必须准确、决策要稳定,用 0~0.3;高温度会让参数乱飞、决策漂移。
Q:Java 工程师做 Agent 有什么优势?
Agent Loop = while循环+策略路由+熔断降级,与你做过的状态机/规则引擎同构;旧系统直接当工具挂载,Spring/Resilience4j 经验直接用。
FDE W4D1 学习手册 · Agent 核心与 Loop(面试级)· 配合《FDE-W4D1-评测题.md》自测
📌 待查 ★ 重要
★0
📌0