第 4 章 · 第 21 讲 · 15:31
本内容改编自小山学堂《学 AI 产品,从入门到精通》,为二次演绎配音版。
来源 xueai.miyang.cn(小山学堂 · 洛小山)
这是 Harness 核心篇的收官集,解决一个非常具体也非常花钱的问题,人工智能产品的成本到底花在哪几层,每一层能用什么办法砍下来,砍到什么程度就该收手。
核心判断:成本不是事后优化项,而是架构决策的结果。系统设计定下来的那一刻,成本结构就基本定死了。课程里那句话说得很直白,在系统设计的初期就考虑这几层优化,比上线之后再优化容易十倍。这一篇把口播里点到为止的每一层,展开成可以直接拿去做评审的材料。
| 层级 | 解决什么 | 关键手段 | 量级参考 |
|---|---|---|---|
| 计费模型 | 钱从哪来 | 按输入词元计费,每轮重发全部历史 | 第 N 轮输入 = 系统提示词 + 前 N 减一轮问答 + 本轮问题 |
| 键值缓存 | 重复历史不重复算 | 缓存已算过的键值矩阵 | 五千词元系统提示词、一千轮对话后可省约八成总成本 |
| 显式缓存 | 保证命中 | 请求里加一行缓存控制标记 | 隐式折扣标准价百分之二十但不保证命中,显式折扣百分之十、命中率接近百分之百 |
| 固定前缀 | 让缓存不失效 | 系统提示词保持不变 | 动态时间戳可让命中率归零 |
| 图片词元 | 像素也在烧钱 | 按缩放对齐后尺寸计费 | 按任务匹配分辨率,词元数可差十到一百倍 |
| 语法层 | 不买格式 | 去掉加粗、缩进、冗余结构 | 格式性词元占百分之十三到二十 |
| 语义层 | 提高信息密度 | 动态示例、语义压缩、关键信息放首尾 | 提示词翻倍,计算量翻四倍 |
| 输出层 | 控制输出 | 负向约束、差异润色、停止序列 | 输出词元比输入贵三到五倍 |
| 模型选型 | 选对档位 | 任务难度 × 调用量 × 容错空间 | 叠加五层可降本七成到九成 |
能力地图的用法是先看行再看列。先看行,确认你现在的成本问题落在哪一层,不要一上来就改提示词措辞,那是最靠后的一层。再看列,确认这一层的手段是否真的落地了,尤其是显式缓存那一行,很多团队以为自己开了缓存,实际上一直挂着隐式缓存在跑。
模型按输入词元的数量计费,每一轮对话都要把之前所有的历史记录重新发给模型。历史越长,词元越多,费用越高。注意是每一轮都重发全部历史,不是只发新增的那一句。
具体到第十轮,输入是系统提示词加前九轮的所有问答再加本轮问题。也就是说到了第十轮,模型要把整段对话从头到尾重新读一遍,才能回答你这一句。用户感觉只是多问了一句,后台其实多付了九轮的钱。课程里专门做了一个费用模拟器,拖动轮次可以看到费用曲线,前面几轮几乎平着走,越往后抬得越快。
这也解释了很多对话产品的通病,聊到后面开始变慢、变贵,甚至答非所问。不是模型不行,是上下文在滚雪球。所以成本优化的第一步永远是看清楚,支出里有多少是真正必要的计算,有多少只是在为重复的历史付费。
原理:每轮对话模型都要对所有历史词元做注意力计算,键值缓存把已经算过的中间结果缓存下来,下一轮只计算新增的那几个词元。
类比:没有缓存,等于每次上课都从头默写一遍所有课本。有缓存,等于课本已经拍好存档,今天只看今天的新笔记。
量级:五千词元的系统提示词,在一千轮对话之后,键值缓存能省掉大约八成的总成本。由此得出一条可直接写进规范的结论,系统提示词越长,键值缓存越值钱;而让缓存命中的前提只有一条,系统提示词保持不变。
隐藏大坑:云端模型通常跑在多台推理服务器上,请求每次被随机路由到不同节点,那台节点上没有你的前文缓存,隐式缓存就永远未命中。课程给出的实际命中率低于百分之三十,意味着三分之一不到的请求真正享受到了折扣。
显式缓存:在请求里加一行缓存控制标记,平台会主动把请求路由到有缓存的节点,不再依赖随机分配,命中率接近百分之百。这里有个反直觉的地方,隐式缓存的折扣数字看起来更大,是标准价的百分之二十,显式缓存只有百分之十,但因为显式缓存几乎不会落空,实际省下来的输入成本接近九成。工程结论非常硬,生产环境必须用显式缓存,把省钱寄托在随机路由上,相当于靠运气省钱,既不可靠,也不专业。
一个小小的设计错误可以让键值缓存完全失效,每轮成本翻倍,这个错误就是在系统提示词里写动态时间。
很多人为了让模型知道现在几点,会在系统提示词里加一句当前时间是某年某月某日某时某分某秒。看起来很合理,结果是缓存命中率归零,因为系统提示词每一秒都在变,保持不变的前提被自己破坏了。课程里做了一个实时对比,左边是带动态时间戳的系统提示词,右边是静态的,两边每秒各发一次请求,跑一会儿就能看到左边的命中率一直是零,右边稳定在百分之百。
正确做法是把时间挪到用户消息里。系统提示词只写角色,时间作为方括号前缀跟在用户问题前面。这样系统提示词是固定的,缓存能一直命中,模型也依然拿到了时间。
常见的缓存杀手还包括随机会话标识、用户标识前缀、灰度测试变量、随机表情前缀、动态广告文案。判断标准就一句话,任何让系统提示词每次都不一样的内容,都会导致缓存完全失效。原则可以背下来,系统提示词等于固定前缀,所有动态的内容,时间、用户信息、带随机性的内容,统统放到用户消息里。
多模态模型不是按一张图计费,而是把图片切成像素块再换算成词元。计费公式是词元数等于缩放后的高乘缩放后的宽,除以每个词元对应的像素数,再加二。
容易被忽略的是缩放对齐机制。模型不按原图计费,而是按缩放对齐之后的尺寸算,超过上限就缩小,低于下限还会放大,最后还要对齐到三十二的整数倍。
这意味着两件事。第一,一张分辨率很低的图可能先被放大再计费,你以为省了,其实没省。第二,一张超高清大图会被压缩下去,多花的带宽和等待时间换不来任何效果提升。很多团队在这里犯的错误是前端直接把手机拍的原图传上去,一张图几兆,实际计费尺寸却早就被压缩到一个固定的格子,中间的传输成本和等待时间全白花了。
所以按任务匹配分辨率很重要。不同任务对细节的要求差很远,识别一张票据上的金额,和判断一张照片里有没有人,需要的分辨率完全不是一个量级。课程把任务分成高、中、低三档,每一档有推荐的分辨率区间,只要先想清楚这个任务到底要看见什么,就能落到对应的那一档。核心原则是,分辨率不是越高越好,用最低能满足任务需求的分辨率,词元数的差距可以达到十倍到一百倍。
语法层解决的是你在为格式付费。格式性词元最高能占到提示词的百分之十三到二十。你为了让提示词看起来专业而加的加粗符号、结构化数据的大括号、缩进和换行,模型并不需要,但每一个符号都要计费。课程给出了一组实测量级,某个提示词里加粗符号就吃掉了百分之八点五的词元,算上列表、标题和格式化缩进,整体格式性词元达到百分之十三。换算成钱就是,在千万级调用量下面,每个月有百分之二十的预算花在了让产品经理看着舒服这件事上。
所以有一句很扎心的话,提示词是写给机器的指令,不是给人看的文档。换成更紧凑的结构化格式,就能省下百分之十五到三十。当然也不用一刀切,要按用途选。给用户流式展示的,用可以增量解析的格式;后端程序消费的,用紧凑格式;文档和富文本展示的,用渲染友好的标记语言。
语义层解决的是信息密度,让每一个词元都有价值。这里还得配套回答上下文满了怎么办,课程给了三条溢出策略。截断简单直接,但早期信息永久丢失,适合短对话工具。摘要压缩是平衡之选,需要额外调用一次模型生成摘要,适合长期对话。语义检索最精准,需要向量系统支撑,词元消耗也最优。这三条不是三选一,而是按对话长度和信息重要性来配。
为什么不能无限往里塞内容,有两条理由。第一条是贵而且慢,注意力复杂度随长度呈平方级增长,提示词翻倍,计算量翻四倍。第二条更关键,效果会变差,模型对中间内容的注意力最弱,把关键信息塞在大段材料中间,它就容易被淹没。三个应对策略是动态选取示例、对长材料做语义压缩、把关键信息放在首尾。这一条和省钱其实是同一件事,密度上去了,词元少了,效果反而更好。
先记住一个比例,输出词元比输入词元贵三到五倍。同样的内容,让模型多说一百个字,比让它多读一百个字贵得多。所以控制输出就是控制成本,具体三个技巧,用负向约束明确告诉它不要什么,只让它润色差异而不是重写全文,以及设置停止序列让它该停就停。
然后是模型选型。公式是三个变量相乘,任务难度、调用量、容错空间。任务难但调用量小,用旗舰模型不心疼;任务简单但调用量巨大,就必须往下走;容错空间小的场景,省钱的余地本来就小,该花的钱不能省。课程里做了一张能力和成本的散点图,你会发现很多任务根本用不上最贵的那一档,真正拉开差距的是有没有把任务按难度分开,而不是一刀切给所有请求配同一个模型。这一刀切下去,就是那百分之二十的旗舰模型开销。
单一优化的效果有限,把五层叠起来才有意义。课程给出了优化前的成本构成,重复历史占百分之三十五,不必要的检索占百分之二十五,旗舰模型占百分之二十,真正必要的计算只占百分之二十。
对应的五层优化与收益分别是,键值缓存省百分之三十五,模型路由省百分之十二,检索过滤省百分之十八,历史压缩省百分之八,语义缓存省百分之七。叠在一起可以把整体人工智能成本压下来七成到九成。
这里最容易被忽略的是第二项和第三项。不必要的检索意味着你往上下文里塞了大量模型其实用不上的资料,它同时抬高了词元消耗和幻觉风险。模型路由则要求你在系统设计阶段就把请求分流做好,这件事上线后补非常痛苦。还是那句话,成本优化是架构设计,不是事后补救。
误区一,先改提示词再改架构。 提示词措辞是最后一层,量级通常在十几个百分点,而重复历史和模型档位是几十个百分点的量级。顺序搞反,就只能拿到零头。
误区二,以为开了缓存就等于在省钱。 隐式缓存在分布式架构下命中率可能低于三成,没有命中率埋点,你根本不知道自己省没省。
误区三,把动态内容塞进系统提示词。 一个时间戳就能让整条链路的缓存失效,而且这类问题在本地测试时几乎发现不了,因为单机环境天然命中。
误区四,图片越大越好。 分辨率不是越高越好,超过上限的部分既不计效果也不计价值,只会增加传输和等待。
误区五,优化越多越好。 迭代到第四轮开始画蛇添足,成本优化也一样。每一层都有工程复杂度,边际收益归零之后继续叠加,就是在给自己增加维护负担。
如果要在一到两周内把这条线理顺,可以按三步走。第一步是观测,先把命中率、输入词元、输出词元、每用户月成本四项埋点补齐,没有观测就没有优化。第二步是止血,把动态时间戳这一类缓存杀手清出系统提示词,把显式缓存开起来,把图片分辨率按任务降下来,这三项改动小、见效快。第三步才是架构,做模型路由和检索过滤,这需要排期,但收益量级也最大。
拿到账单先别急着改提示词。先把成本构成拆成四块,重复历史、不必要的检索、旗舰模型开销、必要计算,看清楚谁占大头再动手。绝大多数团队的第一刀应该砍在重复历史上,而不是在提示词措辞上抠字。
判断一个优化值不值得做,用这一句来拷问,这件事模型版本升级之后还需要吗。如果模型一升级就会被直接替代,或者用户完全感知不到提升,那它就是沉没成本,越早放弃越好。课程给的两条清单可以直接抄,值得做的是能拼成本效率效果、能被升级放大、能形成护城河、收益明确成本可控的;可以放弃的是消耗极大资源、会被升级替代、用户无感、边际收益趋近于零的。
每次用人工智能之前先问一句,这个答案我能验证吗。按这条线把任务分成四类,你懂模型也懂的放心用,你不懂模型可能懂的必须核查,你懂模型不懂的由你来投喂它,谁都不懂的别指望。这一条比任何技巧都重要,因为它决定你把判断权交出去多少。
收官这一句值得抄在墙上。一切方法归根到底都是为了构造更优质的上下文,让模型更准确地理解你的意图。上下文管理三个维度,质量、结构、成本,分别对应注入精准高密度的信息、把关键信息放对位置、用最少的词元传递最多的有效信息。终极问题只有一句,我现在给模型的上下文,是它做好这件事所需要的全部吗。
来源 xueai.miyang.cn(小山学堂 · 洛小山《学 AI 产品,从入门到精通》)