W4D1 学习手册 1.Agent概念2.核心特征3.ReAct4.ToolLoop5.停止条件6.步数预算 7.结果回填8.工程含义9.实战Py10.实战Java11.易错12.资源 达标①达标②自测速记

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 三者定义

1.2 对比表

维度WorkflowAgentAgentic 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 由四个要素构成,缺一不可:

  1. 模型(Model):做决策的"大脑",通常是 LLM,负责理解、规划、选工具、生成结论。生产用低 Temperature(0~0.3)保证决策稳定。
  2. 工具(Tools):Agent 能调用的外部能力,如 OCR、数据库查询、规则引擎、HTTP 接口。工具要有明确的 schema(名称、参数、返回)。
  3. 环境 / 记忆(Memory / State):保存对话历史、工具返回、中间状态,供下一轮决策使用。
  4. 控制循环(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 为什么重要

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 一次迭代里发生了什么

  1. 把完整 messages(含历史 + 之前工具结果)发给模型。
  2. 模型返回:要么是普通文本(最终答案,循环结束),要么是 tool_calls(一组待执行工具)。
  3. 对每个 tool_call:按名字找到本地工具函数,把参数喂进去,拿到返回值。
  4. 把返回值封装成 role: "tool" 的消息,回填进 messages。
  5. 带着更新后的 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 常见"停不下来"的隐患

停止靠三件事:模型自己说"做完了"(不再要工具)、达到最大步数、达到 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 回填的两条铁律

  1. 回填消息必须带 tool_call_id,框架靠它把结果对应回那次调用。漏了会报错或直接忽略。
  2. 工具出错也要回填(把错误信息文本作为 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 的工程含义(面试常问)

工程上 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 → 超限返回降级(转人工)
  1. 循环:重复"模型决策→执行工具→回填"直到模型给最终答案。
  2. 工具调用:解析 tool_calls,按 name 路由到本地函数,参数 JSON 解析。
  3. 结果回填:构造 role:tool 消息,带 tool_call_id,错误也回填(脱敏)。
  4. 停止判断:模型无 tool_calls → 结束;达到 max_steps → 降级转人工。
  5. 工程保障:max_steps、Token 预算、幂等工具、熔断、Trace、降级兜底。
达标线②核心:能口述或手写这个循环(决策→调工具→回填→判停),并提到 tool_call_id 回填、错误处理回填、max_steps 终止、降级兜底四个关键点。

十五、W4D1 自测清单

十六、高频面试题速记卡

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》自测
📌 待查★ 重要