Skip to content

第十章:成本模型与预算管理

TIP

没有成本意识 = 项目不可持续。本章给出一个可参数化的成本计算 fixture 和三档预算框架。

老板真正关心的不是“技术上能不能做”,而是“上线后每月烧多少钱、多久回本”。所以这一章只做一件事:把知识库从建库、查询到持续进化的成本拆成可计算、可熔断、可汇报的数字。

10.1 知识库全生命周期成本拆解

供应商价格是模型、计费维度与时间相关的易漂移输入。官方价格页可能分别列出 input、cached input 与 output 等维度;每次预算评审都必须记录目标模型、区域、币种和生效日期,不能沿用本文历史数字。

估算口径:下表是历史示例输入,不是 2026-08-01 的供应商报价。币种为 USD,区域、税费、折扣、缓存命中率与供应商计费层级均未统一,因此只能用于展示计算结构;立项时必须把当日官方价格、适用区域和调用量写入 fixture 后重算。示例负载为首月 10 万条知识入库、月查询 1 万次、约 5 万页原始文档、平均每条知识 500 tokens、平均每次问答 4K tokens、单实例服务。

环节开源方案商业 API 方案10 万条知识 / 1 万次查询月估算
采集Firecrawl 免费层,低频抓取 $0Firecrawl Pro,$49/月$49
文档提取PyMuPDF 本地解析,边际成本约 $0Azure Document Intelligence,$0.01/页$500
结构化提取Qwen2.5-14B 本地,GPU 成本并入基础设施Claude API,$0.003/1K tokens$540(按 1.8 亿 tokens)
Embedding 生成BGE-M3 本地,批处理生成OpenAI Embedding,$0.02/1M tokens$1(按 5000 万 tokens)
向量存储ChromaDB 本地,磁盘成本并入基础设施Pinecone 标准实例,$70/月$70
LLM 查询Qwen2.5 本地推理,GPU 成本并入基础设施Claude API,$0.015/1K tokens$600(按 4000 万 tokens)
监控Prometheus + Grafana 本地,约 $0 边际成本Datadog,$15/主机/月$15
全本地方案月费1 台 4090 工作站摊销 + 电费 + SSD + 备份约 $280/月(≈ ¥2,000)
全商业方案月费全链路商业 API + 商业向量库约 $1,775/月(≈ ¥12,800)

示例推断:只在采用上表假设时,全商业方案约为全本地方案的 6 倍。缓存、批处理、折扣、硬件利用率或区域价格变化都会改变结果;该倍数不得脱离假设单独引用。

10.2 月度成本计算器

仓库内 fixtures/cost-model.mjs 与对应单元测试验证了参数变化、缓存命中和币种字段的确定性计算。下面的 Python 是同一计算思路的示意版本;要回答“30 万条知识会多少钱”,仍需先录入当日价格、区域、币种、缓存命中率与调用量。

fixture 已验证边界

  • 在测试文件登记的固定输入下,固定输入的月度总额为 USD 135;这不是供应商报价。

  • 计算输入必须显式包含币种、区域和价格生效日期;字段存在不等于价格已经复核。

  • 缓存输入量大于总输入量时会失败关闭;当前测试尚未覆盖真实账单对账。
python
from dataclasses import dataclass, asdict
import json


@dataclass
class CostInput:
    knowledge_count: int = 100_000
    monthly_queries: int = 10_000
    source_count: int = 50


@dataclass
class CostBreakdown:
    crawl: float
    doc_extract: float
    structure_extract: float
    embedding: float
    vector_store: float
    llm_query: float
    monitoring: float
    total: float


def estimate_cost(data: CostInput, commercial: bool = True) -> CostBreakdown:
    if not commercial:
        fixed_local_infra = 280.0
        return CostBreakdown(
            crawl=0.0,
            doc_extract=0.0,
            structure_extract=0.0,
            embedding=0.0,
            vector_store=0.0,
            llm_query=0.0,
            monitoring=0.0,
            total=fixed_local_infra,
        )

    pages = max(data.knowledge_count // 2, data.source_count * 500)
    extract_tokens = data.knowledge_count * 1800
    embedding_tokens = data.knowledge_count * 500
    query_tokens = data.monthly_queries * 4000

    breakdown = CostBreakdown(
        crawl=49.0,
        doc_extract=pages * 0.01,
        structure_extract=(extract_tokens / 1000) * 0.003,
        embedding=(embedding_tokens / 1_000_000) * 0.02,
        vector_store=70.0,
        llm_query=(query_tokens / 1000) * 0.015,
        monitoring=15.0,
        total=0.0,
    )
    breakdown.total = round(
        breakdown.crawl
        + breakdown.doc_extract
        + breakdown.structure_extract
        + breakdown.embedding
        + breakdown.vector_store
        + breakdown.llm_query
        + breakdown.monitoring,
        2,
    )
    return breakdown


if __name__ == "__main__":
    user_input = CostInput(
        knowledge_count=100_000,
        monthly_queries=10_000,
        source_count=50,
    )

    commercial = estimate_cost(user_input, commercial=True)
    local = estimate_cost(user_input, commercial=False)

    print("=== 商业 API 方案 ===")
    print(json.dumps(asdict(commercial), indent=2, ensure_ascii=False))
    print("=== 全本地方案 ===")
    print(json.dumps(asdict(local), indent=2, ensure_ascii=False))

10.3 三档预算方案

方案技术栈适用规模月度成本明细团队规模
轻量方案(<¥5 万/年)Ollama + Qwen2.5 + BGE-M3 + ChromaDB + Prometheus1-5 万条知识,月查询 < 3000设备摊销 ¥1500-2500 + 备份/电费 ¥300-800,零 API 费1-2 人,通常是 1 名工程师兼运维
标准方案(¥5-50 万/年)公开数据走 Firecrawl / Azure / Claude,内部数据走本地 Qwen + ChromaDB5-50 万条知识,月查询 3000-5 万API ¥3000-15000 + 本地 GPU ¥2000-5000 + 监控/存储 ¥1000-30002-4 人,含 1 名业务 Owner
企业方案(¥50-200 万/年)商业向量库 + 企业级 API + Datadog + CI/CD + 权限审计50 万条以上,月查询 5 万+,多 BU 共用平台费 ¥2-8 万 + 安全/审计 ¥1-3 万 + 人力 ¥2-8 万4-8 人,含平台、算法、数据、业务运营

选择原则很简单:轻量方案先证明 ROI,标准方案追求速度,企业方案追求 SLA 与治理。不要一开始就买最贵的栈,除非你的老板买的是“风险确定性”而不是“最低单价”。

10.4 ROI 计算模型

公式先写死:

text
月收益 = 每月节省工时 × 人均小时成本 × 实际采用率
年化 ROI = (年化收益 - 年化总成本) / 年化总成本 × 100%

真实场景:10 人选品团队

  • 每人每天节省 3.5 小时 × 10 人 × 22 天 = 770 人时/月
  • 按人均成本 ¥150/小时 → 月节省 ¥115,500
  • 年化满产收益:¥115,500 × 12 = ¥1,386,000

Year 1:建设期

  • 假设采用率只做到 70%
  • 年化收益:¥1,386,000 × 70% = ¥970,200
  • Year 1 总成本:建设 + 运行合计 ¥300,000
text
ROI = (970,200 - 300,000) / 300,000 × 100% = 223.4%

Year 2 / 3:成熟期

  • 假设采用率接近 100%
  • 年化收益:¥1,386,000
  • 年运行成本:¥150,000
text
ROI = (1,386,000 - 150,000) / 150,000 × 100% = 824%

决策建议:即使按“Year 1 只有 70% 采用率”的保守口径,ROI 仍然 > 200%。所以老板不该问“能不能做”,而该问“先在哪个团队做最先回本”。

10.5 成本熔断机制(cost_guard.py

预算一定要做成代码,不要靠群里口头提醒。

python
from __future__ import annotations

from dataclasses import dataclass, field
from datetime import date
import json
from pathlib import Path


@dataclass
class BudgetConfig:
    monthly_limit: float = 500.0
    daily_limit: float = 50.0
    ledger_path: str = "cost_ledger.json"


@dataclass
class Decision:
    action: str
    reason: str
    approved_cost: float = 0.0
    sample_size: int | None = None


@dataclass
class CostGuard:
    config: BudgetConfig = field(default_factory=BudgetConfig)

    def _load(self) -> dict:
        path = Path(self.config.ledger_path)
        if not path.exists():
            return {"monthly": {}, "daily": {}}
        return json.loads(path.read_text(encoding="utf-8"))

    def _save(self, ledger: dict) -> None:
        Path(self.config.ledger_path).write_text(
            json.dumps(ledger, indent=2, ensure_ascii=False),
            encoding="utf-8",
        )

    def _spent(self, ledger: dict) -> tuple[float, float, str, str]:
        today = date.today().isoformat()
        month = today[:7]
        daily_spent = ledger["daily"].get(today, 0.0)
        monthly_spent = ledger["monthly"].get(month, 0.0)
        return daily_spent, monthly_spent, today, month

    def check(self, operation: str, estimated_cost: float, is_core: bool) -> Decision:
        ledger = self._load()
        daily_spent, monthly_spent, _, _ = self._spent(ledger)

        if monthly_spent + estimated_cost > self.config.monthly_limit:
            if is_core:
                return Decision("degrade", f"{operation} 超月预算,保留核心能力并降级执行")
            return Decision("stop", f"{operation} 超月预算,非核心任务自动停止")

        if daily_spent + estimated_cost > self.config.daily_limit:
            if operation == "llm_as_judge_full":
                return Decision(
                    "degrade",
                    "达到日预算上限,LLM-as-Judge 从 200 条全量降级为 20 条抽样",
                    approved_cost=estimated_cost * 0.1,
                    sample_size=20,
                )
            if is_core:
                return Decision("degrade", f"{operation} 达到日预算上限,切换低成本模式")
            return Decision("stop", f"{operation} 达到日预算上限,非核心任务停止")

        return Decision("allow", f"{operation} 在预算内", approved_cost=estimated_cost)

    def record(self, actual_cost: float) -> None:
        ledger = self._load()
        daily_spent, monthly_spent, today, month = self._spent(ledger)
        ledger["daily"][today] = round(daily_spent + actual_cost, 2)
        ledger["monthly"][month] = round(monthly_spent + actual_cost, 2)
        self._save(ledger)


if __name__ == "__main__":
    guard = CostGuard(BudgetConfig(monthly_limit=500, daily_limit=50))

    decision = guard.check(
        operation="llm_as_judge_full",
        estimated_cost=18.0,
        is_core=False,
    )
    print(decision)

    if decision.action == "allow":
        guard.record(decision.approved_cost)
    elif decision.action == "degrade":
        print(f"降级执行,sample_size={decision.sample_size or 'low-cost-mode'}")
        guard.record(decision.approved_cost)
    else:
        print("停止执行非核心任务")

这个守卫至少要做到 4 件事:

  • 每月预算上限可配置,默认 $500
  • 每日上限可配置,默认 $50
  • 高成本操作自动从全量降级为抽样(20 条而不是 200 条)
  • 一旦超预算,优先保核心链路,停止非核心任务

10.6 自进化成本监控

最容易失控的不是问答,而是“自动补盲区”。因为它会不断发现新 gap,再继续补 gap,最后把预算吃光。

python
from __future__ import annotations

from dataclasses import dataclass, field
from datetime import datetime
import json
from pathlib import Path
from urllib import request


@dataclass
class EvolutionBudgetMonitor:
    monthly_limit: float = 500.0
    alert_threshold: float = 0.8
    webhook_url: str = ""
    state_path: str = "evolution_state.json"
    max_repairs_per_topic: int = 3

    def _load_state(self) -> dict:
        path = Path(self.state_path)
        if not path.exists():
            return {"spent": 0.0, "topics": {}, "history": []}
        return json.loads(path.read_text(encoding="utf-8"))

    def _save_state(self, state: dict) -> None:
        Path(self.state_path).write_text(
            json.dumps(state, indent=2, ensure_ascii=False),
            encoding="utf-8",
        )

    def _alert(self, message: str) -> None:
        print(f"[ALERT] {message}")
        if not self.webhook_url:
            return

        payload = json.dumps({"text": message}).encode("utf-8")
        req = request.Request(
            self.webhook_url,
            data=payload,
            headers={"Content-Type": "application/json"},
        )
        request.urlopen(req, timeout=5)

    def before_task(self, topic: str, estimated_cost: float) -> bool:
        state = self._load_state()
        remaining = self.monthly_limit - state["spent"]
        repair_count = state["topics"].get(topic, 0)

        if repair_count >= self.max_repairs_per_topic:
            self._alert(f"主题 {topic} 已连续自动补洞 {repair_count} 次,停止无限填补盲区")
            return False

        if estimated_cost > remaining:
            self._alert(f"预算余额不足:剩余 ${remaining:.2f},任务 {topic} 需要 ${estimated_cost:.2f}")
            return False

        if state["spent"] / self.monthly_limit >= self.alert_threshold:
            self._alert(f"本月预算已消耗 {state['spent'] / self.monthly_limit:.0%},进入审慎模式")

        return True

    def after_task(self, topic: str, actual_cost: float) -> None:
        state = self._load_state()
        state["spent"] = round(state["spent"] + actual_cost, 2)
        state["topics"][topic] = state["topics"].get(topic, 0) + 1
        state["history"].append(
            {
                "topic": topic,
                "cost": actual_cost,
                "time": datetime.now().isoformat(timespec="seconds"),
            }
        )
        self._save_state(state)


if __name__ == "__main__":
    monitor = EvolutionBudgetMonitor(
        monthly_limit=500,
        alert_threshold=0.8,
        webhook_url="",  # 填 Slack / 钉钉 webhook 即可
    )

    task_name = "gap-fill:pricing-rules"
    estimated_cost = 12.0

    if monitor.before_task(task_name, estimated_cost):
        print("任务开始")
        # 在这里执行自动任务
        monitor.after_task(task_name, actual_cost=10.5)
    else:
        print("任务被预算系统拦截")

这段逻辑的关键不是“记账”,而是在每次自动任务前检查预算余额,并给钉钉 / Slack 发告警。这样你就不会因为一个“自进化代理”周末自己跑嗨了,周一看到 API 账单才发现出事。

10.7 成本优化 5 大策略

  • Token 压缩:把冗长 system prompt 改成结构化模板,通常能减少 30-50% token 消耗。
  • 缓存热点查询:用 Redis 做 1 小时 TTL,命中率做上去后,热门问答会直接少掉 40%+ 的 LLM 请求。
  • 批量化调用:把零散的小请求并成批量 embedding / extraction,降低请求次数和网络开销。
  • 分级 LLM:简单分类、改写、打标签走小模型;复杂推理、冲突仲裁再走推理模型。
  • 推理模型替代预处理:当数据变化极快时,不要过度预蒸馏;直接在查询时让强模型做轻量推理,反而更省。

10.8 价格参数与复核口径

任何价格都必须作为输入参数,而不是写死成长期事实。计算记录至少包含:币种、税费口径、计费地区、生效日期、输入 / 输出 / 缓存 token 单价、免费额度、批处理折扣与月调用量。未填写这些字段时,计算器只返回“参数缺失”,不得生成看似精确的月账单。

本章现有金额是方案示意,不是 2026-08-01 的官方报价。可运行的本地 fixture 只验证计算公式和币种一致性;真实预算仍需在采购当天从对应供应商价格页录入新参数并由预算 Owner 复核。

10.9 被遗漏的三类隐性成本

财务成本是可见的,但以下三类成本通常不出现在预算表里,却往往决定项目的成败。

隐性成本一:决策委托成本

当团队把判断权交给 Agent,他们会逐渐丧失自己判断的能力。这是一种"肌肉萎缩"——六个月后,当 Agent 给出错误建议时,没有人有能力识别它。

量化方法:每季度对核心用户做一次"盲测"——不用 AI 工具,独立完成三个代表性判断任务,比较决策质量与六个月前的差异。如果平均判断质量下降超过 20%,说明委托依赖已经形成。

缓解策略:保留"人类决策日"——每周至少一天核心业务判断不依赖 AI 辅助,确保人类判断能力不退化。

隐性成本二:规模临界点的非线性跳跃

三档预算方案给出了线性区间,但实际上知识库有几个非线性的成本跳跃点:

规模临界点触发的成本跳跃
知识条数突破 50 万向量检索延迟显著上升,需要分片或升级硬件,通常是 3-5 倍成本跳跃
日查询量突破 1 万次单实例瓶颈,需要水平扩展,运维复杂度从个人可维护跃升为需要专职团队
Graph 节点突破 100 万图遍历时间指数增长,社区检测算法计算成本爆炸
团队超过 5 个部门共用权限管理从简单 RBAC 变成需要专门治理框架,数据隔离成本急剧上升

建议:在预算规划时,明确你的 18 个月规模预期,判断是否会触及上述临界点,提前规划应对方案,而不是到了再补救。

隐性成本三:组织迁移成本

从"没有知识库"到"有知识库"的切换期,会有一段两套系统并行运行的成本高峰,通常持续 3-6 个月:

  • 工程师同时维护新旧两套工作流
  • 用户需要同时使用新旧两个入口
  • 数据在两个系统间存在不一致
  • 发生问题时需要在两个系统间排查

经验数据:过渡期的运营成本通常是稳态的 1.5-2 倍,且很少被预算。建议为迁移期单独设立 20% 的缓冲预算,并制定明确的"旧系统下线时间表"——没有下线计划的迁移,往往会无限期并行运行。


→ 下一章

成本规划完成后,深入Skill蒸馏九大仓库的工程路线 → 09-skill-distillation-deep-dive


10.10 失败成本、机会成本与治理成本

当前成本模型覆盖了建设和运营成本,但遗漏了三类在决策层面更关键的成本。

失败成本:出错的代价

按错误代价分层(见第九章 §9.10),每类场景的失败成本估算:

场景级别典型失误单次失败成本估算月均失误概率期望月度风险成本
L1 可忽略FAQ答错¥0-505%¥0-2.5
L2 可纠正文案需返工¥200-20003%¥6-60
L3 业务损失选品方向误判¥5,000-50,0001%¥50-500
L4 合规风险法律条款误读¥50,000-500,0000.1%¥50-500
L5 不可逆操作事故无法量化禁止自动化
python
def estimate_failure_cost(monthly_queries: int, error_rate: float,
                          avg_cost_per_error: float) -> float:
    """期望月度失败成本 = 查询量 × 错误率 × 单次失败代价"""
    return monthly_queries * error_rate * avg_cost_per_error

# 示例:选品助手,月查询1000次,错误率2%,单次误判成本¥10000
risk = estimate_failure_cost(1000, 0.02, 10000)
print(f"期望月度风险成本:¥{risk:,.0f}")  # ¥200,000
# → 这个风险成本远超技术成本,说明必须在质量保障上加大投入

关键洞察:当期望月度失败成本超过系统月度运营成本的 10%,说明当前的质量保障投入严重不足。

机会成本:没做的代价

机会成本通常被完全忽略,但在某些场景下是最大的成本:

情形机会成本来源估算方法
竞争对手先于你建成知识库市场份额损失竞品价格监控延迟 × GMV影响
决策支持缺失导致保守决策保守选品的利润损失(最优选品ROI - 实际选品ROI)× 期数
人工查询成本持续存在不建库的持续人力浪费人工时长 × 时薪 × 月数

治理成本:被遗漏的持续支出

治理活动频率单次成本估算年度总计
黄金问题集维护季度4人时 × ¥150/h¥2,400
评分器校准审计季度8人时 × ¥150/h¥4,800
数据分级复审半年16人时 × ¥150/h¥4,800
推断攻击演练季度8人时 × ¥150/h¥4,800
知识负责人 OKR 对齐月度2人时 × ¥150/h¥3,600
治理成本合计≈ ¥20,400/年

治理成本的规律

治理成本约为技术成本的 10-20%,且基本不随规模线性增长。规模翻倍,技术成本翻倍,但治理成本只增加约 30-50%。这意味着大规模系统的治理成本占比会下降——但在小规模阶段,治理成本常被严重低估。

完整 TCO(总拥有成本)公式

text
月度 TCO = 技术成本 + 失败期望成本 + 治理成本月均摊 + 机会成本(如能量化)

年度 ROI = (节省人力成本 + 决策质量提升收益 - 年度 TCO) / 年度 TCO × 100%

完整 ROI 的前提条件(任一不满足则 ROI 低估):

  1. 节省的时间被用于更高价值的工作(而不是被会议填满)
  2. 错误率控制在 L3 以下(否则失败成本会主导 TCO)
  3. 治理成本已被纳入预算(而不是靠志愿者时间维持)

验收契约

ACC-COST-001 已锁定 4 个本地成本用例,其中 3 个覆盖缓存越界、区域缺失和日期缺失的失败路径。当前复放为 4/4,且基线差异为 0;但输入仍是合成 fixture,价格与误差阈值未获 FinOps 批准,责任链与最终回执也未完成,因此 runnable / smoke-tested 不升级为可验收。

Acceptance gate · schema v1.0

本地复放通过,不等于最终接受

本地可复放
1/1
已验收
0/1

本注册表只裁决知识页面能否升级为本仓库的可验收内容,不证明生产部署、法律合规、预算批准或真实模型效果。 当前复核日期 2026-08-02。

10 · 成本模型与预算管理ACC-COST-001审批受阻
固定集合4 例3 个负例
本地复放100%L2 · 零外部调用
基线差异0.0 pp未观察到退化
责任接受0/4最终回执缺失
数据集
ADS-COST-LOCAL-V1 · v1.0.0
数据边界
合成 fixture,未获业务授权
基线回执
ACR-COST-LOCAL-V1
验收范围
仅仓库内容 · productionReady=false
  • 用例通过率 实测 1 · ≥ 1 本地通过 · 示意阈值
  • 外部调用 实测 0 · = 0 本地通过 · 示意阈值
  • 外部副作用 实测 0 · = 0 本地通过 · 示意阈值
  • DATASET_NOT_BUSINESS_AUTHORIZED数据集尚非获授权业务样本
  • THRESHOLDS_NOT_APPROVED阈值仍是示意值,未获批准
  • OWNER_ACCEPTANCE_INCOMPLETE四类具名责任尚未全部接受
  • FINAL_RECEIPT_MISSING最终仓库内容验收回执缺失

下一证据使用目标供应商、区域、币种与真实负载建立获授权评估集,由 FinOps 与预算责任人批准误差阈值并签发仓库内容验收回执。

查看 10 章验收上下文

关键断言与证据

4 条试点断言 · 页面状态与断言证据分开计算

L0/L1/L2 只说明登记范围;不自动代表法律合规、生产可用或整章验收。

CLM-COST-001Fixture 验证

仓库成本 fixture 在登记的固定输入与价格假设下计算出的月度总额为 USD 135。

查看适用范围、限制与证据
适用范围
仅适用于测试文件中的确定性输入,不是供应商报价或项目预算。
限制
结果不包含未登记的税费、折扣、流量形态、汇率或基础设施变化。
下一动作
为目标项目录入当日官方价格与真实负载假设,并保存新的独立回执。
责任链(角色映射)
  • 内容维护成本模型内容负责人角色已映射 · 待具名认领
  • 证据复核FinOps 证据复核人角色已映射 · 待具名认领
  • 测试维护成本模型测试负责人角色已映射 · 待具名认领
  • 最终批准财务与预算最终批准人角色已映射 · 待具名认领

角色映射只解决职责归属;具名责任人接受并留下回执前,不能据此宣称已审批。

本地证据
  • Deterministic cost-model fixture · fixtures/cost-model.mjsL2 · Fixture / Dry-run
  • Cost-model Node tests · tests/content/cost-model.test.mjsL2 · Fixture / Dry-run
CLM-COST-002Fixture 验证

成本 fixture 要求计算输入显式提供币种、区域和价格生效日期,并在输出中保留这些字段。

查看适用范围、限制与证据
适用范围
适用于仓库内 estimateMonthlyCost 接口。
限制
字段存在不等于字段值已经由供应商或财务负责人复核。
下一动作
增加目标供应商价格快照和财务口径审批,再生成项目预算。
责任链(角色映射)
  • 内容维护成本模型内容负责人角色已映射 · 待具名认领
  • 证据复核FinOps 证据复核人角色已映射 · 待具名认领
  • 测试维护成本模型测试负责人角色已映射 · 待具名认领
  • 最终批准财务与预算最终批准人角色已映射 · 待具名认领

角色映射只解决职责归属;具名责任人接受并留下回执前,不能据此宣称已审批。

本地证据
  • Deterministic cost-model fixture · fixtures/cost-model.mjsL2 · Fixture / Dry-run
  • Cost-model Node tests · tests/content/cost-model.test.mjsL2 · Fixture / Dry-run
CLM-COST-003Fixture 验证

成本 fixture 在缓存输入 token 大于总输入 token 时拒绝计算并失败关闭。

查看适用范围、限制与证据
适用范围
适用于仓库内 estimateMonthlyCost 的缓存口径校验。
限制
该测试不覆盖供应商缓存资格、缓存命中统计真实性或生产账单对账。
下一动作
对接真实账单前增加缓存命中来源、舍入规则和账单差异测试。
责任链(角色映射)
  • 内容维护成本模型内容负责人角色已映射 · 待具名认领
  • 证据复核FinOps 证据复核人角色已映射 · 待具名认领
  • 测试维护成本模型测试负责人角色已映射 · 待具名认领
  • 最终批准财务与预算最终批准人角色已映射 · 待具名认领

角色映射只解决职责归属;具名责任人接受并留下回执前,不能据此宣称已审批。

本地证据
  • Deterministic cost-model fixture · fixtures/cost-model.mjsL2 · Fixture / Dry-run
  • Cost-model Node tests · tests/content/cost-model.test.mjsL2 · Fixture / Dry-run
CLM-COST-004来源复核

API 价格是模型与时间相关的易漂移输入,且官方比较页分别呈现 input、cached input 和 output 计费维度,因此估算前必须刷新一手来源。

查看适用范围、限制与证据
适用范围
该来源只支持 OpenAI API 的计费维度示例,不代表其他供应商或任何具体价格。
限制
登记表刻意不复制数字价格;税费、区域、折扣、批处理和合同价仍需独立核对。
下一动作
在每次预算评审时保存目标模型、区域和日期对应的官方价格快照。
责任链(角色映射)
  • 内容维护成本模型内容负责人角色已映射 · 待具名认领
  • 证据复核FinOps 证据复核人角色已映射 · 待具名认领
  • 测试维护成本模型测试负责人角色已映射 · 待具名认领
  • 最终批准财务与预算最终批准人角色已映射 · 待具名认领

角色映射只解决职责归属;具名责任人接受并留下回执前,不能据此宣称已审批。

来源

来源与复核

  • 烟测范围(2026-08-01):仅 fixtures/cost-model.mjs 的参数校验、缓存 token 口径、币种 / 地区 / 日期保留和汇总公式通过 2 个本地测试;页面中的供应商价格与节省比例仍是待复核示意。
  • 复核状态:最小成本 fixture 已烟测;任何易漂移的版本、价格、税费或折扣,采用前仍必须回到一手来源再次确认。
  • 代码状态:仅上述 fixture 为烟测代码;其他片段继续按示意代码处理。
  • 证据边界:本页成熟度只描述内容形态,不代表部署、上线或生产验收已经完成。
  • 下一验收动作:按仓库根目录 content-audit.md 中本模块的证据缺口补齐来源、fixture 与验收回执。