🧠 第十章 管理和部署
📄 一句话概括

同一套模板,资料从 1 段加到 8 段,粗估 token 从 108 涨到 503,是 4.7 倍; 而固定的那部分(模板、问题、要求)只有 65 个 token。钱主要花在资料上。

📝 本节和前面几节的关系

上一节把应用建出来了。这一节填它的「人格」——提示词。 同一个模型,提示词换一句写法,输出能差一个档次。

一、提示词的四段结构

角色:「你是 AI 训练师助手」。一句话定住语气和知识边界。 资料:这次回答可以依据的原文。这是检索的结果,不是你自己写的。 问题:用户的原话。注意别改写——改写会引入你的理解偏差。 约束:长度、格式、不许做什么。这一段最容易被省略,也最影响可用性。 四段里最该写死的是约束里的这两句:「资料里没有就说不知道」 和 「不要编造数字」。 为什么?因为模型的默认行为是「尽量给一个答案」。 你不明确禁止,它就会拿先验知识补上,而且补得很自信。 这类错误比「答不出」危害大得多——用户没法分辨哪句有依据、哪句是编的。

二、提示词不是越长越好

很多人第一反应是「多写点,把各种情况都覆盖」。 结果写了两千字,模型反而抓不住重点——它和人类一样,长指令里前面的话会被后面的淹没。 经验值:一个业务型应用的主提示词控制在 300 字以内,把边界情况交给「如果……就……」的短句, 不要写成长段落。 真正需要长篇的是少样本示例(给两三个问答样例)。 但示例很贵,每个示例都可能上百 token,所以一般只给最典型的两个。 宁可少写,也不要写互相矛盾的规则。 「回答要简洁」和「解释要详细」同时出现,模型只能随机挑一个执行,输出会不稳定。

三、实测:token 花在资料上

Demo 用同一套模板填三种规模的资料:1 段、2 段、8 段。 粗估 token 分别是 108、156、503。资料从 1 段加到 8 段,token 涨 4.7 倍。 而固定的那部分——模板、问题、要求——只有 65 个 token 左右。 也就是说成本的大头从来不是你精心雕琢的那几句指令,是你塞进去的资料。 所以「知识库塞越多越好」是错的:塞多了不仅贵,还会稀释真正相关的信息。 模型要从一堆不相关段落里挑出有用的,效果反而下降。这就是后面讲知识库检索时要控制 top-k 的理由。 token 数是粗估:中文按一字一 token、其他按四字符一 token。 沙箱里没装 tiktoken,做不了精确分词。真实分词器对中文的切法更细,误差通常在 ±20% 以内。 所以这个数只能比量级,不能拿来算钱。

四、三种写坏了的提示词

太短:「你是一个助手,回答用户问题。」——等于没写。模型会用默认人格,语气、长度、格式全随机。 太啰嗦:两千字的长文,各种「请注意」「务必」「一定要」。规则一多就会互相打架,输出反而不稳定。 示例过多:塞了十个问答样例,把上下文占满,真正要回答的资料反而被挤出去。 这是最隐蔽的一种——提示词看起来特别用心,效果却最差。 改进的办法是只改一处、跑一遍固定测试集。 和调超参数一样,一次动一个变量,否则你不知道是哪个改动起了作用。

五、动手 Demo:提示词渲染:资料八段时 token 涨到 4.7 倍

写一个含四个占位符的模板(角色、资料、问题、约束),分别填 1 段、2 段、8 段资料渲染出完整提示词; 统计字数、按「中文一字一 token、其他四字符一 token」粗估 token 数,再算它占 4096 上下文的百分比。

tpl = (u"你是{角色}。\n只能依据下面的资料回答……\n"
       u"资料:\n{知识}\n用户问题:{问题}\n要求:{约束}")
txt = tpl.format(角色=..., 知识=kb, 问题=q, 约束=...)

zh = sum(1 for c in txt if u"\u4e00" <= c <= u"\u9fa5")
tok = zh + (len(txt) - zh) / 4.0

实跑输出:

--------------------------------------------------------------------
提示词:资料从 1 段加到 8 段,token 涨到 4.7 倍
--------------------------------------------------------------------
  资料规模   渲染后字数   粗估 token   占 4096 上下文
  --------------------------------------------------
  1 段资料       125 字          108             2.6%
  2 段资料       183 字          156             3.8%
  8 段资料       548 字          503            12.3%

  资料从 1 段加到 8 段,token 从 108 涨到 503,是 **4.7 倍**。
  **提示词的成本和延迟主要花在资料上,不在你写的那几句指令上。** 固定的那部分(模板、问题、要求)只有 65 个 token 左右。
  所以「知识库塞越多越好」是错的:塞多了不仅贵,还会稀释真正相关的信息——模型要从一堆不相关段落里挑,效果反而下降。这就是后面讲知识库检索时要控制 top-k 的理由。

  token 数是**粗估**:中文按一字一 token、其他按四字符一 token。沙箱里没装 tiktoken,做不了精确分词。真实分词器对中文的切法更细,数字和符号的切法也不同,误差通常在 ±20% 以内。所以这个数只能用来比较量级,不能用来算钱。

三种规模分别是 125 字、183 字、548 字,粗估 108、156、503 个 token。 占 4096 上下文的比例从 2.6% 涨到 12.3%。 4.7 倍这个涨幅值得记:它意味着如果每次检索都塞八段资料,单次成本是塞一段的四倍多。 一天一万次调用,差别就是实实在在的钱。 固定部分只有 65 个 token 左右。所以优化提示词本身省不下什么,要省钱只能优化「塞多少资料」。 粗估方法要说清:中文一字一 token 是近似,真实分词器会把「训练师」切成两个 token、 也可能把常用双字词合成一个。误差在 ±20% 以内,只够判断量级。

30 秒实验

  1. 把约束那一段从一句话扩成五句,看固定部分的 token 涨多少。
  2. 给模板加两个问答示例,看 token 涨多少、值不值。
  3. 想一想:为什么「资料里没有就说不知道」这句必须显式写进提示词?

常见误区

  1. 「提示词越长越专业」——规则一多就互相打架,输出反而不稳定。
  2. 「多给示例效果一定更好」——示例占上下文,会把资料挤出去。
  3. 「模型会自己判断资料够不够」——不显式禁止,它就会拿先验知识编。
自测三问(点开对答案) 1. 提示词的四段结构是什么? —— 角色、资料、问题、约束。最该写死的是「不知道就说不知道」和「不要编造数字」。 2. 为什么成本主要花在资料上? —— 固定的模板和指令只有几十个 token,资料每多一段就是上百 token。 3. 提示词里的规则为什么不能太多? —— 规则之间容易互相矛盾,模型只能随机挑一个执行,输出不稳定。

提示词定住了它怎么说话。下一步定它有多「敢说」——模型参数。

相关笔记