ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从写提示词到设计循环:AI Agent自动化任务实战

从写提示词到设计循环:AI Agent自动化任务实战 1. 从写提示词到设计循环一次工作方式的彻底转变我大概是在连续第三周被同一个问题折磨到凌晨两点的时候才真正意识到自己一直在用错误的方式使用 AI Agent。当时我在做一个需要批量处理结构化数据的任务每次都要手动写一大段提示词反复调整措辞、补充约束条件、增加示例然后祈祷模型这次能按我想要的格式输出。结果就是同样的任务今天跑通了明天换个数据量就崩了换个字段名输出格式又乱了。我花了大量时间在“调提示词”这件事上但产出极不稳定。后来我换了个思路不再纠结于单次提示词怎么写得更完美而是把整个任务拆成一个可以自动运转的循环——让 Agent 自己判断当前状态、决定下一步做什么、执行、检查结果、再决定是否继续。换句话说我从“写提示词的人”变成了“设计循环的人”。这个转变带来的效果非常直接原本需要我全程盯着的任务现在可以自己跑完我只需要在关键节点做验收。这篇文章就是把我这段时间踩过的坑、试过的方案、以及最终跑通的循环设计思路完整地分享出来。如果你也在用 AI Agent 做实际项目不管是数据处理、内容生成、代码辅助还是自动化流程相信这些经验能帮你少走一些弯路。我不会讲太多抽象的理论重点放在“我实际怎么做的”和“为什么这么做”上。2. 为什么单次提示词注定不够用2.1 提示词的天然局限一次性的指令无法应对变化提示词的本质是一次性指令。你告诉模型“把这段文本翻译成英文”它就翻译你告诉它“提取所有邮箱地址”它就提取。但现实任务往往不是一次性的。比如你要处理一批用户反馈需要先分类、再提取关键信息、然后根据类别做不同的后续处理。这个过程里每一步的输出都会影响下一步的输入而且数据本身可能有各种边界情况——空值、格式不一致、语言混杂。单次提示词的问题在于它假设模型能在一次推理中完成所有判断。但实际上当任务涉及多个步骤、多个条件分支、或者需要根据中间结果调整策略时一次推理的上下文窗口和注意力机制根本不够用。我试过把整个流程写在一个超长提示词里结果模型要么漏掉某些步骤要么在某个分支上卡住输出一堆看似合理但实际不可用的内容。更麻烦的是提示词的效果高度依赖具体的输入。同一个提示词换一批数据可能就从“完美输出”变成“完全跑偏”。你不得不为每种情况写不同的提示词维护成本急剧上升。2.2 循环思维的核心让 Agent 自己决定下一步循环思维的核心很简单把任务拆成“状态判断”和“动作执行”两个部分然后让 Agent 在循环中不断重复这个过程。每次循环Agent 先看当前状态比如“还有多少条数据没处理”“上一步的输出是否符合预期”然后决定下一步做什么比如“继续处理下一条”“重新处理上一条”“跳过并记录异常”执行完再回到状态判断。这个思路的关键在于Agent 不再需要一次性理解整个任务它只需要在每一步做出局部最优决策。这大大降低了单次推理的复杂度也让整个流程更容易调试——因为你可以清楚地看到每一步的状态和决策出了问题能快速定位。我一开始担心这样会不会太慢毕竟多了很多次模型调用。但实际跑下来因为每次调用的提示词更短、更聚焦整体耗时反而比反复调整一个巨型提示词要少。而且稳定性提升非常明显同样的任务循环方式跑十次结果基本一致单次提示词跑十次可能有三四次需要人工干预。2.3 从“写提示词”到“设计循环”的思维转换这个转换说起来简单做起来需要克服几个惯性。第一个惯性是“总想一次说清楚”。我们习惯了写详细的指令恨不得把所有可能的情况都写进提示词里。但循环思维要求你接受“不完整”——你不需要在提示词里覆盖所有情况因为循环本身会处理异常。你只需要定义好状态判断的逻辑和每个动作的边界。第二个惯性是“害怕放手”。让 Agent 自己决定下一步意味着你失去了对每一步的精确控制。我刚开始很不适应总想在每个决策点加一堆约束条件。但后来发现约束越多循环越容易卡死。反而是给 Agent 一定的自主空间让它根据实际情况灵活调整效果更好。第三个惯性是“忽略状态管理”。单次提示词不需要考虑状态但循环必须有一个清晰的状态表示。这个状态可以是简单的计数器也可以是复杂的结构化数据。状态设计得好不好直接决定了循环能不能跑通。3. 循环设计的核心组件与实操拆解3.1 状态定义循环的“记忆”怎么存状态是循环的基石。没有状态Agent 就不知道当前进行到哪一步也不知道下一步该做什么。我试过几种状态存储方式各有优劣。最简单的是用文件系统。每处理完一条数据就把结果写到一个 JSON 文件里同时记录已处理的索引。下次循环开始时Agent 先读这个文件就知道从哪里继续。这种方式的好处是简单、可靠、容易调试——你随时可以打开文件看当前状态。缺点是读写频繁时性能一般但对于大多数任务来说完全够用。稍微复杂一点的是用内存中的数据结构比如一个字典或列表。这种方式速度快但一旦程序崩溃状态就丢了。我一般只在短时间运行的循环里用这种方式或者配合定期持久化。还有一种是用数据库。适合数据量大、需要复杂查询的场景。比如你要根据处理结果做统计、筛选、去重用数据库会方便很多。但引入数据库也增加了复杂度对于简单任务有点杀鸡用牛刀。我现在的习惯是先用文件系统跑通流程如果性能成为瓶颈再考虑换数据库。状态设计的原则是“够用就好”不要一开始就追求完美。3.2 决策逻辑Agent 如何判断“下一步做什么”决策逻辑是循环的大脑。它决定了 Agent 在每一步看到状态后应该采取什么动作。我一般把决策逻辑分成三层。第一层是“终止条件判断”。循环不能无限跑下去必须有明确的退出条件。常见的终止条件包括所有数据都处理完了、连续多次失败、达到最大循环次数、或者外部信号比如收到停止指令。这一层要放在最前面避免无效循环。第二层是“异常处理判断”。如果上一步执行失败或者输出不符合预期Agent 需要决定是重试、跳过、还是终止。我一般会设置重试次数上限比如同一个任务最多重试三次超过就记录异常并跳过。这样既能处理偶发错误又不会卡死。第三层是“正常流程判断”。如果一切正常Agent 就按照预设的流程决定下一步。比如“还有未处理的数据就继续处理下一条”“当前批次处理完了就进入汇总阶段”。这一层可以设计得比较灵活根据任务特点调整。决策逻辑的实现方式也有几种。最简单的是用 if-else 硬编码适合流程固定的任务。稍微灵活一点的是用规则引擎把决策规则写成配置。最灵活的是让模型自己判断但这种方式不确定性较高我一般只在规则难以覆盖的情况下才用。3.3 执行单元每个动作怎么封装才可靠执行单元是循环的手脚。每个动作都应该封装成一个独立的函数或模块接收输入、执行操作、返回结果。封装的好处是可以单独测试、可以复用、可以替换。我封装执行单元时遵循几个原则。第一是“单一职责”一个函数只做一件事。比如“调用模型生成内容”和“解析模型输出”应该是两个独立的函数而不是混在一起。这样出问题时容易定位。第二是“输入输出明确”。每个执行单元都要有清晰的输入参数和返回值不要依赖全局变量。这样你可以随时替换实现而不影响其他部分。第三是“错误处理完善”。每个执行单元都要考虑失败的情况返回明确的错误信息而不是直接抛异常。这样决策逻辑可以根据错误类型决定怎么处理。我举个例子。假设你要让 Agent 从一段文本里提取结构化信息。执行单元可以拆成读取文本、调用模型提取、解析输出、验证格式、保存结果。每个步骤都是独立的函数可以单独测试和替换。如果解析输出这一步经常失败你可以单独优化它而不需要动其他部分。3.4 反馈与校验怎么知道 Agent 做对了反馈与校验是循环的质量控制。没有校验Agent 可能一直在输出错误的结果而你不知道。我一般会在两个地方做校验。第一个是“格式校验”。模型输出的格式是否符合预期比如要求输出 JSON那就检查能不能解析成 JSON要求输出特定字段那就检查字段是否存在。格式校验可以过滤掉大部分低级错误。第二个是“内容校验”。输出内容是否合理比如提取的邮箱地址是否有效、生成的摘要是否包含关键信息、分类结果是否在预设类别内。内容校验比格式校验难因为需要理解语义。我一般用规则加模型结合的方式先用规则做初步筛选再用模型做二次判断。校验不通过时Agent 需要决定怎么处理。我一般会先重试如果重试多次仍然失败就记录异常并跳过。同时我会把失败案例保存下来定期分析原因优化提示词或调整流程。4. 完整循环的搭建过程与关键实现4.1 环境准备与工具选型我用的工具链比较简单Python 作为主语言因为生态成熟、库多模型调用用官方 SDK 或兼容接口状态存储用 JSON 文件日志用标准 logging 模块。没有引入复杂的框架因为循环逻辑本身不复杂用原生代码写反而更可控。如果你用 Claude Code 或类似的工具可以把循环逻辑写成一个脚本然后让工具去执行。我试过在 VS Code 里配置 Claude Code把循环脚本放在项目目录下通过命令调用。这种方式适合开发阶段调试方便。如果你用 OpenClaw 这类工具部署时要注意环境配置。我在 Windows 上试过用 WSL需要先确认 WSL 状态正常。如果遇到验证问题一般检查网络配置和依赖版本就能解决。Node.js 版本建议用 LTS避免兼容性问题。工具选型的核心原则是用你最熟悉的不要为了追新而引入不必要的复杂度。循环设计的关键在于逻辑清晰工具只是载体。4.2 循环骨架的代码实现下面是我常用的循环骨架用 Python 写的简化版import json import logging from pathlib import Path logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) STATE_FILE Path(state.json) MAX_RETRIES 3 MAX_LOOPS 1000 def load_state(): if STATE_FILE.exists(): return json.loads(STATE_FILE.read_text()) return {current_index: 0, retries: 0, results: []} def save_state(state): STATE_FILE.write_text(json.dumps(state, ensure_asciiFalse, indent2)) def should_continue(state, total_items): if state[current_index] total_items: logger.info(所有数据处理完毕) return False if state[retries] MAX_RETRIES: logger.warning(重试次数超限跳过当前项) state[retries] 0 state[current_index] 1 return True if state[current_index] MAX_LOOPS: logger.warning(达到最大循环次数) return False return True def execute_step(item): # 这里放具体的执行逻辑 # 返回 (success, result) pass def main(): items load_items() # 加载待处理数据 state load_state() while should_continue(state, len(items)): item items[state[current_index]] success, result execute_step(item) if success: state[results].append(result) state[current_index] 1 state[retries] 0 else: state[retries] 1 save_state(state) logger.info(f进度: {state[current_index]}/{len(items)}) logger.info(循环结束) if __name__ __main__: main()这个骨架的核心是状态持久化、终止条件判断、重试机制、进度记录。你可以根据具体任务替换execute_step的实现。4.3 参数选择与性能调优循环跑起来之后你会遇到性能问题。我踩过的坑主要有几个。第一个是“模型调用太频繁”。每次循环都调用模型如果数据量大耗时和成本都会很高。我的优化方式是批量处理把多条数据合并成一个请求让模型一次处理多条。但批量大小要控制好太大容易超出上下文限制太小又没效果。我一般从 5 条开始试根据输出质量调整。第二个是“状态读写太频繁”。每次循环都写文件磁盘 I/O 会成为瓶颈。我的做法是每处理 N 条写一次N 取 10 到 50 之间。如果程序崩溃最多丢失 N 条的处理结果可以接受。第三个是“重试策略太激进”。一开始我设置重试间隔为 0结果遇到限流时疯狂重试反而更慢。后来改成指数退避第一次等 1 秒第二次等 2 秒第三次等 4 秒。这样既能处理偶发错误又不会给服务端造成压力。4.4 日志与监控让循环可观测循环跑起来之后你必须能知道它在干什么。没有日志出了问题你只能猜。我一般会记录几类信息。第一类是“进度日志”。每处理完一条记录当前索引和总数。这样你能看到循环在推进而不是卡住了。第二类是“决策日志”。每次 Agent 做出决策时记录决策依据和结果。比如“第 5 条数据格式校验失败进入重试”“第 8 条数据连续失败三次跳过”。这样出问题时能快速定位。第三类是“性能日志”。记录每次模型调用的耗时、每次状态读写的耗时。这样你能发现性能瓶颈。日志的级别也要控制好。INFO 级别记录关键节点DEBUG 级别记录详细信息。生产环境一般用 INFO调试时开 DEBUG。5. 踩坑实录与常见问题排查5.1 循环卡死Agent 陷入死循环怎么办这是我最常遇到的问题。Agent 在某个步骤反复重试但每次都失败因为重试条件没有正确更新。比如校验失败后重试但重试时用的还是同样的输入结果当然还是失败。解决方法是每次重试必须改变某些条件。可以是换一种提示词、调整参数、或者跳过当前项。我一般会在重试时记录失败原因然后根据原因调整策略。如果连续多次失败原因相同就直接跳过避免浪费时间。另一个原因是终止条件写错了。比如判断“所有数据处理完”时用了错误的索引或计数。这种问题一般通过日志能快速发现——你会看到进度一直不变。5.2 状态丢失程序崩溃后怎么恢复状态丢失是循环设计里最危险的问题。如果状态没持久化程序崩溃后你只能从头开始。我踩过一次坑跑了一个小时的任务因为一个未捕获的异常崩溃所有进度丢失。解决方法是每次状态变更后立即持久化。如果性能不允许至少每 N 次持久化一次。同时用 try-except 包裹主循环捕获所有异常在异常处理里保存状态。另外状态文件最好带时间戳或版本号避免多个实例同时写导致冲突。如果可能用文件锁或数据库事务来保证一致性。5.3 输出不稳定同样的输入为什么结果不同模型输出本身就有随机性。同样的输入两次调用可能得到不同的结果。这在单次提示词里可能不明显但在循环里会被放大——因为每一步的输出都会影响后续步骤。我的应对策略是在关键步骤增加校验确保输出符合预期。如果不符合就重试或修正。同时在提示词里增加约束比如“只输出 JSON不要有其他内容”“如果无法确定输出 unknown”。这样能减少随机性带来的影响。如果任务对一致性要求很高可以考虑用温度参数调低模型输出的随机性。但要注意温度太低可能导致输出过于死板反而影响效果。我一般从 0.3 开始试根据实际情况调整。5.4 常见问题速查表问题现象可能原因排查方法解决方案循环不推进终止条件判断错误检查索引和计数逻辑修正判断条件反复重试同一项重试条件未更新查看重试日志每次重试改变输入或策略状态丢失未持久化或持久化失败检查状态文件增加持久化频率和异常处理输出格式错误提示词约束不足检查模型输出增加格式校验和重试性能越来越慢状态文件过大或内存泄漏监控资源使用优化状态存储定期清理模型调用超时网络问题或请求过大检查网络和请求大小增加超时设置拆分请求结果不一致模型随机性对比多次输出降低温度增加校验5.5 独家避坑技巧第一个技巧是“先跑通再优化”。不要一开始就追求完美的循环设计先用最简单的实现跑通流程然后再逐步优化。我见过太多人卡在设计阶段迟迟不动手。第二个技巧是“保留失败案例”。每次失败都是宝贵的调试信息。我会把失败案例单独保存定期分析。很多时候优化提示词或调整流程的灵感就来自这些失败案例。第三个技巧是“设置人工干预点”。循环不是完全放手关键节点还是要人工确认。比如处理完一批数据后暂停一下让你检查结果。这样既能保证质量又不会太累。第四个技巧是“用版本控制管理循环脚本”。循环逻辑会不断调整用 Git 管理可以随时回滚。我一般会给每个稳定版本打标签出问题时能快速定位。6. 循环设计的扩展思路与个人体会6.1 从单循环到多循环复杂任务的拆解单循环适合线性任务但现实任务往往有嵌套结构。比如你要先分类再对每个类别做不同处理最后汇总。这时候可以用多循环外层循环遍历类别内层循环处理每个类别下的数据。多循环的难点在于状态管理。你需要为每个循环维护独立的状态同时保证它们之间的协调。我一般用嵌套的字典来存状态外层键是类别内层键是索引。这样结构清晰也容易调试。另一个扩展方向是“循环嵌套循环”。比如外层循环处理批次内层循环处理批次内的每条数据。这种结构适合数据量大、需要分批处理的场景。但要注意控制嵌套层数太深了容易混乱。6.2 循环与提示词的结合什么时候该写提示词循环设计不是要完全抛弃提示词而是把提示词放在正确的位置。在循环里提示词的作用是“指导单个动作的执行”而不是“描述整个任务”。所以提示词可以写得更聚焦、更简短。我一般会在每个执行单元里嵌入提示词而不是在循环层面写一个大提示词。比如“提取邮箱”这个动作提示词就是“从以下文本中提取所有邮箱地址每行一个”。这样提示词和动作一一对应容易维护。如果某个动作需要复杂的判断我会在提示词里增加示例和约束。但不会把所有逻辑都塞进去因为循环本身会处理流程控制。6.3 个人使用 AI Agent 做自动化任务的体会我用 AI Agent 做过不少自动化任务从数据清洗到内容生成从代码辅助到流程自动化。最大的体会是Agent 的能力边界取决于你怎么用它。同样的模型用单次提示词可能只能做简单任务用循环设计就能做复杂任务。另一个体会是不要追求完全自动化。完全自动化听起来很美好但实际落地时人工干预是保证质量的关键。我一般会在关键节点设置检查点让人工确认后再继续。这样既提高了效率又保证了质量。最后一个体会是循环设计是一种思维方式不局限于 AI Agent。任何需要迭代、反馈、调整的任务都可以用循环思维来优化。比如写代码、做设计、写文章都可以拆成“执行-检查-调整”的循环。这种思维方式一旦养成做事的效率会有质的提升。6.4 后续可以尝试的方向接下来我打算尝试几个方向。第一个是“自适应循环”根据任务难度自动调整循环参数比如重试次数、批量大小。第二个是“多 Agent 协作”让多个 Agent 分别负责不同的循环通过消息传递协调。第三个是“循环可视化”把循环的状态和决策过程可视化方便调试和优化。这些方向都还在探索阶段等跑通了再分享。如果你也在做类似的事情欢迎交流。踩坑不可怕可怕的是踩了坑不总结。希望这篇文章能帮你少踩几个坑把 AI Agent 真正用起来。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进