芥末
发布于 2026-06-14 / 1 阅读
0
0

Loop Engineering:让 AI Agent 从提示词对话变成可运行闭环

AI Agent 能写代码、查资料、改文档、跑测试,但真正用起来以后会发现,麻烦并没有完全消失,只是换了位置。

如果每一步都靠人手动推动,工作流通常长这样:你给 Agent 一个任务,它完成一部分;你检查结果,发现上下文不够,于是补充背景;它继续修改,你再提醒哪些文件不能动、哪些规则必须遵守。AI 确实在干活,但整个过程的调度、检查、纠偏和记录仍然压在人身上。

提示词工程主要解决的是“第一句话怎么说清楚”。Loop Engineering 解决的是另一个问题:怎样把一串反复发生的动作设计成闭环,让 AI Agent 不只是被动回答,而是能围绕目标持续执行、检查、记录,并在合适的时候停下来交给人。

从提示词到闭环

传统的 Agent 使用方式更像对话:

sequenceDiagram
    participant 人
    participant Agent

    人->>Agent: 说明任务
    Agent-->>人: 返回结果
    人->>Agent: 补充背景或指出问题
    Agent-->>人: 再次修改
    人->>Agent: 继续检查和追问

这种方式适合一次性问题,例如解释一段代码、生成一个脚本、补一段文档。问题是,只要任务变长,重复动作就会越来越多:查上下文、拆任务、执行、跑测试、分析失败、重试、写记录、判断是否继续。

Loop Engineering 的重点是把这些动作组织成一个可运行的小系统:

flowchart TD
    A[触发条件] --> B[读取上下文和任务状态]
    B --> C[Agent 执行任务]
    C --> D[运行检查和验证]
    D --> E{结果是否通过}
    E -- 通过 --> F[记录进展]
    E -- 失败 --> G{是否允许重试}
    G -- 是 --> C
    G -- 否 --> H[交给人工处理]
    F --> I{目标是否完成}
    I -- 未完成 --> B
    I -- 完成 --> J[停止循环]

这里的关键不是“自动运行”,而是“闭环”。一个 cron 定时任务只能算触发器,不能算完整 loop。真正的 loop 至少要知道:什么时候启动、去哪里取上下文、如何执行、怎样验收、失败后是否重试、状态写到哪里、什么时候停下。

一个可用的 loop 需要哪些部件

把 Loop Engineering 拆开看,它通常由六个部分组成:触发、隔离、技能、工具、验证和记忆。少了其中任何一个,loop 都容易变成“自动化地制造麻烦”。

部件 要解决的问题 常见做法
触发 谁来启动任务 定时任务、事件触发、测试失败触发、工单触发
隔离 多个 Agent 如何避免互相覆盖 Git worktree、临时分支、沙箱环境
技能 Agent 如何理解项目规则 项目说明、编码规范、禁改目录、常见坑记录
工具 Agent 如何接触真实系统 CI、Issue、数据库、日志、PR、通知系统
验证 谁来判断结果是否可靠 测试、静态检查、独立 reviewer Agent、人工审查
记忆 如何避免每轮都重新开始 Markdown 日志、任务看板、状态文件、外部数据库

触发:让 loop 有明确入口

loop 可以由人手动启动,也可以由事件触发。常见触发方式包括:

triggers:
  - schedule: "每天 09:00 扫描失败 CI"
  - event: "新 issue 被打上 bug 标签"
  - event: "PR 测试失败"
  - condition: "待办队列不为空"

触发器决定 loop 的工作节奏。比如“每天扫描昨晚失败的 CI”适合稳定重复的维护任务;“新 issue 被打上 bug 标签”适合缺陷分流;“测试失败后自动尝试修复”适合反馈非常明确的代码任务。

触发条件越模糊,loop 越容易误启动。一个好的触发器应该能回答两个问题:为什么现在要跑,以及跑完以后怎样判断有没有价值。

隔离:并行之前先避免互相踩踏

多个 Agent 同时改代码时,最容易出问题的不是“它们不会写”,而是“它们都在同一份工作区里写”。一个 Agent 改了测试,另一个 Agent 改了实现,第三个 Agent 又格式化了文件,最后很难判断是谁引入了问题。

代码场景里常用 Git worktree 做隔离:

git worktree add ../repo-agent-fix-login -b agent/fix-login
git worktree add ../repo-agent-update-tests -b agent/update-tests

每个 Agent 在独立目录里工作,完成后再通过分支、Pull Request(合并请求)或人工 review 合并。这样做会多一步合并成本,但能避免并行任务直接污染主工作区。

隔离不只用于代码。数据分析任务可以给每个 Agent 单独的临时表,内容生产任务可以给每个 Agent 单独的草稿区,客服分析任务可以给每个 Agent 单独的样本集。核心原则一样:先让 Agent 在可丢弃的空间里试错,再把结果进入正式流程。

技能:把项目知识写到对话之外

AI Agent 最大的问题之一,是每次启动都像一个刚入职的新同事。它可能不知道项目怎么启动、测试怎么跑、哪些目录不能改、哪些命名规则必须遵守,也不知道之前踩过什么坑。

这些长期规则不适合每次都塞进提示词,而应该沉淀成 skill。它可以是一个约定文件,也可以是工具内置的项目说明,例如:

# Agent Skill: backend-service

## 启动方式
- 本地启动:`pnpm dev`
- 单元测试:`pnpm test`
- 类型检查:`pnpm typecheck`

## 修改规则
- 不要直接修改 `migrations/` 下的历史迁移文件
- API 返回结构必须保持向后兼容
- 新增接口需要补充 OpenAPI 描述

## 常见问题
- 用户 ID 在数据库中是 bigint,前端接收时使用 string
- 支付状态只能通过状态机变更,不要直接更新字段

提示词是临时指令,skill 是长期规则。没有 skill 的 loop 每跑一轮都要重新理解项目,结果就是重复解释、重复踩坑、重复修错。

工具:让 Agent 不只会说,还能做

一个只能读取本地文件的 Agent,最多能给建议。要让 loop 真正推进任务,Agent 需要连接真实工具:Issue 系统、持续集成(CI)、日志平台、数据库、测试环境、代码仓库和通知系统。

典型代码修复 loop 可以这样设计:

flowchart LR
    A[读取失败 CI] --> B[定位失败测试]
    B --> C[创建隔离分支]
    C --> D[Agent 修改代码]
    D --> E[运行测试]
    E --> F{测试通过?}
    F -- 否 --> D
    F -- 是 --> G[创建 PR]
    G --> H[通知人工 review]

这个流程里,Agent 不只是回答“可能是哪里坏了”,而是能创建分支、修改代码、运行测试、提交 Pull Request,并把结果交给人审查。工具接得越深,loop 的能力越强;但权限也必须越谨慎。删除数据、发布生产、合并主分支这类动作,通常不应该完全交给无人值守的 loop。

验证:不要让执行者给自己打满分

写代码的 Agent 很容易高估自己的结果。它完成修改后再自问“是否正确”,答案往往会偏乐观。可靠的 loop 应该把执行和验证拆开。

一种常见结构是“双 Agent”:

sequenceDiagram
    participant 执行Agent
    participant 验证Agent
    participant CI
    participant 人

    执行Agent->>执行Agent: 修改代码
    执行Agent->>CI: 运行测试
    CI-->>执行Agent: 返回结果
    执行Agent->>验证Agent: 提交变更说明
    验证Agent-->>执行Agent: 指出风险或缺陷
    执行Agent->>执行Agent: 修复问题
    执行Agent->>人: 提交待审结果

验证方式可以分层:

验证层级 能检查什么 局限
单元测试 函数行为是否符合预期 覆盖不到的逻辑不会暴露
静态检查 类型、格式、基本代码质量 不理解业务正确性
集成测试 多模块协作是否正常 成本高、运行慢
Reviewer Agent 代码风险、遗漏、异常路径 仍可能产生误判
人工审查 业务语义、产品取舍、上线风险 需要人投入注意力

无人值守的 loop 尤其需要验证层。因为错误一旦进入循环,后续步骤会继续建立在错误结果之上,问题可能越滚越大。

记忆:让 loop 记住已经发生过什么

长期 loop 不能只依赖对话上下文。上下文会被截断,Agent 会忘记上次为什么放弃某个方案,也可能重复验证已经确认过的结论。解决办法是把状态写到外部。

最简单的记忆可以是一个 Markdown 文件:

# Loop State: failing-ci-repair

## 当前目标
修复 `main` 分支上最近一次失败的登录测试。

## 已尝试
- 检查 `auth/session.ts`,未发现 token 过期计算错误
- 回滚测试数据后仍失败
- 发现 mock server 没有返回 `refresh_token`

## 当前结论
失败更可能来自测试桩,而不是业务代码。

## 需要人工判断
是否允许调整登录接口测试夹具。

记忆不一定复杂,但必须稳定存在。它的作用是让 loop 能接着昨天的状态继续,而不是每天重新走一遍同样的路。

什么任务适合设计成 loop

Loop Engineering 不适合所有任务。它真正擅长的是重复、可拆、可验证的工作。

任务类型 是否适合 loop 原因
修复明确失败的测试 适合 有清晰反馈,能自动验证
扫描 issue 并初步分类 适合 流程重复,判断标准可沉淀
每天整理技术情报 适合 数据源固定,产物格式稳定
重构核心支付流程 谨慎 风险高,需要强人工审查
一次性架构决策 不适合 缺少重复性,判断依赖上下文
模糊的产品方向探索 不适合 难以自动验收,容易跑偏

判断一个任务能不能做成 loop,可以看三个条件:

  1. 是否会重复发生;
  2. 是否有相对稳定的流程;
  3. 是否存在可检查的反馈信号。

代码任务天然适合 loop,因为测试、编译、类型检查、日志都能提供反馈。内容选题、竞品分析、客服工单分流、运营日报也可以做成 loop,但需要先定义清楚输入来源、筛选规则、输出格式和人工验收点。

成本和边界

loop 不是免费的自动化。它会反复读取上下文、调用模型、运行工具、重试失败步骤。如果还引入多个 Agent 协作,token 和工具调用成本都会上涨。对于一次性小任务,手动问一次可能更便宜、更快。

更重要的是责任边界。AI Agent 可以推进流程,但不能替人承担结果。它说“完成了”,不代表业务逻辑一定正确;它说“测试通过了”,也不代表覆盖了所有风险。设计 loop 时,应该把高风险动作留给人确认,例如:

动作 建议权限
读取代码和日志 可以自动执行
创建临时分支 可以自动执行
运行测试和静态检查 可以自动执行
创建 PR 可以自动执行
合并主分支 需要人工确认
发布生产环境 需要人工确认
删除数据或迁移数据 需要人工确认

Loop Engineering 的目标不是把人移出系统,而是把人从重复推进中抽出来,保留判断、验收和刹车的权力。一个健康的 loop 应该让人更清楚系统正在做什么,而不是只剩一个“开始”按钮。

一个最小可行 loop 的设计模板

设计 loop 时,可以先用下面这个模板把关键问题写清楚:

name: repair-failing-ci

trigger:
  type: event
  condition: "CI failed on main branch"

context:
  sources:
    - latest_ci_log
    - changed_files
    - test_report
    - project_skill_file

execution:
  workspace: isolated_worktree
  max_retries: 3
  allowed_actions:
    - edit_code
    - run_tests
    - create_pull_request

validation:
  required_checks:
    - unit_tests
    - typecheck
    - reviewer_agent
  human_review_required: true

memory:
  state_file: ".agent/repair-failing-ci.md"

stop:
  success: "PR created with all checks passing"
  failure: "3 retries failed or risky change detected"

这个模板不依赖特定工具,重点是把闭环的几个问题提前定下来:谁触发、读什么、能做什么、怎么验收、状态放哪、什么时候停。只要这些问题没有说清楚,Agent 越自动,风险越大。

结语

提示词工程关注的是一次对话的质量,Loop Engineering 关注的是一段工作流的稳定性。真正决定结果的,不再只是第一句提示词写得多完整,而是触发是否准确、上下文是否足够、执行是否隔离、验证是否独立、记忆是否可靠,以及人在什么位置接管。

当 AI Agent 能处理更长链路的任务,人和 AI 的协作方式也会从“你一句我一句”变成“人设计闭环,Agent 在闭环里执行”。这不会让工程工作变得无脑,反而要求人更懂流程、更懂验证,也更清楚什么时候该让系统停下来。


评论