AgentDepthAgent 工程学习指南
输入概念或问题,检索正文和待编写目录。
第一次学习?从 L0 总览开始 →

人工核对:把审批绑定到具体操作

我的学习 →

正在读取学习记录…

1. 人工介入发生在什么位置

人工介入是让任务在关键位置暂停,由人补充信息、批准操作或处理异常。常见位置包括金额较大的写入、权限不足、资料冲突、连续失败、执行结果未知。

例如Agent准备给订单退款100元,先生成提案,展示对象、金额和依据。人批准后,程序检查批准记录是否仍对应当前提案,再执行。

在工具权限中,Alice的身份记录保存“她是谁、属于哪个组织、允许什么操作”,笔记编号告诉程序“她要读哪篇笔记”。这里的退款提案保存“要处理哪个订单、退多少钱”,审批记录绑定这次具体操作。身份与操作分别保存,才能区分“有资格申请退款”与“这笔100元退款已获批准”。

提案编号r1金额100版本2进入审批;字段一致可继续,金额改为200时重新核对
批准绑定到当前提案编号、金额和版本。提案改变后,进入再次核对。

可以把它理解成核对转账页面:确认时看见收款人和金额,改了金额就需要重新确认。人工参与也要有明确内容;只出现一个“同意”按钮,读者很难知道同意了哪次操作。

2. 检查原提案和修改后的提案

先在 PowerShell 创建并进入学习目录:

Bash
mkdir "F:\学习\l3-human" -Force
cd "F:\学习\l3-human"

保存下面的文件后,在这个终端运行 dir 核对文件名,再执行本节给出的运行命令。

在新目录创建 human.py:

先在 PowerShell 创建并进入学习目录:

Bash
mkdir "F:\学习\l3-human" -Force
cd "F:\学习\l3-human"

保存下面的文件后,在这个终端运行 dir 核对文件名,再执行本节给出的运行命令。

Python
"""将人工审批绑定到本次操作的对象、金额和版本。"""
import json

def approve(proposal, approval):
    if type(approval.get("approved")) is not bool:
        raise ValueError("批准字段须为布尔值")
    if not approval.get("approved"):
        return "cancelled"
    # 审批记录逐字段绑定操作;改了金额或版本,就再次请求核对。
    same = (
        approval.get("proposal_id") == proposal["id"]
        and approval.get("amount") == proposal["amount"]
        and approval.get("version") == proposal["version"]
    )
    return "ready" if same else "needs_review"

if __name__ == "__main__":
    proposal = {"id": "r1", "amount": 100, "version": 2}
    approval = {"proposal_id": "r1", "amount": 100, "version": 2, "approved": True}
    print(json.dumps({"original": approve(proposal, approval)}))
    changed = {**proposal, "amount": 200}
    print(json.dumps({"changed": approve(changed, approval)}))
Bash
ls
python human.py

输出:

TXT
{"original": "ready"}
{"changed": "needs_review"}

proposal 保存提案编号、金额和版本,approval 保存对应批准。proposal.id='r1' 表示这份退款提案的编号,批准中的 proposal_id 指向它。原提案的三个字段与批准一致,返回 ready。金额改成200,原批准仍为100,返回 needs_review。

approved 使用布尔值 True 或 False,程序先检查类型;字符串 "False" 会返回字段错误,便于定位错误输入。

version 是提案修订编号。每次修改关键信息就增加版本,审批针对具体版本记录。除了金额,还可绑定动作名称、资源编号、收款方、有效期和操作者。

3. 修改批准字段,观察执行分支

把 approved 改为 False,两次结果都变为 cancelled。恢复后,只把提案版本改为3,结果为 needs_review。接着将批准版本也改为3,保持对象和金额相同,原提案路径可以继续。

每次保存后运行 python human.py。结束后恢复提案与批准的version为2、approved为True,再运行核对ready与needs_review两行。示例以是否批准和字段匹配来决定状态。实际系统还应校验审批者的身份与权限,记录审批时间,并在执行前重新确认提案尚未变化。

4. 用测试保存判断规则

在同目录创建 test_human.py:

下面的测试检查审批是否绑定当前提案编号、金额和版本,以及提案变化后是否重新确认。

测试代码:test_human.py
Python
"""检查human示例的正常路径和边界结果。"""
import unittest
from human import approve
class Tests(unittest.TestCase):
    def test_bound(self):
        p={"id":"r1","amount":100,"version":2}
        a={"proposal_id":"r1","amount":100,"version":2,"approved":True}
        self.assertEqual(approve(p,a),"ready")
        self.assertEqual(approve({**p,"amount":200},a),"needs_review")
    def test_rejected(self): self.assertEqual(approve({"id":"r1","amount":100,"version":2},{"approved":False}),"cancelled")
    def test_string_flag(self):
        p={"id":"r1","amount":100,"version":2}
        a={"proposal_id":"r1","amount":100,"version":2,"approved":"False"}
        with self.assertRaises(ValueError): approve(p,a)

if __name__ == "__main__":
    unittest.main()
Bash
python -m unittest test_human -v

正常路径与改动后的边界都在测试中检查。若结果不同,先定位失败的断言,再回到对应的字段与分支。

5. 给人足够的信息,再保存恢复位置

暂停原因应该展示恢复方向
高风险写入对象、动作、金额、依据批准当前版本后执行
资料冲突两份原文、来源与差异选定依据或补资料
权限不足目标资源和需要的权限核对访问范围
连续失败最近动作与错误类别修复后恢复或取消
写入结果未知请求编号与已知回执先查结果,再决定后续

暂停前保存目标、当前步骤、已有结果和提案。恢复时读取这些记录,并重新检查预算、权限和审批有效期。这样等待十分钟后,可以继续尚未完成的步骤,同时确认当前条件仍然成立。

人工批准通过后,工具还要执行实际写入,并回读确认结果。批准解决的是“允许做这次操作”,回执解决的是“操作得到什么结果”。这两个记录分别存储,页面才能显示“等待审批”“执行中”“已确认结果”。

涉及长时间等待时,持久化保存比一直占用网络连接更适合。应用程序返回待审批任务编号,后台等待事件,再恢复执行。LangGraph 人工介入文档介绍暂停与恢复的框架方式。

从提案到实际执行,逐段核对

阶段保存什么谁决定继续
生成提案对象、动作、金额、版本应用检查字段
展示待批准操作提案与依据有权限的审批者
读取批准批准值与绑定字段程序比较当前提案
执行工具请求与操作键业务服务
回查回执和最终状态应用确认结果

示例ready只表示字段绑定通过。下一函数才发出业务请求。写入后若回执迟迟未返回,状态可转为结果待确认,沿原操作键回查,而不是继续发新的退款。

审批还需要有效期。比如批准后等了很久,政策或金额改变,可以增加版本或要求重新核对。审批者权限也要在批准入口验证,普通用户的文本确认与管理员批准具有不同的业务含义。

人工等待通常应释放本次网络请求,把任务编号返回界面,状态和提案持久化。批准事件到达后,恢复到尚未完成的动作,核对当前权限与预算,再执行。这样等待较长时间也能保持上下文清楚。

回顾与下一步

明确暂停原因,展示具体操作,绑定审批版本,保存恢复位置。最后读 可观察轨迹,把整次任务串成可回查的过程。

课后练习展开习题收起习题

4 道练习 · 客观题规则评分 · 其余题目待批改

正在读取本地记录…

不调用模型,不执行代码。简答、代码和场景题仅保存答案并展示自查标准,不生成评分、徽章或认证。输入内容不会自动保存,请点击提交;不要填写个人信息或密钥。

练习 1 / 4 · v1.0.1

选择题 · 先判断边界

关于“何时转人工与停止自治”,哪种做法更稳妥?

对应知识点:L3-human

选择一个答案
练习 2 / 4 · v1.0.0

简答题 · 解释失败

写出一个失败输入并说明记录字段。

对应知识点:L3-human

练习 3 / 4 · v1.0.0

代码题 · 边界测试

补充正常、边界、失败三组输入和预期结果。

对应知识点:L3-human

练习 4 / 4 · v1.0.0

场景题 · 结果未知

证据不足时如何设计状态和人工接管?

对应知识点:L3-human

图片查看器
100%

文章配图 · 按 Esc 关闭