安全不是开关,是边界。AutoGen 给 Agent 装了"手"(函数调用),这手能干好事也能干坏事。这一节讲三条必须划清的边界:执行沙箱、数据脱敏、权限最小化。
UserProxyAgent 开了自动执行又不用沙箱,等于把机器操作权交给模型。任何有破坏力的代码(删文件、发请求、改配置)都可能被模型触发。生产必须用容器或受限环境隔离执行。
from autogen import UserProxyAgent # 用 docker 沙箱,执行完即弃,宿主机不被波及 executor = UserProxyAgent("exec", human_input_mode="NEVER", code_execution_config={"use_docker": "python:3.11-slim"}) # 即使模型生成了危险代码,也只在容器内生效,宿主机安全
对话历史里可能包含用户隐私(手机号、身份证)。进模型前脱敏,出模型后按需还原。我们建议用一个脱敏钩子,在发送前把敏感字段替换成占位。
import re def mask(text: str) -> str: text = re.sub(r"\d{11}", "[手机号]", text) # 手机号打码 text = re.sub(r"\d{17}[\dXx]", "[身份证]", text) # 身份证打码 return text # 在 register_reply 的发送前步骤里对 outgoing 消息脱敏 def mask_out(recipient, messages, sender, config): last = messages[-1] if isinstance(last, dict) and "content" in last: last["content"] = mask(str(last["content"])) return False, None # 这样敏感信息不会明文进模型
Agent 调用的函数只给它能做的最少权限。比如"查订单"的函数不该有"删订单"的能力。把危险操作拆成独立的、需人工确认的函数,而非混在一个万能函数里。
# 危险操作单独成函数,且要求人工确认(human_input_mode=TERMINATE) def delete_order(order_id: str) -> str: """删除订单,需人工在终端确认。""" # 真实删除逻辑 return f"订单 {order_id} 已删" # 不把它放进全自动 Agent 的 functions,只在需人拍板的 Agent 注册
涉及金融、医疗等强监管领域,每次 Agent 的决策和操作都要留痕,便于审计。利用 5.3 的日志把关键动作(尤其函数执行)持久化。
我们主张:能自动执行的无害函数放开,有破坏力的函数一律沙箱 + 人工确认。
进模型前脱敏,出模型后按映射还原,敏感原文不落模型日志。下面示意占位替换。
import re _vault = {} # 真实值映射,存在安全存储,不进模型 def mask_text(text: str) -> str: def repl(m): token = f"[ID{len(_vault)}]" _vault[token] = m.group(0) return token return re.sub(r"\d{11}", repl, text) def unmask(text: str) -> str: for token, real in _vault.items(): text = text.replace(token, real) return text # 模型全程只见 [ID0] 这类占位,原文在边界外还原
把函数按风险分级:只读类(查)自动执行;写类(增改)需 TERMINATE 人工确认;删类强制双确认且限白名单。分级后,自动执行的范围清晰,审计也简单——看日志里哪些函数被调用即可。
# 风险分级:不同函数挂不同 Agent read_only = ["query_sales", "fetch_user"] # 可自动 write_ops = ["update_order"] # 需人确认 # read_only 进全自动 Agent.functions,write_ops 进 TERMINATE Agent.functions
强监管领域,每次函数执行都要留痕。做法是把 5.3 的日志和"执行了哪个函数、参数、结果"绑定持久化。下面示意结构化记录。
import json, time def audit_log(func_name, args, result): row = {"t": time.strftime("%Y-%m-%d %H:%M:%S"), "func": func_name, "args": args, "result": str(result)[:200]} # 真实场景写入审计库,供监管调阅 print(json.dumps(row, ensure_ascii=False)) # 配合脱敏,敏感参数落库前先打码,既合规又安全
沙箱、脱敏、权限这些不是配一次就完事。模型升级可能改变生成代码的风险面,外部服务接口可能变。我们建议把安全检查也接进 6.4 的监控——异常率里包含"拦截次数",拦截突增说明有人在试探越权。安全是持续动作,不是上线开关。
docker 沙箱最稳但有启动开销,本地受限环境更轻量但隔离弱。我们按任务风险选:危险操作多就用 docker,只读低风险可轻量。没有放之四海皆准的方案,只有适配风险的取舍。
⚠️ 自动执行 + 无沙箱 + 高权限函数,三者叠加等于给模型你系统的完整控制权,高危。
💡 安全边界是"对话即编排"能不能上生产的及格线——手再灵,也得戴手套。