南大 AI 课 Token 自费:用缓存命中率算一学期账单

南大 AI 课 Token 自费:用缓存命中率算一学期账单

关键词:生成式软件工程、蒋炎岩、deepseek-v4-flash、Token 成本、KV Cache 缓存命中、上下文工程、Agent 成本控制


目录


一、导语:一句课堂狠话,和一份没人细看的定价表

2026 年秋季开学季,南京大学计算机学院副教授蒋炎岩在新开的《生成式软件工程》课上放了一页课件,首页一行红字:「没有 Token 的 CS 学生,应立即退学」。截图流出后,知乎相关话题冲上热榜,很快攒到四百多条回答。

这句话的传播效率极高,因为它同时踩中了两个情绪按钮:一是"学校又在逼学生花钱",二是"不用 AI 就要被淘汰"。但传播的代价是失焦------几乎所有讨论都停在"该不该自费"的立场之争上,而没有任何一篇文章认真算过:这门课一学期到底要花多少钱。

蒋炎岩在课上给了一个数字:建议学生去 DeepSeek 充 100 块。这个数字是拍脑袋还是算过的?我按 DeepSeek 官方定价表做了完整测算,顺带把"让 Agent 读整个代码库到底有多贵"这件事也实测了一遍。结论有点反直觉:

  • 100 元对典型使用场景绰绰有余,一学期实际支出中位数在 40 元左右;
  • 但成本曲线极其陡峭,只要缓存失效或上下文翻倍,一学期可以轻松烧到 480 元;
  • 最值钱的省钱动作不是"少用点",而是让 prompt 前缀稳定命中缓存------这一项比"把代码库砍一半"有效三倍。

第三条尤其值得说。它给"不要 Tokenmaxxing"这句略带调侃的课堂黑话,找到了一个非常硬的工程落点。

图一:事实边界------官方课程页与传言

(图一:左栏为课程官方主页与 DeepSeek 官方定价页可查证的内容,右栏为网络流传但无一手证据的说法;争议的真正焦点不在"要不要花钱",而在教育成本该由谁承担)


二、先把事实和传言分开:课件没告诉你的两件事

2.1 官方课程页上两个被忽略的细节

这门课的官方主页是公开的(jyywiki.cn/GSE/2026/),B 站还有同步直播。我把它翻了一遍,发现两个细节在所有媒体报道里都缺席了,但它们对理解这门课的性质很关键。

第一,这门课不打分。 课程页白纸黑字写着"成绩:不计分,仅通过 / 不通过"。这意味着"没 Token 就退学"从制度上就不可能是处分条款------一个通过制的选修课,根本没有"退学"这个执行路径。它是一句课堂修辞,功能是破冰和筛选注意力,不是校纪。

第二,Projects 列表里有一个叫「作业帮帮」的项目,官方描述是"能自动完成作业,并且看起来像人完成的,自带伪造的 git 记录"。

这个作业设计相当狠。它不回避"学生用 AI 抄作业"这个事实,反而把它变成作业本身:你要真能把这套东西做出来,你对 Agent 的能力边界、版本伪造、行为拟真的理解,就已经超过了绝大多数只会被动调用 API 的人。 这比在课堂上宣讲"禁止使用 AI"要诚实得多。

课程大纲的骨架也值得一提,它并没有把 AI 单列成一块,而是嵌进经典软件工程生命周期的每个环节:

图二:课程大纲------从模型到演化的五段结构

(图二:官方课程主页列出的五大模块与四个 Projects;骨架仍是经典软件工程生命周期,AI 是被嵌入每个环节的变量,而不是独立章节)

三条课堂 Policy 的原文口径(据课程内容整理,多家媒体表述一致):

Policy 原文含义 对应的工程能力
禁止古法编程 别再用十年前那套方式敲代码 人机分工与任务拆解
Token 自费 作业全程基于 deepseek-v4-flash,费用自理 成本意识
不需要 Tokenmaxxing 别拿 Token 当水喝,要高效地用 上下文工程与缓存复用

第三条是全文的重点,第五节详细拆。

2.2 这不是孤例:AI 必修课正在全球同步铺开

把南大这页课件当成一次孤立的行为艺术,会错过真正的信号。AI 课正在从"选修加分项"变成"通识基础设施",而且节奏比很多人想象的快。

新加坡国立大学的 THE1008《Applied Generative AI: From Prompting to Evaluation》从 2026/27 学年起成为新生必修课,覆盖约 7700 名本科新生(NUS 官方新闻室公布)。复旦大学的《生成式软件开发》(课程代码 AIB110005)2026 年春季开课,3 学分 / 54 学时,明确面向非计算机专业学生(复旦 AI 课程平台公布)。

对比之下能看出南大这门课的定位差异:

课程 开课方 面向对象 学分/规模 Token 承担方式
生成式软件工程 南大计算机学院 计算机专业选修 通过制,不打分 学生自费
THE1008 Applied GenAI 新加坡国立大学 全体新生必修 约 7700 人/学年 学校统一
生成式软件开发 AIB110005 复旦大学 非计算机专业 3 学分 / 54 学时 学校统一

这是本文第一个属于自己的判断: 三所学校的课程设计差异不大,真正的分歧点只有一个------谁来买单。南大把成本转嫁给了学生,另外两所由学校承担。这个分歧,恰恰是第六节那场争论的核心。


三、Token 到底贵在哪:先摆官方定价表

讨论成本之前必须先把价格钉死,因为网上传的数字混乱得离谱。以下全部来自 DeepSeek 官方 API 文档(api-docs.deepseek.com,2026-09-02 访问的中文定价页),deepseek-v4-flash 型号:

计费项 空闲时段 高峰时段
输入 · 缓存命中 ¥0.05 / 百万 tokens ¥0.10 / 百万 tokens
输入 · 缓存未命中 ¥1.50 / 百万 tokens ¥3.00 / 百万 tokens
输出 ¥4.50 / 百万 tokens ¥9.00 / 百万 tokens

另外两个硬指标:上下文长度 1M,单次最大输出 384K。

这里有两件事必须点出来,它们决定了后面所有的计算:

第一,缓存命中和未命中差 30 倍(¥0.05 vs ¥1.50)。这是整张定价表里最大的价差,比"换更便宜的模型"的影响大得多。所谓 KV Cache 命中,指的是你这一轮请求的前缀与不久前的某次请求完全一致,模型可以直接复用已算好的中间状态。

第二,高峰时段价格翻倍,且时段定义对国内学生极不友好。 官方定义的高峰是北京时间周一至周五 9:00-12:00、14:00-18:00。换句话说,一个正常作息、白天上课晚上写作业的学生,会把大部分调用落在空闲时段;但如果他习惯在下午机房集中赶作业,成本直接翻倍。这个细节几乎没人提,但它对最终账单的影响和"换模型"是同一个量级。

顺手做个换算:100 元在空闲时段能买到 66.7M 输入 tokens(缓存未命中)2000M 输入 tokens(缓存命中) ,或 22.2M 输出 tokens


四、实测:把整个代码库塞进上下文要多少钱

蒋炎岩提到"让 Agent 读整个代码库要烧钱"。这句话对不对?我找了六个真实项目实测了一遍。样本取各项目的 Python 源码(排除测试与构建产物),分词用 tiktoken 的 cl100k_base 作代理------DeepSeek 实际分词器不同,代码文本的 token 数误差通常在 ±20% 以内,这个精度对量级判断够用。

项目 文件数 行数 tokens 单次全库入上下文(空闲,缓存未命中)
requests 37 12,069 94,439 ¥0.14
click 17 12,196 95,299 ¥0.14
flask 83 18,428 134,439 ¥0.20
fastapi 48 21,096 152,557 ¥0.23
matplotlib 248 200,422 1,930,783 ¥2.90
numpy 407 243,077 2,330,164 ¥3.50

结论很直接:"让 Agent 读整个代码库"在绝大多数真实项目上根本不贵。 把两万行的 fastapi 整个塞进上下文,一次两毛三;100 元能这么干 437 次。只有 numpy(24 万行)这种量级才会到单次 3.5 元。

所以严格讲,蒋炎岩那句话在中小项目上是不成立的------对课程作业级别的 codebase,"全库读"的成本可以忽略,为了省这几毛钱去做上下文裁剪反而浪费时间。而在超大型仓库上,它也不成立,因为 1M 上下文根本装不下 numpy(233 万 tokens),你物理上没法"全库读"。

真正烧钱的是另一件事。


五、真正烧钱的不是代码库,是上下文乘以轮数

Agent 的计费结构和人类直觉相反。人类写一次代码付一次"理解成本",Agent 每轮对话都要把整个上下文重新提交一遍。一次作业不是"读一次代码库",而是几十轮 × 每轮几十万 tokens

我把这门课的典型作业场景建模后跑了测算:一学期 16 周、每周 1 次作业。

图三:一学期 Token 支出(16 周累计)

(图三:按 deepseek-v4-flash 空闲时段定价测算,每周 1 次作业、缓存命中率按 70% 计;高峰时段为图中数值的两倍------100 元充值覆盖典型场景有余,但只要缓存失效或上下文翻倍就会被击穿)

场景 缓存命中率 单次作业 一学期(16 周)
轻量:10 轮 × 50K 上下文 70% ¥0.47 ¥7.5
典型:30 轮 × 100K 上下文 70% ¥2.54 ¥40.6
典型,但全在高峰时段 70% ¥5.07 ¥81.1
典型,但缓存完全失效 0% ¥5.58 ¥89.3
重度:60 轮 × 300K 上下文 70% ¥11.97 ¥191.5
重度,且缓存完全失效 0% ¥30.24 ¥483.8

这张表回答了导语里的问题:蒋炎岩说的 100 元是算过的,而且估得很准------它恰好覆盖典型场景(¥40.6)并留出一倍以上余量。 但如果学生做的是"重度"级别的 Agent 项目,或者完全不懂缓存机制,100 元会在学期中段就见底。

注意 100 元的另一层含义:它把"成本失控"从一个隐性风险变成了一个有形的边界。学生第一次看到余额往下掉的时候,会开始主动追问"这轮为什么这么贵"------这正是这门课想要的教学效果,而且它比任何一堂成本意识讲座都有效。


六、"不要 Tokenmaxxing" 的精确技术含义

Tokenmaxxing 这个词在课上的意思大概是"别把 Token 当水喝"。听起来像是"少用点",但按定价表算下来,"少用"恰恰是收益最低的那个动作

以典型场景(30 轮 × 100K、命中率 70%、单次 ¥2.54)为基准,逐个调整变量:

图四:降本杠杆排序------改哪里最省钱

(图四:基准为单次作业「30 轮 × 100K 上下文、缓存命中 70%」,成本 ¥2.54;条形长度表示影响幅度------"少写点"收益最小,"让前缀稳定命中缓存"和"少绕几轮"才是大头)

动作 单次成本 变化
缓存命中率由 70% 归零 ¥5.58 +120.1%
交互轮数减半(30 → 15 轮) ¥1.27 −50.0%
缓存命中率由 70% 提到 95% ¥1.45 −42.9%
上下文减半(100K → 50K) ¥1.81 −28.7%
每轮输出减半(8K → 4K) ¥2.00 −21.3%

排序结果很清楚:缓存命中率 > 轮数 > 上下文长度 > 输出长度。

这背后的机制值得展开。KV Cache 命中要求请求前缀逐 token 完全一致。Agent 循环里最常见、也最致命的反模式有这几个:

  1. 在 system prompt 里插时间戳或随机数。每轮都变,缓存全废,成本直接 +120%。
  2. 每轮动态重排工具定义的顺序。很多框架会按相关性排序工具列表,这个"智能"优化会把缓存从头打碎。
  3. 把对话历史塞进 system prompt 而不是 messages 数组。历史在增长,前缀就永远不稳定。
  4. 中途切换模型或改温度参数。换模型的瞬间缓存全部作废。

反过来说,"不要 Tokenmaxxing" 在工程上的正确翻译应该是:把易变内容放在提示词尾部,把稳定内容(系统指令、工具定义、项目文档)放在头部并且一个字都别动。 这不是省钱技巧,这是上下文工程的基本功------顺带还能显著降低首 token 延迟。

这一点课堂上大概率没有展开讲,但它是这门课最值钱的那部分。


七、动手:给自己算一笔账

把上面的模型写成脚本,你可以直接代入自己 Agent 的真实参数。环境要求 Python 3.9+,无第三方依赖。

python 复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Agent 单次任务成本测算器
价格取自 DeepSeek 官方定价页(deepseek-v4-flash,2026-09-02):
  输入缓存命中   ¥0.05 / 百万 tokens(高峰 ¥0.10)
  输入缓存未命中 ¥1.50 / 百万 tokens(高峰 ¥3.00)
  输出           ¥4.50 / 百万 tokens(高峰 ¥9.00)
高峰时段:北京时间周一至周五 9:00-12:00、14:00-18:00
"""

IN_HIT = 0.05      # 输入,缓存命中
IN_MISS = 1.50     # 输入,缓存未命中
OUT = 4.50         # 输出


def task_cost(rounds, ctx_k, out_k, hit_rate, peak=False):
    """计算一次任务成本。

    rounds   交互轮数
    ctx_k    每轮平均上下文长度(单位 K tokens)
    out_k    每轮平均输出长度(单位 K tokens)
    hit_rate 输入侧的缓存命中率(0~1)
    peak     是否落在高峰时段(价格翻倍)
    """
    mult = 2.0 if peak else 1.0
    total_in = rounds * ctx_k / 1000.0     # 换算成百万 tokens
    total_out = rounds * out_k / 1000.0
    hit = total_in * hit_rate
    miss = total_in * (1 - hit_rate)
    return (hit * IN_HIT + miss * IN_MISS + total_out * OUT) * mult


if __name__ == "__main__":
    # 典型作业:30 轮交互、平均 100K 上下文、每轮输出 8K、命中率 70%
    base = task_cost(rounds=30, ctx_k=100, out_k=8, hit_rate=0.70)
    print(f"单次作业(空闲时段)      : ¥{base:.2f}")
    print(f"一学期 16 次(空闲)      : ¥{base * 16:.1f}")
    print(f"一学期 16 次(高峰时段)  : ¥{base * 2 * 16:.1f}")

    # 同样的任务,但每轮改一次 system prompt,缓存全废
    worst = task_cost(rounds=30, ctx_k=100, out_k=8, hit_rate=0.0)
    print(f"缓存完全失效,一学期      : ¥{worst * 16:.1f}")
    print(f"缓存失效带来的额外支出    : +{(worst / base - 1) * 100:.1f}%")

跑出来的输出是:

复制代码
单次作业(空闲时段)      : ¥2.54
一学期 16 次(空闲)      : ¥40.6
一学期 16 次(高峰时段)  : ¥81.1
缓存完全失效,一学期      : ¥89.3
缓存失效带来的额外支出    : +120.1%

roundsctx_khit_rate 换成你自己 Agent 的真实观测值,就能知道你的月账单会落在什么位置。如果你手头没有观测数据,一个粗略的经验值是:编码类 Agent 稳定跑起来后缓存命中率通常在 70%~90% 之间;低于 50% 基本说明提示词构造有问题,值得优先排查上面列的四个反模式。


八、冷静视角:争议在哪,边界在哪

8.1 反方的核心论点:这是教育责任的转嫁

支持声之外,批评同样尖锐。评论人谷新光在一篇传播较广的文章里把它定性为"教育懒政与缺位",论证结构值得一读:

二十年前个人电脑不普及,一台 486 抵普通家庭半年收入,但没有老师会说"没有自己的电脑就退学" ------学校挤经费建机房,困难学生还能申请额外机时。十年前商业 IDE 授权、云服务器、数据库许可也不便宜,学校统一采购教育版授权、搭内部测试服务器、开放科研集群空闲资源。到了 AI 时代,几十块钱的 Token 反而成了学生自掏腰包的"入场券"。

他的关键论断是:问题的核心从来不是"贵不贵",而是"该不该由学生掏",以及教育成本转嫁的滑坡------今天接受几十块的 Token 自费,明天就能接受几百块的多模态额度,后天上千块的算力微调。

这段话里最锋利的一句是:"教育的公平性,从来不是按大多数人的承受能力算的,而是要看那个最困难的学生,能不能毫无障碍地获得同等的教育资源。"

8.2 我的判断:测算支持"成本可控",但不支持"责任可转移"

把两方观点和我的测算放在一起,立场其实可以拆开看:

在成本问题上,蒋炎岩是对的。 一学期 40 元的中位支出、100 元的安全垫,这个量级低于一本专业教材。以"增加经济负担"为由的批评,在数据上站不住。

在责任问题上,反方是对的。 我的测算反而强化了这一点------既然一学期总成本只有几十元,那"学校掏不起这笔钱"这个前提根本不成立。南大计算机学院完全有能力把这笔钱纳入实验耗材采购。成本越低,转嫁的正当性就越弱。这不是负担问题,是原则问题。

在教学问题上,双方都忽略了真正的变量。 争论集中在"谁付钱",但按第六节的杠杆排序,这门课真正稀缺的教学资源不是 Token,而是对上下文工程的系统训练------缓存复用、Loop 收敛、任务拆解。这些能力决定了同一个任务可以花 40 元也可以花 480 元,差距 12 倍,而它和钱包厚度毫无关系。

8.3 三个待观察的边界

  1. 口径会变。 DeepSeek 的分时定价是 2026 年才引入的机制,价格本身也在调整。本文所有数字绑定在 2026-09-02 的官方定价页上,一个学期后需要重算。
  2. 测算基于建模,不是真实账单。 我的 30 轮 × 100K 是典型值假设,学生真实使用强度的分布还没有公开数据。课程结束后如果能看到匿名化的实际消耗统计,"100 元够不够"这个问题才算真正有答案。
  3. "Token 困难可联系解决"是个人承诺,不是制度保障。 蒋炎岩明确表示有困难的学生可以找他,但这依赖教师个人,无法复制,也无法约束后来的开课者。把兜底机制写进制度,才是这次讨论最应该留下的东西。

总结

那句"没有 Token 的 CS 学生应立即退学"是课堂修辞,不是校纪------这门课不计分、只分通过与不通过,Projects 里甚至有一个"自动完成作业并伪造 git 记录"的作业帮帮,设计得比绝大多数课程诚实。

按官方定价实测,这门课一学期的 Token 支出中位数约 40 元 ,蒋炎岩建议的 100 元充值留了充足余量;但成本曲线很陡,重度场景叠加缓存失效可以烧到 480 元 。真正决定账单的不是"用多用少",而是缓存命中率------它和"交互轮数"一起,贡献了绝大部分的成本变动,而"少写点"的收益只有五分之一。

对已经在用 Agent 干活的工程师,这门课的讨论值得借鉴的不是"要不要自费",而是那张杠杆排序表:检查你的 system prompt 里有没有时间戳、工具定义顺序会不会每轮变、对话历史有没有被塞进 system 字段。 这三件事改完,成本通常能降四成。

对高校,真正的问题不是这笔钱谁出------几十块的量级根本不构成争议------而是能不能借这次讨论把 AI 课程的实验耗材保障机制立起来。新加坡国立和复旦已经这么做了。

下一步值得盯的是学期末的真实消耗数据。如果南大愿意公开匿名化的 Token 消耗分布,"100 元够不够一学期"这个被吵了上万楼的问题,才算有了确定的答案。


#生成式软件工程 #蒋炎岩 #deepseek-v4-flash #Token成本 #KVCache缓存命中 #上下文工程 #Agent成本控制 #AI课程改革

相关推荐
拿本唠嗑AI研究15 分钟前
当防御系统学会“说谎”:AI动态防御的终极形态构想
人工智能
世冠科技16 分钟前
精品方案 | AI×MBD:让模型驱动开发拥有“工程级智能”
人工智能
咖啡星人k16 分钟前
2026 Agentic RAG 实战:让 AI 学会“先想后查“,MonkeyCode 云端跑通
人工智能·机器学习
小白说大模型18 分钟前
AI 提示词专栏:Zero-Shot 与 One-Shot Prompt 的差别与适用场景
大数据·数据库·人工智能·sql·深度学习·prompt
学习日记52520 分钟前
第 3 章:三层记忆体系——把偏好变成项目资产
人工智能·ai·prompt
水上冰石24 分钟前
氛围编程:Java智能体开发实战
人工智能
东方-教育技术博主28 分钟前
数字人对话接口方案ASR(语音识别)+ LLM(大脑)+ TTS(语音合成)
人工智能·语音识别
超级赛博搬砖工30 分钟前
Reddit养号教程:2026Reddit环境搭建、养号流程与Karma提升完整攻略
人工智能