Skip to content

如何验证模型真伪

在中转/代理 API 市场,「实际提供的模型与标称不符」(模型替换、静默降级)是行业层面普遍被讨论的风险——这不针对任何特定平台,而是所有中转用户都应具备的基本核查意识。

本页给出你可以自己动手执行的验证方法。我们不替你下结论:本页不包含 Shuro 的验证结果,也不构成对任何验证结果的承诺。

核心原则

不要依赖平台的自我声明(包括 Shuro 的)。用可复现的请求自己测,并保留请求/响应记录以便对比。

方法 1:核对模型目录(/v1/models

最基础的一步:确认你的 key 能看到的模型清单,与 支持的模型 页记载的 9 款一致。

bash
# OpenAI 协议
curl -sS 'https://shuro.vip/v1/models' \
  -H 'Authorization: Bearer <您的 API Key>' \
  | jq -r '.data[].id' | sort

# Anthropic 协议
curl -sS 'https://shuro.vip/v1/models' \
  -H 'x-api-key: <您的 API Key>' \
  -H 'anthropic-version: 2023-06-01' \
  | jq -r '.data[].id' | sort

同时确认响应体里回显的模型 ID 与你请求的一致:

bash
curl -sS -X POST 'https://shuro.vip/v1/messages' \
  -H 'content-type: application/json' \
  -H 'anthropic-version: 2023-06-01' \
  -H 'x-api-key: <您的 API Key>' \
  -d '{"model":"claude-haiku-4-5-20251001","max_tokens":20,"messages":[{"role":"user","content":"hi"}]}' \
  | jq '.model'

局限:目录和回显字段都是网关可控的元数据,一致 ≠ 后端真的是该模型。这只能排除最粗糙的问题(模型压根不存在、ID 被改写)。

方法 2:知识截止日期提问法

不同模型代际的训练数据截止时间(knowledge cutoff)不同。问一些只有较新 cutoff 才可能知道的事实性问题,观察模型是否知道 / 是否明确说「我的知识截止于 XXXX 年 XX 月」。

bash
curl -sS -X POST 'https://shuro.vip/v1/messages' \
  -H 'content-type: application/json' \
  -H 'anthropic-version: 2023-06-01' \
  -H 'x-api-key: <您的 API Key>' \
  -d '{
    "model": "claude-opus-4-8",
    "max_tokens": 200,
    "messages": [{"role":"user","content":"你的知识截止日期是什么时候?请直接回答,不要联网。"}]
  }' | jq -r '.content[0].text'

对同一问题分别问「标称的新模型」和「标称的旧/小模型」,cutoff 应有代际差异。

局限

  • 模型自报的 cutoff 不完全可靠(模型可能答错自己的 cutoff)
  • 网关若注入系统提示词,可能影响回答
  • 更可靠的变体:不问 cutoff 本身,而是问 cutoff 前后发生的具体公开事件,看模型「知道 A 但不知道 B」的边界落在哪个时间段

方法 3:上下文长度实测

Shuro 目录标注的上下文:Claude 全系 1M(haiku 为 200K)、gpt-5.5 1.1M、gpt-5.4 系列 400K。如果后端被换成小上下文模型,长输入会直接报错或被截断。

思路:构造一个超过「疑似替身模型」上下文、但在标称上下文以内的输入,在文首埋一个 needle(暗号),在文末要求复述:

python
# pip install anthropic
import anthropic

client = anthropic.Anthropic(
    base_url="https://shuro.vip",
    api_key="<您的 API Key>",
)

needle = "MAGIC-TOKEN-20260708"
# 约 30 万 token 量级的填充文本(超出 200K 级模型的上限)
filler = ("这是填充文本。" * 20) + "\n"
long_doc = f"记住这个暗号:{needle}\n" + filler * 12000

resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=100,
    messages=[{"role": "user", "content": long_doc + "\n请只输出文首的暗号。"}],
)
print(resp.content[0].text)       # 应包含 needle
print(resp.usage.input_tokens)    # 核对实际计入的输入 token 数

结果解读

  • 请求被接受、needle 复述正确、usage.input_tokens 与预期量级相符 → 上下文能力与标称相容
  • 报「context length exceeded」类错误且输入远低于标称上限 → 值得追问

成本注意

长上下文测试按输入 token 计费,一次 30 万 token 的请求即便打在低倍率模型上也有可观成本。建议:用最低倍率模型先测(如 claude-haiku-4-5-20251001 测 200K 档)、控制 max_tokens 输出上限、测一次留档即可,不要反复跑。费用构成见 计费说明

方法 4:用量对账

对比两套独立来源的 token 计数:

  1. 控制台侧:Shuro 控制台 → 「日志」→ 找到对应请求,记录其 prompt/completion token 数
  2. 客户端侧:SDK 响应中的 usage 字段(Anthropic:usage.input_tokens / output_tokens;OpenAI:usage.prompt_tokens / completion_tokens),或本地 tokenizer 的估算
bash
curl -sS -X POST 'https://shuro.vip/v1/chat/completions' \
  -H 'content-type: application/json' \
  -H 'Authorization: Bearer <您的 API Key>' \
  -d '{"model":"gpt-5.4-mini","max_tokens":50,"messages":[{"role":"user","content":"用一句话介绍 TCP"}]}' \
  | jq '.usage'

两边数字应当基本一致(tokenizer 差异可致小幅出入)。系统性、大比例的偏差——尤其是控制台计数持续显著高于客户端回报——是值得记录并追问的信号。倍率与计费口径见 计费说明

方法 5:行为特征横向对比(仅作辅助)

如果你同时有官方 API(或另一渠道)的访问权,可以用**相同的 prompt、相同参数(temperature=0 等)**分别请求,对比:

  • 输出风格、格式习惯(如 Markdown 结构、代码风格)
  • 拒答边界、安全策略措辞
  • 相同任务的错误模式

局限(很大):即使是同一模型,采样随机性、系统提示词差异、版本 snapshot 差异都会造成输出不同。这个方法主观性强,只能作为其他方法的辅助佐证,单独不构成任何结论。

免责与边界

请如实理解这些方法的效力

  • 上述每种方法都有局限,没有任何单一方法能 100% 证明或证伪后端模型身份;多方法交叉印证也只能提高置信度。
  • 本页是方法论指引,不包含 Shuro 平台的任何验证结果(我们没有替你做过这些测试),也不构成对验证结果的承诺或担保。
  • 验证结论对时间敏感:今天测过 ≠ 永远如此,重要生产用途建议定期抽测并留档。

相关页面

内容采用 CC BY-NC-ND 4.0 协议 · 禁止商业使用 / 禁止改编 / 禁止训练 AI 模型