南大 AI 课 Token 自费:用缓存命中率算一学期账单
关键词:生成式软件工程、蒋炎岩、deepseek-v4-flash、Token 成本、KV Cache 缓存命中、上下文工程、Agent 成本控制
目录
- 一、导语:一句课堂狠话,和一份没人细看的定价表
- 二、先把事实和传言分开:课件没告诉你的两件事
- [2.1 官方课程页上两个被忽略的细节](#2.1 官方课程页上两个被忽略的细节)
- [2.2 这不是孤例:AI 必修课正在全球同步铺开](#2.2 这不是孤例:AI 必修课正在全球同步铺开)
- [三、Token 到底贵在哪:先摆官方定价表](#三、Token 到底贵在哪:先摆官方定价表)
- 四、实测:把整个代码库塞进上下文要多少钱
- 五、真正烧钱的不是代码库,是上下文乘以轮数
- [六、"不要 Tokenmaxxing" 的精确技术含义](#六、“不要 Tokenmaxxing” 的精确技术含义)
- 七、动手:给自己算一笔账
- 八、冷静视角:争议在哪,边界在哪
- 总结
一、导语:一句课堂狠话,和一份没人细看的定价表
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 循环里最常见、也最致命的反模式有这几个:
- 在 system prompt 里插时间戳或随机数。每轮都变,缓存全废,成本直接 +120%。
- 每轮动态重排工具定义的顺序。很多框架会按相关性排序工具列表,这个"智能"优化会把缓存从头打碎。
- 把对话历史塞进 system prompt 而不是 messages 数组。历史在增长,前缀就永远不稳定。
- 中途切换模型或改温度参数。换模型的瞬间缓存全部作废。
反过来说,"不要 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%
把 rounds、ctx_k、hit_rate 换成你自己 Agent 的真实观测值,就能知道你的月账单会落在什么位置。如果你手头没有观测数据,一个粗略的经验值是:编码类 Agent 稳定跑起来后缓存命中率通常在 70%~90% 之间;低于 50% 基本说明提示词构造有问题,值得优先排查上面列的四个反模式。
八、冷静视角:争议在哪,边界在哪
8.1 反方的核心论点:这是教育责任的转嫁
支持声之外,批评同样尖锐。评论人谷新光在一篇传播较广的文章里把它定性为"教育懒政与缺位",论证结构值得一读:
二十年前个人电脑不普及,一台 486 抵普通家庭半年收入,但没有老师会说"没有自己的电脑就退学" ------学校挤经费建机房,困难学生还能申请额外机时。十年前商业 IDE 授权、云服务器、数据库许可也不便宜,学校统一采购教育版授权、搭内部测试服务器、开放科研集群空闲资源。到了 AI 时代,几十块钱的 Token 反而成了学生自掏腰包的"入场券"。
他的关键论断是:问题的核心从来不是"贵不贵",而是"该不该由学生掏",以及教育成本转嫁的滑坡------今天接受几十块的 Token 自费,明天就能接受几百块的多模态额度,后天上千块的算力微调。
这段话里最锋利的一句是:"教育的公平性,从来不是按大多数人的承受能力算的,而是要看那个最困难的学生,能不能毫无障碍地获得同等的教育资源。"
8.2 我的判断:测算支持"成本可控",但不支持"责任可转移"
把两方观点和我的测算放在一起,立场其实可以拆开看:
在成本问题上,蒋炎岩是对的。 一学期 40 元的中位支出、100 元的安全垫,这个量级低于一本专业教材。以"增加经济负担"为由的批评,在数据上站不住。
在责任问题上,反方是对的。 我的测算反而强化了这一点------既然一学期总成本只有几十元,那"学校掏不起这笔钱"这个前提根本不成立。南大计算机学院完全有能力把这笔钱纳入实验耗材采购。成本越低,转嫁的正当性就越弱。这不是负担问题,是原则问题。
在教学问题上,双方都忽略了真正的变量。 争论集中在"谁付钱",但按第六节的杠杆排序,这门课真正稀缺的教学资源不是 Token,而是对上下文工程的系统训练------缓存复用、Loop 收敛、任务拆解。这些能力决定了同一个任务可以花 40 元也可以花 480 元,差距 12 倍,而它和钱包厚度毫无关系。
8.3 三个待观察的边界
- 口径会变。 DeepSeek 的分时定价是 2026 年才引入的机制,价格本身也在调整。本文所有数字绑定在 2026-09-02 的官方定价页上,一个学期后需要重算。
- 测算基于建模,不是真实账单。 我的 30 轮 × 100K 是典型值假设,学生真实使用强度的分布还没有公开数据。课程结束后如果能看到匿名化的实际消耗统计,"100 元够不够"这个问题才算真正有答案。
- "Token 困难可联系解决"是个人承诺,不是制度保障。 蒋炎岩明确表示有困难的学生可以找他,但这依赖教师个人,无法复制,也无法约束后来的开课者。把兜底机制写进制度,才是这次讨论最应该留下的东西。
总结
那句"没有 Token 的 CS 学生应立即退学"是课堂修辞,不是校纪------这门课不计分、只分通过与不通过,Projects 里甚至有一个"自动完成作业并伪造 git 记录"的作业帮帮,设计得比绝大多数课程诚实。
按官方定价实测,这门课一学期的 Token 支出中位数约 40 元 ,蒋炎岩建议的 100 元充值留了充足余量;但成本曲线很陡,重度场景叠加缓存失效可以烧到 480 元 。真正决定账单的不是"用多用少",而是缓存命中率------它和"交互轮数"一起,贡献了绝大部分的成本变动,而"少写点"的收益只有五分之一。
对已经在用 Agent 干活的工程师,这门课的讨论值得借鉴的不是"要不要自费",而是那张杠杆排序表:检查你的 system prompt 里有没有时间戳、工具定义顺序会不会每轮变、对话历史有没有被塞进 system 字段。 这三件事改完,成本通常能降四成。
对高校,真正的问题不是这笔钱谁出------几十块的量级根本不构成争议------而是能不能借这次讨论把 AI 课程的实验耗材保障机制立起来。新加坡国立和复旦已经这么做了。
下一步值得盯的是学期末的真实消耗数据。如果南大愿意公开匿名化的 Token 消耗分布,"100 元够不够一学期"这个被吵了上万楼的问题,才算有了确定的答案。
#生成式软件工程 #蒋炎岩 #deepseek-v4-flash #Token成本 #KVCache缓存命中 #上下文工程 #Agent成本控制 #AI课程改革