前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
返回 AI 情报前线
All News · 全部资讯8611
  • MCP生态突破13000+服务器、mcp-hub工具解决发现难题
  • 开源AI栈:构建数据主权、无供应商锁定的私有基础设施
  • AI 漏洞检测有效性量化:1.3% 真实利用率
  • 人脸年龄验证的2年误差困局与设计陷阱
  • 自主 AI 公司39天实验:487M tokens、$1.1k成本、零收入
  • 语音 AI 的转身悖论:延长静音阈值反而更差
  • Claude Code 三大提效流程:规划-构建-修复
  • Agent 内存用向量存储的天花板:聚合查询失效
  • MoE 模型压缩魔法:2GB 内存跑 Gemma 26B 的权重共享方案
  • Herdr:编码代理多路复用器,像 tmux 一样管理并发 Agent
  • Claude Opus 5 一句话生成 3D 游戏,含物理和音乐
  • Claude Code 赋能容量规划:从被动应急到主动预测
  • 本地部署 16 块高端 GPU 运行开源大模型完整方案
  • 真 Agent vs 伪 Agent:金融自动化平台的量化对标与选型框架
  • 本周技术速览:K3 开源、MCP 无状态化、Agent Office CLI
  • Claude 红队测试突破 3 个组织隔离、上传恶意包到 PyPI
  • DeepSeek-V4-Flash 正式版 API 上线,性能媲美闭源模型
  • 用 MCP 把 AI Agent 变成运维工程师
  • METR 呼吁:每次 AI Agent 失控都应独立调查
  • Agent 流水线中的 Goodhart 陷阱:5 个作弊案例
  • AI Agent 发送短信前的人工审批设计模式
  • Lean 项目 CI 优化:41 分钟到 12 分钟的三轮实验
  • AI Agent 安全防护:模型提取与密钥泄露风险清单
  • 代码生成陷阱:格式匹配不等于执行成功
  • Agent 自主支付协议 x402 商用落地
  • 自托管 DeepSeek-V3:$8/月 vs Claude Opus 成本 1/180
  • DeepSeek V4-Flash:开源模型性能 Opus 级、成本 1/100
  • AI 生成应用审计清单:5 大维度常见缺陷与修复
  • NVIDIA开源Molt: PyTorch原生强化学习框架
  • Termexo: AI编程Agent会话管理工作台
  • 国产开源模型登顶全球调用量,程序员有了平价选择
  • Go+Rust构建本地离线AI助手: 安全架构深度指南
  • Python 和 TypeScript 生态新版图
  • CI中的自主代码审查与自动修复:Claude Code实战
  • MCP 工具服务搭建实战指南
  • Agent 工具成本优化:从隐形开销到 Tool Search
  • Agent DevOps 安全:暴露旧日权限管理漏洞
  • 从零构建 MCP 服务器:Agent 工具集成标准化指南
  • 长时任务 Agent 的持久化队列架构
  • Agent 平台从原型到生产的实战经验
  • 小规模 Agent 治理协议的实现范例
  • 微软生成式AI入门教程(21课)
  • Ollama本地AI:免费运行GPT级模型
  • 电商订单管理的5层Agent架构设计
  • 235 家公司联署:开源权重 AI 模型是竞争和安全基础
  • 7 月模型速览:GPT-5.6 与 Claude Opus 5 新特性汇总
  • Agent认知记忆8层架构设计与实现
  • 月费 6 美元自托管 Llama 2 完整指南
  • LLM 限流应对:系统优雅降级完整设计指南
  • 开源音频全能工具:集语音克隆、识别、翻译于一体
  • AI 猜测 vs 确定的三个识别信号
  • 已加载 51 / 8611
8.0
热点
AI SCORE
技术实践2026-08-02 15:10

AI Agent 发送短信前的人工审批设计模式

dev.to · AI#Agent安全#系统设计#风险管理
Editor brief · 编辑速览

短信缺乏撤回机制,AI Agent 的错误(错号码、模板变量破损、草稿泄露)会立即变成客户事件;论证在 API 调用前加人工审批关卡的必要性。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

一个能够给客户发短信的 AI Agent,也可能在凌晨两点把短信发给错误的客户,而且里面还带着失效的合并字段。只要在任何 SMS 发出前加入人工审批门禁,就能在发送前发现问题,而不是事后补救。

为什么 SMS 需要单独的审批门禁

Email 还有一段可以在对方阅读前删除的缓冲期,SMS 没有。它通常会在几秒内抵达手机并显示为通知——没有草稿箱,没有“撤回消息”,也没有垃圾邮件过滤器悄悄吞掉这个错误。如果你的 Agent 会起草预约提醒、物流更新或重新唤回用户的短信,那么一次糟糕的运行——从过期记录中取出了错误的电话号码、模板变量失效并被渲染成 {{first_name}}、原本用于内部 QA 的消息发给了真实客户——都会立刻演变成直接影响客户的事故。

Twilio、Vonage 以及类似的服务提供商,会毫不犹豫地发送你交给它们的任何字符串——它们不知道内容是否合理。这项检查必须发生在 API 调用之前,而且必须由人来完成,不能只是再写一个 prompt,让模型“自行复查”。

假设你为一家牙科诊所运行一个预约调度 Agent。它会读取明天的预约列表,为每位患者起草一条提醒短信,过去会直接调用 Twilio API。现在,它会先把每条草稿推送到 Impri,只有在前台接待人员批准后才发送:

import os
import time
import requests

IMPRI_KEY = os.environ["IMPRI_API_KEY"]
BASE = "https://api.impri.dev"
HEADERS = {"Authorization": f"Bearer {IMPRI_KEY}", "Content-Type": "application/json"}

def push_sms_for_approval(to_number, body):
    resp = requests.post(f"{BASE}/v1/actions", headers=HEADERS, json={
        "kind": "sms.send",
        "title": f"Reminder SMS to {to_number}",
        "preview": {"format": "plain", "body": body},
        "expires_in": 3600,          # stale reminder isn't worth sending after an hour
        "editable": ["preview.body"],
        "idempotent": False,         # resending would double-text the patient
    })
    resp.raise_for_status()
    return resp.json()["id"]

def wait_for_decision(action_id, poll_every=5):
    while True:
        resp = requests.get(f"{BASE}/v1/actions/{action_id}", headers=HEADERS)
        data = resp.json()
        if data["status"] != "pending":
            return data
        time.sleep(poll_every)

action_id = push_sms_for_approval("+15551234567", "Hi Sam, reminder: your cleaning is tomorrow at 2pm.")
decision = wait_for_decision(action_id)

if decision["status"] == "approved":
    final_body = decision["decision"]["final_preview"]["body"]
    # send via Twilio only after approval
    twilio_client.messages.create(to="+15551234567", from_=CLINIC_NUMBER, body=final_body)
    requests.post(f"{BASE}/v1/actions/{action_id}/result", headers=HEADERS,
                  json={"status": "executed"})

Twilio 调用只存在于 if approved 分支中,在代码库的其他任何地方都不存在——这才让它成为真正的审批门禁,而不是流于形式。如果 Agent、程序 Bug,或来自某个上游数据源的 prompt 注入指令,试图绕过审批直接调用 twilio_client.messages.create(...),它仍然需要 API key 和封装层,而这两者在该分支之外都无法访问。

前台接待人员会看到什么,以及 editable 为什么重要

设置 editable: ["preview.body"] 意味着收件箱中的审批卡片不只是提供批准或拒绝按钮——前台接待人员还可以在发送前修正错别字、调整语气或更正姓名,Impri 会通过 decision.final_preview.body 返回编辑后的文本。始终发送这个字段,绝不要发送原始的 preview.body;如果人工修改过消息,就不应该再把原始版本发出去。

这一点对于 SMS 来说比大多数渠道都更重要,因为你没有第二次澄清的机会。一封措辞别扭的 Email 还可以再发一封跟进邮件解释。但如果短信因为某个被自动纠正的单词,把“你的预约已确认”写成了“你的预约已取消”,困惑的患者就会直接打电话过来。

速率限制和批量运行

如果你的 Agent 在一次运行中处理全天的预约列表,它可能会在短时间内集中推送 40~50 个 action。POST /v1/actions 对每个 key 的限制是每分钟 60 次请求,足以轻松覆盖一家诊所的日常业务量——但如果你要把它用于规模更大的机构,例如连锁药店或拥有多个营业点的诊所,就应该错开推送时间,或者为每个营业点使用单独的 key,而不是用同一个 key 持续发起请求直至超过限制。

Impri 会保存起草好的消息、通知审核人员并等待审批决定——它不会读取消息内容,不知道怎样的措辞才符合你们诊所的语气,也不会代替你与 Twilio 通信。发送 SMS 仍然由你的 Agent 负责;Impri 负责确保在发送前确实有人批准。至于另外两种集成方式——使用 MCP tool call 代替原始 HTTP,以及通过配置 executor,确保在未经批准时确实无法访问凭证——请参阅主集成指南。

如果你希望审核人员直接从 Slack 批准,而不是使用 Web 收件箱,请参阅 Slack 审批。第一次使用 Impri?请从快速入门开始。

对于进一步的操作,你可以考虑屏蔽此人和/或举报滥用行为。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
Agent 流水线中的 Goodhart 陷阱:5 个作弊案例
下一篇
Lean 项目 CI 优化:41 分钟到 12 分钟的三轮实验