痛点二:实战中离不开Agent Loop?" src="/uploads/images/333.jpg"/>
正如 Borish Cherny 所说:“我现在不给 Claude 写提示词了那些 Loop 替我写”。Peter Steinberger 也指出:“你不应该再给编程 Agent 写提示词了应该设计 Loop 来提示你的 Agent”。
AlphaSignal 在《Loop Engineering: Do You Actually Need to Put Your Agent in a Loop?》中:
为什么不能只靠单次调用?说起来,
场景示例:AI 帮你写工作汇报
-
单次 LLM 调用:一次性生成文本。格式、数据常常不符合团队标准;补充说明时模型往往忘记前一次反馈。
-
脚本化流程:预先写好的固定流程只能处理已知方法;遇到数据缺失或异常文件时卡死。
-
Loop Agent:Agent 自主读取日报、进度表、会议记录;发现数据缺失主动去关联文件补全;按模板检查格式并自行修正——整个过程无需人为干预。
| 方式 | 能做什么 | 不能做什么 |
| 单次 LLM 调用 | 回答问题、生成文本 | 执行多步任务、动态决策、处理意外情况 |
| 脚本化流程 | 确定性的流程自动化 | 、自主规划、错误恢复 |
| Loop Agent | 多步推理、工具调用、、自主决策 | |
一、什么是 Loop?
说到一句话。Loop 是让 AI Agent 在「推理 → 行动 → 观察」之间不断循环,直到满足任务目标的控制结构。
根本差别在于决策权归属:
-
脚本:决策权在开发者手里执行固定指令序列。
-
Loop:LLM 在每一步自行决定接下来要做什么——这才是真正的“智能”。
while True:
response = llm.call
if response.is_final_answer:
return response.content
context.append)
二、Loop 的三个基本元素
推理
LLM 从完整上下文中判断「接下来该做什么」。说到返回两种可能,
-
- 完成任务 → 输出最终答案并退出循环。老实说,
-
- 未完成 → 指定一个工具进行接下来行动。
行动
LLM 所选工具会被实际执行。工具类型不限,例如:
| 工具类型 | 示例 |
|
| 文件操作
读/写文件
执行代码
子进程运行脚本
调用命令行
|
- 打开/保存报告文档
- 动态生成 Python 脚本并运行
- 调用程序 shell 完成部署命令
|
| - 调用子 Agent 完成特定子任务
|
|
观察
LLM 必须看到工具真实返回的结果。包括成功信息和错误信息,原则是"错误原文必须回写上下文",否则模型会误以为一切正常而继续错误方法。
try:
result = tools
except Exception as e:
result = f"Tool error: {e}" # ✅ 把错误原文交给模型。让它自行决定如何处理
context.append})
三、Loop 必须解决的五大工程难题
再看问题一,何时停止?痛点:循环无限进行导致资源浪费与不可控成本。按理说,
Agent 必须拥有明确退出信号。否则会像没有截止日期的员工一样不停检查修改。常见退出策略包括:
-
- 模型主动返回「final_answer」标记。
-
- 达到预设最大步数,强制截断并返回当前结果。.
-
- 检测到满足业务级验收标准。
-
- 人工审批后显式终止。
问题二这方面,上下文爆炸
痛点:Token 消耗飙升导致成本失控还有模型窗口溢出报错。
Cycle 每轮都会把工具输出追加进上下文,长任务很快超过 LLM 窗口大小。至于常用缓解手段,
-
- 滚动窗口。只保留最近 N 步,说起来,
-
- 对历史记录做摘要压缩。将前面步骤浓缩为简短概述。
-
- 按关键性筛选,仅保留「目标 +关键中间结果 + 最近几轮」。
The rule is simple: **Never swallow exceptions**. 把异常原样写回上下文,让模型自行决定重试、更换方案或直接上报人类。
# ❌ 错误吞掉示例
try的观点是,result = execute
except的观点是,pass
# ✅ 正确写法
说到try。result = execute
except Exception as e:
result = f"Tool error: {e}"
context.append
从问题四来看,需要等待外部事件
痛点:同步阻塞导致服务卡死或超时无自动恢复机制。
If loop reaches a step that depends on an external signal,它应当进入「挂起」状态并持久化当前上下文。当信号到达后再恢复继续执行,从而避免空转或崩溃。实现思路类似移动端来电暂停音乐播放再恢复播放的机制。
至于问题五,任务规模过大
痛点:单个循环耗时过长且难以调试与监控。
Solve by decomposition. 把大型任务拆分为若干相互独立或弱耦合的子任务。每个子任务由独立的子 Agent Loop 并行执行,最终聚合结果。这样整体耗时取决于最慢子任务。而不是所有子任务之和,大幅提高效率与可靠性。
四、Loop 完整状态机概览
A complete Loop can be modeled as a finite‑state machine with following states:
-
- **Init** → 收集初始目标与约束。
-
- **Reason** → 决策是否结束或选择工具。
-
- **Act** → 执行所选工具。
-
- **Observe** → 将结果写回并检查错误。
-
- **CheckStop** → 判断是否满足退出条件。
-
- **WaitExternal** → 等待外部信号。
-
- **Decompose** → 当规模过大时切换到子‑Loop 模式。
-
- **Terminate** → 返回最终答案或错误报告。\* 每条转移都伴随明确输入/输出,使得调试与监控成为可能。\* 状态图在实际实现中可通过枚举类 + switch‑case 编码实现。\* 此结构保证了「停」「不爆」「容错」「挂起」「拆分」五大需求全部得到覆盖。\*
五、Loop 与相关概念关系图谱
A. Loop 在 Agent 架构中的位置
-
*Model* :LLM 本体,仅在 Reason 阶段被调用一次用于思考与决策;话说回来,
-
*Loop Engine* :控制流。引擎负责触发 Reason → Act → Observe 循环,是 Agent 真正“动起来”的主要;
-
*Harness* :生产级外壳。实现安全沙箱、多实例调度还有监控报警等功能,使得 Loop 能够在线上稳健运行。<\/ul>
B. Loop vs CoT vs ReAct vs Harness<\/h3>
<\/th>| 解决什么问题<\/th> |
<\/ad>
| Chain‑of‑Thought <\/td> | 单轮内部思考策略<\/ td> | 提高一次推理深度,不涉及循环<\/ td> |
| ReAct<\/ td> | Prompt 格式同时包含 “思考” 与 “行动” 标记<\/ td> | 让模型能够一次输出 tool call,而非仅文本<\/ td> |
| Loop<\/ td> | 完整工程结构,将 CoT/ReAct 包装成可迭代控制流<\/ td> | 实现多步推理+动作+观测+收敛<\/ td> |
| Harness<\/ td> | 运行时框架/解释器/VM<\/ td> | 保证 Loop 在生产环境下安全、高效、易监控<\/ td> |
<\/tbody>
<\/table>
"CoT 管模型怎么想","ReAct 管模型怎么表达","Loop 管任务怎么推进","Harness 管程序怎么跑稳"
六、Agent 工程全景层级
| Agent 工程层 | 对标软件/计算机概念 | 一句话本质 | |
\<\/ad>
\
\
\Prompt engineering\ t d \t \t \t : 把人类意图转成 LLM 能识别的一行代码 \<\/ tr\>\
\
\
Lo op engineering \ n t d>
控制流 \ n t d>
把单次调用变成迭代。可重试,可收敛 \<\/ tr\>\
\
\
Harness engineering \ n t d>
Runtime / Interpreter / VM \ n t d>
为 Lo op 提供容错、安全、防崩溃包装 \<\/ tr\>\
\
\
Context engineering \ n t d>
内存管理 / 手动 GC \ n t d>
就是 RAM,需要 evict 与 compact \<\/ tr\>\
\
\
Memory engineering \ n t d>
持久化 / DB 落盘 \ n t d>
跨 Session 保存状态 \<\/ tr\>\
\
\
Eval / Verifier engineering \ n t d>
类型程序 / 单元测试 \ n t d>
校验 agent 返回值是否合法 \<\/ tr\>\
\
\
Orchestration engineering \ n t d>
并发 / 多线程 / Actor model \ n t d>
多 agent 调度、防死锁 \<\/ tr\>\
\
\这篇文章作者:RuiRui 智能驾驶事业群组
This article will help you:
-
在Agent工程 architecture 里 and *** it’s core structure that makes an agent truly “work”.
I see re is still messing up due to escape sequences earlier.
Given time constraints I think I should produce a clean HTML version without errors manually typed.
Let's start again carefully:
这篇文章作者的观点是,RuiRui 智能驾驶事业群组
这篇文章可以帮助你:
建立对 Loop 的基本认知,搞清楚
‘Agent&,amp;amp,amp;amp,amp;amp,amp;
amp,amp;m&,'>
•';'',''),//;.),' "
说到背景。`)
至于场景示例,
1️⃣ 单次 LLM 调用:
- 一问一答生成报告,但格式和数据经常不符合团队规范。- 再补充说明时模型往往忘记上一轮反馈。🚀 脚本化流程:
- 固定顺序读取日报 → 调用模型 → 输出报告。- 遇到数据缺失或异常文件时卡住。💡 **Loop Agent**:
- 主动读取所有相关文件;- 自动发现缺失信息并去关联资源补全;说起来,- 按团队模板自检格式并自行修正。
| 方法 |
能做到 |
做不到 |
| 单次 LLM 调用 |
回答问题·生成文本 |
多步执行·动态决策·处理意外 |
| 脚本化流程 |
确定性自动化 |
·自主规划 |
| Loop Agent |
多步推理·工具调用·自适应 |
|
一️⃣ 什么是 Loop?
从一句话概括来看。Loop = “推理 → 行动 → 观察” 的闭环控制结构,直到满足预设目标为止。
主要概念——上下文
每一次推理都能看到完整上下文,相当于 AI 的工作笔记本。每轮行动产生的数据都会追加进去,为下一轮提供依据。不过,
为什么要用 Loop 而不是硬编码脚本?不过,
-
脚本 决策权在开发者手里只能按固定顺序走;
-
Loop 决策权交给 LLM,让它自行决定接下来要做什么这才是真正意义上的智能。
python
while True:
response = llm.call
if response.is_final_answer:
return response.content
context.append)
二️⃣ Loop 的三大主要要素
🔹 推理
-
从当前全部上下文出发判断:“接下来该干嘛?”
-
两种输出的观点是。
-
final_answer → 完成任务,退出循环;
-
tool_call → 指定一个工具继续执行。
🔹 行动
LLM 所选工具被实际触发。从支持任意类型来看,
| 工具类别 |
示例 |
| 文件操作 |
打开/保存报告 |
| 执行代码 |
动态生成 & 执行 Python 脚本 |
| API 调用 |
查询数据库 / 发起 HTTP 请求 |
| 子进程 |
启动另一个 Agent 完成子任务 |
| 命令行 |
执行程序命令 |
🔹 观察
将工具返回值写回 context。
python
try的观点是,result = tools
except Exception as e:
result = f"Tool error: {e}" # ✅ 错误原样回传给模型
context.append})
三️⃣ 五大必解工程难题
📌 痛点① 何时停止?
如果没有明确退出条件,会出现无限循环导致资源浪费。
常见停机策略
-
模型主动返回
final_answer;
-
达到
max_steps 上限;说起来,
-
验证指标满足业务阈值;
-
人工审批后显式终止。
📌 痛点② 上下文爆炸
每一步都会向上下文追加数据,大量 Token 导致费用飙升且可能超出模型窗口。不过,
缓解方案
-
滚动窗口 – 保留最近 N 步;
-
摘要压缩 – 对历史记录做浓缩摘要;话说回来,
-
关键节点保留 – “目标 +关键中间结果 + 最近几轮”。
📌 痛点③ 工具调用失败
隐藏异常会让后续推理基于错误假设继续,从而产出不可用结果。
正确做法
📌 痛点④ 等待外部事件
人工审批、后台作业等会导致同步阻塞。
实现方式
-
将当前
context 持久化;说起来,
-
标记为 挂起 状态;
-
等待信号后恢复执行,不会空转也不会崩溃。
📌 痛点⑤ 任务规模过大
单个循环耗时太长且难以监控。
拆分策略
把大型任务拆成若干独立子任务。每个子任务由独立 子‑Agent‑Loop 并行跑,再聚合结果。整体耗时取决于最慢子任务,实现显著加速。
四️⃣ 完整状态机视角
Init ─► Reason ─► ──► Terminate
│
▼
Act ─► Observe ─► CheckStop ─► Terminate
│No
▼
WaitExternal?─► Suspend ─► Resume
│No
▼
Decompose?怎么说呢,─► Sub‑Loops ► …不过,
每个节点都有明确进入条件和出口。使得调试与监控成为可能,
五️⃣ Loop 与其他概念的关系图谱
| #概念 | Description | Solved Problem | |
| COT | LLM 单轮内部深度思考策略 | |
| | Loo pEngine that wraps COT/ReAct into an iterative control flow | Multi-step reasoning + action + observation | |
TR{
Trg}Har ness | Runtime sandbox & orchestration | Production‑grade stability & observability | |
}
<
/
/
/
<
/
{| layer | Description | Eureka Quote | | layer |
{prompt engineering | }Translate human intent into LLM-friendly prompt | "One line of code makes a model think" | }
{loo engineering | }Control flow turning single calls into iterative execution | "The engine that makes agents move" | }
{har engineering | }Runtime environment / VM guaranteeing safety and scalability | "Production shield" | }
{context engineering | }Memory management – manual GC for context window | "RAM for prompts" | }
{memory engineering | }Persistence across sessions – database or KV store | "Long‑term memory" | }
{eval engineering | }Type system & unit tests for agent outputs | "Are we right?"}{ | orchestration engineering | }Concurrent multi‑agent scheduling & deadlock avoidance | "Actor model for agents" | }
{protocol engineering | }ABI/FI for tool & agent interop | "Contract 娱乐ween worlds" | }
{policy engineering | }Permission model & exception handling"sudo+try/catch" | policy>protocol>orchestration>}
{tool engineering | }Standard library & API design for agents"Ready‑to‑use functions"}
{| retrieval correct="" engineering | }
{skill capability="" engineering<>}reusable="" module="" modules"<="" packages"plug‑and‑play="" td="">}
{}| }container="" engi="" engin="" engineering<>}explicit="" engineering<>}load="" handles="" handling"rollback="" isolation="" machine="" matters"<="" model="" neering<>}logs="" neering<>}token="" optimization"money="" p="" preventing="" profiling"know="" ready"<="" request"smart="" rm="" ro{="" r}{} |
...
七️⃣ 最小完整实现代码示例
python
def agentloop(goal: str。maxsteps: int = 20,approvalrequiredtools=None) -> str:
"""
最小 Lo op 骨架,实现 Reason → Act → Observe 循环。"""
if approvalrequiredtools is None:
approvalrequiredtools = set
# 初始 Context 包含使用者目标
context =
for step in range:
# ---------- Reason ----------
response = llm.call # LLM 推理得到 JSON 格式响应
# ---------- Observe ----------
# 若已得到最终答案则直接返回
if response.get == "final_answer":
return response
# ---------- 人工审批 ----------
tool_call = response.get
if tool_call.get in approval_required_tools:
approved = request_human_approval # 阻塞等待人工确认
if not approved:
# 将拒绝信息写回 Context,让 LLM 自主决定后续方案
context.append
continue
# ---------- Act ----------
try的观点是。tool_name = tool_call
args = tool_call.get
result = TOOLS_REGISTRY
except Exception as e:
result = f"Tool error: {e}" # 错误原样回传
# ---------- Observe ----------
context.append
context.append})
# ---------- 防止 Context 爆炸 ----------
if len> CONTEXT_MAX_LEN:
context = compress_context # 摘要或滚动窗口实现
# ---------- 可选挂起 ----------
if isinstance:
save_state # 持久化当前状态,以便恢复
return "⚠️ Max steps reached – may need manual review."
八️⃣ 实战案例 —— 文心快码 Comate 自动化建立 Prompt
背景与痛点
-
业务需求为地图场景的大批量「文生图」生成 Prompt,需要遵守数十条规则。
-
传统方式痛点
-
人工逐条编写规则 ➜ 效率低且易出错;
-
脚本只能线性遍历规则 ➜ 遇到冲突或缺失数据无法自适应;
Solution – 基于 Lo op 的 Comate 流程
-
目标输入「根据 X 场景生成符合 Y 条件的 Prompt」+ 验收阈值
-
主 Lo op
-
Reason: 理解所有业务规则并形成内部计划;
-
Act: 调用 DeepSeek 批量生成 Prompt;
-
Observe: 自动运行 QC 脚本检测违规项;
-
若 QC 未通过则进入 失败处理子 Lo op。
-
整个闭环完全由 AI 自驱,无需人工介入除最终验收阶段。
子 Lo op —— 「QC 失败 → 修复 → 重试」
mermaid
flowchart TD;话说回来,A --> B;B --> C,老实说,C --> D{Is Fix Acceptable?},D -- Yes --> E;E --> F,F --> G;
成果对比表格
| # 步骤 | Description | Status Before Lo op | Status After Lo op | |
| ①DTA?,!,?,?,?,!,?,?, |
九️⃣
-
主要价值Lo op 为 AI 提供了「感知—行动—反馈」闭环,使其能够自我纠错、自主迭代直至交付符合要求的成果。
-
实践建议
-
明确定义退出条件、防止无限循环;
-
实施 Context 压缩避免 Token 爆炸;
-
始终把 Tool 错误原样回写,让模型自行决定重试或放弃;不过,
-
对可能阻塞的步骤使用挂起/恢复机制;
-
大型任务务必拆解为可并行的子 Lo ops。按理说,
-
当上述五大要素全部落地。你会发现 AI 从「回答问题」升级为「真正能干活」的搭档,而这正是当下工业级应用所迫切需要的能力。
| | skill> | retrieval> | tool>eval>memory>context>har>loo>prompt>