主讲能力:任务规划、风险评估、反思、长期经验沉淀
业务场景:用户给出复杂模糊目标,Agent 自动拆解计划、识别风险、推进低风险事项、创建人工交接,并把复盘经验写入长期记忆。
对应代码:backend/projects/p10_autonomous_task/
12.1 老板甩来的目标
周一早上,老板路过工位,丢下一句:"帮我准备下季度产品发布会。"然后人就走了。
你愣在原地。这句话信息量极大,步骤却为零。发布会在哪天?预算多少?要不要请媒体?场地谁定?邀请函谁发?哪些事你能自己拍板,哪些事必须回头请示老板?你不可能冲进老板办公室问每一个细节,也不可能闷头把所有事全干了——万一你替老板拍板了一个五十万的场地,那是要背锅的。
于是你本能地做了一件事:先在脑子里把这句模糊的"目标"拆成一件件能动手的事,再给每件事贴个标签——这件我自己干、这件得问老板、这件有风险先别动。干完之后,你还会在备忘录里记一笔:"下次发布会要提前两周锁场地,不然临时溢价。"下回再有类似活儿,你翻翻备忘录,轻车熟路。
这就是自主任务规划:把一个模糊目标,变成一份可执行的清单,并清清楚楚地划出"能自动推进"和"必须人工确认"的边界。本章要造的,正是这样一个 Agent。
前面九个项目都在围绕具体场景打转:客服、知识库、代码、数据、内容、个人助理……每个都是一把"专精的锤子"。而本章要做的,是把前面练过的所有本事攥成一拳——规划、反思、记忆、工具、风险评估、人工交接——这是全书的集大成,也是最后一战。
真实世界的任务往往不是"查订单 10001"这样一句话就能搞定,而是:
- 帮我准备一次产品发布
- 帮我规划一次技术迁移
- 帮我组织一次线上活动
- 帮我制定一个学习计划
这些任务的难点,根本不在工具调用本身,而在四件事上:目标模糊、步骤繁多、风险不定、处处要人确认。自主任务规划 Agent 的职责,就是把这团乱麻理成一份可执行计划,并牢牢守住一条红线——分清"能自动推进"和"必须人工确认"。
功能需求
- 检索历史经验。
- 拆解复杂目标为 5-8 个任务。
- 评估每个任务风险等级。
- 自动推进低风险任务。
- 高风险任务创建人工交接单。
- 任务完成后生成复盘并写入长期记忆。
12.2 画个样子:它该长啥样
回到开头那个员工。他接到"准备发布会"后,脑子里其实跑了一条流水线:先翻备忘录(有没有干过类似的活儿)→ 把目标拆成几摊事 → 给每摊事估个风险 → 自己干能干的 → 脏活累活高风险活儿写成请示单递给老板 → 干完写复盘存档。我们的 Agent 走的也是同一条路,只不过每一步都落成可观测的结构化动作:
%%{init: {'theme':'base','flowchart':{'useMaxWidth':true,'htmlLabels':true}}}%%
graph TD
Goal["模糊目标"] --> Recall["检索历史经验"]
Recall --> Plan["拆解任务"]
Plan --> Risk["风险评估"]
Risk -->|低风险| Exec["自动执行"]
Risk -->|高风险| Handoff["人工交接"]
Exec --> Reflect["反思复盘"]
Handoff --> Reflect
Reflect --> Memory["写入长期记忆"]
Memory --> Report["最终报告"]
classDef p fill:#e3f2fd,stroke:#1976d2,stroke-width:2px,color:#0d47a1
classDef r fill:#ede7f6,stroke:#5e35b1,stroke-width:2px,color:#311b92
classDef o fill:#e8f5e9,stroke:#43a047,stroke-width:2px,color:#1b5e20
class Goal,Recall,Plan,Risk p
class Exec,Handoff,Reflect r
class Memory,Report o
蓝色是"想"——把模糊目标想清楚;紫色是"做"——但做之前先分清哪些该自己做、哪些得交出去;绿色是"长记性"——做完一次,就往长期记忆里存一笔。注意那条分叉:风险评估一出来,路就分成两条,低风险往下走自动执行,高风险往右拐进人工交接。这条分叉,是整章的灵魂。
12.3 拆开看:怎么造出来
12.3.1 任务模型
1 |
|
任务必须结构化,否则后续风险评估、自动执行、人工交接都无从谈起——就像你给自己列待办,光写"搞发布会"三个字,下一秒就不知道该干嘛了。owner 说清这件事归谁,risk 说清这件事能不能乱动,status 说清这件事到哪一步了。三个字段,把一团模糊钉成一张可操作的工单。
12.3.2 风险边界
生产级自主 Agent 的核心原则只有一句:能自动化的,不等于应该自动执行的。
这句话值得反复咀嚼。一个 Agent 能调用发邮件的接口、能改数据库、能下单付款——技术上它"能"。但"能"和"该"之间,隔着一道叫"后果"的墙。发错一封群邮件、改错一行生产数据、多刷一笔款子,这些都是不可逆、有外部影响、真金白银的坑。所以本章用一套规则,给每个任务上一道闸:
| 风险 | 行为 |
|---|---|
| low | 可自动执行 |
| medium | 可给建议,但需补充信息 |
| high | 创建人工交接,不自动执行 |
💡 顿悟时刻:很多人第一次做自主 Agent,最容易踩的坑就是"既然它能干,那就让它干呗"。但生产环境里,自主权越大,闯祸的能力也越大。真正成熟的 Agent 不是"什么都能自己干"的 Agent,而是"知道自己不该干什么"的 Agent。把高风险动作强制交接给人工,不是 Agent 能力弱,恰恰是它最懂事的体现。
⚠️ 避坑:风险分级不是写死在 Prompt 里就万事大吉——Prompt 是"建议",Agent 心情好可能听,心情不好可能不听。所以本章的闸门是两道的:Prompt 里写"高风险必须交接",代码里
needs_human_confirmation在risk == high时硬性拦截执行。Prompt 管"该不该",代码管"能不能",两道闸门一起守,才守得住边界。
12.3.3 记忆沉淀
每次任务结束后,Agent 调用 remember_lesson 写入长期经验。下一次类似任务开始时,先调用 recall_lessons 把旧经验翻出来。
这一步,乍看平淡,其实是整章最反直觉的设计。有人会问:Agent 每次重新生成计划不就行了,费这劲存历史干嘛?
答案藏在"为什么老员工比新员工靠谱"里。新员工每次接活都从零开始推理,凭的是通用经验;老员工接活先翻自己的备忘录——“上次干这事栽在场地没提前锁,这次第一件事就是锁场地”。这一翻,省下的不是几秒钟,而是整个踩坑循环。反思复盘之所以要写入长期记忆,就是因为一次反思的价值不在当下这个任务(它已经做完了),而在下一个相似任务——只有存下来,经验才能跨越会话累积,Agent 才会"越用越懂你、越用越专业"。不写进记忆的反思,就像写完日记就扔进碎纸机,复盘等于没做。
12.4 动手写:三层架构完整代码
本节给出自主任务规划 Agent 的完整代码实现。代码按"模型层 / 提示词层 / 工具层 / 记忆层 / 服务层 / 项目层 / 入口"分层组织,每一层职责单一、互相解耦,最终由服务层编排成"规划 → 执行 → 反思"闭环。
读这段代码有个窍门:先别一头扎进某个工具的细节,先从服务层 AutonomousTaskService.run_full_workflow 往下看。它是这场戏的"导演",四个阶段一气呵成;其余每层都是被它调度的"演员"。导演怎么排戏,决定了整出戏怎么走。
12.4.1 三层架构完整代码
| 层次 | 文件 | 职责 |
|---|---|---|
| 模型层 | models.py | 任务状态机、风险等级、经验/反思模型 |
| 提示词层 | prompts.py | 自主规划系统提示词、拆解/评估/反思模板 |
| 工具层 | tools.py | 检索/拆解/评估/执行/交接/沉淀工具 |
| 记忆层 | memory.py | 经验沉淀记忆系统(SQLite) |
| 服务层 | service.py | 规划-执行-反思闭环编排 |
| 项目层 | project.py | 项目注册、对外接口 |
| 入口 | init.py | 注册与 re-export |
models.py
1 | """项目十:数据模型层。 |
prompts.py
1 | """项目十:Prompt 层。 |
tools.py
1 | """项目十:工具层。 |
memory.py
1 | """项目十:记忆层。 |
service.py
1 | """项目十:服务层。 |
project.py
1 | """项目十:项目定义层。 |
init.py
1 | """项目十:自主任务规划 Agent(全能力集大成) |
12.4.2 核心代码讲解
1. 规划-执行-反思闭环(Plan → Execute → Reflect)
整个 Agent 的心脏,是服务层 AutonomousTaskService.run_full_workflow 串起的四阶段闭环:先 run_planning_phase 把模糊目标拆成结构化任务,再 run_risk_assessment_phase 给每个任务打风险标签,接着 run_execution_phase 自动推进低风险任务、把高风险任务挂起交接,最后 run_reflection_phase 复盘并沉淀经验。注意,这四个阶段不是"可选菜单",而是强制顺序——规划失败就直接返回错误,绝不允许带着一份空计划硬往下执行。反思阶段产出的复盘报告会拼进最终报告交回给用户,形成"做完一次任务、长一次经验"的正循环。
2. 任务状态机与风险评估
TaskStatus 定义了 todo / in_progress / completed / blocked / handed_off 五种状态,TaskRisk 定义了 low / medium / high 三级风险。TaskItem.is_safe_to_execute 用三条规则(owner 是 agent、risk 是 low、status 是 todo)判断任务能否自动执行;needs_human_confirmation 则在 risk 为 high 或 owner 为 human 时触发人工确认。这种"状态 + 风险"的双重约束,正是把"能自动化的"和"应该自动执行的"分开的关键——只有可逆、无外部影响、不涉及费用的操作,才允许 Agent 自己动手。
3. 高风险任务的人工交接机制
执行阶段对高风险任务调用 create_handoff 生成 HandoffTicket,并把任务状态置为 handed_off,绝不擅自执行。交接单里带着任务标题、风险原因、优先级和上下文,相当于给人工递过去一张"待办工单"。AUTONOMOUS_AGENT_PROMPT 里也白纸黑字写着"高风险任务必须 create_handoff,不能擅自执行"——Prompt 和代码两道闸门一起守,这就是 12.3.2 那条"能自动化 ≠ 该自动执行"原则的工程落地。
4. 经验沉淀到长期记忆
记忆层 TaskMemory 用 SQLite 存了一张 lessons 表,remember_lesson 写入、recall_lessons 按 goal/lesson 关键词 LIKE 检索。反思阶段会自动把"完成几个任务、交接几个高风险任务"作为一条 process 类经验写进去;下次类似目标开始时,recall_lessons 工具会先把历史经验喂给 Agent,让它像老员工翻备忘录一样避开旧坑。这就是"越用越懂你"的工程落点:经验不是一次性的结论,而是跨会话累积的资产。
⚠️ 避坑(记忆治理):经验库会越攒越大,时间一长,过期经验会变成噪音甚至误导——半年前"场地要先锁"的经验,放到今年改成线上发布会就不适用了。生产环境里别只管写入不管清理:要给经验加时间衰减、支持用户删除与导出,检索时优先返回近期、高相关的条目。一个无人治理的记忆库,最终会从"资产"退化成"负债"。
5. 服务层的异步工作流编排
四个阶段方法都是 async def,run_full_workflow 用 await 顺序编排,为将来接入真实异步工具(调外部 API、写消息队列)留好了口子。PlanningTask 作为可变状态对象在各阶段之间传递,每个阶段往 execution_log 追加带时间戳的日志,最后 generate_final_report 取最近 10 条日志拼进报告,做到过程可观测——出问题时,日志就是排查的第一现场。
6. 错误降级处理
每一层都给自己留了退路:规划阶段 decompose_goal 解析失败,会把异常写进日志并返回 False,整个流程提前终止;执行阶段单个任务失败,只把这一个任务置为 blocked,不影响其他任务继续跑;project.py 的 run 方法先尝试跑完整异步工作流,捕获异常后再降级到直接调用 agent.run,再失败才返回错误文案。这种"逐层兜底"的设计,保证 Agent 不会因为单点故障就整体崩盘。
7. 三层架构的解耦优势
模型层只定义数据结构和状态机,不依赖任何外部服务;提示词层是纯字符串常量,可独立审阅和迭代;工具层用 @tool 装饰器把能力暴露给 Agent,内部依赖模型层和记忆层;服务层编排工具却不关心工具怎么实现;项目层只管注册和对外接口。这种分层让每一层都能单独测试和替换——比如把 decompose_goal 从示例数据换成真实 LLM 生成,只动工具层,模型层和服务层一行都不用改。__init__.py 统一 re-export 并注册到全局 registry,对外只暴露 run / build_agent / get_tools,调用方完全无需关心内部分层。
💡 顿悟时刻:回看全书,从第 1 章只会回答问题的"单兵",到现在能规划、能判断风险、知道该请示谁、还会把经验存下来的"自主 Agent"——这条主线的本质,是 Agent 一步步长出了"边界感"和"成长性"。会干活只是及格,懂边界、能积累,才是一个 Agent 从"工具"走向"队友"的分水岭。
12.5 跑一跑:它真的行吗
离线测试要回答的核心问题是:这台 Agent 的"边界感"到底靠不靠谱?所以用例专门盯着风险分流和记忆读写:
- 任务拆解返回合法 JSON
- 风险评估能识别高低风险
- 低风险执行工具返回完成信息
- 高风险交接工具返回人工确认单
- 经验记忆可写入和检索
换句话说,测的就是"该自动的自动了没、该交接的拦住了没、经验存进去还能不能捞回来"。这三道关卡守住,Agent 才敢放心上岗。
运行:
1 | cd backend |
12.6 送上线:让它上班
前端选择「自主任务规划 Agent」,输入:
帮我规划一次新产品发布会。
你会看到 Agent 先检索历史经验,再拆任务、评风险、自动推进低风险项、创建人工交接单,并输出最终报告——活脱脱一个有边界感、会复盘的"AI 项目助理"在屏幕里跑完整套流程。
生产环境中,这套东西要真敢上,还有几条规矩必须立:
- 所有高风险交接单进入工单系统,不能只活在日志里。
- 自动执行任务必须有审计日志,谁干的、干了什么、什么时候干的,可追溯。
- 长期记忆支持用户删除与导出——经验库是用户的资产,处置权得交还用户。
- 对外部动作配置白名单,没在白名单里的操作,Agent 再"能"也不许碰。
⚠️ 避坑:这几条看着像行政要求,其实条条都是血泪。交接单不进工单系统,人工就会漏处理;没有审计日志,出了事连谁都查不清;记忆不让删,不仅违规还埋雷;外部动作不设白名单,等于把家门钥匙挂门外。自主权越大的 Agent,这几条越不是可选项。
12.7 回头看:学到了什么
自主任务规划 Agent 是本书十个项目的集大成。它把前面练过的所有本事,一股脑儿串成了一条完整的能力链:
| 能力 | 在本章中的体现 |
|---|---|
| Prompt | 流程约束型 System Prompt |
| Tool | 六个任务规划工具 |
| Harness | create_agent 内部循环 |
| 记忆 | 历史经验检索与沉淀 |
| 安全 | 高风险任务人工交接 |
| 反思 | 任务结束后复盘写入经验库 |
💡 诚实交代一句:本章是单个自主 Agent 加上"Agent↔人工"的交接协作,
capabilities = ["Planning", "Reflection", "Memory", "Tool", "Autonomy"]里没有 Multi-Agent。这里的"协作",指的是 Agent 懂得把干不了的事交回给人,而不是多个 Agent 之间的群体协同。真正的多 Agent 编队,请看第 9、10 章的内容创作与研究分析平台。把"自主"和"多智能体"分清楚,才不会高估了它的能力边界。
至此,十个项目的核心实战全部完成。从第一章那个只会回答问题的单兵,到今天这个能拆目标、判风险、懂交接、会复盘、还长记性的自主 Agent——这条"从单兵到团队、从工具到队友"的主线,已经走完最关键的一程。后续章节将回到工程层面,进一步讲统一前端管理台和生产级最佳实践。
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !