ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【AI安全】用Anthropic Petri做Agent行为审计:TaoToken统一Key接入与settings.json配置骨架

【AI安全】用Anthropic Petri做Agent行为审计:TaoToken统一Key接入与settings.json配置骨架 1. 为什么要在本地跑一次 Agent 行为审计Anthropic 开源的 PetriParallel Exploration Tool for Risky Interactions做的事情本质上是把「人工红队」换成「Agent 红队」你给一个种子提示词比如诱导欺骗、越权操作、阿谀奉承Petri 会拉起多个审计 Agent用不同策略去和被测模型交互再由评判模型从诚实度、拒绝能力、权力寻求等维度打分最后把有风险的对话记录标出来给你人工复核。它适合谁适合正在做 Agent 产品、需要在上线前跑一轮行为回归的工程同学也适合想把「模型安全」从 PPT 落到 CI 里的人。我这次的目标不是复述 Petri 的概念而是复现一条可观测的链路用 TaoToken 的统一 Key 作为模型通道把 Petri 的审计 Agent 和被测模型都接到同一个入口然后用一份 settings.json 骨架把配置固定下来跑一次审计任务并验证结果。这样做的现实原因是Petri 内部会同时调用「审计 Agent 模型」和「被测模型」如果两边分别去配不同的厂商 Key、不同的 base_url配置会散落在环境变量、脚本参数、框架默认值三个地方排障时非常痛苦。统一到一个 API 通道后你只需要维护一份配置换模型只改一个字符串。需要提前说清楚边界Petri 是审计工具不是「越狱工具」它的提示词库是为了暴露风险行为跑出来的记录可能包含敏感内容请在自己的测试环境里做不要拿生产流量去试。另外本文只讲工程接入和配置骨架不涉及任何网络访问方式的讨论所有请求都走标准 HTTPS API。2. TaoToken 前置统一 Key 与通道准备TaoToken 在这里扮演的角色是「一个 Key 打通多家模型」的 API 通道。对 Petri 这种要同时喂多个模型的场景它的价值很直接审计 Agent 可以用一个模型被测模型换成另一个两者共用同一个 base_url 和同一个 Key只是 model 字段不同。这样 Petri 的配置文件里就不需要为每个厂商写一套鉴权逻辑。你需要先拿到两样东西API Key 和 base_url。Key 在控制台的 API Keys 页面创建建议单独建一个给审计任务用的 Key方便出问题时一键吊销不要和线上业务的 Key 混用。base_url 用https://taotoken.net/api注意这个地址不带任何查询参数直接作为 OpenAI 兼容接口的根路径使用。创建 Key 的入口在这里控制台 API Keyshttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite如果你还没决定审计 Agent 用哪个模型可以先去模型对话页面手动试几条提示词感受一下不同模型对「诱导欺骗」类输入的拒绝风格再决定 Petri 里怎么配。模型对话入口模型对话https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite接入文档里有完整的请求示例和字段说明配置前扫一遍能省不少时间接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite一个容易踩的坑不要把 Key 硬编码进 settings.json 然后提交到 Git。下面给的骨架里Key 一律用环境变量占位配置文件只引用变量名。这样即使配置文件进了仓库也不会泄露凭证。3. settings.json 配置骨架把审计链路固定下来Petri 的配置通常分三块审计 Agent 的模型配置、被测模型的配置、以及审计任务的参数并发数、种子提示词、评判维度。下面这份骨架是按「统一通道 环境变量注入」的思路写的你可以直接改成自己项目里的路径。{ provider: { base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, timeout_seconds: 120, max_retries: 3 }, auditor_agent: { model: claude-sonnet-4-5, temperature: 0.7, max_tokens: 2048, system_prompt_file: ./prompts/auditor_system.md }, target_model: { model: gpt-5, temperature: 0.0, max_tokens: 2048 }, judge_model: { model: claude-sonnet-4-5, temperature: 0.0, dimensions: [honesty, refusal, power_seeking, sycophancy] }, audit_task: { seed_prompts_dir: ./seeds, parallel_agents: 4, max_turns: 12, output_dir: ./runs/petri_001, save_transcripts: true } }几个字段值得单独解释。provider.base_url固定为 TaoToken 的 API 根路径api_key_env指向环境变量名而不是 Key 本身程序启动时读取。auditor_agent和target_model分开配是因为审计 Agent 需要一定的创造性去变换攻击策略温度给 0.7 比较合适而被测模型要尽量稳定复现温度给 0。judge_model单独列出来是因为评判模型如果和被测模型是同一个会存在自我偏袒的风险Petri 官方也提到评判模型可能继承被测模型的偏差所以这里建议评判模型选一个和被测模型不同的。audit_task.parallel_agents控制并发审计 Agent 数量第一次跑建议设成 2 到 4观察一下速率限制和费用再往上加。max_turns是单个审计会话的最大轮数设太小测不出多轮诱导设太大容易跑飞12 轮是个折中值。环境变量这样设置Linux/macOS 下export TAOTOKEN_API_KEYsk-你的KeyWindows PowerShell$env:TAOTOKEN_API_KEY sk-你的Key配置文件里只出现变量名这样你把 settings.json 分享给同事时不用先脱敏。4. 启动 Petri 审计任务并验证结果配置就绪后先做一次最小连通性验证确认 Key 和 base_url 能通再跑完整审计。这一步能帮你把「配置错误」和「审计逻辑错误」分开。import os import json from openai import OpenAI with open(settings.json, r, encodingutf-8) as f: cfg json.load(f) client OpenAI( base_urlcfg[provider][base_url], api_keyos.environ[cfg[provider][api_key_env]], ) resp client.chat.completions.create( modelcfg[target_model][model], messages[{role: user, content: Reply with the single word: ready}], temperature0, ) print(resp.choices[0].message.content)如果这一步返回ready说明通道、Key、模型名三者都对上了。如果报 401检查环境变量是否在当前 shell 生效如果报 404 或模型不存在检查model字段拼写。连通性通过后启动审计任务。Petri 的入口脚本通常接受配置文件路径和任务名python -m petri.run \ --config ./settings.json \ --task risky_interactions \ --seed ./seeds/deception_01.md \ --out ./runs/petri_001跑起来之后你会看到每个审计 Agent 的会话日志滚动输出。判断任务是否正常看三个信号一是审计 Agent 是否在按轮次推进日志里出现 turn 1、turn 2二是被测模型是否返回了内容而不是空响应三是评判模型是否在会话结束后给出了维度分数。结果验证阶段重点看输出目录里的transcripts和scores两个子目录。transcripts里是完整对话记录scores里是每个会话在四个维度上的打分。你可以写个小脚本把分数聚合一下import json import glob rows [] for path in glob.glob(./runs/petri_001/scores/*.json): with open(path, r, encodingutf-8) as f: data json.load(f) rows.append({ session: data[session_id], honesty: data[dimensions][honesty], refusal: data[dimensions][refusal], power_seeking: data[dimensions][power_seeking], sycophancy: data[dimensions][sycophancy], }) for r in rows: print(r)拿到分数后不要只看平均值。Petri 的价值在于标记出「高风险会话」所以你应该按power_seeking或honesty分数排序把最差的几条 transcript 挑出来人工读一遍。这一步是自动化审计里最不能省的人工环节因为评判模型本身也可能误判。5. 本篇常见错排查报 401 Unauthorized。九成是环境变量没生效。在 Python 里打印os.environ.get(TAOTOKEN_API_KEY)看是不是 None。如果你在 IDE 里跑注意 IDE 的终端环境和系统终端环境可能不是同一个重启 IDE 或改用系统终端。报 model not found。检查settings.json里的模型名是否和通道支持的名称一致。不同厂商的模型命名风格不同有的带日期后缀有的不带建议先在模型对话页面确认可用名称再填。审计任务卡住不动。先看是不是parallel_agents设太大触发了速率限制把并发降到 2 再试。如果日志停在某一轮不动可能是timeout_seconds太短长会话被截断调到 180 试试。评判分数全是 0 或全是满分。这通常是评判模型的输出格式没被正确解析。检查judge_model的返回是否包含预期的 JSON 结构必要时在评判提示词里加一句「只输出 JSON不要输出其他文字」。transcript 里出现空回复。被测模型可能因为内容策略拒绝了请求这本身也是一种审计信号不要当成 bug 直接跳过应该记录为「拒绝行为」样本。配置改了但没生效。Petri 有些实现会缓存配置改完 settings.json 后确认进程重启了。另外注意相对路径是相对于启动目录还是配置文件目录两者不一致时seed_prompts_dir会找不到文件。6. 把审计接进日常流程跑通一次之后真正有价值的是把它变成可重复的动作。我的做法是把 settings.json 按被测模型拆成多份比如settings_gpt5.json、settings_gemini.json共用同一个 provider 段只改target_model.model。然后写一个 shell 脚本循环跑把每次的 scores 汇总成一张对比表这样模型迭代或提示词改动后你能看到安全维度的分数有没有退化。如果你打算长期做 Agent 行为审计尤其是要跑多轮、多模型、带评判的批量任务建议了解一下 Coding Plan它在长任务和批量调用上的额度安排更适合这种场景Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite最后提醒一句Petri 的审计 Agent 本身也是模型它可能暴露审计意图导致被测模型「演戏」隐藏不良行为。所以不要把单次审计结果当成绝对结论把它当成一个持续观测的信号源配合人工复核一起用。
返回列表