第 5 章 · 第 24 讲 · 15:50
pm24-m5-播客.mp3(时长见集页)pm24-m5-播客.srt本集改编自小山学堂《学 AI 产品,从入门到精通》,音频为二次演绎配音版。音频讲主线与判断,文字稿给结构、清单和可复用的设计框架。
做 AI 产品的人大多把注意力放在「模型聪不聪明、回答好不好」上,很少算过一次对话到底花多少钱。而成本的结构和直觉不一样:它不是按用户说了几句话算的,而是按底层跑了多少轮、每轮带了多少内容算的。用户只发一句话,底层可能跑了 10+ 轮循环、产生几十条 API 消息。
这一集把这笔账拆开,再给出三套可直接使用的设计框架:上下文怎么压、记忆怎么管、提示词怎么分层。
对产品经理而言,这三件事全是取舍,没有标准答案——哪些内容能删、什么值得记住、工具描述要不要全给,都要由产品拍板,而一旦定错,返工代价远高于一开始想清楚。
上下文管理不是性能优化,是基本功,没有可选的余地。放任不管的产品会变得又贵又笨,而用户只会觉得「这东西越来越不好用」,说不出为什么。
| 层次 | 关键概念 | 它在回答什么 | 你该追问的问题 |
|---|---|---|---|
| 成本层 | 轮次、工具结果、上下文累积 | 一次对话花多少钱 | 成本大头在三类中的哪一类 |
| 压缩层 | 可删 / 可压 / 不可动 | 太长了怎么办 | 这条内容属于哪一类 |
| 记忆层 | 白板 vs 笔记本、守门员、冲突策略 | 什么该跨会话留下 | 记什么、怎么更新、怎么注入 |
| 提示词层 | 身份 / 环境 / 工具 / 行为四层 | 怎么组织系统提示词 | 改一层会不会影响其他层 |
| 加载层 | 按需加载、KV Cache 前缀稳定 | 怎么省 Token、提准确率 | 前缀里有没有会变的东西 |
读法两条。第一,自上而下是「越往下越省」:成本层暴露问题,压缩与记忆层解决当下,提示词与加载层决定长期可扩展性。第二,压缩层和记忆层是同一类思维:都是「判断什么有价值」,而不是「尽可能多留」或「尽可能多记」。
用户发一句话,底层可能跑 10+ 轮循环、几十条 API 消息。成本大头有三个来源:
| 来源 | 说明 |
|---|---|
| System Prompt | 每轮都要重复发送,轮次越多重复消耗越大 |
| Tool Results | 工具返回文本通常很长(整个文件内容、搜索结果…) |
| 上下文累积 | 后一轮要带上前面所有消息,滚雪球式增长 |
核心结论:成本随轮次指数增长而非线性——每一轮都要把之前所有内容重新发送给模型。用户每说一句话,账单上可能多了 10 美分。
为什么对话越长越笨:
全删不对,全留也不对。真正的答案是分三类:
| 类别 | 内容 | 处理 |
|---|---|---|
| 可以删 | 旧的工具调用结果、已处理完的中间步骤、重复的确认消息 | 直接删 |
| 可以压缩 | AI 的长篇回复、多轮讨论的结论、搜索 / 查询的详细结果 | 摘要压缩 |
| 不能动 | 用户的原始消息、System Prompt、关键的偏好设定 | 永不触碰 |
压缩优先级(从先到后):工具输出 → AI 回复 → 用户消息(不可删)。
AI 的输出可以摘要、工具结果可以截断,但用户的原话删了就回不来——而且用户一定会发现:「我明明说了 xxx,你怎么忘了?」
用户输入的每一句都承载着需求、偏好和上下文。一旦删除,丢失的不只是信息,更是用户的信任。宁可删 AI 自己说的 1000 字,也别动用户说的 10 个字。
| 维度 | 本地压缩 | LLM 压缩 |
|---|---|---|
| 原理 | 正则匹配、字符截断、模板替换 | 让另一个 LLM 读一遍后写摘要 |
| 成本 | 零(纯本地计算) | 要花钱(调用一次 API) |
| 延迟 | <1ms | 1~5 秒 |
| 效果 | 粗糙,可能丢关键信息 | 精准,能保留核心语义 |
| 适合 | 工具输出、JSON 结果、重复内容 | 多轮对话摘要、复杂上下文浓缩 |
正确顺序:先免费后花钱(流水线先后环节,不是二选一):
案例:用户让助手查北京到上海的高铁,一句话背后跑了 10 轮、用掉 4200 tokens。其中车次查询返回 15 条结果 800 字、座位查询返回 500 字 JSON、酒店搜索返回 600 字——而用户在意的只是最后那一句推荐。这 1900 字查完就再也不会看,是典型的「可以直接删」。
| 白板(上下文窗口) | 笔记本(长期记忆) | |
|---|---|---|
| 类比 | 开会时的白板,会议结束就擦 | 会议纪要,下次开会能翻出来 |
| 优势 | 随时可用、读写极快 | 跨会话保留、容量可扩展 |
| 代价 | 容量有限、对话结束即消失 | 需要写入决策、检索需额外步骤 |
常见误解:以为把上下文窗口开得足够大就等于有了记忆。不是的——窗口再大也是一次性的,对话结束就清空。真正的跨会话能力必须靠外部存储 + 检索,两套系统谁也替代不了谁。
记忆守门员:
| 值得记 | 不值得记 |
|---|---|
| 用户的偏好(喜欢 / 不喜欢) | 语气词(嗯、好的、哈哈) |
| 重要事实(生日、城市、职业) | 一次性问题(今天天气怎么样) |
| 长期习惯(早起、吃素、用某设备) | 纯闲聊(无具体信息量) |
| 明确表达的需求模式 | 已经过时的临时信息 |
如果什么都记,记忆库很快变成垃圾场。守门员比记忆力更重要。
记忆冲突的四种策略:
| 策略 | 适用 |
|---|---|
| 覆盖更新 | 信息有明确的新旧关系时 |
| 合并扩展 | 新旧信息互补时 |
| 标记冲突 | 无法确定谁对时(两条都留,等用户确认) |
| 跳过不存 | 信息不够确定时 |
记忆注入:全量注入(全部塞进 prompt)简单但贵且噪声多;推荐按需检索,每次只注入最相关的 3~10 条。
| 记忆条数 | 全量注入可行性 |
|---|---|
| 10 条 | 还行 |
| 100 条 | 又贵又吵 |
| 1,000 / 10,000 条 | 完全不可行 |
记忆的价值在于每次能拿出最相关的几条,记了多少条并不重要。好的记忆系统像一个称职的秘书:不会把整个档案柜搬到会议室,只会提前把今天需要的三份文件放在桌上。
① System Prompt 四层分层
| 层 | 回答什么 | 变化频率 |
|---|---|---|
| 身份层 | 我是谁?性格、角色、基本人设 | 几乎不变 |
| 环境层 | 现在什么情况?系统状态、用户上下文 | 每次会话可能不同 |
| 工具层 | 能用什么?可调用的工具和 API | 中等(随功能迭代增删) |
| 行为层 | 怎么行动?输出格式、决策规则、安全护栏 | 最高频 |
「一坨文本」的混乱写法把身份、环境、工具、行为全搅在一起——改一处可能影响全部,出了问题只能靠猜。
分层的四个好处:改一层不影响其他层;多人协作不冲突(产品改行为、工程师加工具、运营调人设);A/B 测试更精准(只替换行为层,变量单一);排查问题更容易(按层检查)。
② 按需加载工具
| Token 开销 | |
|---|---|
| 全量加载(100 个工具) | ~34,000 tk |
| 按需加载 | ~2,800 tk |
三步走:首轮只给名字列表 → 用到时再展开完整描述 → 用完就收回。
类比公司通讯录:不需要每个人的完整简历,只需要名字和职位。
③ Skill:可运营的 Prompt 模块
| 组成 | 内容 |
|---|---|
| 触发条件 | 什么情况下启用 |
| 允许的工具列表 | 白名单控制风险 |
| 执行流程 | 从头到尾的步骤,可带分支 |
| 输出格式要求 | 格式、长度、风格 |
为什么不直接写进 System Prompt:System Prompt 是全局的,改了影响所有场景;Skill 是按需加载的,只在特定场景注入,不污染其他任务;且 Skill 是独立文件,可单独版本管理,谁改了什么一目了然。文件即配置,改了就生效。
④ 提示词与缓存的微妙关系
KV Cache 规则极其简单:前缀一模一样就命中,差一个字就全部重算。
| 做法 | 结果 |
|---|---|
| System Prompt 含「当前时间: 14:35:22」 | 每秒指纹不同 → 永远 MISS → 每次从头算 |
| 时间放入 user message,System 保持固定 | 前缀不变 → 持续 HIT |
Skill 的注入方式也影响缓存:
不只是时间戳,所有动态注入到 System Prompt 的内容都是缓存杀手:Skill、用户 ID、Session 标记…任何会变的东西都不该出现在前缀里。
设计或迭代一个 Agent / 长对话产品时,按顺序过这九条:
以下约束来自本集原始素材,属于设计与承诺时的边界条件:
选一个最典型的用户任务,把底层跑了多少轮、每轮的输入输出 Token、工具返回各占多少,全部打点记录下来。这个动作一般会在第一次就带来惊喜——多数团队会发现成本大头不是用户输入,而是某一次返回了整页搜索结果的工具调用。归因做完,优化方向通常是明确的:给那个工具加返回长度限制,或者处理完立刻把原始结果从上下文里删掉。
不要笼统地说「上下文太长了就压缩」,而是把上下文里出现的每一类内容列成一张表,逐行标注可删、可压、不可动,并写明处理方式。这张表是压缩策略的核心交付物,也是和工程对齐的依据。写的过程中你往往会发现争议点——比如「AI 上一轮的思考过程到底能不能删」,这类争议必须在设计阶段解决,不能等线上出问题再补。
设计记忆功能时,先写「不值得记」的清单,再写「值得记」的清单。顺序很重要:不值得记的清单能立刻挡掉绝大部分噪声(语气词、闲聊、一次性问题),而剩下的自然就是有价值的。同时把四种冲突策略的适用条件写清楚,尤其是「标记冲突」——当新旧信息矛盾且无法判断谁对时,两条都留着等用户确认,远比自作主张覆盖要安全。
把现有的 System Prompt 拆成身份、环境、工具、行为四个独立部分,各自管理。拆分之后立刻做一次检查:身份层内容是否是长期不变的?会变的内容(时间、当前技能、用户 ID)是否都被移到了 System Prompt 之后?这一步做完,缓存命中率通常会有立竿见影的变化,而且后续迭代时改行为层不用再担心影响全局。
这五条的共同点:它们都在回答同一个问题——怎么让一次对话既便宜又可靠。答案不在模型里,在你对上下文、记忆和提示词的设计里。
来源:xueai.miyang.cn(小山学堂 · 洛小山《学 AI 产品,从入门到精通》)