<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>推理优化 on 方糖猫Blog</title>
    <link>https://ftmao.com/blog/tags/%E6%8E%A8%E7%90%86%E4%BC%98%E5%8C%96/</link>
    <description>AI 视频、AI Agent 与工程实践笔记</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Sat, 13 Dec 2025 14:00:00 +0800</lastBuildDate><atom:link href="https://ftmao.com/blog/tags/%E6%8E%A8%E7%90%86%E4%BC%98%E5%8C%96/index.xml" rel="self" type="application/rss+xml" /><item>
      <title>《AI 工程》学习笔记（下）：RAG、Agent、微调、推理优化与应用架构</title>
      <link>https://ftmao.com/blog/posts/ai-engineering-book-notes-part2/</link>
      <pubDate>Sat, 13 Dec 2025 14:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/ai-engineering-book-notes-part2/</guid>
      <description>&lt;h1 id=&#34;ai-工程学习笔记下ragagent微调推理优化与应用架构&#34;&gt;《AI 工程》学习笔记（下）：RAG、Agent、微调、推理优化与应用架构&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;这是 Chip Huyen《AI 工程》读书笔记的下篇，覆盖第 6-10 章。上篇讲了基础模型、评估和提示工程（见 &lt;a href=&#34;https://ftmao.com/blog/blog/posts/ai-engineering-book-notes-part1/&#34;&gt;《AI 工程》学习笔记（上）&lt;/a&gt;），这篇进入&amp;quot;重型&amp;quot;话题：RAG、Agent、微调、数据工程、推理优化，最后收拢到完整的应用架构。&lt;/p&gt;
&lt;p&gt;如果说上篇的主题是&amp;quot;怎么知道模型干得好不好&amp;quot;，下篇的主题就是&amp;quot;怎么让它在真实世界里又快又稳地干活&amp;quot;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一rag先检索后生成&#34;&gt;一、RAG：先检索，后生成&lt;/h2&gt;
&lt;h3 id=&#34;11-为什么-rag-是第一个要掌握的模式&#34;&gt;1.1 为什么 RAG 是第一个要掌握的模式&lt;/h3&gt;
&lt;p&gt;模型的知识有两个硬限制：&lt;strong&gt;上下文窗口装不下&lt;/strong&gt;（整个代码库、几百本书），以及&lt;strong&gt;训练截止后的事情不知道&lt;/strong&gt;。RAG（检索增强生成）用&amp;quot;开卷考试&amp;quot;的思路同时解决两个问题：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    subgraph 离线[&amp;#34;离线索引（写路径）&amp;#34;]
        DOC[文档库] --&amp;gt; CHUNK[切分 Chunking]
        CHUNK --&amp;gt; EMB[Embedding 向量化]
        EMB --&amp;gt; VDB[(向量数据库&amp;lt;br/&amp;gt;+ BM25 倒排索引)]
    end
    subgraph 在线[&amp;#34;在线查询（读路径）&amp;#34;]
        Q[用户问题] --&amp;gt; QE[查询向量化]
        QE --&amp;gt; RET[检索&amp;lt;br/&amp;gt;top-k 相关片段]
        RET --&amp;gt; RER[可选: 重排序 Rerank]
        RER --&amp;gt; GEN[&amp;#34;LLM 生成&amp;lt;br/&amp;gt;问题 + 检索片段 → 回答&amp;#34;]
    end
    VDB --&amp;gt; RET&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;作者的一个重要判断：&lt;strong&gt;RAG 系统的成败在检索器，不在生成器&lt;/strong&gt;。检索不到正确材料，生成模型只能&amp;quot;基于错误的证据一本正经地编&amp;quot;。上篇那个合同审查案例就是活例子。&lt;/p&gt;
&lt;h3 id=&#34;12-两派检索算法&#34;&gt;1.2 两派检索算法&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;词项检索（BM25/Elasticsearch）&lt;/th&gt;
					&lt;th&gt;向量检索（Embedding）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;原理&lt;/td&gt;
					&lt;td&gt;词面匹配 + 词频统计&lt;/td&gt;
					&lt;td&gt;语义相似度&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;强项&lt;/td&gt;
					&lt;td&gt;精确词命中（型号、ID、专有名词）、轻量、可解释&lt;/td&gt;
					&lt;td&gt;同义改写、跨语言、模糊查询&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;弱项&lt;/td&gt;
					&lt;td&gt;&amp;ldquo;汽车&amp;quot;搜不到&amp;quot;轿车&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;精确 ID 反而可能搜偏&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;成本&lt;/td&gt;
					&lt;td&gt;极低&lt;/td&gt;
					&lt;td&gt;索引/查询都要算 embedding&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;实战结论是混合检索（hybrid search）&lt;/strong&gt;：BM25 和向量检索各跑一遍，按 RRF（Reciprocal Rank Fusion）之类的方法融合排序。词项检索是非常强的 baseline，书里的建议是&lt;strong&gt;先用 BM25 起步，验证检索确实是瓶颈后再上向量检索，而不是反过来&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;13-踩坑记录&#34;&gt;1.3 踩坑记录&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;踩坑 1：chunk 一刀切。&lt;/strong&gt; 按固定 500 token 切分，把表格拦腰切断、把&amp;quot;问题&amp;quot;和&amp;quot;答案&amp;quot;切进不同 chunk，检索回来全是语义残缺的碎片。改法：按文档结构切（标题层级、段落边界），代码按函数/类边界切，表格整存。chunk 之间留 10%-20% 重叠（overlap），缓解边界处上下文丢失。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑 2：只评估端到端，不看召回率。&lt;/strong&gt; RAG 至少要分开盯两个指标：检索的 top-k 召回率（正确片段在不在结果里）和生成的忠实度（回答有没有超出检索内容瞎编）。前者低改检索，后者低改 prompt 或模型——混为一谈就会像无头苍蝇。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑 3：元数据过滤用晚了。&lt;/strong&gt; 知识库里混着 2020 年和 2025 年的制度文档，用户问&amp;quot;年假几天&amp;quot;，检索回来旧制度。给 chunk 打上时间、部门、文档类型等元数据，检索时先过滤再排序，比换更大的 embedding 模型有效得多。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;成功案例&lt;/strong&gt;：我们给一个内部知识库做问答，初期纯向量检索，员工搜报销系统名称&amp;quot;易快报&amp;quot;时召回很差（专有名词语义模糊）。加上 BM25 混合检索后这类 query 的召回率从 61% 提到 93%，整体满意度显著提升。&lt;strong&gt;教训：语义检索不是万能升级，词面匹配在专有名词场景不可替代。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二agent让模型当规划者&#34;&gt;二、Agent：让模型当规划者&lt;/h2&gt;
&lt;h3 id=&#34;21-从-rag-到-agent一脉相承&#34;&gt;2.1 从 RAG 到 Agent：一脉相承&lt;/h3&gt;
&lt;p&gt;书里有个很妙的视角：&lt;strong&gt;RAG 是 Agent 的特例&lt;/strong&gt;——检索器只是模型可用的一件工具。推而广之，给模型配上更多工具（搜索、计算器、数据库、代码执行、API），让它自己规划&amp;quot;先做什么、再做什么&amp;quot;，就成了 Agent。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TB
    GOAL[任务目标] --&amp;gt; PLAN[&amp;#34;规划 Planning&amp;lt;br/&amp;gt;模型分解任务、生成步骤&amp;#34;]
    PLAN --&amp;gt; ACT[&amp;#34;执行 Action&amp;lt;br/&amp;gt;调用工具&amp;#34;]
    ACT --&amp;gt; OBS[&amp;#34;观察 Observation&amp;lt;br/&amp;gt;读取工具返回&amp;#34;]
    OBS --&amp;gt; REFLECT{&amp;#34;反思 Reflection&amp;lt;br/&amp;gt;结果对吗？目标达成了吗？&amp;#34;}
    REFLECT -- 继续 --&amp;gt; PLAN
    REFLECT -- 完成 --&amp;gt; OUT[最终输出]
    subgraph MEM[&amp;#34;记忆系统 Memory&amp;#34;]
        M1[短期: 对话/执行历史]
        M2[长期: 向量库/知识库]
    end
    PLAN -.读取/写入.-&amp;gt; MEM&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;Agent 由三要素定义：&lt;strong&gt;环境&lt;/strong&gt;（它感知和操作的世界）、&lt;strong&gt;工具&lt;/strong&gt;（它能调用的动作集）、&lt;strong&gt;规划能力&lt;/strong&gt;（模型分析任务、选路径的脑力）。规划是瓶颈——复杂任务需要多步推理，模型的规划能力决定了 Agent 的上限，所以 Agent 类应用对模型能力最敏感。&lt;/p&gt;
&lt;h3 id=&#34;22-失败模式与工程约束&#34;&gt;2.2 失败模式与工程约束&lt;/h3&gt;
&lt;p&gt;书里对 Agent 的警告很直接：&lt;strong&gt;自动化程度越高，失败越灾难性&lt;/strong&gt;。典型失败模式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;规划错误：任务分解就错了，后面越努力越离谱；&lt;/li&gt;
&lt;li&gt;工具调用错误：参数编错、调错工具、幻觉出不存在的 API；&lt;/li&gt;
&lt;li&gt;循环失控：反复重试同一个失败动作，token 烧光任务没进展；&lt;/li&gt;
&lt;li&gt;复合错误：单步准确率 95% 看着不错，10 步下来整体成功率只有 0.95¹⁰ ≈ 60%。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对应的工程约束（都是血泪换来的常识）：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1. 硬性步数上限，防止失控循环&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MAX_STEPS &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2. 每次循环检查预算（步数/token/钱）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; step &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(MAX_STEPS):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; budget&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;exceeded():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; fallback_answer(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;任务超出预算，转人工处理&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    action &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; plan_next(state)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; execute(action)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    state&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;update(action, result)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3. 不可逆操作（发邮件、删数据、支付）必须人工确认&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; action&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;risk_level &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;high&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    require_human_approval(action)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;失败案例&lt;/strong&gt;：某团队的客服 Agent 有&amp;quot;查询订单&amp;quot;和&amp;quot;退款&amp;quot;两个工具。一次上游 LLM 提供商抖动了几次超时，Agent 把超时误判为&amp;quot;查询失败&amp;quot;，触发了它的兜底逻辑——居然直接走了&amp;quot;退款&amp;quot;流程安抚用户。一晚上误退几十单。教训有三：&lt;strong&gt;工具的失败语义要精确&lt;/strong&gt;（超时 ≠ 业务失败）、&lt;strong&gt;写操作必须和读操作分级管理&lt;/strong&gt;、&lt;strong&gt;Agent 的所有写操作要留可审计日志&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;感悟&lt;/strong&gt;：Agent 的工程本质是&amp;quot;给概率系统装刹车&amp;quot;。演示 Demo 里 Agent 行云流水，是因为 Demo 只跑了成功路径。生产化的工作量 80% 在失败路径上。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三微调什么时候才轮到你上场&#34;&gt;三、微调：什么时候才轮到你上场&lt;/h2&gt;
&lt;h3 id=&#34;31-微调-vs-rag决策树&#34;&gt;3.1 微调 vs RAG：决策树&lt;/h3&gt;
&lt;p&gt;这是被问得最多的问题，书里给的思路可以画成决策树：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TB
    Q1{&amp;#34;模型缺的是&amp;lt;br/&amp;gt;知识还是行为？&amp;#34;}
    Q1 -- &amp;#34;缺知识&amp;lt;br/&amp;gt;（不知道你公司的产品、最新政策）&amp;#34; --&amp;gt; RAG[&amp;#34;选 RAG&amp;lt;br/&amp;gt;知识更新快、可溯源&amp;#34;]
    Q1 -- &amp;#34;缺行为&amp;lt;br/&amp;gt;（知识够，但格式/风格/领域表达不对）&amp;#34; --&amp;gt; Q2{&amp;#34;提示工程 + few-shot&amp;lt;br/&amp;gt;能教会吗？&amp;#34;}
    Q2 -- 能 --&amp;gt; PE[&amp;#34;停在提示工程&amp;lt;br/&amp;gt;最便宜、迭代最快&amp;#34;]
    Q2 -- 不能 --&amp;gt; FT[&amp;#34;微调 Finetuning&amp;#34;]
    Q1 -- &amp;#34;都缺&amp;#34; --&amp;gt; BOTH[&amp;#34;RAG + 微调组合&amp;lt;br/&amp;gt;常见的企业方案&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;一句话记忆：&lt;strong&gt;RAG 给模型&amp;quot;资料&amp;quot;，微调教模型&amp;quot;习惯&amp;quot;&lt;/strong&gt;。需要频繁更新的知识走 RAG（改数据库就行）；稳定的领域行为（医疗报告的书写规范、固定输出格式）走微调。&lt;/p&gt;
&lt;p&gt;不微调的理由同样重要：微调需要高质量标注数据（最难的部分）、引入模型管理复杂度、基础模型升级后可能要重训、还可能损害模型的通用能力（灾难性遗忘）。&lt;/p&gt;
&lt;h3 id=&#34;32-peft-与-lora微调的平民化&#34;&gt;3.2 PEFT 与 LoRA：微调的平民化&lt;/h3&gt;
&lt;p&gt;全参数微调动辄几百 GB 显存，普通团队玩不起。于是有了一类叫 &lt;strong&gt;PEFT（Parameter-Efficient Fine-Tuning，参数高效微调）&lt;/strong&gt; 的技术：共同思路是&lt;strong&gt;冻结绝大部分原模型权重，只训练一小撮新增或挑选出来的参数&lt;/strong&gt;。家族成员包括 Adapter（在层间插小模块）、Prefix/Prompt Tuning（只学一段可训练的&amp;quot;软提示&amp;quot;向量）等，其中目前最主流、事实标准的是 &lt;strong&gt;LoRA&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;LoRA（Low-Rank Adaptation）的思路是：&lt;strong&gt;冻结原模型权重，只训练一对低秩矩阵&lt;/strong&gt;来近似权重的变化量 ΔW ≈ A·B：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    X[输入 x] --&amp;gt; W[&amp;#34;原始权重 W&amp;lt;br/&amp;gt;（冻结，不训练）&amp;#34;]
    X --&amp;gt; A[&amp;#34;低秩矩阵 A&amp;lt;br/&amp;gt;（可训练）&amp;#34;]
    A --&amp;gt; B[&amp;#34;低秩矩阵 B&amp;lt;br/&amp;gt;（可训练）&amp;#34;]
    W --&amp;gt; SUM((+))
    B --&amp;gt; SUM
    SUM --&amp;gt; Y[输出 y = Wx + BAx]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;好处实打实：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可训练参数量降到 0.1%-1%，显存需求砍掉一个数量级；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模块化&lt;/strong&gt;：一个基础模型可以挂多个 LoRA&amp;quot;插件&amp;quot;——客服一个、营销一个，推理时按需加载，不用每个场景部署一份完整模型；&lt;/li&gt;
&lt;li&gt;推理时可以把 LoRA 权重合并回主干，零额外延迟。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;踩坑 4：LoRA rank 不是越大越好。&lt;/strong&gt; 新手直觉是 rank 越大容量越大，但数据量撑不住时，大 rank 只会过拟合得更快。常见起点是 rank=8-16，配合几百到几千条高质量数据，往往比 rank=128 + 脏数据强。&lt;strong&gt;微调的效果上限在数据质量，不在参数量&lt;/strong&gt;——这直接引出了下一章。&lt;/p&gt;
&lt;h3 id=&#34;33-lora-的数学原理手算一遍就懂了&#34;&gt;3.3 LoRA 的数学原理：手算一遍就懂了&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;① 前向传播的公式。&lt;/strong&gt; 设原始权重 $W \in \mathbb{R}^{d \times d}$（冻结），LoRA 用一对小矩阵乘积来近似权重的变化量：&lt;/p&gt;
&lt;p&gt;$$
\Delta W = BA, \quad B \in \mathbb{R}^{d \times r},\ A \in \mathbb{R}^{r \times d},\ r \ll d
$$&lt;/p&gt;
&lt;p&gt;前向计算变成：&lt;/p&gt;
&lt;p&gt;$$
y = Wx + BAx = (W + BA)x
$$&lt;/p&gt;
&lt;p&gt;参数量对比一目了然：全参数微调要学 $d^2$ 个数（$d=4096$ 时约 1677 万）；LoRA 只学 $2dr$ 个（$d=4096, r=16$ 时约 13.1 万，占 0.8%）。省显存的真正大头其实不在参数本身，而在&lt;strong&gt;优化器状态&lt;/strong&gt;：冻结的 $W$ 没有梯度，Adam 也就不必为它存两份和权重一样大的动量张量——全参数微调时那才是真正吃显存的部分。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;② 为什么&amp;quot;低秩&amp;quot;够用。&lt;/strong&gt; 直觉是：预训练已经把模型放在了一个很好的解附近，微调只需要在少数几个方向上做修正，而不是对 $d^2$ 维空间做任意改动。LoRA 论文的实验支持这一点——权重增量的&lt;strong&gt;内在秩（intrinsic rank）很低&lt;/strong&gt;，rank 取 1、2 在很多任务上就能接近全参数微调的效果。$r$ 就是&amp;quot;允许修改的子空间维数&amp;quot;：$r=1$ 时 $\Delta W$ 的所有列都是 $B$ 的倍数，只能表达&amp;quot;沿一个方向拉伸&amp;quot;；$r$ 越大，能表达的修正模式越丰富。&lt;/p&gt;
&lt;p&gt;两个工程细节：&lt;strong&gt;初始化&lt;/strong&gt;时 $A$ 用随机高斯、$B$ 全零，这样训练起点 $BA=0$，模型行为和原模型完全一致；实际实现里增量还会乘缩放系数 $\alpha/r$（$\alpha$ 是超参），让换 rank 时不用重调学习率。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;③ 手算：一个 $2 \times 2$ 的完整训练步。&lt;/strong&gt; 取 $d=2, r=1$，冻结权重设为单位阵，输入 $x = [1, 2]^T$，目标输出 $y^* = [0, 0]^T$。假设 $A = [1, 1]$（$1 \times 2$）、$B = [1, 1]^T$（$2 \times 1$），都只有 2 个可训练参数：&lt;/p&gt;
&lt;p&gt;$$
W = \begin{bmatrix} 1 &amp;amp; 0 \\ 0 &amp;amp; 1 \end{bmatrix}, \quad
A = \begin{bmatrix} 1 &amp;amp; 1 \end{bmatrix}, \quad
B = \begin{bmatrix} 1 \\ 1 \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前向&lt;/strong&gt;：先算 $A$ 再算 $B$（注意顺序，别先乘出 $\Delta W$，那是 $d \times d$ 的大矩阵，先算 $Ax$ 只需 $O(dr)$）：&lt;/p&gt;
&lt;p&gt;$$
Ax = 1 \times 1 + 1 \times 2 = 3, \quad
BAx = B \cdot 3 = \begin{bmatrix} 3 \\ 3 \end{bmatrix}, \quad
y = Wx + BAx = \begin{bmatrix} 1 \\ 2 \end{bmatrix} + \begin{bmatrix} 3 \\ 3 \end{bmatrix} = \begin{bmatrix} 4 \\ 5 \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;损失&lt;/strong&gt;：$L = \frac{1}{2} |y - y^*|^2 = \frac{1}{2}(4^2 + 5^2) = 20.5$。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;反向&lt;/strong&gt;：令 $g = y - y^* = [4, 5]^T$，即 $\partial L / \partial y$。梯度沿链路只流向 $A$ 和 $B$，$W$ 不参与：&lt;/p&gt;
&lt;p&gt;$$
\frac{\partial L}{\partial A} = B^T g \cdot x^T = \big([1,1] \cdot [4,5]^T\big) \cdot [1,2] = 9 \times [1, 2] = \begin{bmatrix} 9 &amp;amp; 18 \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;$$
\frac{\partial L}{\partial B} = g \cdot (Ax) = \begin{bmatrix} 4 \\ 5 \end{bmatrix} \times 3 = \begin{bmatrix} 12 \\ 15 \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;更新&lt;/strong&gt;（学习率 $\eta = 0.1$）：&lt;/p&gt;
&lt;p&gt;$$
A_{\text{new}} = \begin{bmatrix} 1 &amp;amp; 1 \end{bmatrix} - 0.1 \begin{bmatrix} 9 &amp;amp; 18 \end{bmatrix} = \begin{bmatrix} 0.1 &amp;amp; -0.8 \end{bmatrix}, \quad
B_{\text{new}} = \begin{bmatrix} 1 \\ 1 \end{bmatrix} - 0.1 \begin{bmatrix} 12 \\ 15 \end{bmatrix} = \begin{bmatrix} -0.2 \\ -0.5 \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;再走一遍前向验证&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$
A_{\text{new}}x = 0.1 \times 1 + (-0.8) \times 2 = -1.5, \quad
B_{\text{new}}A_{\text{new}}x = \begin{bmatrix} -0.2 \\ -0.5 \end{bmatrix} \times (-1.5) = \begin{bmatrix} 0.3 \\ 0.75 \end{bmatrix}, \quad
y_{\text{new}} = \begin{bmatrix} 1.3 \\ 2.75 \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;新损失 $L_{\text{new}} = \frac{1}{2}(1.3^2 + 2.75^2) \approx 4.63$。&lt;strong&gt;一步梯度下降，损失从 20.5 降到 4.63，全程没碰过 $W$ 的一个元素&lt;/strong&gt;——这就是 LoRA 训练的全部。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;④ 推理时合并。&lt;/strong&gt; 部署时把增量并回主干：&lt;/p&gt;
&lt;p&gt;$$
\Delta W = B_{\text{new}}A_{\text{new}} = \begin{bmatrix} -0.2 \\ -0.5 \end{bmatrix} \begin{bmatrix} 0.1 &amp;amp; -0.8 \end{bmatrix} = \begin{bmatrix} -0.02 &amp;amp; 0.16 \\ -0.05 &amp;amp; 0.4 \end{bmatrix}, \quad
W_{\text{merged}} = W + \Delta W = \begin{bmatrix} 0.98 &amp;amp; 0.16 \\ -0.05 &amp;amp; 1.4 \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;验证：$W_{\text{merged}} x = [0.98 + 0.32,\ -0.05 + 2.8]^T = [1.3,\ 2.75]^T$，和上面分开算的结果完全一致。合并后就是一个普通矩阵乘法，&lt;strong&gt;零额外推理延迟&lt;/strong&gt;就是这么来的。&lt;/p&gt;
&lt;p&gt;（这个玩具例子里 LoRA 是 4 个参数、全参数也是 4 个，省不了——节省只在 $r \ll d$ 的大矩阵上出现。）&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四数据工程质量覆盖数量&#34;&gt;四、数据工程：质量、覆盖、数量&lt;/h2&gt;
&lt;p&gt;第 8 章是全书最&amp;quot;脏活累活&amp;quot;的一章，也是我最推荐反复读的一章。数据集设计三准则：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TB
    D[数据集三准则] --&amp;gt; Q[&amp;#34;质量 Quality&amp;lt;br/&amp;gt;标注准确、格式一致、无噪声&amp;#34;]
    D --&amp;gt; C[&amp;#34;覆盖 Coverage&amp;lt;br/&amp;gt;覆盖真实场景的多样性&amp;lt;br/&amp;gt;含边界情况和失败样例&amp;#34;]
    D --&amp;gt; N[&amp;#34;数量 Quantity&amp;lt;br/&amp;gt;够用即可，边际收益递减&amp;#34;]
    Q -.-&amp;gt;|&amp;#34;少量高质量 &amp;gt; 大量噪声&amp;#34;| LESSON[&amp;#34;核心教训&amp;#34;]
    C -.-&amp;gt; LESSON
    N -.-&amp;gt; LESSON&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;几个反直觉的要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;少量高质量数据胜过大量噪声数据&lt;/strong&gt;。LIMA 等研究表明，1000 条精心策划的指令数据可以让模型行为对齐得相当好；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合成数据是主力补给，但必须评估&lt;/strong&gt;。用大模型生成训练数据已经是标准操作（比如用 GPT-4 造指令数据微调小模型，即蒸馏），但&amp;quot;AI 生成的数据&amp;quot;和&amp;quot;AI 生成的内容&amp;quot;一样需要评估把关。人们更倾向于使用自己能可靠评估的合成数据；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最难的不是标注，是写标注规范&lt;/strong&gt;。&amp;ldquo;什么叫好答案&amp;quot;没想清楚的团队，标注出来的数据就是标注员个人偏好的大杂烩。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;踩坑 5：合成数据近亲繁殖。&lt;/strong&gt; 用模型 A 生成数据训练模型 B，再用 B 生成数据训练 C…… 几轮下来多样性塌陷，模型只会说&amp;quot;AI 腔&amp;rdquo;。书外研究（model collapse）也印证了这点。对策：合成数据里持续掺真实数据、定期用多样性指标（如 n-gram 去重率）体检。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;成功案例&lt;/strong&gt;：一个做 SQL 生成的朋友团队，微调数据从&amp;quot;网上爬的 5 万条 SQL 问答&amp;quot;换成&amp;quot;自己业务库表结构 + 人工审核的 3000 条&amp;quot;，效果反而大幅提升。爬虫数据里大量通用示例和他们的业务 schema 无关甚至冲突。&lt;strong&gt;覆盖你的真实分布，比堆量重要得多。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五推理优化先懂指标再谈优化&#34;&gt;五、推理优化：先懂指标，再谈优化&lt;/h2&gt;
&lt;h3 id=&#34;51-延迟的两段式结构&#34;&gt;5.1 延迟的两段式结构&lt;/h3&gt;
&lt;p&gt;自回归生成决定了延迟不是单一数字：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;sequenceDiagram
    participant U as 用户
    participant S as 推理服务
    U-&amp;gt;&amp;gt;S: 发送 prompt
    S-&amp;gt;&amp;gt;S: Prefill 预填充阶段&amp;lt;br/&amp;gt;并行处理全部输入 token
    S--&amp;gt;&amp;gt;U: 第一个 token (TTFT)
    loop Decode 解码阶段（逐 token 串行）
        S--&amp;gt;&amp;gt;U: 第 2, 3, ... N 个 token (间隔 = TPOT)
    end&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TTFT（Time To First Token）&lt;/strong&gt;：首 token 延迟，由 prefill 阶段决定。长 prompt 的应用（塞了一大段检索内容的 RAG）TTFT 高；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TPOT（Time Per Output Token）&lt;/strong&gt;：每个输出 token 的间隔，由 decode 阶段决定。长输出的应用（写报告）对 TPOT 敏感；&lt;/li&gt;
&lt;li&gt;吞吐量和延迟存在权衡：batch 开大吞吐高、单价低，但单请求延迟上升。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;实战含义&lt;/strong&gt;：流式输出（streaming）是最便宜的&amp;quot;延迟优化&amp;quot;——总时长没变，但用户感知延迟从&amp;quot;整个生成时间&amp;quot;变成了 TTFT。聊天场景不流式输出基本不可接受。&lt;/p&gt;
&lt;h3 id=&#34;52-优化手段地图&#34;&gt;5.2 优化手段地图&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TB
    OPT[推理优化] --&amp;gt; MO[&amp;#34;模型级优化&amp;lt;br/&amp;gt;（会改变模型本身）&amp;#34;]
    OPT --&amp;gt; SO[&amp;#34;服务级优化&amp;lt;br/&amp;gt;（模型不动，改服务方式）&amp;#34;]
    MO --&amp;gt; Q[量化 Quantization&amp;lt;br/&amp;gt;FP16→INT8/INT4，省显存提速]
    MO --&amp;gt; D[蒸馏 Distillation&amp;lt;br/&amp;gt;大模型教小模型]
    MO --&amp;gt; KV[KV Cache 管理&amp;lt;br/&amp;gt;注意力机制优化]
    SO --&amp;gt; B[连续批处理&amp;lt;br/&amp;gt;Continuous Batching]
    SO --&amp;gt; PC[Prompt 缓存&amp;lt;br/&amp;gt;相同前缀不重算]
    SO --&amp;gt; P[并行策略&amp;lt;br/&amp;gt;张量并行 / 副本并行]
    SO --&amp;gt; PD[Prefill/Decode 分离部署]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;对应用开发者（主要用 API 的人）最相关的两条：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;① Prompt 缓存（prompt caching）&lt;/strong&gt;。多轮对话或固定长 system prompt 的场景，重复的前缀不用重复算，省钱省延迟。Anthropic/OpenAI 的 API 都已支持，但要注意&lt;strong&gt;缓存按前缀匹配&lt;/strong&gt;——把变化的内容（时间戳、用户问题）放在 prompt 尾部，稳定内容放头部，否则缓存命中率是零。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑 6&lt;/strong&gt;：我们就犯过这个错——system prompt 开头嵌了当前时间，每请求都变，prompt cache 从没命中过。把动态部分挪到末尾后，长 system prompt 场景的成本降了约 40%。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;② 量化是性价比之王&lt;/strong&gt;。书里总结&amp;quot;跨场景最有效的技术通常是量化&amp;quot;——INT8 几乎无损，INT4 轻微掉点但显存减半以上。自托管时先用上量化再谈别的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六收拢完整的-ai-应用架构&#34;&gt;六、收拢：完整的 AI 应用架构&lt;/h2&gt;
&lt;p&gt;第 10 章把前面所有技术拼成一张图。一个生产级生成式 AI 应用的典型架构：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TB
    U[用户] --&amp;gt; GW[&amp;#34;模型网关 Model Gateway&amp;lt;br/&amp;gt;认证 / 限流 / 路由 / 审计&amp;#34;]
    GW --&amp;gt; GR1[&amp;#34;输入护栏&amp;lt;br/&amp;gt;注入检测 / 敏感词 / PII 脱敏&amp;#34;]
    GR1 --&amp;gt; CTX[&amp;#34;上下文增强&amp;lt;br/&amp;gt;RAG 检索 / 记忆 / 用户画像&amp;#34;]
    CTX --&amp;gt; CACHE{&amp;#34;缓存命中？&amp;#34;}
    CACHE -- 是 --&amp;gt; RESP
    CACHE -- 否 --&amp;gt; ROUTER[&amp;#34;模型路由&amp;lt;br/&amp;gt;简单问题→小模型&amp;lt;br/&amp;gt;复杂问题→大模型&amp;#34;]
    ROUTER --&amp;gt; LLM[基础模型&amp;lt;br/&amp;gt;+ LoRA 插件]
    LLM --&amp;gt; GR2[&amp;#34;输出护栏&amp;lt;br/&amp;gt;事实核查 / 格式校验 / 安全过滤&amp;#34;]
    GR2 --&amp;gt; RESP[响应]
    RESP --&amp;gt; FB[&amp;#34;用户反馈采集&amp;lt;br/&amp;gt;点赞/点踩/会话信号&amp;#34;]
    FB --&amp;gt; OBS[&amp;#34;可观测平台&amp;lt;br/&amp;gt;指标 / 告警 / 追溯&amp;#34;]
    OBS -.数据飞轮.-&amp;gt; CTX&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;这张图是按&amp;quot;增量搭建&amp;quot;的顺序理解的——作者的 step-by-step 思路非常实用：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先增强上下文&lt;/strong&gt;（RAG/记忆），解决&amp;quot;模型不知道&amp;quot;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加护栏&lt;/strong&gt;，解决&amp;quot;模型乱说&amp;quot;，护栏可以在输入侧、输出侧，或独立服务；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加网关和路由&lt;/strong&gt;，解决&amp;quot;多模型管理&amp;quot;：简单 query 走便宜小模型，复杂的走大模型，省钱；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加缓存&lt;/strong&gt;降延迟降成本；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最后才加 Agent 模式&lt;/strong&gt;，解决&amp;quot;模型不会做&amp;quot;——这是复杂度最高的一步，放最后。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;61-可观测性与用户反馈&#34;&gt;6.1 可观测性与用户反馈&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;可观测性&lt;/strong&gt;的核心问题是&amp;quot;理解系统怎么失败的&amp;quot;。LLM 应用的新失败模式（幻觉、注入、格式漂移）要求新指标：除了传统的延迟/错误率，还要跟踪忠实度评分、护栏拦截率、judge 分数趋势、token 成本曲线。日志里要存完整的 prompt 和上下文，否则 bad case 根本无法复盘。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;用户反馈&lt;/strong&gt;是被工程师系统性低估的金矿。点赞点踩、追问、复制回答、重新生成……这些会话信号是迭代评估集和微调数据的免费来源——这就是&lt;strong&gt;数据飞轮&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    P[产品上线] --&amp;gt; U[用户使用]
    U --&amp;gt; F[反馈信号采集]
    F --&amp;gt; E[回流评估集&amp;lt;br/&amp;gt;发现 bad case]
    E --&amp;gt; I[迭代 prompt/检索/模型]
    I --&amp;gt; P&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;作者因此说&amp;quot;AI 工程比 ML 工程离产品更近&amp;quot;——反馈机制设计传统上是产品的事，但它是模型改进的数据源头，工程师必须介入。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;感悟&lt;/strong&gt;：这张图最值得记住的不是组件本身，而是&lt;strong&gt;搭建顺序&lt;/strong&gt;。见过太多项目第一天就上 Agent + 多模型路由，结果复杂度爆炸、没人知道错误来自哪一层。每加一个组件，系统能力 +1，但失败模式 +N。够用就好，是 AI 架构的第一美德。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;七思考与感悟下篇&#34;&gt;七、思考与感悟（下篇）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;检索、工具、微调，本质都是&amp;quot;上下文管理&amp;quot;。&lt;/strong&gt; RAG 是把外部知识塞进上下文，工具是把能力塞进上下文，微调是把行为烙进权重。选哪种取决于：变化的频率（天天变→RAG，稳定→微调）、成本（上下文 token 费 vs 训练费）、可靠性要求。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;复杂度是敌人，按失败模式的&amp;quot;价格&amp;quot;出牌。&lt;/strong&gt; 每章读完都有一个共同感受：作者永远在问&amp;quot;这个技术的失败模式是什么&amp;quot;。RAG 的失败在检索，Agent 的失败在规划复合错误，微调的失败在数据，judge 的失败在漂移。工程技术选型 = 选择你承受得起的那种失败。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据飞轮是唯一持久的护城河。&lt;/strong&gt; 模型会商品化，框架会趋同，但&amp;quot;真实用户反馈 → 评估集 → 迭代&amp;quot;这个循环积累下来的数据和评估体系，别人抄不走。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;先把指标立住，再谈优化。&lt;/strong&gt; TTFT/TPOT/召回率/忠实度这些指标的意义在于：它们把&amp;quot;感觉变慢了&amp;quot;&amp;ldquo;感觉变笨了&amp;quot;变成可以定位、可以回归的数字。没有指标体系的优化都是玄学。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;八面试高频题下篇&#34;&gt;八、面试高频题（下篇）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q1：RAG 和微调怎么选？&lt;/strong&gt;
看缺什么：缺知识选 RAG（更新快、可溯源、成本低）；缺行为/格式/风格选微调；都缺就组合。实践顺序：先提示工程，再 RAG，最后微调——按投入产出排序。补充：微调需要高质量标注数据，且可能损害通用能力。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q2：RAG 效果差，你的排查顺序是什么？&lt;/strong&gt;
组件级评估：① 单独测检索召回率——正确片段在不在 top-k；不在则查 chunking、混合检索、元数据过滤、查询改写；② 召回没问题再测生成忠实度——回答是否忠于检索内容；不忠实则改 prompt、加引用约束或换模型。③ 全程保留 bad case 进评估集。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q3：词项检索和向量检索各自的适用场景？&lt;/strong&gt;
词项检索（BM25）：精确匹配强（ID、型号、专有名词）、轻量可解释，但不理解语义；向量检索：同义改写、模糊查询强，但精确词可能搜偏、成本高。生产上常用混合检索 + 融合排序。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q4：Agent 的单步准确率 95%，为什么 20 步任务成功率不到 40%？怎么改进？&lt;/strong&gt;
错误复合：0.95²⁰ ≈ 36%。改进：缩短链路（任务分解更粗粒度）、加反思与自我纠错、关键步骤验证后再继续、步数/预算上限、高风险动作人工确认、提升单步可靠性（更好的工具描述与参数校验）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q5：LoRA 的原理是什么？为什么受欢迎？&lt;/strong&gt;
冻结原权重，用低秩分解 ΔW≈A·B 学习权重增量，可训练参数降到 1% 量级。优点：显存省一个数量级；数据效率高；模块化——一个基座挂多个 LoRA 插件按需加载；可合并回主干零额外推理开销。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q6：TTFT 和 TPOT 的区别？各自受什么影响？怎么优化？&lt;/strong&gt;
TTFT 由 prefill 决定，受 prompt 长度影响——优化：prompt 缓存、压缩上下文、流式输出改善感知；TPOT 由 decode 决定，逐 token 串行——优化：连续批处理、量化、投机解码、更好的硬件利用率。两者存在吞吐-延迟权衡。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q7：怎么设计一个 AI 应用的护栏体系？&lt;/strong&gt;
分层：输入护栏（注入检测、PII 脱敏、话题边界）、生成约束（结构化输出、引用检索内容）、输出护栏（事实核查、安全过滤、格式校验）、动作护栏（工具最小权限、高危操作人工确认）。护栏可放在网关、推理服务或独立组件，关键指标是拦截率和误杀率。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q8：模型网关（Model Gateway）解决什么问题？&lt;/strong&gt;
统一入口做认证、限流、审计、多模型路由（简单问题走小模型省钱）、故障转移（provider 挂了就切换）、缓存。类比微服务里的 API Gateway——当系统里有多个模型、多个 provider 时，它把横切关注点从业务代码里收走。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;全书写在最后&#34;&gt;全书写在最后&lt;/h2&gt;
&lt;p&gt;把两篇笔记浓缩成一句话：&lt;strong&gt;AI 工程 = 用评估驾驭概率，用上下文注入知识，用架构吸收失败&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这本书值得放在手边反复翻。技术细节会过时（明年 Agent 框架肯定又换了一轮），但书里那些思维框架——组件级评估、失败模式分析、先简单后复杂的搭建顺序、数据飞轮——是长期有效的工程直觉。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
