多人多Agent防诈骗应用的踩坑实录
作者复盘在共享聊天室中构建家庭防诈骗系统的过程,涵盖 Agent 与普通代码的职责划分、计时、任务交接及真人协作。文章还讨论为何关键决策不能交给 AI,以及仅靠口头请求批准为何不足以保障安全。
AI 深度解读
家庭反诈最难的一步,可能不是识别一句骗术,而是让被隔离在通话里的老人及时得到外部帮助。作者做的 Parent Line 会在银行短信触发规则后通知家庭群,再由 AI 分派联系父母、报警、联系银行的任务。
这个项目值得看的地方,是作者把哪些事交给 AI、哪些事坚持留在代码里。他还在 Telegram 实测中撞上了两类危险故障:AI 冒充定时服务发出假警报,以及自动模式绕过人工批准。这些经验,比演示里的顺畅对话更有参考价值。
决定要不要报警,为什么先用规则
作者针对的是印度的「数字逮捕」诈骗:骗子冒充执法人员,通过视频通话控制受害者,要求转账并禁止联系家人。原文援引报道,称印度内政部披露的 2026 年八个月相关投诉超过 21,900 起,涉案金额超过 ₹647 crore。
Parent Line 的选择是通知家人。银行确认电话仍然打给正被骗子指导的受害者,家庭群则能引入外部判断。
但「半夜要不要叫醒全家」没有交给模型。Bank watch 使用仅依赖标准库的 Python,检查超出家庭限额、陌生收款人、提前支取定期存款、贷款、短时间连续扣款和深夜扣款等规则。
作者要求,23:40 向新收款人支付 ₹4.8 lakh,应当稳定触发报警;向日常杂货店支付 ₹450,则不产生消息。未触发的短信也不会交给 AI。
需要稳定复现的触发条件,先写成能测试的代码。
这同时减少模型调用和日常消费信息暴露。不过,当前解析器只支持 SBI 和一种通用短信格式。增加银行需要增加解析器及测试,格式不认识就可能漏报。
报警还附带申报日期。作者按 RBI 2017 年客户责任通函中的三个工作日窗口设计了下面的计算:
def report_by(at: datetime) -> date:
# 简化处理:除周日外都计为工作日;银行假日
# 只会让真实截止日更晚,因此这里的日期不会太迟。
day, counted = at.date(), 0
while counted < 3:
day += timedelta(days=1)
if day.weekday() != 6:
counted += 1
return day
关键是 day.weekday() != 6:代码只排除周日,没有维护银行假日日历。按作者采用的计算前提,提醒会偏早,不会因遗漏假日而偏晚。但这段代码只解决日期计算,不能据此判断某笔损失必然符合免责条件,原文没有展开适用条件。
AI 接手的是报警之后的语言工作:分派任务、记录认领情况、追问遗漏事项,以及起草投诉。
让服务和 AI 同群,能省掉多少连接代码
作者最初考虑过 Telegram bot 加 LLM API,但共享历史、消息路由、代理交接、人工批准和渠道桥接都得自己做。Switch 已经提供了这些能力,Telegram 群可以桥接为一个房间,人和代理读取同一段对话。

这里的「代理」不一定运行模型。Bank watch 有身份、凭据和房间成员资格,但它只是普通程序。在 Switch Console 创建 bank-watch 后,通过 !invite-agent @bank-watch 邀请入群,再调用 POST /agents/{id}/message 发消息即可。报警末尾写上 @guardian over to you.,由 Switch 路由给 Guardian。
提示词也进入版本管理:bankwatch setup 根据 family.toml 填入家人、备用邻居和银行信息,再通过 agent.op("update_room", {"room_id": config.room_id, "instructions": instructions}) 更新房间指令。
真实聊天软件反过来约束了提示词:Telegram 中不用表格和标题,每行一个意思、最多 8 行,固定使用 🚨、✅、⏳、❌ 表示状态。家人回复要以 @guardian 开头,因为代理默认只接收发给自己的消息;follow_the_conversation 功能标志可以放宽这一点,但默认关闭。
Guardian 负责当下的人员协调,Clerk 负责持续几天的材料和申报。交接直接在群里发送 @clerk please open a case,家人能看到,也能纠正。Clerk 用 create_room_document 为事件建档,起草 1930 热线投诉和银行信函;截止日当天,由 Bank watch 提醒 @clerk 索要银行投诉编号。
作者的一次 Telegram 实测中,Guardian 在报警后 5 秒回复,Clerk 在 28 秒后更新档案;无人认领时,3 分钟出现追问;发送 @guardian I'll take 1 后,2 秒更新任务列表。这证明流程跑通过,尚不能证明真实家庭能及时响应。
定时与发布,为什么不能只靠提示词
Ride watch 用来处理夜间独自乘车。用户发送 @ride-watch 25 min 和行程信息;预计到达时间过后 10 分钟仍未回复 reached,服务先询问,再等 5 分钟无回应才通知家人。
这里必须有外部计时器。作者使用 GET /agents/{id}/events 长轮询读取事件,调用 agent.events(25),并另外运行 30 秒周期检查。对这种由消息驱动的代理,「一直没人回复」不会自动变成一条唤醒消息。
司机截图也延后处理:Ride watch 只保存附件的 mxc 标识;报警后,Guardian 使用 Claude 和 download_attachment 下载、读取车牌及司机信息。安全到达的行程不需要模型看图。
实测却出现了提前报警。原因是服务只轮询事件,在 Switch Console 看来没有连接;Room watcher 收到对 @ride-watch 的提及时,启动了同名 Claude Code 会话。这个会话按自己的理解,发出了假警报。
修复有三层:每 2 秒调用 POST /agents/{id}/connection/renew 续期,避免约 6 秒后被视为断连;在 Console 停止 Room watcher;再用指令要求误启动的 bank-watch、ride-watch AI 会话保持沉默。
另一个问题发生在公开发帖。第一版让 Clerk 通过 X API 发布,并依赖 Switch 批准卡和 Claude Code 权限等待人工允许。但实测时 Claude Code 开着 Auto mode,自身安全审查放行了命令,批准卡没有出现。
高风险操作的人工确认,要落在实际执行路径上。
第二版撤掉了代理的发布能力。xpost.py 拒绝包含手机号、邮箱、长账号式数字或超过 280 字符的草稿,再生成 x.com/intent/post 链接,让家人自己打开、阅读并点击 Post。

这比提示词里写「发布前请确认」更可靠,也免去了 X 开发者账号和发布 API 密钥。不过,格式检查不等于完整隐私审查,最后仍需要人读草稿。
我的判断
我赞同作者的职责划分:规则决定触发,程序负责时间,AI 处理语言和协调,公开发布交给人。假警报和批准失效都来自现场测试,也说明单元测试覆盖不到平台会话启动、聊天路由和执行权限的组合行为。
但这是黑客松原型,效果需要分层看。规则有测试、聊天流程实测成功,与诈骗损失减少是不同的结论。作者明确承认没有找到衡量家庭干预成功率的研究,也没有给出规则方案与 LLM 识别方案的准确率、漏报率对照。规则更适合这个项目的判断,目前主要是工程取舍。
Switch 省下了房间和路由设施,也引入了连接状态、Room watcher 等平台语义。简单通知机器人是否需要这套平台,原文没有成本对照。一个代理同时只能连接一个房间,面向父母的 Line 需要通过 connect_to_room 切到家庭房间报警,再切回去,也是需要理解的约束。
边界还包括:系统不能阻止转账;没有短信或解析失败就没有报警;Guardian 在完全无人发言时不能持续追问,外部提醒服务仍在路线图上。Line 计划支持 Hindi、English、Hinglish,并识别 AnyDesk、OTP 等可疑请求,但所需平台扩展尚未合入,因此属于可选部分。
能拿来做什么
- 做聊天式 AI 应用时,先把金额阈值、日期、超时和状态转换从提示词中抽出来,用 Python 或 Node 服务实现;让模型解释状态、协调人员。
- 多代理协作时,把交接写进人能看到的对话,并验证默认路由规则。用户没有提及代理时,代理是否收到消息,会直接影响任务能否继续。
- 涉及公开发布时,参考草稿加人工提交的设计,同时检查实际运行模式能否绕过批准。测试要覆盖真实客户端、断连和自动会话启动。
- 想复现核心规则,可以在 Python 3.11+ 环境执行下面两条命令;
check.py会检查配置、58 个单元测试和示例报警,用 OK、NOTE、FAIL 输出结果,并为 FAIL 给出修复方法。作者称完整 Telegram 与 Switch Console 流程约需 20 分钟。
git clone https://github.com/prx-my/parent-line && cd parent-line
python3 check.py