[{"data":1,"prerenderedAt":330},["ShallowReactive",2],{"article:column:/column/llm-to-agent-learning/32":3},{"id":4,"title":5,"body":6,"description":322,"extension":323,"meta":324,"navigation":325,"path":326,"seo":327,"stem":328,"__hash__":329},"column/column/llm-to-agent-learning/32.md","32｜Agent与工作流：目标、状态、动作和停止",{"type":7,"value":8,"toc":303},"minimark",[9,13,16,21,24,27,30,40,43,47,50,53,56,59,63,66,69,75,78,81,84,87,90,97,100,104,107,110,113,116,119,122,126,129,132,135,138,141,147,150,153,157,165,168,171,174,178,181,184,187,190,193,196,199,203,206,209,212,215,219,224,227,232,235,240,243,246,251,254,259,262,267,270,273,278,281,286,289,294,297,300],[10,11,12],"p",{},"请模型检查一张活动海报：时间、地点和报名链接是否与官网一致。它可以很快写出一段看似周全的意见，但如果根本没有打开官网，或者把旧通知当成新通知，这段意见还不构成完成任务。",[10,14,15],{},"前几章已经准备好外部资料、记忆、工具与连接协议。本章把它们接成一个持续过程：系统要知道目标是什么，当前已经确认什么，下一步允许做什么，以及出现什么证据才算结束。Agent的关键因此不是名字里多一个“智能”，而是模型参与选择动作，并根据新观察继续调整行动。",[17,18,20],"h2",{"id":19},"_1固定工作流与动态选择","1．固定工作流与动态选择",[10,22,23],{},"先设计一条固定工作流：读取海报文字，打开预先指定的官方通知，逐项比较，再输出差异。步骤和顺序由程序事先规定，模型可以负责文字提取或语义比较，但未必决定去哪里、做几轮或何时换路。",[10,25,26],{},"这种方法有明显优点：输入稳定时容易检查，成本和失败点相对可预测。它也可以包含条件分支，例如链接无效就返回“链接检查失败”。有分支不代表已经成为开放式Agent；关键是路径是否主要由事先写好的规则限定。",[10,28,29],{},"动态Agent则可能发现官网首页没有日期，先搜索具体活动名；发现两份冲突公告，再查修订时间；发现报名页注明变更地点，就补读变更说明。下一步取决于前一步观察，事先未必能枚举所有页面和次数。",[10,31,32,33],{},"两者之间是一条连续光谱，常见系统会混合使用：外层固定权限、预算和交付格式，内层让模型选择资料与核验步骤。Anthropic的公开工程说明用“预定义路径”与“模型动态组织过程”区分工作流和Agent，也建议从足够简单的方案开始。",[34,35,39],"a",{"href":36,"rel":37},"https://www.anthropic.com/engineering/building-effective-agents",[38],"nofollow","工作流与Agent的公开工程说明",[10,41,42],{},"不要把固定工作流理解成低级方案。对于格式稳定、规则明确、需要严格一致的工作，减少自由选择可能更可靠。自主程度是设计变量，不是越高越好的质量分数。",[17,44,46],{"id":45},"_2把任务写成可检查的目标","2．把任务写成可检查的目标",[10,48,49],{},"“帮我看看海报”仍然模糊。我们把教学任务限定为：核对活动日期、开始时间、地点和报名链接四项；优先使用主办方正式页面；输出每项是否一致及证据；只读资料，不发布或修改海报。",[10,51,52],{},"这段说明同时包含目标、范围、证据标准和权限。目标回答想得到什么；权限回答允许改变什么。即使模型推断出海报写错，也不能因此把“指出差异”自动升级成“替用户在社交平台改图”。",[10,54,55],{},"完成条件也要具体。例如四项都有对应官方证据，冲突已经标明，无法确认项明确留空，最终报告能让人点开来源。报名入口还要拆开检查：当前主办方正式公告确实指向这个地址；实际打开后，页面可用且内容适用于这场活动。仅有页面内容相符，不能证明它是官方公布的入口。这里允许“有一项无法确认”成为诚实的终止结果，但不能把它归类为全部核对成功。",[10,57,58],{},"系统还需要区分成功、受阻、取消与预算耗尽。它们都可能结束一轮运行，却表达不同结果。把所有终止都打印成“已完成”，会在最重要的地方丢失信息。",[17,60,62],{"id":61},"_3内部状态怎样跟上外部变化","3．内部状态怎样跟上外部变化",[10,64,65],{},"为了看清结构，给每轮编号t。t只表示第几轮，不是物理时间。我们用Sₜ表示这轮开始时的任务状态，用Aₜ表示选择的动作，用Oₜ₊₁表示动作返回的新观察。",[10,67,68],{},"整个关系可以写成：",[10,70,71],{},[72,73,74],"strong",{},"当前状态Sₜ → 选择动作Aₜ → 外部执行 → 得到观察Oₜ₊₁ → 更新状态Sₜ₊₁",[10,76,77],{},"先把外部世界和内部状态分开。主办方在网页发布新地点，是外部变化；系统还没读到新页时，内部可能仍记录北厅。网页已经更新，并不意味着模型立即知道。反过来，一次读取也可能超时，或只返回旧缓存。因此本章固定的假设是：页面可更新，观察可失败，内部记录可能过时；需要通过新观察修正它，不能仅凭原计划推进。",[10,79,80],{},"状态不是模型脑中一个神秘的情绪。它可以是一份明确记录：已确认的三项事实、还缺的地点、访问过的页面、剩余预算、当前允许的工具与待处理错误。下一轮模型未必看到全部历史，系统会决定把哪些部分送入上下文。",[10,82,83],{},"动作是一个提议，例如“读取公告页面”，随后由执行层检查工具名、参数与权限，再真正访问。观察则是页面内容、错误或回执。模型说“我已经打开了”，不能替代外部执行产生的记录。",[10,85,86],{},"更新状态时，应把事实与推测分开。页面写“活动延期”，可以记录这个原文事实；推测“可能改到下周”需要另外标注，不能在下一轮摘要里变成正式日期。状态管理正好连接第29章的来源、时效和冲突处理。",[10,88,89],{},"看图1时，沿着“读到新公告”这条虚线走：真正改变内部结论的是带来源的观察，不是外部页面更新这个事件本身。",[10,91,92],{},[93,94],"img",{"alt":95,"src":96},"32｜Agent与工作流：目标、状态、动作和停止：图1","/collections-assets/llm-to-agent-learning/4b3f240dd6ac3a51605b3d095657226b2fd9f6bbfcefa5dfce3234a0b275a78f.png",[10,98,99],{},"图1｜外部页面与内部证据状态是两个对象。执行前先查权限，实际读取才带回观察；观察更新状态后，才决定继续还是停止。虚线表示观察进入内部，实线表示动作与控制路径。固定工作流也可以按这套边界执行，只是下一步由预设规则限定。",[17,101,103],{"id":102},"_4用纸笔运行一个小agent","4．用纸笔运行一个小Agent",[10,105,106],{},"准备四张教学资料卡。海报卡写“10月18日14:00，北厅，报名入口L”；主办方旧公告写相同日期、时间与地点；已确认属于当前主办方的正式新公告写“活动仍为10月18日，改在南厅，本活动当前报名入口为L”，并明确链接到L；入口L所对应的报名页写“10月18日14:00，南厅”，且能够正常打开。新公告未另写开始时间。L只是纸笔标识，不是真实网址。这些卡片均为虚构资料，不对应真实活动。",[10,108,109],{},"初始状态四项都未确认，预算允许最多四次读取。第一轮读取旧公告，日期和时间获得支持，地点暂时与海报一致，但还没有证据证明它是最终版本。此时可以标注“旧公告支持”，不能把“暂未看到更新”当成“确定没有更新”。",[10,111,112],{},"第二轮按活动名查到新公告，状态发生实质变化：日期保持，地点出现版本冲突；入口L获得“当前正式公告明确指向”的来源证据，但是否可访问、内容是否适用仍待查。合理动作是保留旧公告的出处，标记地点已被更新，再读取L补齐后两项检查。不能删除冲突记录后装作所有资料从来一致。",[10,114,115],{},"第三轮读取正式新公告指向、且与海报所列一致的入口L，确认页面能正常打开，并核对活动身份、10月18日14:00和南厅。这样，“官方指向L”与“L可用且内容适用”才共同完成入口核验。剩余预算还有一次，但四项任务已具备足够证据，可以停止。预算是上限，不是必须用满的配额。",[10,117,118],{},"最终报告应说海报地点与最新公告不一致，其他三项核对结果各有来源。完成证据不是“模型连续想了三轮”，而是四个字段的核对记录和相应材料。如果报名入口访问失败，则应单独报告链接无法核实，不能只因地址看起来像网址就说可用。反过来，一张复制了全部活动文字、也能打开的非官方页面，只能通过内容与可用性检查；缺少当前正式公告到它的指向，仍不能当作已核实的官方入口。",[10,120,121],{},"这个实验最有价值的步骤，是故意把资料卡顺序调换。先看新公告，再看旧公告，结论应由适用版本决定，不能被最后看到的文字覆盖。若系统记忆只保存一段无来源摘要，这类顺序错误就很容易发生。",[17,123,125],{"id":124},"_5状态更新也需要不变量","5．状态更新也需要不变量",[10,127,128],{},"不变量指整个过程中始终应成立的条件。例如“没有证据的字段不得标为已验证”“只能读取获准来源”“已知冲突不能默默丢弃”。它们不像任务计划会随观察变化，而是约束每次变化必须合法。",[10,130,131],{},"再加一条：“剩余读取次数＝初始预算−已实际执行次数”。初始预算为4，三次读取后剩1。模型在文字里列出三个计划，不消耗三次外部读取；同一轮实际读取两个页面，则应该扣两次。预算计数最好由系统依据真实事件维护，而不是依赖模型回忆。",[10,133,134],{},"并行执行还需要调度。若只剩1次读取机会，两个候选动作不能各自看见“剩1次”后一起启动；执行层应先占用可用名额，再发起读取，并把已经发出的请求计入实际用量。模型负责提议下一步，调度器负责让并发中的总量也不越界。这里借用的是资源计数与状态约束，不是假定模型每次都会作出相同提议。",[10,136,137],{},"状态还应保留失败类型。暂时超时、目标不存在和权限不足，不应都变成“没有找到”。超时可以在允许范围内重试；不存在可能需要换来源；权限不足则需要止步或取得授权，不能换个入口绕过同一限制。",[10,139,140],{},"图2把预算和完成条件分开列出。先检查是否已经满足四项核对要求；若没有，再检查是否仍有获准且可用的读取机会。否则诚实结束，不把停止原因改成成功。",[10,142,143],{},[93,144],{"alt":145,"src":146},"32｜Agent与工作流：目标、状态、动作和停止：图2","/collections-assets/llm-to-agent-learning/94a893175d51ca1cc2bce7d6d4553cc86db3bdfa5662bb95e018bc0e74fe6ea5.png",[10,148,149],{},"图2｜虚构海报的四项证据台账随三次实际读取变化，预算从4降到1。第二次读取确立当前正式公告指向L，第三次再确认L可用且内容适用，两者共同完成入口核验。地点为南厅，故核对成功仍可发现海报不一致；缺证且无法继续时报告受阻，尚缺证且预算为零时报告预算耗尽。",[10,151,152],{},"还有一种必须处理的状态是“动作结果未知”。第30章的回执丢失已经说明，外部动作可能完成但系统没收到结果。对于只读任务，重复读取通常主要浪费资源；对于发消息或修改记录，盲目重试可能造成重复副作用。Agent循环不会自动消除这种分布式系统问题。",[17,154,156],{"id":155},"_6循环框架提供什么不提供什么","6．循环框架提供什么，不提供什么",[10,158,159,160],{},"OpenAI Agents SDK的运行说明公开列出一种执行循环：调用当前Agent使用的模型；遇到工具调用就执行并把结果加入后续输入；遇到移交就切换相应Agent；达到最终输出或触发轮数限制时结束。这是框架层的实际组织机制。",[34,161,164],{"href":162,"rel":163},"https://openai.github.io/openai-agents-python/running_agents/",[38],"Agents SDK执行循环",[10,166,167],{},"它帮助我们把一次模型输出与持续运行分开。框架知道如何接续事件，不等于知道海报地点的真实值；框架能返回一个最终输出对象，也不等于四项核对已满足业务标准。后者仍需我们定义并检查。",[10,169,170],{},"轮数限制同样不能代替全部资源限制。一轮可能触发多个工具，单个工具可能很慢，不同模型调用量也不同。因此实际预算可以同时约束模型轮数、工具次数、总时间与费用；任一项触及边界，就应进入明确的停止或求助路径。",[10,172,173],{},"人类接管是正常控制手段。材料冲突无法解决、权限不够、风险超出授权时，请用户作决定比继续猜更合理。把“从不提问、永不停止”当作自治能力，会让系统在不知道答案时仍不断扩大行动。",[17,175,177],{"id":176},"_7计划与环境为什么会脱节","7．计划与环境为什么会脱节",[10,179,180],{},"回到图1的观察边界，模型只看见工具带回的部分环境。假如新公告已发布但读取失败，计划应记录“尚未核实当前版本”，不能假装内部状态已经与外部同步。",[10,182,183],{},"因此计划需要接受反馈。原计划“读取官网首页”失败后，合理重规划是寻找同一主办方的具体公告；若用户更改任务，只核对时间，旧计划中检查地点的步骤就可以取消。坚持执行过时计划，并不比没有计划更可靠。",[10,185,186],{},"但重规划也不能随意改成功标准。最初要求核对官方来源，遇到困难后偷偷改成“网上有人这样说”，就是降低证据要求。可以向用户说明无法达到原标准并提出替代方案，却不应在内部改完后宣称原任务成功。",[10,188,189],{},"这也对应软件工程中的状态机测试：给定同一旧状态和一次观察，检查新状态有没有保留来源、按适用版本更新字段，并准确扣除实际读取预算。将新旧资料的到达顺序反转，或注入一次超时，就能检验这些不变量，而不是只比较最终段落写得像不像。",[10,191,192],{},"这给了Agent评估一个更精确的问题：它在新观察出现时，是否修改了该修改的部分，同时守住了不该改变的约束？只看最终文字是否漂亮，无法回答这个问题；需要保留关键动作与证据的记录。",[10,194,195],{},"历史记录与当前状态也应分开。历史保留先后发生了什么，当前状态表示现在采用哪些结论。新公告取代旧地点时，当前值可以变成南厅，但历史仍应让人看见为什么发生更改。只保留当前值难以调查错误，只把全部历史丢给模型又容易混淆过期结论，两种记录各有职责。",[10,197,198],{},"状态还可以标注任务依赖：报名入口未验证，不必阻止已经完成的时间核对向用户报告；但不能宣称整项检查无遗漏。这让系统在受阻时仍交付可靠部分，同时清楚标出未完成边界。",[17,200,202],{"id":201},"_8什么时候值得增加自主性","8．什么时候值得增加自主性",[10,204,205],{},"如果每个输入都走同样三步，工具返回结构稳定，异常种类很少，固定工作流通常更容易验证。若相关资料分散、下一步取决于发现什么、任务长度不固定，动态选择更有价值。",[10,207,208],{},"也可以把开放部分限制在小范围内：允许模型在一组只读检索工具里选择，不允许任意发送或删除；允许探索三轮，仍由确定规则检查交付字段。这样得到的是有边界的灵活性，便于逐步评估收益和风险。",[10,210,211],{},"判断标准是实际任务是否改善：找到了原来漏掉的证据吗，错误是否更容易定位，成本与延迟是否可接受，失败时能否安全停止。工具数量、角色数量或持续运行时长，都不能单独回答这些问题。",[17,213,214],{"id":214},"本章练习",[216,217,218],"h3",{"id":218},"题目",[10,220,221],{},[72,222,223],{},"问题1｜分支由谁决定",[10,225,226],{},"一个流程预先写好“链接失效就返回失败，链接可用就逐项比较”。它属于固定工作流还是必然属于动态Agent？说明判断依据。",[10,228,229],{},[72,230,231],{},"问题2｜把新观察写进状态",[10,233,234],{},"已读旧公告一次，预算从4变为3；日期、时间、地点都标“旧公告支持”，入口L仍待查。第二次读到当前主办方正式新公告：日期不变、地点改南厅，并明确链接到当前报名入口L，未提开始时间。请更新四项状态与预算，选择下一步；第三次打开L，确认同一活动、10月18日14:00和南厅后，应走哪个出口？若只有一张内容相同且可打开的复制页，却没有当前正式公告指向它，能否作同样判断？",[10,236,237],{},[72,238,239],{},"问题3｜观察迟到以后",[10,241,242],{},"新公告已经发布，但本次读取超时。框架随后返回最终文字“核对完成”。这时内部地点应标什么状态？仅凭最终文字能否判成功，应检查哪些证据？",[216,244,245],{"id":245},"思考提示",[10,247,248],{},[72,249,250],{},"提示1｜对应问题1",[10,252,253],{},"找出谁规定下一步，而不是数一共有几个分支。",[10,255,256],{},[72,257,258],{},"提示2｜对应问题2",[10,260,261],{},"未提到的字段不要凭空获得新证据。把入口的来源关系与实际可用性分开；完成核对可以是找到了差异。",[10,263,264],{},[72,265,266],{},"提示3｜对应问题3",[10,268,269],{},"把外部事实、实际收到的观察、框架停止分别看待。",[216,271,272],{"id":272},"参考答案与解析",[10,274,275],{},[72,276,277],{},"答案1｜对应问题1",[10,279,280],{},"它可以是固定工作流。两个分支及其触发条件都由程序预先规定；有条件判断、有循环，都不足以证明模型在根据观察动态组织路径。",[10,282,283],{},[72,284,285],{},"答案2｜对应问题2",[10,287,288],{},"第二次读取后预算为2。日期得到新公告支持；时间仍只有旧公告支持；地点保留“旧北厅、新南厅”的冲突及版本关系；入口记为“当前正式公告指向L，可用性与内容待查”。下一步在权限内读取L。第三次读取后预算为1，来源关系、可用性与内容适用性都得到支持，四项核对已有适用证据，走核对成功出口，并报告海报地点不一致。无需用满第四次读取。复制页即使内容相同且能打开，也缺少当前正式公告的指向，不能据此判为已核实的官方入口。",[10,290,291],{},[72,292,293],{},"答案3｜对应问题3",[10,295,296],{},"内部不能仅凭“网页已经更新”就记为已核实南厅；应保留已有地点及来源，并标记当前版本未核实、读取超时。最终文字只说明运行结束，不能证明任务成功。需检查四字段证据、适用版本、冲突处理、实际工具返回与预算记录；仍有缺证就报告受阻或其他真实停止原因。",[17,298,299],{"id":299},"下一章",[10,301,302],{},"一个Agent已经要管理许多状态。如果再加入计划器、搜索分支和多位协作者，什么时候会更可靠，什么时候只是多了出错点？第33章用依赖关系、相关错误和通信成本来回答。",{"title":304,"searchDepth":305,"depth":305,"links":306},"",3,[307,309,310,311,312,313,314,315,316,321],{"id":19,"depth":308,"text":20},2,{"id":45,"depth":308,"text":46},{"id":61,"depth":308,"text":62},{"id":102,"depth":308,"text":103},{"id":124,"depth":308,"text":125},{"id":155,"depth":308,"text":156},{"id":176,"depth":308,"text":177},{"id":201,"depth":308,"text":202},{"id":214,"depth":308,"text":214,"children":317},[318,319,320],{"id":218,"depth":305,"text":218},{"id":245,"depth":305,"text":245},{"id":272,"depth":305,"text":272},{"id":299,"depth":308,"text":299},"从信息表示和学习出发，用可核算的例子与白板图逐步理解大模型、后训练、推理和Agent系统。","md",{},true,"/column/llm-to-agent-learning/32",{"title":5,"description":322},"column/llm-to-agent-learning/32","akS-v5q75RXPGBp_yrOQHSzND9uukIBGu9aLSIWeSRY",1791935828880]