本讲目录

第 08 讲 · 让输出更好更稳:四个工程

诞生场景:2022 年底,几亿人突然拥有了一个强大但古怪的员工:它博学、快速、不知疲倦,但每次回答都带随机性、会一本正经地编造事实、记性只有一个对话框那么长、复杂任务走到一半会迷路。想把它从"聊天玩具"变成"可靠的生产力",靠的不是重新训练模型(那是实验室的事),而是在模型外面做工程。四年间,这套工程实践沿着一条清晰的路径演化:提示词工程 → 上下文工程 → 编排工程 → 循环工程——每一步都是为了解决前一步搞不定的问题。本讲把这条路径讲透,它也是理解下一讲(智能体、MCP、Skills)的地基。

RAG/上下文工程:检索→拼进上下文→生成的数据流。

图 8.1RAG/上下文工程:检索→拼进上下文→生成的数据流。

1. 先理解你的"员工":LLM 的三个物理性质

工程是针对材料特性的设计,先看清材料。

1. 输出是采样,不是查询。模型每一步给出的是下一个 token 的概率分布(第 07 讲),实际输出靠采样。温度 \(T\) 控制分布的尖锐度——把 logits 除以 \(T\) 再过 softmax:

\[ \mathbb{P}(w_i) = \frac{e^{z_i / T}}{\sum_j e^{z_j / T}} \]

\(T \to 0\) 退化为贪心(永远选最大概率,输出趋于确定但呆板);\(T\) 大则分布拉平(多样但混乱)。top-p 采样则只在累积概率前 \(p\) 的候选里采。工程含义:同一个问题问两遍,答案本来就可以不同——需要稳定输出的场合(分类、抽取)把温度调低、把格式钉死;需要创意的场合反之。

2. 幻觉是本性,不是 bug。模型的训练目标是"输出训练语料的文本"(第 07 讲的极大似然),不是"输出真话"。当它不知道答案时,损失函数曾奖励它给出"最像答案的答案"——于是编造的参考文献格式完美、编造的 API 用法看起来无比合理。对齐训练能缓解但无法根除。工程含义:关键事实必须在模型外部验证(第 14 讲展开)。

3. 上下文就是全部记忆。模型没有硬盘:权重冻结着训练时的知识(有截止日期),除此之外它只"知道"当前上下文窗口里的内容,对话关闭即失忆。且窗口有限(数万到百万 token),塞太满还会"变笨"。工程含义:你负责在每次调用时把该给的信息给全——这件事重要到催生了一个专门的工种,见第 3 节。

2. 提示词工程:把话说明白

Prompt engineering——通过设计输入文本来引导输出质量。GPT-3 发现 in-context learning(第 07 讲)后,"改输入"成了不训练模型就能"编程"模型的唯一手段。核心技法五条,每条都有明确的机理:

1. 把任务说完整:角色(你是谁)、任务(做什么)、约束(格式/长度/语言)、受众(写给谁看)。机理毫不神秘:LLM 在模拟"这段文本的合理延续",你给的设定越具体,它模拟的目标分布越窄,输出方差越小。

2. Few-shot 示例:给 2~5 个"输入→输出"范例再提问。对格式要求严格的任务(抽取、改写、打标签),一个好例子顶一百字描述——示例直接展示了目标分布的样本。

3. 思维链(Chain-of-Thought, CoT):要求"先一步步推理,再给答案"(Wei et al. 2022;zero-shot 版本只需加一句 "Let's think step by step")。为什么有效?回到第 06 讲的架构:Transformer 生成每个 token 的计算量是固定的(一次前向传播),要求直接报答案 = 要求一步算完多步问题;而"先写推理过程"让模型把中间结果写进上下文,后续步骤能"看见"前面的草稿——上下文成了外置的工作记忆,串行计算深度随生成长度线性增长。这也正是第 07 讲推理模型(o1/R1)的原理雏形:它们只是把"写很长的思维链"用强化学习练到了极致。

4. 自洽性(self-consistency):同一问题采样多条思维链,对最终答案投票。机理是朴素的概率论:若单次正确率 \(p > 0.5\) 且错误方式分散,多数投票的正确率随采样数上升(每条链的错误各不相同,正确答案却相同——方差被平均掉了,第 03 讲 bagging 的逻辑在推理上的重演)。

5. 给出口:明确允许"信息不足时回答不知道"。否则你等于强迫模型在"编一个"和"违抗指令"之间二选一,而它的训练偏向前者。

提示词的现实边界

提示词工程解决"单次调用说清楚"的问题,但它有天花板:说得再清楚,模型不知道的事它还是不知道(知识截止、私有数据),太长的任务它还是会迷路。前者引出上下文工程,后者引出编排与循环。"魔法咒语式提示词"("深呼吸""我给你小费")的收益随模型变强已趋近于零,把任务和材料交代清楚才是长期有效的部分。

3. 上下文工程:把料备齐

Context engineering——这个词 2024–2025 年间取代提示词工程成为行业主话语,重心转移标志着认识的深化:决定输出质量的首要因素,往往不是指令的措辞,而是上下文里有没有干活所需的信息。把 LLM 想成一位新来的、患顺行性遗忘症的天才同事:每次找他,你递过去的文件夹里有什么,他就只知道什么。

上下文窗口里通常装六类东西:系统提示(长期人设与规则)、对话历史、检索来的资料、工具调用的结果、少样本示例、当前问题。工程要点三条:

1. RAG(检索增强生成)——解决"模型不知道"的标准方案。私有文档、最新资讯不在训练数据里,就在回答前检索出来塞进上下文:

  1. 切块(chunking):把文档库切成几百 token 的段落;
  2. 向量化:用嵌入模型把每块变成向量(第 06 讲 word2vec 思想的段落版:语义相近 → 向量相近);
  3. 检索:把用户问题也向量化,按余弦相似度 \(\cos\theta = \frac{\langle u, v\rangle}{\|u\|\|v\|}\) 取最相近的 k 块(向量数据库负责在亿级块中快速近邻搜索);
  4. 重排(rerank):用更精细的模型对候选块二次排序,取精华入上下文;
  5. 生成时要求引用出处——幻觉的部分解药:答案有据可查。

2. 上下文不是越多越好。实验反复证实两个现象:lost in the middle(长上下文中间部分的信息,被利用的概率显著低于开头结尾)与上下文腐烂(对话拖得越长、塞入的无关信息越多,模型表现越差——旧的错误、跑偏的讨论都在污染后续每次生成)。对策:只放相关的,把关键信息放开头或结尾,长对话适时重开并带摘要迁移,把"已确认的结论"压缩后再续。

3. 上下文经济学。API 按 token 计费,且注意力的 \(O(n^2)\)(第 06 讲)让长上下文又慢又贵;prompt caching(前缀不变的部分缓存复用,价格约一折)改变了成本结构——把稳定内容(系统提示、文档)放前面、多变内容放后面,是省钱的结构设计。上下文是稀缺资源,"该给什么"与"不给什么"同等重要——这个约束到第 09 讲会再次出场,成为 Skills 设计"延迟加载"的直接动机。

4. 编排工程:把活拆开

单次调用有极限:让模型"一口气写一份 50 页的行业研报",效果必然平庸——任务太长、要求太多,注意力和篇幅都不够分。编排(orchestration / workflow)工程的思路:把大任务拆成多个小步骤,每步一次 LLM 调用(或普通代码),用确定性的程序骨架把它们接起来。

常用模式五种:

模式 结构 适用
链式(chaining) A 的输出 → B 的输入 → C…… 天然分阶段的任务:大纲→初稿→润色
路由(routing) 先分类,再分发给不同的专用提示词 客服(退款/技术/咨询各有专家提示)
并行(parallel) 同一输入多路同时处理再合并 多角度审稿、多文档分别摘要
生成-评审(generator–critic) 一个生成,另一个按清单挑错,打回重做 代码、译文、任何有质量标准的产出
Map-Reduce 分块各自处理(map),再汇总(reduce) 超长文档:逐章摘要后再总摘要

编排的精髓在于确定性骨架:流程、分支、重试、数据校验由普通代码负责(可靠、可测试、可调试),LLM 只出现在真正需要智能的节点上。每个节点做且只做一件事,输入输出格式钉死(JSON),于是每个节点可以单独测试、单独优化——软件工程的模块化纪律,原样适用于 LLM 系统

一个真实案例的骨架(一套每日财经资讯自动化管道):抓取 RSS(纯代码)→ 聚类去重(嵌入向量 + 算法)→ 实体抽取(规则)→ 主题分类(小模型,一次一小任务)→ 深度分析卡片(大模型 + 精心准备的上下文:近期事件 + 领域背景知识注入)→ 产出网页(纯代码)。注意 LLM 只在两个节点出现,且每个节点的提示词、上下文、输出格式都是独立设计和迭代的——这就是编排工程的典型形态。

5. 循环工程:让它自己跑

编排的前提是能预先画出流程图。但有些任务的路径没法预知——"帮我修好这个 bug":要先看报错,根据报错猜原因,读相关代码,改一下,跑测试,可能失败,再改……下一步做什么取决于上一步的结果。流程图画不出来,就把画流程图的权力交给模型自己——循环工程(agentic loop)

循环:
    1. 模型观察当前状态(任务目标 + 已收集的信息 + 上一步行动的结果)
    2. 模型思考并决定下一步行动(调用某个工具 / 宣布完成)
    3. 程序执行该行动,把结果追加进上下文
    直到:任务完成 / 达到步数上限 / 需要人类介入

这个"思考→行动→观察"的循环模式称为 ReAct(Reason + Act, 2022)。LLM 从"函数"升级成了"过程中的决策者"——这就是智能体(agent)的定义级特征,下一讲的主角。循环工程的核心关切恰恰是

四个工程至此连成一条线,每一步都是对前一步天花板的回应:

\[ \text{说明白(提示词)} \to \text{料备齐(上下文)} \to \text{活拆开(编排)} \to \text{自己跑(循环)} \]

自由度逐级上升,对可靠性工程的要求也逐级上升。行业的共识经验:能用编排解决的不要上循环(确定性流程更便宜、更可控、更好调试),循环留给真正无法预知路径的任务。

6. 界碑:工程还是训练?

最后厘清本讲的边界。改变模型行为有两条路:改输入(本讲的一切)和改权重(微调)。何时需要微调?——需要模型掌握大量无法塞进上下文的领域风格/术语体系、需要极致的延迟与成本优化(小模型微调后替代大模型)、或行为要求与通用模型的对齐冲突。除此之外,2026 年的默认答案是:先穷尽工程手段。工程迭代以分钟计、可回滚、可解释;训练以天计、烧钱、且每次基座模型升级你的微调资产就贬值一次。绝大多数"模型不行"的场景,真相是"上下文没给够"。

本讲小结

概念 一句话
材料特性 采样随机 + 幻觉本性 + 上下文即全部记忆
温度 logits 除以 \(T\) 再 softmax;稳定任务调低
提示词工程 角色/任务/约束/示例/给出口;把目标分布收窄
CoT 中间步骤写进上下文 = 外置工作记忆,串行深度随长度增长
自洽性 多链采样投票,bagging 式降方差
上下文工程 决定质量的是"料"而非"咒语";RAG、防中间迷失、防腐烂
编排工程 确定性骨架 + LLM 节点;五种模式;模块化纪律
循环工程 ReAct 循环;停机/恢复/验证/上下文压缩四件套
界碑 先穷尽工程再考虑微调

动手:跑 labs/lab08_prompt_engineering.py——用 DeepSeek API 做三组对照实验:零样本 vs 思维链在数学题上的准确率、温度对输出稳定性的影响、自洽性投票的收益曲线。用数据验证本讲的每个论断。

延伸阅读:Anthropic "Building Effective Agents"(2024,编排五模式的出处,行业公认最清醒的一篇);Wei et al. "Chain-of-Thought Prompting" (2022);Liu et al. "Lost in the Middle" (2023)。


下一讲:工程化让 LLM 稳了,但它还被关在文本的笼子里——不能查资料、不能跑代码、不能碰你的文件。给它装上"手"的过程,就是工具调用 → 智能体 → MCP → Skills 这条演化链,也是老师课程大纲里"AI 怎么一步步变得更强大、更通用"的答案。