【Claude Code-System Prompt实测】请求前缀可观测性:token profile、prefix diff 与 cache miss 归因
非线智能API经验 [Claude Code-System Prompt实测] 第14篇
摘要
请求前缀可观测性的目标不是把完整 prompt 打进日志,而是回答四个工程问题:前缀到底多大,哪一段在变化,为什么缓存没有命中,观测过程中有没有泄露敏感内容。对 Claude Code 跨模型 gateway 来说,这一层和协议转换同样重要;没有可观测性,cache miss、role 400、工具描述膨胀和 MCP 抖动都会变成黑盒问题。
本文聚焦请求前缀可观测性。system prompt token 只是其中一类 segment;还需要统计 Claude Code 内置 prompt token 数、CLAUDE.md / project context token 数、工具定义 token 数、MCP 描述 token 数、cacheable prefix token 数、uncacheable dynamic token 数,以及每轮前缀变化 diff。
数据来源:非线智能Nonlinear 官网
Prefix Profile
每轮请求应生成一份结构化 profile:
{
"request_id": "req_...",
"provider": "vllm",
"model": "qwen3-coder",
"tokenizer": {
"provider": "vllm",
"model_id": "qwen3-coder",
"count_method": "provider_usage_or_local_estimate"
},
"tokens": {
"total_input": 48231,
"leaf_segments_sum": 48231,
"system_total": 12980,
"claude_code_builtin": 7210,
"project_context_total": 2840,
"claude_md": 1630,
"tools": 15440,
"mcp": 6150,
"task_state": 2760,
"live_window": 11051,
"dynamic_uncacheable": 20
},
"cache": {
"cacheable_prefix_tokens": 30270,
"uncacheable_dynamic_tokens": 20,
"stable_prefix_hmac": "hmac-sha256:...",
"changed_segments": ["live_window"],
"expected_hit": true,
"actual_hit": false,
"miss_reason": "dynamic_attribution_block"
},
"adapter": {
"role_rewrite_count": 1,
"stripped_attribution_blocks": 1,
"reserved_keyword_blocks": 0
}
}
注意这里使用 HMAC,而不是裸 SHA。生产环境中,固定 prompt、公开工具描述和常见 system prompt 可能被字典攻击反推;带环境 salt 的 HMAC 仍能在同一环境内比较变化,同时降低泄露风险。
token 分桶必须先定义口径。推荐用 leaf segment 作为成本归因基础,total_input 等于 leaf segment 之和;system_total 可以包含 claude_code_builtin 等子维度,但不能再与子维度重复相加;claude_md 通常是 project_context_total 的子集;live_window 包含最新用户消息、工具结果和错误反馈。跨 provider 比较时必须记录 tokenizer.provider、model_id 和 count_method,因为 Anthropic token counting、OpenAI-compatible tokenizer、vLLM / local tokenizer 的计数并不一定一致。
指标分组
| 指标 | 用途 |
|---|---|
prompt.total_tokens |
总输入成本 |
prompt.system_tokens |
系统级指令体积 |
prompt.claude_code_builtin_tokens |
平台固定成本 |
prompt.project_context_tokens |
项目上下文成本 |
prompt.claude_md_tokens |
项目规则成本 |
prompt.tools_tokens |
工具定义成本 |
prompt.mcp_tokens |
MCP 描述成本 |
prefix.cacheable_tokens |
可复用前缀规模 |
prefix.dynamic_tokens |
动态噪声规模 |
prefix.churn_ratio |
稳定前缀变化比例 |
cache.hit_rate |
实际缓存效果 |
cache.read_tokens / cache.write_tokens |
provider cache 收益 |
adapter.role_rewrite_count |
协议修正频率 |
adapter.stripped_attribution_blocks |
attribution 是否仍在出现 |
实现上应优先记录 segment_tokens[],再派生这些聚合指标。这样可以避免 system、project_context、CLAUDE.md 等父子维度重复计费。
Prefix diff 不应泄露原文
默认 diff 应只展示 segment 级变化:
{
"segment": "tools",
"before_hmac": "hmac:aaa",
"after_hmac": "hmac:bbb",
"token_delta": 840,
"change_type": "tool_added",
"metadata": {
"tool_name_hmac": "hmac:...",
"schema_hmac": "hmac:..."
}
}
不要默认记录:
• 完整 system prompt。
• 完整 CLAUDE.md。
• 用户 prompt 原文。
• 工具参数原文。
• API key、cookie、authorization header。
• 绝对路径和临时目录。
工具名、路径、MCP server 名也可能泄露内部能力。生产默认应是 hash_only / HMAC-only;名称类 metadata 只有在 allowlist 或本地 debug 模式下输出。本地 debug 可以短期启用脱敏片段,但必须有 TTL、访问控制、secret scan,并禁止写入长期分析仓库。
cache miss 归因
cache miss 不应只记录 hit=false。兼容层应归因到 segment:
| miss reason | 诊断 |
|---|---|
dynamic_attribution_block |
attribution fingerprint 未剥离 |
tool_order_changed |
工具列表未 canonicalize |
tool_schema_changed |
工具 schema 真变化 |
mcp_descriptor_changed |
MCP server/tool 描述变化 |
project_context_changed |
CLAUDE.md 或项目摘要变化 |
cache_boundary_after_dynamic_block |
breakpoint 放错位置 |
provider_no_cache_support |
目标后端不支持等价 cache |
role_rewrite_changed_prefix |
role 兼容修正改变前缀结构 |
这样才能把“缓存没命中”变成可修复的问题。
归因算法建议遵循三条规则。第一,多个 segment 同时变化时,优先归因第一个 cache boundary 之前的变化,因为它会破坏后续所有 prefix reuse。第二,expectedHit=true 但 provider 没有返回 cache metrics 时,不能记作 miss,应记录 actualHit=unknown。第三,区分 gateway cache miss、provider cache miss、cache write 和 cache read;readTokens / writeTokens 必须绑定 provider 字段来源,不能用本地估算冒充 provider 账单字段。与 attribution cache miss 相关的原因见第 10 篇 Claude Code attribution block 与第三方缓存 miss,工具 / MCP 膨胀见第 12 篇 CLAUDE.md、工具定义与 MCP 描述的上下文膨胀,前缀稳定化见第 13 篇 归属指纹块剥离与前缀稳定化。
telemetry schema
type PromptTelemetryEvent = {
requestId: string;
provider: string;
model: string;
tokenizer: {
provider: string;
modelId: string;
countMethod: "provider_usage" | "provider_count_tokens" | "local_tokenizer" | "diff_estimate";
};
segments: Array<{
id: string;
type: "system" | "tools" | "mcp" | "project_context" | "task_state" | "live_window" | "metadata";
tokens: number;
hmac: string;
cacheable: boolean;
stability: "static" | "semi_static" | "dynamic";
redaction: "hash_only" | "metadata_only" | "redacted_sample";
}>;
diff: {
changedSegments: string[];
churnTokens: number;
churnRatio: number;
};
cache: {
expectedHit: boolean;
actualHit?: boolean | "unknown";
cacheLayer?: "gateway" | "provider" | "local_kv";
missReason?: string;
readTokens?: number;
writeTokens?: number;
tokenSource?: string;
};
adapter: {
roleRewriteCount: number;
strippedAttributionBlocks: number;
reservedKeywordBlocks: number;
};
};
稳定性评分
score = 100
- 40 * cacheable_churn_ratio
- 20 * dynamic_prefix_ratio
- 15 * ordering_instability
- 15 * role_rewrite_risk
- 10 * cache_boundary_risk
评分解释:
| 分数 | 含义 |
|---|---|
| 90-100 | 前缀稳定,预期高缓存命中 |
| 70-89 | 轻微抖动,可观察 |
| 40-69 | 缓存收益不稳定 |
| 0-39 | 动态前缀污染严重 |
失败模式
| 失败模式 | 触发原因 | 修复策略 |
|---|---|---|
| token 成本重复计算 | 父子分桶没有定义 | 以 leaf segment 为准,聚合指标派生 |
| 跨 provider 指标不可比 | 未记录 tokenizer / model / count method | telemetry 强制包含 tokenizer metadata |
| 日志泄露内部能力 | 输出工具名、路径、server 名 | 默认 HMAC-only,名称走 allowlist |
| cache miss 误报 | provider 未返回 cache metrics 却记 false | 使用 actualHit=unknown |
| miss reason 过粗 | 只记录 hit=false |
归因到第一个变化的 cacheable segment |
| HMAC 仍可跨环境关联 | salt 复用或长期不轮换 | 环境级 salt,按策略轮换 |
验证清单
• 构造 attribution fingerprint 变化,miss reason 应为 dynamic_attribution_block。
• 构造工具顺序变化,canonicalization 后不应产生 diff。
• 构造工具 schema 变化,diff 应定位到具体 tool schema。
• 构造 CLAUDE.md 变化,diff 应定位到 project context,而不是 system builtin。
• 对 telemetry 日志运行 secret scan,确认没有完整 prompt、API key、cookie、authorization header。
• 对生产配置确认 prompt 原文不落盘,只保留 HMAC、token 和结构化 metadata。
• 比较 expected cache hit 与 provider actual cache hit,找出 gateway 与 provider 语义差异。
参考链接
• Anthropic Token Counting
• Anthropic Prompt Caching
• Claude Code Environment Variables
• Claude Code LLM Gateway
• Anthropic Engineering: Effective context engineering for AI agents
• CacheProbe
• Contextual Memory Virtualisation
本文由非线智能API Claude Code 行业专家整理编写