人工核对:把审批绑定到具体操作
正在读取学习记录…
1. 人工介入发生在什么位置
人工介入是让任务在关键位置暂停,由人补充信息、批准操作或处理异常。常见位置包括金额较大的写入、权限不足、资料冲突、连续失败、执行结果未知。
例如Agent准备给订单退款100元,先生成提案,展示对象、金额和依据。人批准后,程序检查批准记录是否仍对应当前提案,再执行。
在工具权限中,Alice的身份记录保存“她是谁、属于哪个组织、允许什么操作”,笔记编号告诉程序“她要读哪篇笔记”。这里的退款提案保存“要处理哪个订单、退多少钱”,审批记录绑定这次具体操作。身份与操作分别保存,才能区分“有资格申请退款”与“这笔100元退款已获批准”。
可以把它理解成核对转账页面:确认时看见收款人和金额,改了金额就需要重新确认。人工参与也要有明确内容;只出现一个“同意”按钮,读者很难知道同意了哪次操作。
2. 检查原提案和修改后的提案
先在 PowerShell 创建并进入学习目录:
mkdir "F:\学习\l3-human" -Force
cd "F:\学习\l3-human"保存下面的文件后,在这个终端运行 dir 核对文件名,再执行本节给出的运行命令。
在新目录创建 human.py:
先在 PowerShell 创建并进入学习目录:
mkdir "F:\学习\l3-human" -Force
cd "F:\学习\l3-human"保存下面的文件后,在这个终端运行 dir 核对文件名,再执行本节给出的运行命令。
"""将人工审批绑定到本次操作的对象、金额和版本。"""
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)}))ls
python human.py输出:
{"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
"""检查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()python -m unittest test_human -v正常路径与改动后的边界都在测试中检查。若结果不同,先定位失败的断言,再回到对应的字段与分支。
5. 给人足够的信息,再保存恢复位置
| 暂停原因 | 应该展示 | 恢复方向 |
|---|---|---|
| 高风险写入 | 对象、动作、金额、依据 | 批准当前版本后执行 |
| 资料冲突 | 两份原文、来源与差异 | 选定依据或补资料 |
| 权限不足 | 目标资源和需要的权限 | 核对访问范围 |
| 连续失败 | 最近动作与错误类别 | 修复后恢复或取消 |
| 写入结果未知 | 请求编号与已知回执 | 先查结果,再决定后续 |
暂停前保存目标、当前步骤、已有结果和提案。恢复时读取这些记录,并重新检查预算、权限和审批有效期。这样等待十分钟后,可以继续尚未完成的步骤,同时确认当前条件仍然成立。
人工批准通过后,工具还要执行实际写入,并回读确认结果。批准解决的是“允许做这次操作”,回执解决的是“操作得到什么结果”。这两个记录分别存储,页面才能显示“等待审批”“执行中”“已确认结果”。
涉及长时间等待时,持久化保存比一直占用网络连接更适合。应用程序返回待审批任务编号,后台等待事件,再恢复执行。LangGraph 人工介入文档介绍暂停与恢复的框架方式。
从提案到实际执行,逐段核对
| 阶段 | 保存什么 | 谁决定继续 |
|---|---|---|
| 生成提案 | 对象、动作、金额、版本 | 应用检查字段 |
| 展示待批准操作 | 提案与依据 | 有权限的审批者 |
| 读取批准 | 批准值与绑定字段 | 程序比较当前提案 |
| 执行 | 工具请求与操作键 | 业务服务 |
| 回查 | 回执和最终状态 | 应用确认结果 |
示例ready只表示字段绑定通过。下一函数才发出业务请求。写入后若回执迟迟未返回,状态可转为结果待确认,沿原操作键回查,而不是继续发新的退款。
审批还需要有效期。比如批准后等了很久,政策或金额改变,可以增加版本或要求重新核对。审批者权限也要在批准入口验证,普通用户的文本确认与管理员批准具有不同的业务含义。
人工等待通常应释放本次网络请求,把任务编号返回界面,状态和提案持久化。批准事件到达后,恢复到尚未完成的动作,核对当前权限与预算,再执行。这样等待较长时间也能保持上下文清楚。
回顾与下一步
明确暂停原因,展示具体操作,绑定审批版本,保存恢复位置。最后读 可观察轨迹,把整次任务串成可回查的过程。
课后练习展开习题收起习题
正在读取本地记录…
不调用模型,不执行代码。简答、代码和场景题仅保存答案并展示自查标准,不生成评分、徽章或认证。输入内容不会自动保存,请点击提交;不要填写个人信息或密钥。
选择题 · 先判断边界
关于“何时转人工与停止自治”,哪种做法更稳妥?
对应知识点:L3-human
简答题 · 解释失败
写出一个失败输入并说明记录字段。
对应知识点:L3-human
代码题 · 边界测试
补充正常、边界、失败三组输入和预期结果。
对应知识点:L3-human
场景题 · 结果未知
证据不足时如何设计状态和人工接管?
对应知识点:L3-human
描述会发送给本站维护者,用于修订文章,保存90天。请只填写文章问题,省略个人信息、密钥和内部资料。