资讯动态

Agent工作原理详解:从ReAct循环到记忆与工具调用的架构拆解

发布时间:2026/10/20 13:53:05 来源:尧图企业网站定制
这个系列聊到第三篇了前两篇我们把Agent能做什么、为什么值得折腾说得七七八八但这几天还是陆续有读者在问同一个问题Agent到底是怎么工作的问得多了我觉得确实有必要花一整篇把内部机制摊开来聊清楚。先说结论Agent不是某个新发布的大模型而是一种架构模式——它由“一个大模型 一套调度逻辑 一组外部工具 记忆读写能力”组合而成。所谓“它会干活”本质上就是这套架构在反复执行同一个循环观察现状、思考下一步、调用工具、拿到结果、再观察。这篇就是把这个循环的每一个环节拆开讲讲LLM在里面到底承担什么、规划是怎么落地的、记忆存在哪里、工具调用又经历了什么。这篇内容适合几类人看想搞清楚Agent原理再决定要不要上手的开发者已经在用某个Agent框架但总觉得隔着一层纱的同学以及需要向团队解释“Agent为什么不能按我预期干活”的技术负责人。纯入门也没关系后文涉及的关键概念我会尽量用大白话和实际案例拆开讲。1. Agent和聊天机器人到底差在哪1.1 对话是“表达”Agent是“执行”很多人第一次接触Agent时都会下意识觉得它不就是个更聪明的聊天机器人吗不是的。这两者的根本差异在于聊天机器人Chatbot的任务是“生成一段合理的回复”而Agent的任务是“完成一个目标”。举一个最简单的例子。你问普通聊天机器人“帮我订一张今晚去A市的高铁票”它能给你一段流程说明告诉你打开哪个App、怎么选座位、怎么支付甚至能说得很有礼貌、很详尽。但它永远不会真的帮你下单因为它压根没有下单这个动作的入口。Agent不一样它在接收这个目标之后会把任务拆成多个步骤查车次、选票、填乘车人、支付确认、出票。每一个步骤对应一个真实的系统动作做完一步再走下一步直到整个目标闭环完成。这个差别的底层逻辑是普通对话系统把大模型当成“知识的出口”Agent则把大模型当成“决策的大脑”。同样是读了一堆资料才能回答前者把答案说出来就结束了后者要把答案转化成一连串对真实世界的操作指令。1.2 用户感知不到的三个“隐藏引擎”如果从架构视角看Agent比聊天机器人多出三块东西这也是它看起来“能干”的来源规划引擎负责把大目标拆解成小步骤并且在执行过程中根据新信息不断调整步骤。记忆系统负责记录当前任务进展、历史偏好以及跨任务的长期信息让Agent的行为有连续性。工具执行层负责把大模型“想做”的事变成真实操作比如读写文件、查询数据库、调用API、发送消息。这三块在用户界面上完全看不见用户只感知到“这个AI能直接把事办了”。但实际开发里这三块恰恰是决定Agent上限和下限的核心。模型选得再好规划引擎写得稀烂Agent照样会在一件简单任务里绕圈子。1.3 一个最容易踩的误区以为Agent是“某个新模型”我被问过很多次“是不是要等某个更强的模型出来Agent才真正能用”这个问题本身就把Agent理解错了。Agent不是某个具体的模型而是“架构 模型 工具 交互策略”的组合。同一个Agent框架把底座模型从A换成B任务效果会变化但架构逻辑完全不变。反过来哪怕底座模型很强如果工具接口描述模糊、记忆检索混乱、规划策略粗糙Agent依然会表现得像个“空有智商但没有执行力的人”。这个认知会在你选型和排错时特别有用。遇到Agent表现差先别急着怀疑模型能力而是按“规划链路是否合理、记忆检索是否命中、工具调用是否正确”三个方向去排查大概率能找到真正的问题所在。2. 喊LLM干活的姿势ReAct闭环与决策提示词2.1 LLM在Agent里干的不是“回答”而是“决策”大模型本身是一个文本预测模型它的强项是“根据上文生成下文”。在Agent架构里我们需要利用的恰恰是这个能力但把任务目标换一下不再要求它生成给人类看的话而是生成给“执行引擎”看的决策指令。举个例子。系统给模型的输入可能是这样一段拼接起来的文本你现在是一名任务执行调度器。用户的目标是把会议纪要整理成日报并发送邮件。当前已有的历史记录如下你已经读取了会议纪要文件发现里面有5条待办事项。你还没确定收件人。你的可选工具列表包括read_file、search_contacts、create_draft_email、send_email。请输出你下一步要做的动作以及对应的参数。模型读完之后输出的不再是一段“回答”而是一个结构化的动作标记比如一个JSON{tool: search_contacts, args: {query: 直属上级}}。系统解析出这个JSON去调用真实的通讯录查询接口把结果拿回来再喂给模型进入下一轮决策。这就是Agent底层最朴素的运转方式输入历史 当前状态 可用工具输出下一步动作循环往复。2.2 ReAct让“想一下”和“做一步”交替发生在Agent的实际落地里有一种被广泛使用的交互模式叫ReAct全称是Reasoning and Acting。它强调的是一件事让大模型先输出一段推理说明自己“为什么这样做”然后再输出具体动作而不是直接跳到一个结论。这么做的好处我在实际项目中体验很深。模型直接输出动作时经常会在信息不够的情况下就开始执行而要求它先写一句思考它就有机会发现自己漏了什么。比如你要它订票它如果先写思考过程就会意识到“我还不知道乘车人身份证号需要先问用户”而不是直接去调用订票接口报错。ReAct循环的典型结构是Thought: 用户要我把会议纪要整理成日报我需要先找到纪要文件。 Action: read_file Action Input: {file: meeting_notes_may.txt} Observation: 文件内容包含5条待办事项…… Thought: 我已经拿到会议内容下一步需要确定收件人。 Action: search_contacts Action Input: {query: 直属上级}每个回合都是“思考 → 行动 → 观察 → 思考”直到模型判断目标完成输出一个类似“FINISH”的结束标记。在系统实现层面这个循环通常由一个Python脚本或对应逻辑的主循环控制伪代码大致长这样def run_agent(user_goal, tools, max_steps10): history [] for step in range(max_steps): response llm_chat( system_prompt user_goal format(history) format(tools) ) thought, action parse_response(response) if action FINISH: return finalize(response) result execute_tool(action) history.append((thought, action, result)) return timeout_result(max_steps)这一步是整个Agent主循环的骨架我建议任何想理解Agent原理的人先把上面这段逻辑吃透后面所有花哨的规划、记忆、多代理交互本质都是在往这个循环里加东西。2.3 决策提示词怎么设计才靠谱同样的模型同样的工具提示词写法不同Agent的成功率可以差出一大截。我在实践里总结出五个在Agent系统提示词里必须写清楚的东西角色定位明确告诉模型“你是调度器/执行器不是聊天助手”。当前目标把用户请求转化为一个简洁的目标说明避免模型发散。可用工具清单逐一说明每个工具的名字、用途、关键参数最好附一个使用示例。历史记录格式告诉模型之前发生过什么观察结果如何呈现。停止条件明确什么时候该结束循环避免模型陷入无休止的补充操作。下面是一个我经常在原型阶段使用的极简决策提示模板适合快速验证Agent循环你是一个任务执行调度器。你的工作是根据用户目标、历史记录和可用工具输出下一步行动。 用户目标{goal} 已有历史记录 {history} 可用工具 - read_file: 读取本地文件参数 path: 文件路径 - search_contacts: 搜索联系人参数 query: 关键词 - send_email: 发送邮件参数 to, subject, body 规则 1. 每次只做一件事逐步推进。 2. 先输出简短的 Thought再输出 Action 和 Action Input。 3. 如果目标已完成输出 FINISH。 4. 不要解释给最终用户听不要寒暄。这套提示词的核心思路是把展示给读者的“自然语气”全部剥离只留决策所需的要素。很多新手第一次搭Agent提示词写得太像聊天指令模型自然就切换回了“聊天模式”。2.4 结构化的Action输出是Agent闭环的黏合剂大模型的输出天生是自由文本但Agent执行引擎需要结构化指令才能跑起来。所以中间必须有一个“解析”环节把模型的自由文本转成可执行的函数调用。目前最主流的方式是让模型输出JSON系统层面用JSON解析器去读取。这个方案简单但有一个坑模型偶尔会生成格式错误的JSON比如多一个逗号、括号没闭合。解析一失败整个循环就会中断。我在项目里一般会在解析层加一个“容错修复”函数比如对明显的截断符号做补齐、对多余的换行做清理如果修复失败再让模型重写。真实生产环境里更稳的方案是使用“结构化输出模式”也就是由框架层面约束模型的输出格式让模型直接返回符合schema的内容而不是靠事后解析。无论是哪种方案原则都一样让模型把意图落在结构上后面才有可靠的执行。3. “想清楚再做”任务规划是怎么发生的3.1 规划的本质是“目标到动作之间的路径生成”规划模块解决的核心问题是用户只给了一个最终目标Agent怎么知道先做什么、再做什么如果目标特别简单比如“把当前时间输出给用户”那不需要规划直接调一个工具就行。但真实任务通常不会这么乖巧比如“把最近一周的销售数据整理成表格发给销售总监”里面至少包含查数据、清洗、汇总、制表、找联系人、写邮件、发送等多个环节。规划模块的作用就是把这个链条生成出来并且在过程中不断调整。一个朴素但有效的方案是“让模型自己规划”。在每轮循环开始前我们可以在提示词中要求模型先输出当前这一步的行动同时输出一个“剩余子任务清单”。这样每一步都在动态更新既不过度规划也不会让模型瞎猜太远的未来。3.2 一次性规划与动态规划的取舍关于Agent怎么做规划业内大致有两条思路一次性规划在最开始让模型输出完整的步骤列表然后依次执行适合稳定、线性的任务。动态规划边执行边规划根据观察到的结果决定下一步适合不确定性强、依赖外部反馈的任务。我在实际使用中更倾向于动态规划理由很简单真实世界的工具返回结果充满不确定性。你查一个数据库可能字段和你预想的不一样你读一个文件可能根本没有你要的内容。一次性规划把所有步骤都定死中途一旦发现某个假设不成立整个流程就崩了。动态规划相当于允许Agent在每个循环里根据最新观察重写剩余路径容错能力会强很多。动态规划的实现方式不复杂核心就是在每轮循环里把“剩余计划”也交给模型维护观察到新信息后让它决定是继续原计划还是修改计划。本质上还是ReAct循环只是多了一个“重新规划”的意识。3.3 规划翻车的三类典型现场我调试Agent时见过太多次规划环节翻车总结下来主要是三类拆得太粗模型觉得“发送邮件”是一步但真实场景里还要先找收件人、确认正文模板、决定附件这都属于该拆开的子步骤。拆太粗会导致某一步工具调用参数严重依赖猜测。拆得太细模型每一步只做一个极小的动作比如“打开软件”“点击新建”“输入标题”“输入正文”导致整个任务要跑二十多轮token成本直线上升还增加了中途出错概率。子步骤顺序错误比如先发送邮件再写正文或者先支付再锁座这会让后续操作失败。针对这几类问题我常用的处理方式是给模型一个“步骤合并与拆分”的约束只有涉及不同领域操作时才必须拆分其余可以合并同时在每个子步骤前要求模型标注输入依赖比如“这一步需要上一步的返回结果作为参数”。依赖标注能有效防止顺序错乱。3.4 简化版规划器的实现思路有些同学会问规划是不是一定要用很复杂的框架其实一个最小可用的规划器用几行伪代码就能表达def plan_and_execute(goal): current_plan [] done False while not done: if need_replan(current_plan, last_observation): current_plan llm_generate_plan(goal, history) next_step current_plan.pop(0) observation execute_step(next_step) history.append(observation) if llm_is_finished(goal, history): done True return history这个版本已经具备规划、执行、观察、重新规划的核心能力。生产系统会在这个基础上加更多细节比如失败重试、状态管理、并发执行但主干逻辑就是这个。想理清Agent工作原理的人我建议先亲手把这个最小循环跑通再去看各种框架里复杂的规划器会轻松很多。4. 记忆机制Agent的短期工作台和长期仓库4.1 短期记忆就是上下文窗口Agent在每轮决策时要把已有的历史思考、行动、观察结果全部拼到上下文里喂给模型让模型“记得”前面发生过什么。这个上下文窗口就是Agent的短期记忆也叫工作记忆。短期记忆的设计是“全量拼接”也就是把所有轨迹都塞进提示词。好处是模型能掌握最完整的信息坏处也很明显——上下文窗口是有限的任务一长历史记录可能把窗口撑爆或者因为历史太长导致模型注意力分散反而抓不住重点。我在做长链路任务时会做一个“轨迹裁剪”操作把旧的、已经被利用过的观察结果压缩成一条摘要只保留最近几轮完整内容。这样短期记忆的消耗能降低不少模型的决策精度也更稳定。4.2 长期记忆跨任务的信息怎么存用户第一次和Agent交互时可能会说“我坐高铁喜欢靠窗”第二次交互时没有重复这句话但Agent依然应该记得这个偏好。这就需要长期记忆系统把有价值的信息写入外部存储在后续任务需要时检索出来注入到当前上下文。目前最常用的长期记忆存储是“向量数据库 语义检索”。过程大致是这样的把文本比如用户偏好、任务总结通过嵌入模型转成向量。存进专门的向量存储。新任务进来时把当前目标也转成向量在存储里做相似度检索。把命中的文本拼进提示词让Agent“记起”相关信息。除了向量检索很多系统也会用传统的关键词检索或SQL结构化存储来配合比如用户信息、时间区间等强结构化数据用数据库更可靠而开放性的偏好、习惯用向量库更合适。4.3 记忆写入策略不是所有对话都值得存很多人第一次做长期记忆时会犯同一个错把Agent看到的、说过的所有内容全存下来。结果就是记忆库越来越脏检索时什么都命中不了或者命中一堆无关内容把上下文撑变形。记忆写入需要策略。我一般会把内容分成三类用户明确表达的偏好或约束比如“我不吃辣”“我要靠窗”这类必须存。任务执行过程中的中间状态比如“已经查到票了”这类是短期记忆任务结束就该清理。总结性事实比如“完成了一次出差行程安排往返时间分别是……”这类可以做压缩存储用于未来同类任务参考。写入时机也要控制不能每轮循环都写入。比较稳妥的做法是任务完成后统一提取一次“值得长期记住的事”再批量写入。这样既降低存储成本也避免执行过程中写入噪声信息。4.4 记忆污染我踩过最狠的坑长期记忆用起来之后我遇到的最大问题是“记忆污染”。具体表现是一次任务中存储了一条当时正确、但后来已经被推翻的信息后续任务检索到这条过期信息Agent做了错误决策。举个真实场景模拟某用户第一次说“靠窗位置好”系统存了偏好。后来该用户在另一次对话里明确说“不以后不要靠窗了太晒”系统如果没有做覆盖更新记忆库就会同时存在“靠窗好”和“不要靠窗”两条矛盾信息。下次Agent检索旧信息权重可能更高就又选了靠窗。这个问题的本质是记忆系统只做了“追加写入”没有做“版本管理”。后来我的处理方式是给每条记忆增加时间戳和来源写入新记忆时先检测是否存在同主题旧记忆如果存在就标记为“已覆盖”或直接把旧记忆判断为过期。检测同主题可以靠规则映射也可以靠语义相似度判断条件允许时语义判断更可靠。长期记忆是一把双刃剑用得好Agent像一个人体贴的助手用不好就是一个带偏见的糟糕同事。建议所有准备上长期记忆的团队提前设计好覆盖和清理机制。5. 工具调用Agent的手是怎么穿过对话框伸出去的5.1 为什么Agent必须会调用工具大模型的知识来自训练数据天然有时效性问题和事实盲区。比如它可能不知道今天的最新车次表也不知道你公司通讯录里某个人的邮箱地址。Agent之所以“能干活”核心就是因为它能通过工具实时获取外部信息、触发外部操作。在架构里工具被抽象成函数。每个工具都有三要素名字、描述、参数说明。Agent看到这些说明才能判断“解决当前问题应该调用哪个函数、参数填什么”。5.2 Function Calling的三步流程业界把Agent调用外部函数的过程称为Function Calling流程分成三步工具声明系统把可用工具的描述name、description、parameters传给模型通常以JSON Schema的形式表示。模型决策模型根据当前上下文选择是否调用工具并生成参数JSON。运行时执行系统解析模型输出的函数名和参数做校验后真正执行函数把返回值传给模型作为下一轮观察。以一个搜索联系人的伪代码片段为例tools [ { name: search_contacts, description: 根据关键词搜索企业通讯录中的联系人, parameters: { type: object, properties: { query: {type: string, description: 搜索关键词比如姓名或职位} }, required: [query] } } ] # 模型输出的结果 model_response {tool: search_contacts, args: {query: 直属上级}} parsed parse_json(model_response) result execute_tool(parsed)这段逻辑看着简单但展开到真实系统里工具数量可能成百上千参数类型五花八门这一步就会变成稳定性考验的主战场。5.3 工具返回结果怎么回填上下文工具执行完之后的返回值是整个Agent循环的关键“观察”信号。这个信号描述得差模型下一轮决策就会跑偏。我在项目里的做法是无论工具返回的是JSON、文本还是报错都先把数据洗干净再拼进历史记录。比如数据库查询的返回字段名如果和模型预期不一致我会先做一个字段映射工具报错时我会把错误信息整理成“工具名 错误码 可读描述”三段式方便模型理解并修正计划。另外工具返回数据可能非常大。一次性把几万行查询结果塞给模型直接浪费大量token且容易让模型看漏重点。通常的做法是先让Agent基于任务目标对结果做过滤/摘要再进入下一轮。例如查询结果过多时系统先自动做统计摘要只有模型明确需要明细时才传完整数据。5.4 工具调用最常见的四类翻车跑了一年多Agent相关的项目工具调用环节的“翻车名场面”我基本都见过归纳成四类给各位避坑参数幻觉模型生成工具不存在的参数比如工具只接受“days”模型却传了“date_range”。这类问题通常可以通过更严格的参数描述和工具调用示例来缓解。时间与时区用户说“明天上午开会”Agent填参数时没有换算时区导致系统按UTC时间处理。工具参数设计时最好把时区和默认值写清楚模型生成前也最好先问一次用户意图。返回值过大工具把大文本直接返回撑爆上下文。这类问题要前置做结果截断和摘要。静默失败工具内部报错但Agent以为成功直接进入下一步。这类问题必须靠返回值里的status字段区分成功与失败不能只看有没有数据。5.5 工具调用失败后的重试策略工具调用失败不丢人关键是有没有挽回机制。我目前常用的策略是分层重试第一层是参数修复重试。如果错误提示“缺少必填参数”系统自动把错误信息回传给模型让模型重新生成参数。这种问题多数一次就能修复。第二层是降级处理。比如主搜索工具挂了自动切换到备用的搜索接口或者强制改用简单的关键词搜索模式。这要求前期把工具逐一梳理出备选方案。第三层是人工转交。如果连续两三轮重试还是失败直接把错误上下文打包推给用户在界面上确认。硬着头皮让Agent继续试只会浪费token还可能把错误扩散到后续步骤。6. 一次真实任务的完整推演从收到指令到发出邮件6.1 场景与初始状态说了这么多原理我把一个典型任务从头到尾推演一遍这样整个Agent循环会清晰很多。假设用户给Agent发来一句话“帮我把今天上午会议的纪要整理成一条简明日报发给我的直属上级。”Agent收到这条消息后的初始状态是用户目标明确但没有任何历史记录没有会议纪要文件路径不知道收件人是谁也没确认邮件格式。这个时候如果Agent直接调create_draft_email参数必然全是编的。靠谱的Agent应该从“找纪要文件”开始。6.2 逐步推演整个决策循环下面是Agent内部一步步发生的事。我把它整理成表格方便对照每个循环的元素。步骤观察到的信息思考动作返回结果1初始状态只知道用户目标需要先找到会议纪要文件read_file参数待确认错误缺少文件路径2读了用户提供的工作目录列表目录里有meeting_notes_20260605.md大概率是目标文件read_filepathmeeting_notes_20260605.md成功返回3段会议记录含5条待办事项3今天上午的会议内容是项目评审涉及两个模块排期、一个风险点需要从中抽取最重要的信息压成日报无外部工具直接用LLM生成摘要生成3行日报草稿4日报已生成但还不知道发给谁用户的“直属上级”是谁需要查通讯录search_contactsquery直属上级返回一位联系人邮箱为leaderexample.com5收件人已知正文草稿就绪应该先把邮件写成草稿供用户确认而不是直接发送create_draft_emailto、subject、body草稿创建成功返回草稿ID6草稿已创建仍未发送直接发送不可撤回存在风险询问用户是否需要直接发送等待确认用户回复“确认发送”7用户已确认可以执行最终发送动作send_emaildraft_idxxx发送成功任务完成6.3 推演中体现的三个关键设计这个推演能体现Agent落地时的三个关键设计考量值得单独拿出来讲。第一工具步骤依赖。第1步失败是因为缺少依赖参数第2步通过先读取目录补齐依赖这印证了规划阶段要标注子步骤依赖的价值。第二重要操作前置确认。第6步把“创建草稿”和“发送邮件”拆成了两个动作并且在最终发送前插入一个人工确认环节。这个设计在真实场景中极其重要邮件发出去不能撤回Agent自动执行高风险动作必须设置安全闸门。第三LLM本身也算一种工具。第3步做摘要时没有调用外部函数但本质上是用LLM完成了“文本处理工具”的职责。很多Agent架构就是混用外部工具和非外部能力。完整推演一趟之后你会发现Agent并不是什么玄学它只是在一个“观察-思考-行动”的循环里反复利用模型推理和外部工具逐步逼近目标。所有复杂功能都是在这个循环上叠加策略。7. Agent真正跑起来之后我反复吃的亏和改法7.1 模型幻觉会让Agent做出“看起来合理但错误”的行为在Agent场景里幻觉的危害比聊天场景大得多。聊天场景里模型编一段内容用户可能无所谓但Agent如果因为幻觉编造一个不存在的文件路径、一个错误的联系人、一组错误参数实际后果是系统真去执行了损失可能是实打实的。应对幻觉我没有特别神奇的方案就是老四条能调工具查证就不要让模型凭空猜测关键参数做规则校验比如路径格式、邮箱格式必须匹配才能执行执行前把待确认的关键信息截图给用户过目以及给模型足够权限之前先在人可以干预的环境里跑段时间观察。7.2 Agent卡死循环烧的不是算力是钱Agent在复杂任务里最让我头疼的问题是“循环空转”。它会在同一件事上反复做类似动作比如反复读取同一个文件、反复生成相似摘要就是不给FINISH。这个问题直接反映在账单上——每一轮循环都在消耗token空转十轮的成本可以顶一篇长文的生成成本。我现在的做法是双保险。硬限制层面设置最大步骤数一般是8到15步超出直接终止并转人工软限制层面记录每一步的“状态摘要”如果连续几轮状态没有实质变化就强制触发“重新规划”或直接结束。7.3 错误一旦累积后面全白做Agent是长链路执行前面一个小错误会被后续步骤放大。比如第一步把纪要文件读错了后面所有摘要、邮件、发送全部基于错误内容进行等发送完了才发现源头不对这个返工成本极高。我习惯在每个关键节点加一个“前后一致性校验”。比如摘要生成后自动比对摘要中提到的事实是否都能在原文里找到支撑邮件发送前让另一个模型实例做一次独立复核。这个“双重检查”的做法会让成本增加一些但和发错邮件的代价比起来非常划算。7.4 权限收敛给Agent最小权限别给最大便利很多Agent之所以不敢在真实业务里放开核心就是权限问题。让Agent去调用生产系统接口等于把一个能“自动做决定”的实体放进了核心链路。我的原则很明确Agent默认只读写完数据必须二次确认涉及资金、对外发布、删除类操作一律需要人工审批接口介入。权限收敛不是不信任Agent而是承认模型输出天然存在不确定性。把权限做小Agent做错事的破坏范围就小出现问题时你才有心情去优化它的决策质量而不是先停机抢救业务。7.5 调试Agent的方法论留痕、回放、评估Agent调试和普通程序调试最大的不同是普通程序每一步是可复现的而Agent每一步依赖模型概率输出不好复现。我调试Agent时最依赖的方法是“全链路留痕”。我会让Agent把每一步的完整输入输出都写成日志包括系统提示词、模型决策结果、工具调用参数、工具返回值、每一轮消耗的token数。出问题时把这段“回放记录”对着看一遍基本都能定位到是规划、记忆、工具还是权限哪个环节出了问题。在此基础上再针对高频场景准备一批固定的测试用例每次调整规划提示词或工具描述后自动跑一遍对比前后的成功率。没有这套回归测试Agent的每轮优化都是在赌运气。整套内容写下来我最想分享的实际建议是做Agent不要一上来就追求复杂的架构先把“观察-思考-行动”的最小循环跑通再逐步叠加规划、记忆和权限控制。尤其是刚开始接触的同学在最小循环上把日志和重试做好往后加功能会顺很多。我每次做新项目都是先写清楚“任务说明书”把可能出现的边界情况、工具调用顺序、哪些操作需要人工确认都列出来再开始写调度逻辑这一步能规避掉大部分返工。AgEE的工作原理说穿了不复杂真正决定它能跑多远跑多稳的都是那些循环之外的细节。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑