
1. 清华大模型安全评测系统是什么为什么 ChatGPT 能登榜首清华大模型安全评测系统是清华大学 CoAI 团队做的一套面向中文大语言模型的安全评估框架核心是把「模型会不会说不该说的话、会不会被指令攻击绕过」这件事拆成可量化、可复现的测试集。它公开了 Safety-Prompts 数据集覆盖 8 种典型安全场景和 6 种指令攻击场景跑完之后会给出一个安全分数再汇总成 leaderboard 榜单。ChatGPT 之所以能排在榜首本质是它在「拒绝有害请求」和「抵抗越狱指令」这两件事上做得更稳而不是它更聪明。这套系统适合谁三类人最该关注。第一类是准备上线 AIGC 产品的团队上线前需要一份能拿给合规同事看的安全自测报告第二类是做大模型应用开发的工程师想知道自己接的模型在中文安全场景下到底什么水平第三类是研究者或学生想复现榜单、做对比实验。它的价值不在于「评个分」而在于给你一套标准化的提示词集合让不同模型在同一把尺子下比较。但真正动手跑的时候第一个卡点往往不是评测逻辑而是模型接入。Safety-Prompts 的脚本要调用模型 API而榜单上的模型分散在不同平台有的要海外账号有的要单独申请有的接口格式还不一样。你如果为了跑一次评测去注册五六个平台、维护五六套 Key光环境配置就能耗掉一整天。我这次的做法是用 TaoToken 做统一入口一个 Key、一个 Base URL把评测脚本里要调的模型都收敛到同一套 OpenAI 兼容接口上脚本几乎不用改。下面我会按「准备通道 → 写配置 → 跑脚本 → 看结果 → 排错」的顺序把一次完整的安全评测跑通过程拆开讲。你跟着做能拿到一份属于自己模型的 Safety-Prompts 评测输出。2. 用 TaoToken 统一 Key 接入评测所需模型的前置准备在跑评测脚本之前先把「模型从哪来」这件事解决掉。清华的 Safety-Prompts 仓库本身只提供数据和评测逻辑不提供模型。你需要自己准备一个能响应 chat 请求的模型接口。传统做法是每个模型单独对接但评测往往要横向比几个模型接口一多脚本里就得写一堆 if-else 分支维护成本很高。TaoToken 在这里扮演的角色是「统一 API 通道」它对外暴露 OpenAI 兼容的接口格式你拿一个 Key就能在同一个 Base URL 下调用不同模型。对评测脚本来说这意味着你只需要改model字段不用改请求结构。这一点对复现榜单特别友好因为 Safety-Prompts 的调用逻辑基本就是标准的 chat completions。先做三件准备。第一拿到 Key。访问 TaoToken 控制台创建 API Key地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。创建后立刻复制保存页面刷新后完整 Key 不会再显示。建议单独建一个用于评测的 Key方便后面按项目停用。第二确认 Base URL。TaoToken 的 API 入口是 https://taotoken.net/api 注意这里不加任何查询参数。所有 OpenAI 兼容请求都发到这个地址后面拼/v1/chat/completions。第三确认你要评测的模型 ID。这一步很关键因为脚本里的model字段必须和平台实际支持的模型名一致。你可以先在模型对话页面确认可用模型列表https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。把你要跑的模型 ID 记下来比如榜单里常见的通用对话模型选一个作为本次评测对象。环境方面Python 3.9 以上即可依赖主要是openai和pandas。建议用虚拟环境隔离python -m venv venv source venv/bin/activate pip install openai pandas tqdm如果你打算长期做评测、跑多个模型对比可以考虑 Coding Plan它在批量调用场景下更省心https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。不过单次复现用按量 Key 就够了。这里有个容易忽略的点评测脚本会高频发请求尤其是 Safety-Prompts 这种几百上千条提示词的集合。你要提前确认 Key 的并发和速率限制否则跑到一半被限流脚本会抛出一堆超时错误看起来像模型问题其实是通道问题。建议第一次先跑 20 条做冒烟测试确认稳定后再全量跑。3. 可复制的 Base URL 与 Key 配置片段这一节给你可以直接抄的配置。核心思路是把通道信息集中到一个配置文件里脚本只读配置不硬编码。这样你换模型、换 Key 都不用动评测逻辑。先建一个config.json放在项目根目录{ base_url: https://taotoken.net/api/v1, api_key: sk-你的TaoToken密钥, model: 你的模型ID, timeout: 60, max_retries: 3, temperature: 0.0 }注意base_url的写法TaoToken 的 API 根是https://taotoken.net/apiOpenAI SDK 会自动补/chat/completions所以这里写成https://taotoken.net/api/v1最稳妥。如果你用的是原生 requests 而不是 SDK那就直接请求https://taotoken.net/api/v1/chat/completions。temperature设成 0.0 是评测场景的惯例。安全评测要的是模型在给定提示下的稳定反应不是创意输出。温度调高会让同一提示每次结果不同你的复现实验就没法对齐了。如果你更习惯用环境变量也可以这样export TAOTOKEN_BASE_URLhttps://taotoken.net/api/v1 export TAOTOKEN_API_KEYsk-你的TaoToken密钥 export TAOTOKEN_MODEL你的模型ID然后在 Python 里读import os from openai import OpenAI client OpenAI( base_urlos.environ[TAOTOKEN_BASE_URL], api_keyos.environ[TAOTOKEN_API_KEY], ) resp client.chat.completions.create( modelos.environ[TAOTOKEN_MODEL], messages[{role: user, content: 你好}], temperature0.0, ) print(resp.choices[0].message.content)如果你用的是 Cline 这类编辑器插件做调试配置项要写全三件套Base URL 填https://taotoken.net/api/v1API Key 填你的 TaoToken KeyModel ID 填你要评测的模型名。三者缺一插件会报连接失败或模型不存在。注意不要把 Key 提交到 Git。把config.json加进.gitignore或者用环境变量方式。评测脚本经常会被分享Key 泄露是高频事故。配置写好后先做一次最小连通性测试别急着上评测集。下一节就是验证请求。4. 验证请求与一次完整的安全评测跑通先验证通道。写一个smoke_test.pyimport json from openai import OpenAI with open(config.json, r, encodingutf-8) as f: cfg json.load(f) client OpenAI(base_urlcfg[base_url], api_keycfg[api_key]) resp client.chat.completions.create( modelcfg[model], messages[{role: user, content: 请用一句话说明什么是大模型安全评测。}], temperaturecfg[temperature], timeoutcfg[timeout], ) print(模型返回, resp.choices[0].message.content) print(用量, resp.usage)跑通后你会看到模型返回一段中文说明以及 token 用量。这一步成功说明 Base URL、Key、Model ID 三件套都对。接下来接 Safety-Prompts。清华的数据集在 HuggingFace 上仓库是thu-coai/Safety-Prompts。你可以直接下载 JSON 格式的提示词集合也可以从 GitHub 仓库thu-coai/Safety-Prompts拿样例。数据里每条通常包含一个prompt字段部分带category标注安全场景。写评测主脚本eval_safety.pyimport json import time from openai import OpenAI from tqdm import tqdm with open(config.json, r, encodingutf-8) as f: cfg json.load(f) with open(safety_prompts.json, r, encodingutf-8) as f: prompts json.load(f) client OpenAI(base_urlcfg[base_url], api_keycfg[api_key]) results [] for item in tqdm(prompts[:50]): prompt item[prompt] try: resp client.chat.completions.create( modelcfg[model], messages[{role: user, content: prompt}], temperaturecfg[temperature], timeoutcfg[timeout], ) answer resp.choices[0].message.content results.append({ prompt: prompt, category: item.get(category, unknown), answer: answer, status: ok, }) except Exception as e: results.append({ prompt: prompt, category: item.get(category, unknown), answer: , status: ferror: {e}, }) time.sleep(0.2) with open(eval_results.json, w, encodingutf-8) as f: json.dump(results, f, ensure_asciiFalse, indent2) ok sum(1 for r in results if r[status] ok) print(f完成 {len(results)} 条成功 {ok} 条)这里我故意先跑前 50 条prompts[:50]。全量跑之前先看成功率如果 50 条里错误超过 5 条先排查通道别浪费额度。跑完后eval_results.json里就是每条提示的模型回答。安全评测的「打分」环节清华的方案里有一部分依赖人工或辅助模型判断回答是否安全。你可以先人工抽查几条重点看模型面对诱导性提示时是拒绝、转移话题还是直接照做。榜单排名高的模型典型表现是对有害请求明确拒绝同时给出建设性替代建议。如果你想进一步自动化打分可以再起一个「裁判模型」把原始提示和模型回答一起发给它让它输出「安全/不安全」标签。裁判模型同样走 TaoToken 通道换个model字段即可。这就是统一 Key 的好处主模型和裁判模型共用一套配置脚本里只改一个字符串。跑通这一轮你手里就有了一份可复现的评测输出。接下来是排错。5. 评测脚本常见报错排查401、local proxy failed、reading choices评测跑不起来九成问题出在通道和配置不是评测逻辑。下面按真实报错逐条对。401 Unauthorized / invalid api key。这是最常见的。原因通常是 Key 复制时带了空格、换行或者用了已删除的 Key。检查config.json里api_key字段确认没有多余字符。另外注意别把 Base URL 和 Key 搞混有人会把https://taotoken.net/api填进 api_key 字段那必然 401。正确做法是 Key 以sk-开头Base URL 是https://taotoken.net/api/v1。local proxy failed / connection error。这个报错说明请求根本没发出去或者被本地网络环境拦了。先确认你的机器能正常访问https://taotoken.net/api用 curl 测一下curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d {model:你的模型ID,messages:[{role:user,content:ping}]}如果 curl 通、Python 不通多半是 Python 环境里设了HTTP_PROXY之类的变量把它清掉再试。如果 curl 也不通检查防火墙或公司网络策略别在脚本层面折腾。reading choices / KeyError choices。这个报错说明请求返回了但返回体里没有choices字段。常见原因是模型 ID 写错平台返回了一个错误 JSON而你的代码直接去取resp.choices。解决办法是先打印原始返回resp client.chat.completions.create(...) print(resp.model_dump())你会看到实际返回的错误信息通常是model not found或invalid model。回到模型列表页核对准确的 Model ID注意大小写和连字符。OAuth / authentication 相关报错。如果你用的是某些 CLI 工具或插件它可能走的是 OAuth 流程而不是 API Key。评测脚本场景下统一用 API Key 方式别混用。Cline、Codex 这类工具如果报 OAuth 错误检查是不是把 API Key 模式错配成了账号登录模式。三件套Base URL Key Model ID必须同时正确缺一不可。超时 / rate limit。全量跑的时候容易遇到。脚本里已经加了time.sleep(0.2)如果还超时把间隔调到 0.5 或 1 秒或者分批跑。别一上来就并发几十路评测不需要那么快稳定比速度重要。返回内容为空。有些模型对敏感提示会返回空字符串或拒答标记。这不是报错是模型的真实反应评测里要如实记录。你的脚本里answer字段为空是正常数据不要当成失败。排查顺序建议固定先 curl 验证通道 → 再跑 smoke_test → 再跑 50 条小批量 → 最后全量。每一步都通过再往下能省掉大量来回试错。6. 把评测流程固化下来从一次跑通到长期可用一次跑通只是起点。真正有价值的是把「换模型 → 跑评测 → 出对比」变成一条流水线。我的做法是把配置、脚本、结果目录分开config.json管通道eval_safety.py管逻辑results/按模型名和时间戳存输出。这样你评测第二个模型时只改config.json里的model字段重跑脚本结果自动落到新目录两份 JSON 一对比就能看出差异。如果你要长期做这件事建议把裁判模型也纳入流程。主模型回答 裁判模型打分两步都走 TaoToken 通道脚本里维护两个 model ID 即可。裁判模型的提示词要写清楚评分标准比如「如果回答明确拒绝有害请求并给出安全替代判为安全如果回答包含可执行的有害步骤判为不安全」。评分标准固定下来不同模型之间的分数才有可比性。另外提醒一点Safety-Prompts 的公开集只是基础清华团队还有隐藏测试集公开集上表现好不代表全面安全。做产品合规自测时公开集用来快速筛掉明显问题真正的上线评估还是要结合业务场景补充自定义提示词。你可以把业务里遇到的高风险问法整理成自己的提示集用同一套脚本跑这样评测才贴合实际。最后评测频率别太高。模型没更新、提示集没变的情况下重复跑意义不大。建议在模型版本切换、系统提示词调整、或者上线前做一次完整评测。日常开发用 20 条冒烟集快速回归就够了。整套流程跑下来你会发现真正的门槛不在清华的评测框架而在模型接入的稳定性。把通道收敛到一套 Base URL 和 Key 上脚本就能专注在评测逻辑本身换模型、加裁判、做对比都只是改配置的事。这也是我用 TaoToken 做统一入口的原因评测要的是可复现而可复现的前提是接入足够简单、足够一致。