<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>LLM on Chico's Tech Blog</title><link>https://realtime-ai.chat/categories/llm/</link><description>Recent content in LLM on Chico's Tech Blog</description><image><title>Chico's Tech Blog</title><url>https://github.com/chicogong.png</url><link>https://github.com/chicogong.png</link></image><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 18 May 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://realtime-ai.chat/categories/llm/index.xml" rel="self" type="application/rss+xml"/><item><title>2026 大模型选型:别问「哪个最强」,问「哪个够用」</title><link>https://realtime-ai.chat/posts/llm-selection-2026/</link><pubDate>Mon, 18 May 2026 10:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/llm-selection-2026/</guid><description>2026 年大模型选型不该看跑分排名。这篇给一套按场景选型的决策框架:能力梯队、推理成本、延迟、上下文、闭源开源、私有化部署,附决策流程图。</description><content:encoded><![CDATA[<p>去年我们一个内部项目,用 Claude Opus 跑一个意图分类:输入一句用户的话,输出三个标签之一。上线两周,有人去看账单,愣住了——这个分类任务,一个 14B 的开源模型在自己的卡上跑,效果差不了几个点,成本是它的几十分之一。</p>
<p>这就是 2026 年选型最常见的错误:<strong>把&quot;哪个模型最强&quot;当成了&quot;我该用哪个模型&quot;。</strong></p>
<p>这两个问题根本不是一回事。GPQA、SWE-bench、ARC-AGI-2 这些榜单告诉你的是天花板,而你大部分的线上请求,离天花板远着呢。一个分类、一段摘要、一次格式化抽取——这些活儿,旗舰模型是高射炮打蚊子。选型不是选最强,是给<strong>每一类任务</strong>配一个&quot;刚好够用、且最便宜&quot;的模型。</p>
<p>这篇不排名。给你一套按场景拆的决策框架。</p>
<h2 id="先认清2026-年的模型是分梯队的">先认清:2026 年的模型是分梯队的</h2>
<p>2026 年 5 月,前沿模型大概是这么个格局——记住具体版本号意义不大,它们每两三个月就跳一次,记住<strong>梯队</strong>就行:</p>
<table>
  <thead>
      <tr>
          <th>梯队</th>
          <th>代表模型(2026.05)</th>
          <th>典型 API 价格(输入/输出,每百万 token)</th>
          <th>该干什么</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>旗舰</td>
          <td>GPT-5.5、Claude Opus 4.7、Gemini 3.1 Pro</td>
          <td>$5 / $25 量级</td>
          <td>复杂推理、Agent 编排、难代码</td>
      </tr>
      <tr>
          <td>主力</td>
          <td>Claude Sonnet 4.6、Gemini 3 Flash、DeepSeek V4-Pro</td>
          <td>$1–3 / $3–15 量级</td>
          <td>绝大多数生产任务</td>
      </tr>
      <tr>
          <td>快而省</td>
          <td>Claude Haiku 4.5、Gemini 3 Flash-Lite、DeepSeek V4-Flash</td>
          <td>$0.1–1 / $0.3–5 量级</td>
          <td>分类、抽取、路由、简单问答</td>
      </tr>
  </tbody>
</table>
<p>这张表里藏着一个关键事实:<strong>旗舰和&quot;快而省&quot;之间,输出价格差了几十倍。</strong> DeepSeek V4-Flash 的输出大约 $0.28,GPT-5.5 是 $30——一百多倍。这个差距不是边角料,它会直接决定你的产品能不能规模化。</p>
<p>而梯队之间的<strong>能力</strong>差距,这两年反而在缩小。2024 年你能明显感觉到旗舰和主力不是一个物种;2026 年,在很多具体任务上,主力模型只比旗舰差几个百分点,有时候你压根测不出来。能力在收敛,价格还拉得很开——这就是&quot;按梯队选型&quot;能省钱的根本原因。</p>
<p>所以第一条原则:<strong>默认从主力梯队起步,只在它确实顶不住时才往上抬。</strong> 不要反过来,从旗舰往下砍——那样你永远不知道下面那一档是不是早就够了。</p>
<h2 id="维度一能力够不够要按任务类型问">维度一:能力够不够,要按&quot;任务类型&quot;问</h2>
<p>&ldquo;够用&quot;不是一个模糊的感觉,它可以拆。把你的任务大致归到三类:</p>
<p><strong>确定性任务</strong>——分类、实体抽取、格式转换、敏感词过滤。这类任务有标准答案,对错可量化。结论很直接:<strong>用快而省梯队,甚至小开源模型。</strong> 旗舰在这里没有任何优势,它多出来的&quot;智商&quot;在一个三选一的分类题上无处发挥。我前面说的那个翻车案例,就是这一类。</p>
<p><strong>生成与改写任务</strong>——写文案、做摘要、客服话术、翻译。这类没有唯一答案,但对&quot;质量&quot;敏感。主力梯队是甜区。值得一提:Claude 系列在中长文写作上的语感明显更自然,一次能稳定输出十几万 token 不塌;如果你的产品核心就是&quot;写得像人&rdquo;,这个差异值得你多花那点钱。</p>
<p><strong>推理与 Agent 任务</strong>——多步代码、需要调工具、长链路规划、&ldquo;自己想办法完成&rdquo;。这是 2026 年唯一<strong>真的需要旗舰</strong>的地方。一个 Agent 要连续做二三十步,每一步的小错误会累积,中间某一步判断失误,后面全废。这种场景下,旗舰多出来的几个点,放大到整条链路就是&quot;能跑通&quot;和&quot;跑不通&quot;的区别。GPT-5.5、Claude Opus 4.7 这一档,贵有贵的道理——但前提是,你的任务真的是 Agent,而不是被包装成 Agent 的一次性问答。</p>
<p>一个实操建议:<strong>别用一个模型扛所有任务。</strong> 成熟的做法是按任务路由——一个便宜模型做分流和简单活儿,难的才转交旗舰。这比&quot;全程旗舰&quot;省一大笔,也比&quot;全程便宜&quot;靠谱。</p>
<h2 id="维度二成本不是单价是单价--调用量--输出长度">维度二:成本不是单价,是「单价 × 调用量 × 输出长度」</h2>
<p>很多人看 API 价格,只瞄一眼那个&quot;每百万 token 多少钱&quot;。这是不够的。真正的账是三个数相乘:</p>
<ul>
<li><strong>单价</strong>——尤其是<strong>输出</strong>单价,通常是输入的 3 到 5 倍,而且 Agent 类任务输出占比高。</li>
<li><strong>调用量</strong>——一天一千次还是一千万次,差四个数量级。</li>
<li><strong>平均输出长度</strong>——让模型&quot;先想再答&quot;(reasoning)能提质量,但思考链本身也是要付费的 token。</li>
</ul>
<p>把这三个乘起来,你常会得到一个反直觉的结论。举个例子:一个日活几万的客服机器人,绝大多数对话是&quot;查物流&quot;&ldquo;改地址&quot;这种,真正复杂的咨询可能只占 5%。如果你全程用旗舰,等于为了那 5% 的复杂场景,给 95% 的简单场景也付了旗舰价。把 95% 切到主力或快省梯队,月成本可能直接砍掉七八成,用户一点感知都没有。</p>
<p>两个几乎免费、却经常被忘掉的省钱手段,务必用上:</p>
<ul>
<li><strong>Prompt Caching(提示缓存)</strong>——固定不变的前缀(system prompt、长文档、few-shot 例子)缓存住,命中后这部分输入便宜约 90%。多轮对话、RAG、批量同模板任务,收益巨大。</li>
<li><strong>Batch(批处理)</strong>——不要求实时返回的任务,走批处理接口,普遍五折。离线打标、夜间报表、内容审核这类活儿,没理由不用。</li>
</ul>
<p>记住:<strong>选型省下的钱,常常比换一个&quot;更便宜的模型&quot;省得还多。</strong> 因为它省的是结构性的浪费。</p>
<h2 id="维度三延迟上下文被场景一票否决的硬约束">维度三:延迟、上下文——被场景一票否决的硬约束</h2>
<p>有些维度不参与&quot;性价比&quot;的权衡,它们是<strong>门槛</strong>:不过线,这个模型直接出局,多强多便宜都没用。</p>
<p><strong>延迟。</strong> 如果你做的是实时语音对话,用户说完到 AI 出声的预算只有几百毫秒(这个我在<a href="../voice-technology/voice-latency-budget/">上一篇</a>里专门拆过)。这种场景,你要盯的是<strong>首 token 延迟(TTFT)</strong>,不是模型聪不聪明。一个慢半拍的旗舰,体验上输给一个快的主力模型。反过来,如果是离线批处理,延迟根本不在你的考虑范围里——这时候为&quot;快&quot;付的溢价就是纯浪费。</p>
<p><strong>上下文长度。</strong> 2026 年长上下文已经不稀缺:Gemini 3.1 Pro 和 DeepSeek V4 都是 1M token 窗口,Llama 4 甚至把 10M 带进了开源世界。但<strong>有窗口不等于会用</strong>。把 50 万 token 一股脑塞进去,模型对中间段落的注意力会明显下降——业内说的 &ldquo;lost in the middle&rdquo; 没有消失。所以长上下文是个二元的资格题:你的单次任务真需要塞进一整本书、一个大代码库,那 1M 窗口是硬指标;如果你的输入本来就几千 token,纠结谁的窗口更大毫无意义,<strong>该花力气的是 RAG 的检索质量,而不是模型的窗口数字。</strong></p>
<p>判断方法很简单:<strong>先问&quot;这个场景能不能容忍 X&rdquo;,不能就直接划掉一批模型,再在活下来的里面比性价比。</strong> 别把硬约束和软偏好混在一起算。</p>
<h2 id="维度四闭源还是开源2026-年这道题变简单了">维度四:闭源还是开源,2026 年这道题变简单了</h2>
<p>两年前这是个艰难抉择,因为开源模型确实差一截。2026 年不一样了。</p>
<p>DeepSeek V4-Pro 在 SWE-bench Verified 上能摸到 80% 出头,和顶级闭源模型只差零点几个点,而且是 MIT 许可证。Qwen 3.5 / 3.6、Llama 4 也都在各自的领域逼近前沿。<strong>开源和闭源的能力差距,现在是用单个 benchmark 上的几个点来衡量,不再是&quot;差一代&quot;。</strong> 同时,主流开源模型现在发布即附带官方量化版本(Q4/Q5/Q8),部署门槛大幅下降。</p>
<p>所以这道题的判据,从&quot;谁更强&quot;变成了别的:</p>
<ul>
<li>选<strong>闭源 API</strong>:你要的是省心。不碰 GPU、不管扩缩容、要最新最强、出了事有人兜底。绝大多数从 0 到 1 的产品,该走这条路——你的精力应该花在产品上,不是运维推理集群。</li>
<li>选<strong>开源</strong>:你有三个理由之一——量足够大(自己跑的边际成本能把闭源 API 打下去)、需要深度微调(让模型长出领域知识)、或者数据不能出门(下一节细说)。</li>
</ul>
<p>还有个容易被忽视的点:<strong>开源是一份保险。</strong> 用闭源 API,你绑定了对方的定价、限流和模型下线节奏——它说某个版本退役,你就得连夜迁移。把一部分负载放在能自己掌控的开源模型上,是对供应商风险的对冲。</p>
<h2 id="维度五要不要私有化部署这题先于选模型">维度五:要不要私有化部署——这题先于选模型</h2>
<p>如果你的数据是病历、银行流水、未公开的财报、核心代码——<strong>这一条会推翻上面所有结论。</strong> 它不是一个性价比维度,它是法律和信任的红线。</p>
<p>判断私有化部署需求,问三个问题:</p>
<ol>
<li><strong>数据能不能离开你的网络?</strong> 受监管的医疗、金融、政务,答案常常是&quot;不能&quot;。</li>
<li><strong>合规要求审计闭环吗?</strong> 欧盟 AI 法案 2026 年 8 月全面生效,高风险系统要求可追溯、可解释、有人类监督。这些在一个黑盒 API 后面很难自证。</li>
<li><strong>数据主权有没有硬约束?</strong> 某些行业、某些地区,要求推理全程在境内、在自有设施内完成。</li>
</ol>
<p>只要有一个答案指向&quot;必须自己掌控&quot;,那就<strong>只能选能私有化的开源模型</strong>——Qwen、Llama、DeepSeek 这一类,把权重下载下来,跑在自己的 VPC 或机房里。这时候&quot;GPT-5.5 更强&quot;是一句正确的废话,因为它根本不在你的候选集里。</p>
<p>要提醒的是,私有化不是&quot;省钱&quot;的同义词。算上 GPU 采购或租赁、运维、扩缩容、安全加固,<strong>很多时候它比 API 更贵。</strong> 选它的理由是控制权和合规,不是成本。如果你既没有合规硬约束、量也撑不起一个推理集群,却因为&quot;感觉更安全&quot;去自建,那大概率是给自己挖坑。</p>
<h2 id="把这套框架连起来">把这套框架连起来</h2>
<p>选型不是从一张排行榜里挑第一名,而是带着你的场景,依次过几道闸门:</p>
<pre class="mermaid">flowchart TD
  A[一个具体任务] --> B{数据能否出本网络?}
  B -- 不能/强合规 --> P[私有化部署<br/>开源模型: Qwen / Llama / DeepSeek]
  B -- 可以 --> C{任务类型?}
  C -- 确定性<br/>分类·抽取·路由 --> D[快而省梯队<br/>Haiku / Flash-Lite / 小开源模型]
  C -- 生成改写<br/>文案·摘要·翻译 --> E[主力梯队<br/>Sonnet / Flash / DeepSeek V4-Pro]
  C -- 推理 Agent<br/>多步·调工具·规划 --> F[旗舰梯队<br/>GPT-5.5 / Opus 4.7 / Gemini 3.1 Pro]
  D --> G{有延迟或上下文硬约束?}
  E --> G
  F --> G
  G -- 有 --> H[在满足约束的模型里<br/>重新筛一遍]
  G -- 没有 --> I[按规模决定<br/>闭源 API or 自建开源]
</pre><p>注意几个细节。<strong>第一道闸是数据合规,不是能力</strong>——合规一票否决,放在最前面,免得你比了半天性价比最后发现这个模型根本不能用。任务类型决定的是<strong>梯队</strong>,不是具体型号——型号每季度都变,梯队的逻辑稳定得多。延迟和上下文是<strong>筛选器</strong>,不是打分项——它们只负责把不合格的划掉。最后才轮到闭源还是开源,而这一步<strong>主要由调用量决定</strong>:量小走 API,量大到自建更划算时,再考虑迁。</p>
<h2 id="最后">最后</h2>
<p>2026 年大模型这块,缺的从来不是好模型,缺的是&quot;清楚自己要什么&quot;。</p>
<p>榜单天天有人更新,排名天天有人吵,但你的客服机器人需要的可能只是一个稳定、便宜、够快的主力模型;你的代码 Agent 才真的吃旗舰那几个点的智商;你的合规系统压根不在公开榜单的讨论范围里。</p>
<p>把&quot;哪个最强&quot;这个问题放下。换成一串具体的问题:这个任务是什么类型?能容忍多少延迟?一天调用多少次?数据能不能出门?——这几个问题答完,该选哪个,基本也就清楚了。</p>
<p>选型的功夫,九成在想清楚需求,一成在看模型。顺序别搞反。</p>
]]></content:encoded></item><item><title>RAG、微调、长上下文:2026 年到底选哪个</title><link>https://realtime-ai.chat/posts/rag-finetune-longcontext/</link><pubDate>Sun, 17 May 2026 10:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/rag-finetune-longcontext/</guid><description>RAG、微调、长上下文是给模型补知识的三条路。这篇拆开各自的真实成本、维护代价和时效性,讲清楚什么时候该选哪个,结尾给一张决策流程图。</description><content:encoded><![CDATA[<p>先说一个反直觉的数字:<strong>80% 喊着「我们要微调」的需求,换个更好的检索就解决了。</strong></p>
<p>这是 2026 年做过几轮项目后,业内基本形成的共识。但凡你想让一个通用大模型「答对你自己的事」——公司的产品文档、内部规章、某个客户的历史订单——你大概率会在三条路里纠结:<strong>RAG</strong>(检索增强)、<strong>微调</strong>、<strong>长上下文</strong>(直接把材料塞进 prompt)。</p>
<p>这三条路经常被拿来对比,但很多对比都在装中立,列个表说「各有优劣,看场景」。这篇不装。它们不是平级的选项,<strong>它们解决的根本不是同一个问题</strong>。选错那条,代价不是「效果差一点」,而是要么每个月烧掉本不该烧的钱,要么半年后你的数据全过期、整个系统没人敢碰。</p>
<h2 id="它们到底各自在解决什么">它们到底各自在解决什么</h2>
<p>把这件事想清楚,后面就不纠结了。</p>
<ul>
<li><strong>RAG</strong>:模型不知道答案,你<strong>临时把答案找出来递给它</strong>。模型本身不变,变的是每次喂给它的上下文。</li>
<li><strong>微调</strong>:你<strong>改的是模型本身的权重</strong>。让它换一种说话方式、固定输出某种格式、养成某种行为习惯。</li>
<li><strong>长上下文</strong>:你<strong>不做检索、不做训练</strong>,直接把所有相关材料一次性塞进 prompt,让模型自己在里面找。</li>
</ul>
<p>注意区别:RAG 和长上下文都是在「给模型补知识」,区别只是补的方式——一个精挑细选地补,一个一股脑全塞。而<strong>微调压根不是在补知识,它在补能力和行为</strong>。这是最常见的认知错位:有人想让模型「记住公司有 300 条规章」,跑去微调,结果训完发现模型还是答不准,因为微调不是用来塞事实的。</p>
<p>一句话记牢:<strong>知识用 RAG,行为用微调,长上下文是知识量小到不值得搭管道时的偷懒办法。</strong></p>
<h2 id="rag知识会变要溯源就选它">RAG:知识会变、要溯源,就选它</h2>
<p>RAG 是 2026 年绝大多数团队的默认起点,理由很硬:它便宜、上线快,而且能干那件最常见的事——让模型回答关于你自家数据的问题。</p>
<p>它的真正杀手锏是另外两个:</p>
<p><strong>知识能随时更新。</strong> 产品改了价、规章出了新版,你只要更新向量库里那几条,模型下一秒就用新的了。不用重训、不用重新部署。对任何一个数据会变的业务,这一条几乎是决定性的。</p>
<p><strong>答案能溯源。</strong> 模型说「退款政策是 7 天」,你能指着它后面挂的那条文档说「依据在这」。金融、医疗、法律这类场景,「答得对」还不够,你得能证明它<strong>为什么</strong>这么答。微调和长上下文都给不了这种可追溯性——微调把知识熬进了权重里,你根本说不清它从哪学的。</p>
<p>但 RAG 不是免费午餐,2026 年的现实是:<strong>当 RAG 出错,73% 的锅在检索,不在生成。</strong> 模型没胡说,是你压根没把对的文档捞给它。所以现代 RAG 早就不是「embedding + 余弦相似度」那么简单了,一条能上生产的管道长这样:</p>
<pre class="mermaid">flowchart LR
  A[文档] --> B[语义切块]
  B --> C[向量库]
  D[用户提问] --> E[混合检索<br/>向量 + BM25]
  C --> E
  E --> F[Rerank<br/>取 Top 5-10]
  F --> G[LLM 生成]
</pre><p>几个关键点,踩过坑的都懂:</p>
<ul>
<li><strong>切块是默默崩掉 RAG 的地方。</strong> 切得太碎,一个 chunk 答不全一个问题;切得太大,塞进去全是噪音。语义切块(按 embedding 相似度找话题边界)比固定字数切块靠谱得多。</li>
<li><strong>混合检索基本是标配了。</strong> 纯语义检索会漏掉「精确匹配」——比如某个型号编号、某个专有名词。把向量检索和 BM25(关键词)拼起来,准确率明显更稳。</li>
<li><strong>Rerank 是那勺秘制酱。</strong> 先用混合检索捞 100 条候选,再用一个 cross-encoder 重排序模型(Cohere Rerank、BGE-Reranker 这类)精筛出 5-10 条真正喂给大模型。这一步加上,系统会从「有时有用」变成「能上生产」。</li>
</ul>
<p>代价是:你得维护一整套数据管道——切块、embedding、向量库、rerank,每一环都能出问题。RAG 上线快,但<strong>养着它不轻松</strong>。</p>
<h2 id="微调改的是行为不是知识">微调:改的是行为,不是知识</h2>
<p>如果你的痛点是这些,那才轮到微调:</p>
<ul>
<li>模型语气不对——你要它像个严谨的客服,它偏要活泼。</li>
<li>输出格式不稳——你要它每次都吐严格的 JSON,它三次里有一次加段废话。</li>
<li>某种固定行为——特定领域的术语习惯、固定的处理流程、某类问题的标准应对。</li>
</ul>
<p><strong>这些 RAG 救不了。</strong> 你没法靠「检索」让模型改性格。微调改的是模型权重本身,它学的是「怎么说」「按什么格式说」「遇到这类输入该怎么反应」,不是「记住哪些事实」。</p>
<p>2026 年微调内部其实分三种,选哪种取决于你要改多深:</p>
<table>
  <thead>
      <tr>
          <th>方式</th>
          <th>改什么</th>
          <th>成本</th>
          <th>什么时候用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>LoRA / QLoRA</td>
          <td>加一层薄薄的「适配器」,基座权重不动</td>
          <td>极低</td>
          <td>绝大多数场景的默认选择</td>
      </tr>
      <tr>
          <td>全量微调</td>
          <td>动整个模型的所有权重</td>
          <td>高,要大显存、长时间</td>
          <td>改动极深、且有海量高质量数据</td>
      </tr>
      <tr>
          <td>偏好对齐(DPO)</td>
          <td>用「好答案 vs 坏答案」的成对数据校行为</td>
          <td>中等</td>
          <td>微调完之后再「精修」价值取向</td>
      </tr>
  </tbody>
</table>
<p><strong>LoRA / QLoRA 是 2026 年的事实默认。</strong> LoRA 只训练总参数量的 0.1%–1%,却能拿回全量微调 90%–95% 的效果。QLoRA 再加上 4-bit 量化,显存需求砍掉约 75%——一张 A100 80GB,大概 6 小时、十几美元,就能在 5 万条样本上微调完一个 8B 模型。这个成本低到,微调不再是大厂专属了。</p>
<p><strong>全量微调</strong> 2026 年反而成了少数派选择。除非你的改动深到 LoRA 那层适配器装不下,而且你手里有海量高质量数据,否则没必要——花十倍的钱,换那 5%–10% 的边际效果,多数时候不划算。</p>
<p><strong>DPO 已经基本取代了传统 RLHF</strong> 来做对齐。它更便宜、更稳定,效果相当。典型用法是「微调之后的精修」:先用 LoRA 把基本能力训出来,再用 DPO 拿成对偏好数据校一遍「这种答法好、那种不好」。</p>
<p>微调最反直觉的一条:<strong>数据质量碾压数据数量。1000 条手工精挑的样本,经常打得过 10 万条带噪声的。</strong> 学习率给个参考——普通 LoRA/QLoRA 从 2e-4 起步,DPO 这类强化学习类的要小得多,5e-6 左右。</p>
<p>微调真正的代价不在训练那几个小时,在<strong>之后</strong>:基座模型升级了,你的适配器要不要跟着重训?业务行为变了,数据要重新标、模型要重新跑。微调是一笔<strong>持续的维护承诺</strong>,不是训完就完事。</p>
<h2 id="长上下文知识量不大时最省事的那条">长上下文:知识量不大时,最省事的那条</h2>
<p>2026 年的上下文窗口已经大得有点离谱了:</p>
<ul>
<li><strong>Gemini 3 Pro</strong> 标准 1M–2M token,实验档摸到了 10M。</li>
<li><strong>GPT-5.2</strong> 支持到 400K。</li>
<li><strong>Claude Sonnet 4</strong> 给到 tier 4 的组织开了 1M beta(标准档 200K)。</li>
<li><strong>Llama 4 Scout</strong> 标称 10M。</li>
</ul>
<p>窗口大到这份上,一个很自然的想法冒出来:<strong>还要 RAG 干嘛?把所有文档一股脑塞进去不就完了?</strong></p>
<p>知识量真的小,这招确实成立。你只有一份 50 页的产品手册,与其搭一整套切块、向量库、rerank 的管道,不如直接把整份手册塞进 prompt。零维护、零基建,模型还能看到全局上下文,不会因为「检索只捞了相关那几段」而丢掉跨章节的关联。原型阶段,长上下文几乎永远是最快的验证方式。</p>
<p>但它有两个绕不过去的硬伤:</p>
<p><strong>第一,标称窗口 ≠ 可用窗口。</strong> 这是最大的误区。一个模型标 200K,不代表它在 200K 上还好用。RULER 这类基准反复验证:<strong>模型的有效容量通常只有标称值的 60%–70%</strong>。还有那个老问题「迷失在中间」(lost in the middle)——材料放在 prompt 开头和结尾时模型找得最准,夹在中间 10%–50% 深度的内容,准确率明显塌方。2026 年各家表现也不一样:Claude Sonnet 4 在 200K 全程的衰减能压在 5% 以内,GPT-5.2 在 256K 内保持接近满分的检索,而 Gemini 3 Pro 一过 128K 在多目标检索上就掉得挺快。你塞进 1M token,别真指望它每个角落都看得清。</p>
<p><strong>第二,贵。而且是规模化之后致命地贵。</strong> 你每问一个问题,那一大坨上下文就要重新算一遍 token 钱。在规模上,长上下文比 RAG 或微调贵 20–24 倍。更糟的是计费门槛:OpenAI 超过 272K token 之后单价翻倍,Gemini 超过 200K 翻倍。原型阶段长上下文很香,<strong>生产高并发场景它会把你账单点着</strong>。</p>
<p>所以长上下文的定位很清楚:<strong>知识量小、又不想搭基建,就用它;一旦知识量大起来、或者要扛量,老老实实回去做 RAG。</strong></p>
<h2 id="别再二选一了2026-年是分层">别再二选一了:2026 年是分层</h2>
<p>把这三条路当成单选题,是最常见的错。</p>
<p>2026 年那些真正做出好产品的团队,没有谁在「选一个」。他们在<strong>分层叠加</strong>:<strong>RAG 负责事实,微调负责风格、策略和决策行为。</strong> 一个典型的成熟架构是——一个不算大的基座模型,挂一层薄薄的 LoRA 适配器把语气和格式调到位,再配一套 RAG 管道实时喂事实。微调和检索不是互相替代,是各管一段。</p>
<p>落地的推进顺序也有共识,别跳步:</p>
<p><strong>Prompt → RAG → 微调 → 蒸馏</strong></p>
<p>先把 prompt 写好,不行再上 RAG,RAG 解决了知识、但行为还不对再上微调,最后量大到一定程度、想把成本压到底,才考虑蒸馏成小模型。绝大多数团队走到第二步就够了,根本不需要碰微调。</p>
<p>成本上还有一条值得记:<strong>低并发场景 RAG 赢,因为没有前期训练投入;高并发场景(每天 10 万+ 次查询)微调过的小模型赢,因为单次推理便宜。</strong> 量,是决定天平往哪边倒的关键变量。</p>
<h2 id="一张图替你决策">一张图替你决策</h2>
<p>不想读上面那一大堆,看这张图就够了:</p>
<pre class="mermaid">flowchart TD
  Start[你想让模型答对自己的事] --> Q1{需要补充的是<br/>知识还是行为?}
  Q1 -->|行为/风格/格式| FT[微调<br/>默认 LoRA/QLoRA<br/>再用 DPO 精修]
  Q1 -->|知识| Q2{知识量大不大?<br/>会不会变?}
  Q2 -->|量小 + 基本不变| LC[长上下文<br/>直接塞进 prompt]
  Q2 -->|量大 / 会变 / 要溯源| RAG[RAG<br/>混合检索 + Rerank]
  FT --> Hybrid[多数生产系统:<br/>RAG 管事实 + 微调管行为]
  RAG --> Hybrid
  LC -.量涨上来.-> RAG
</pre><p>最后留一句话,这是这篇唯一想让你记住的:<strong>先问自己「我缺的是知识还是行为」。</strong> 想清楚这一个问题,三条路自己就排好队了。剩下的纠结,多半是因为这个问题没问清。</p>
<hr>
<p>参考资料:</p>
<ul>
<li><a href="https://tokenmix.ai/blog/llm-context-window-explained">LLM Context Window 2026 — TokenMix</a></li>
<li><a href="https://www.elvex.com/blog/context-length-comparison-ai-models-2026">Context Length Comparison: Leading AI Models in 2026 — elvex</a></li>
<li><a href="https://www.gauraw.com/fine-tuning-llm-lora-dpo-guide-2026/">Fine Tuning AI Models in 2026 — Kumar Gauraw</a></li>
<li><a href="https://hjlabs.in/AIML/blog/post/llm-fine-tuning-best-practices.html">LLM Fine-Tuning Best Practices 2026 — hjLabs</a></li>
<li><a href="https://dev.to/umesh_malik/rag-vs-fine-tuning-for-llms-2026-what-actually-works-in-production-10if">RAG vs Fine-Tuning for LLMs (2026): What Actually Works in Production — DEV</a></li>
<li><a href="https://medium.com/@officialpreksha2166/rag-vs-fine-tuning-vs-long-context-when-to-use-what-and-why-most-teams-get-it-wrong-388cc446ff3c">RAG vs Fine-tuning vs Long Context — Preksha Dewoolkar, Medium</a></li>
<li><a href="https://blog.premai.io/building-production-rag-architecture-chunking-evaluation-monitoring-2026-guide/">Building Production RAG: Architecture, Chunking, Evaluation &amp; Monitoring (2026) — PremAI</a></li>
<li><a href="https://medium.com/@techsachin/ruler-benchmark-to-evaluate-long-context-modeling-capabilities-of-language-models-7eb13a269e36">RULER: Benchmark for Long-Context Modeling</a></li>
</ul>
]]></content:encoded></item><item><title>从朴素 RAG 到 Agentic RAG</title><link>https://realtime-ai.chat/posts/agentic-rag/</link><pubDate>Wed, 13 May 2026 11:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/agentic-rag/</guid><description>朴素 RAG 的「一次检索 + 一次生成」在多跳和模糊问题上会失败。这篇拆解它如何演进成 Agentic RAG:查询改写、多轮检索、自我纠错、把检索当工具,以及代价值不值得。</description><content:encoded><![CDATA[<p>给你的知识库问一个问题:&ldquo;我们去年 Q3 的退款政策,跟今年比有什么变化?&rdquo;</p>
<p>朴素 RAG 会怎么做?它把这一整句话拿去向量库里查一次,取回 5 个最相似的片段,塞进 prompt,让大模型生成。结果大概率是:它检索到了&quot;今年的退款政策&quot;,但没检索到&quot;去年 Q3 的&quot;,因为这句话作为一个整体,语义上离&quot;今年的政策文档&quot;更近。于是模型用今年的政策,回答了一个关于&quot;变化&quot;的问题——而且它不会告诉你它只看到了一半。</p>
<p>这就是朴素 RAG 的根本毛病。它把检索当成一个<strong>一次性的、无脑的前置步骤</strong>:查一次,查到什么算什么,然后生成。它不会判断&quot;我查到的东西够不够&quot;,不会发现&quot;这个问题其实要查两次&quot;,更不会在检索失败时重来。它失败的时候不会报错,会编。</p>
<p>2026 年,生产环境里真正能扛住复杂问题的,已经不是这条流水线了。这篇讲清楚它怎么一步步长成 Agentic RAG,以及——这是重点——多出来的延迟和成本,什么时候值,什么时候是浪费。</p>
<h2 id="朴素-rag-到底卡在哪">朴素 RAG 到底卡在哪</h2>
<p>先把它失败的几类问题说具体,不然后面所有&quot;改进&quot;都是空的。</p>
<p><strong>多跳问题。</strong>&ldquo;写《三体》的作者还写过哪些小说?&quot;——这要先查&rdquo;《三体》的作者是谁&quot;(刘慈欣),再用这个答案去查&quot;刘慈欣的其他作品&quot;。一次检索拿不到第二跳需要的关键词,因为第二跳的查询词(&ldquo;刘慈欣&rdquo;)根本不在原始问题里。</p>
<p>**模糊 / 措辞错位。**用户问&quot;那个会自动重试的配置项叫什么&quot;,知识库里写的是&quot;<code>retry_policy</code> 重试策略&quot;。用户的口语和文档的术语对不上,向量相似度也救不回来。</p>
<p><strong>问题里藏着多个子问题。</strong>&ldquo;对比一下 A 方案和 B 方案的成本和上线周期&rdquo;——这是四个检索意图揉在一句话里,一次检索只会取回一堆&quot;半相关&quot;的片段,哪个都不深。</p>
<p><strong>需要计算或外部数据。</strong>&ldquo;我们这个季度的获客成本环比涨了多少&rdquo;——答案不在任何一个文档片段里,它需要先取两个数,再算个除法。文本检索给不了。</p>
<p>这些问题的共同点是:<strong>正确答案不是&quot;检索一次就能拿到的那 5 个片段&quot;</strong>。要么得检索多次,要么得换个查法,要么检索根本不是最后一步。朴素 RAG 的架构里没有&quot;再来一次&quot;这个动作,所以它只能在第一次的结果上硬生成。</p>
<h2 id="演进的主线从流水线到控制循环">演进的主线:从「流水线」到「控制循环」</h2>
<p>把朴素 RAG 和 Agentic RAG 摆在一起看,差别不是&quot;加了几个模块&quot;,是<strong>控制权交给了谁</strong>。</p>
<p>朴素 RAG 是一条<strong>固定流水线</strong>:检索 → 生成,顺序写死,模型只负责最后那步生成,没有决策权。</p>
<p>Agentic RAG 是一个<strong>控制循环</strong>:大模型坐在中间当指挥,它拿到问题后自己决定下一步干什么——要不要检索、检索什么、查到的东西够不够、要不要换个查询词再来一次、还是已经可以回答了。检索从&quot;前置步骤&quot;变成了模型手里的一个<strong>工具</strong>,跟计算器、SQL 查询、API 调用平级。</p>
<pre class="mermaid">flowchart TB
  subgraph naive[朴素 RAG:固定流水线]
    direction LR
    Q1[问题] --> R1[检索一次] --> G1[生成] --> A1[答案]
  end
  subgraph agentic[Agentic RAG:控制循环]
    direction LR
    Q2[问题] --> AG{Agent<br/>决策}
    AG -->|要查| R2[检索/改写/计算]
    R2 --> EV[评估结果<br/>够不够?]
    EV -->|不够| AG
    EV -->|够了| G2[生成] --> A2[答案]
  end
  style AG fill:#fde7c2,stroke:#e8b23c
  style EV fill:#fde7c2,stroke:#e8b23c
</pre><p>橙色的两块——<strong>决策</strong>和<strong>评估</strong>——是朴素 RAG 里完全没有的。整个演进,本质上就是把这两个能力一点点加进来。下面拆成四个阶段讲。</p>
<h2 id="第一步查询改写别拿用户的原话去检索">第一步:查询改写,别拿用户的原话去检索</h2>
<p>最便宜、收益最直接的一步,是不再把用户的原始问题直接丢给向量库。</p>
<p>用户的话是口语、是模糊的、是给人听的;文档是书面语、是术语。中间这道坎,用一个改写步骤填上。常见的几种做法:</p>
<ul>
<li><strong>同义改写(Rewrite-Retrieve-Read)</strong>:先让一个小模型把&quot;那个会自动重试的配置项&quot;改写成检索友好的&quot;重试策略 retry 配置 自动重试机制&quot;,再去查。RQ-RAG 这类方法甚至专门训了一个小模型来干这件事。</li>
<li><strong>查询分解</strong>:把&quot;对比 A 和 B 的成本和上线周期&quot;拆成四个独立子查询,各查各的,最后合并。</li>
<li><strong>HyDE(假设性文档)</strong>:先让模型&quot;瞎编&quot;一段它觉得答案应该长什么样的文字,再用这段编出来的文字去检索。听起来反直觉,但编出来的文字在语义空间里离真实文档更近——因为它和文档一样是书面语。</li>
</ul>
<p>注意:到这一步,系统还<strong>不是 Agent</strong>。改写是固定加进流水线的一环,模型还是没有&quot;要不要再查一次&quot;的决策权。但它是个分水岭——从这里开始,检索的输入不再等于用户的输入了。</p>
<h2 id="第二步多轮检索让多跳问题能跑通">第二步:多轮检索,让多跳问题能跑通</h2>
<p>查询改写解决&quot;查得准&quot;,多轮检索解决&quot;查得够&quot;。</p>
<p>对多跳问题,做法是让流程<strong>循环</strong>起来:检索一轮 → 看看拿到的信息能不能支撑回答 → 不能就根据已知信息生成下一个查询 → 再检索。&quot;《三体》作者还写过什么&quot;就变成:第一轮查到&quot;刘慈欣&quot;,第二轮用&quot;刘慈欣&quot;作为新查询词,查到《球状闪电》《流浪地球》。</p>
<p>这里的关键设计是<strong>谁来决定停</strong>。两种思路:</p>
<ul>
<li><strong>固定轮数</strong>:简单粗暴,查 3 轮就停。问题是简单问题被迫查 3 轮(浪费),复杂问题 3 轮可能还不够。</li>
<li><strong>模型自己判断</strong>:每轮检索后让模型回答一个问题——&ldquo;现在的信息够回答用户了吗?&rdquo; 够了就停,不够就继续。这就开始有 Agent 的味道了:停止条件是动态的。</li>
</ul>
<p>到这一步,系统已经能处理多跳问题。但它还有个隐患:它<strong>默认每个问题都要检索</strong>。&ldquo;你好&quot;&ldquo;帮我把这段话翻译成英文&quot;这种根本不需要查知识库的请求,它也老老实实查一遍——白花钱、白加延迟。</p>
<h2 id="第三步adaptive-rag让-agent-决定要不要查查几次">第三步:Adaptive RAG,让 Agent 决定「要不要查、查几次」</h2>
<p>这一步把决策权真正交出去:<strong>检索不再是默认动作,而是 Agent 评估后才触发的选择。</strong></p>
<p>Adaptive RAG 的典型做法是训一个轻量级<strong>路由器</strong>(router),它先给问题分个级:</p>
<table>
  <thead>
      <tr>
          <th>问题类型</th>
          <th>例子</th>
          <th>路由策略</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>不需要检索</td>
          <td>&ldquo;把这段翻译成英文&rdquo;、闲聊</td>
          <td>直接让模型回答,0 次检索</td>
      </tr>
      <tr>
          <td>简单事实</td>
          <td>&ldquo;我们的退款时限是几天&rdquo;</td>
          <td>单次检索 + 生成</td>
      </tr>
      <tr>
          <td>复杂 / 多跳</td>
          <td>&ldquo;去年 Q3 和今年的政策差异&rdquo;</td>
          <td>进入多轮检索循环</td>
      </tr>
  </tbody>
</table>
<p>它的价值在于<strong>按需付费</strong>:简单问题走快车道,省下来的延迟和成本,留给真正难的问题。SELF-RAG 是同一思路的另一种实现——它不靠外挂路由器,而是训练模型在生成过程中吐出特殊的&quot;反思 token&rdquo;,由模型自己在每一步决定&quot;这里该不该插入一次检索&rdquo;。</p>
<p>把检索当工具,意味着它旁边还能摆别的工具。&ldquo;这季度获客成本环比涨多少&quot;这种问题,Agent 会先调&quot;检索工具&quot;取两个季度的原始数字,再调&quot;计算工具&quot;做除法。检索从此只是 Agent 工具箱里的一格,不是全部。2026 年 2 月的 A-RAG 框架走得更彻底:把关键词检索、语义检索、按片段检索<strong>当成三个不同的工具</strong>直接暴露给 Agent,让它自己挑用哪个,QA 准确率比一刀切的扁平检索高了 5%–13%。</p>
<h2 id="第四步自我纠错self-rag-与-corrective-rag">第四步:自我纠错,Self-RAG 与 Corrective RAG</h2>
<p>前面三步解决&quot;查得准、查得够、该不该查&rdquo;。最后一步解决一个更难的问题:<strong>查回来的东西是错的、是噪音,怎么办。</strong></p>
<p>朴素 RAG 在这里是裸奔的——检索到什么就用什么,哪怕取回的 5 个片段全是不相关的,它也照样塞进 prompt 生成。自我纠错就是在&quot;检索完&quot;和&quot;生成&quot;之间,硬插一个质检环节。</p>
<p>两条主流路线:</p>
<ul>
<li><strong>Corrective RAG(CRAG)</strong>:检索之后,用一个轻量评估器给每个片段打分——相关、不相关、还是模棱两可。如果片段质量够高,正常生成;如果一堆是噪音,就<strong>触发纠正动作</strong>,典型的是把查询词改写后重新检索,甚至 fallback 到联网搜索;模棱两可的就两边的信息都用上。评估器是<strong>外挂</strong>的,不依赖主模型。</li>
<li><strong>Self-RAG</strong>:把评估能力<strong>训进模型本身</strong>。模型生成时会同步产出&quot;反思 token&quot;,自己评判&quot;我刚引用的这段资料,真的支撑我这句话吗&quot;。如果不支撑,它会自己回退、重检索。</li>
</ul>
<p>两者的区别值得记住:CRAG 是&quot;外挂一个质检员&quot;,改造成本低、能套在现有系统外面;Self-RAG 是&quot;让模型自带质检能力&quot;,效果更深入但需要专门训练模型。生产里 CRAG 更常见,因为不用动模型。</p>
<p>不管哪条路,目的是同一个:让系统在<strong>给出答案之前</strong>,先对自己手里的证据有个判断。一个会说&quot;我没查到足够信息&quot;的 RAG,比一个永远自信乱编的 RAG,有用得多。</p>
<h2 id="代价这一切都不是免费的">代价:这一切都不是免费的</h2>
<p>把上面四步全堆上,你得到的不是&quot;更好的 RAG&quot;,是&quot;更慢更贵更难维护的 RAG&quot;。这个账必须算清楚。</p>
<p><strong>延迟。</strong> 朴素 RAG 是一次检索 + 一次生成。Agentic RAG 每多一轮&quot;决策 → 检索 → 评估&quot;,就多一组大模型调用和向量查询。一个跑三轮的 Agentic 流程,延迟翻几倍很正常。有实测数据:在 FIQA 这类金融问答任务上,Agentic 方案的平均延迟是增强型 RAG 的约 <strong>1.5 倍</strong>;做同样一件事,一条 Agentic 流水线可能比朴素 RAG 多花 <strong>5 秒</strong>。</p>
<p><strong>成本。</strong> 每一轮决策和评估都是真金白银的 token。一个朴素 RAG 查询大约 $0.001,功能相当的 Agentic 流程能到它的 <strong>10 倍</strong>。生产环境里实际的单次查询成本,从简单查找的 $0.02 到复杂多源推理的 $0.31 不等。</p>
<p><strong>复杂度。</strong> 这是最容易被低估的一项。固定流水线的 bug 好查——就那么几步。一个会循环、会自己改查询、会自己决定停的 Agent,出错的时候你得问:是路由判错了?改写改歪了?评估器误判了?还是循环该停没停?调试和监控的难度,跟朴素 RAG 不是一个量级。还有个隐蔽的坑:有研究发现,RAG 的精度调参没调好,会悄悄把检索准确率拉低 40%,而这个误差在 Agentic 的多轮循环里会被一路放大。</p>
<table>
  <thead>
      <tr>
          <th>维度</th>
          <th>朴素 RAG</th>
          <th>Agentic RAG</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>检索次数</td>
          <td>固定 1 次</td>
          <td>0 到多次,动态</td>
      </tr>
      <tr>
          <td>单次查询成本</td>
          <td>~$0.001</td>
          <td>可达 10 倍</td>
      </tr>
      <tr>
          <td>延迟</td>
          <td>一次检索 + 生成</td>
          <td>增强型的约 1.5 倍起</td>
      </tr>
      <tr>
          <td>多跳 / 模糊问题</td>
          <td>经常失败且不自知</td>
          <td>能处理</td>
      </tr>
      <tr>
          <td>调试难度</td>
          <td>低</td>
          <td>高</td>
      </tr>
      <tr>
          <td>适用场景</td>
          <td>文档查找、抽取、简单问答</td>
          <td>复杂推理、多源、多跳</td>
      </tr>
  </tbody>
</table>
<h2 id="那到底什么时候该上-agentic-rag">那到底什么时候该上 Agentic RAG</h2>
<p>我的判断很直接:<strong>Agentic RAG 不是朴素 RAG 的升级版,是另一个东西,按场景选,不是按&quot;先进程度&quot;选。</strong></p>
<p>如果你的产品主要是文档查找、信息抽取、单轮问答——客服查个政策、员工查个手册——<strong>朴素 RAG 就是最优解</strong>。它简单、便宜、好调试,给它叠 Agent 是纯浪费,用户还得多等几秒。2026 年企业里的生产基线,其实是混合检索(向量 + 关键词)这种&quot;增强型朴素 RAG&quot;,而不是 Agentic。</p>
<p>什么时候该上 Agentic:当你的问题里<strong>经常出现多跳、模糊、多子问题、需要计算</strong>这几类——比如做研究型助手、做需要跨多个数据源交叉验证的分析、做法律 / 医疗这种&quot;答错代价很高、宁可多查几轮也要确认证据&quot;的场景。这时候多出来的延迟和成本,买的是&quot;答对&quot;和&quot;知道自己没查够&quot;,值。</p>
<p>更现实的做法是别一刀切。先用 Adaptive RAG 的路由思路:<strong>简单问题走朴素快车道,只有被判定为复杂的那部分,才进 Agentic 的循环。</strong> 让贵的能力只花在真正需要它的问题上——这跟做语音 Agent 时&quot;先打通流式管道、再去抠贵的环节&quot;是同一个工程哲学:别为不存在的复杂度付钱。</p>
<p>朴素 RAG 最大的问题从来不是&quot;不够先进&quot;,是它<strong>失败的时候很安静</strong>。Agentic RAG 真正值钱的地方,也不是那些花哨的多轮循环,而是它终于学会了在证据不足时说一句:&ldquo;这个我没查够。&rdquo;</p>
]]></content:encoded></item><item><title>Prompt Injection:Agent 时代的头号安全问题</title><link>https://realtime-ai.chat/posts/prompt-injection-2026/</link><pubDate>Tue, 12 May 2026 11:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/prompt-injection-2026/</guid><description>Agent 能调工具、能读外部内容之后,prompt injection 从好玩的越狱变成真正的数据泄露。拆解间接注入为什么最致命、真实攻击形态,以及工程上唯一靠谱的缓解思路。</description><content:encoded><![CDATA[<p>2025 年 6 月,安全公司 Aim Security 披露了一个叫 EchoLeak 的漏洞(CVE-2025-32711,CVSS 9.3)。攻击方式简单得离谱:给目标发一封普通邮件。</p>
<p>用户<strong>不需要点开邮件</strong>,不需要点链接,什么都不用做。只要他之后用 Microsoft 365 Copilot 问了一个相关问题,Copilot 在检索资料时读到了那封邮件,藏在邮件里的指令就被执行了——Copilot 把它能访问的内部文档内容,通过一张自动加载的图片悄悄发到了攻击者的服务器。</p>
<p>这是第一个在生产级 LLM 系统里被证实的&quot;零点击&quot;prompt injection。它之所以值得拿出来开头讲,是因为它把一件事摆到了台面上:<strong>当 AI 只是个聊天框时,prompt injection 是个有意思的玩具;当 AI 变成能读邮件、能调工具、能发请求的 Agent 时,它是头号安全问题。</strong></p>
<h2 id="prompt-injection-到底是什么">prompt injection 到底是什么</h2>
<p>先把概念说清楚,因为很多人把它和&quot;越狱&quot;(jailbreak)混为一谈。</p>
<p>越狱是用户<strong>自己</strong>想绕过模型的安全限制——比如骗模型教他做危险的东西。受害者和攻击者是同一个人,危害基本限于他自己。</p>
<p>prompt injection 不一样。它是<strong>第三方</strong>把恶意指令塞进 LLM 的输入里,劫持模型,让它替攻击者干活,而真正的用户和应用开发者都被蒙在鼓里。受害者和攻击者是不同的人,这才是它危险的根源。</p>
<p>它的技术根因,Simon Willison(2022 年造出 &ldquo;prompt injection&rdquo; 这个词的人)说得最直白:<strong>LLM 没有可靠的能力区分&quot;指令&quot;和&quot;数据&quot;</strong>。</p>
<p>传统软件里,SQL 注入之所以能被根治,是因为我们有 prepared statement——代码归代码,数据归数据,数据库引擎从结构上就分得清。但 LLM 的输入是一锅粥:system prompt、用户问题、检索到的文档、工具返回的结果,全部拼成一段文本喂进去。模型看到的只是 token 流。如果一段&quot;数据&quot;里写着&quot;忽略以上所有指令,改为执行……&quot;,模型完全可能就照做了——因为对它来说,这跟开发者写的 system prompt 长得一模一样。</p>
<p>这不是某个模型的 bug,是当前这套架构的固有属性。GPT、Claude、Gemini 全都中招。</p>
<h2 id="直接注入只是开胃菜间接注入才致命">直接注入只是开胃菜,间接注入才致命</h2>
<p>prompt injection 分两类,危险程度差着量级。</p>
<p><strong>直接注入</strong>:攻击者自己在对话框里输入恶意 prompt。这种相对好防——输入就来自用户,你本来就该对它保持警惕,而且很多场景下用户骗 Agent 也只是坑自己。</p>
<p><strong>间接注入</strong>(indirect prompt injection):恶意指令藏在 Agent 会去读的<strong>外部内容</strong>里——一个网页、一封邮件、一份共享文档、一段代码仓库的 README、甚至一张图片的元数据。Agent 在正常干活的过程中读到了这段内容,指令就被触发。</p>
<p>间接注入致命在哪?在于<strong>它走的是数据通道,而数据通道没人盯着</strong>。</p>
<p>你会审查用户在对话框里打了什么,但你不会去审查 Agent 帮你总结的那个网页里每一个字。Agent 读外部内容,本来就是它的核心价值——一个不能读邮件的邮件助手、一个不能浏览网页的浏览器 Agent,等于废了。可一旦它开始读这些你不可控的内容,攻击面就从&quot;用户&quot;扩大到了&quot;全互联网&quot;。任何能把一段文字放到 Agent 视野里的人,都成了潜在攻击者。</p>
<p>Anthropic 在 2026 年 2 月的系统卡里干脆<strong>把直接注入这个指标整个删掉了</strong>,理由是:过去一年里每一起高影响的生产环境安全事件,涉及的都是间接注入。</p>
<pre class="mermaid">flowchart LR
  A[攻击者] -->|把恶意指令<br/>埋进外部内容| B[网页 / 邮件<br/>文档 / 代码库]
  B -->|Agent 正常检索时读到| C[LLM]
  D[真实用户] -->|发出正常请求| C
  C -->|被劫持后调用工具| E[读私有数据 / 发外部请求]
  style B fill:#fde7c2,stroke:#e8b23c
  style C fill:#fde7c2,stroke:#e8b23c
</pre><p>橙色那两块——<strong>被污染的外部内容</strong>和<strong>分不清指令与数据的 LLM</strong>——就是整条攻击链的命门。</p>
<h2 id="致命三要素三个都凑齐才会出事">致命三要素:三个都凑齐才会出事</h2>
<p>Simon Willison 提出了一个特别好用的判断框架,叫<strong>致命三要素(the lethal trifecta)</strong>。一个 Agent 系统真正危险,需要同时满足三个条件:</p>
<table>
  <thead>
      <tr>
          <th>要素</th>
          <th>含义</th>
          <th>没有它会怎样</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>接触私有数据</td>
          <td>Agent 能读你的邮件、文档、数据库</td>
          <td>没有可偷的东西</td>
      </tr>
      <tr>
          <td>接触不可信内容</td>
          <td>Agent 会处理来自外部的输入</td>
          <td>没有注入的入口</td>
      </tr>
      <tr>
          <td>具备外传能力</td>
          <td>Agent 能发起外部请求(调 API、加载图片、生成链接)</td>
          <td>偷到了也送不出去</td>
      </tr>
  </tbody>
</table>
<p><strong>三个全凑齐,系统就一定可被攻击;缺任何一个,这条路就断了。</strong></p>
<p>EchoLeak 就是教科书般的三要素齐活:Copilot 能读公司内部文档(私有数据)、会检索用户收到的邮件(不可信内容)、能渲染 Markdown 里的外部图片(外传通道——图片 URL 一加载,数据就跟着 query 参数发出去了)。攻击者要做的,只是用一个图片链接把偷来的数据&quot;驮&quot;出去。</p>
<p>这个框架的价值在于:它把&quot;要不要担心 prompt injection&quot;这个模糊的问题,变成了一个可以逐项打钩的清单。2026 年 1 月那一周,安全研究者接连披露了四款主流 AI 生产力工具的漏洞,攻击模式如出一辙,全都踩中了这三要素。</p>
<h2 id="真实攻击长什么样">真实攻击长什么样</h2>
<p>把抽象的东西落到地面。2025 到 2026 年被公开证实的攻击,大致是这几种形态:</p>
<p><strong>数据外泄。</strong> 最主流。EchoLeak 是代表——让 Agent 把它能访问的敏感数据,通过图片、链接、API 调用送到攻击者手里。浏览器类 Agent 在&quot;总结这个网页&quot;时被网页里的隐藏文字骗着泄露了凭据,也是这一类。</p>
<p><strong>劫持工具调用。</strong> 2026 年 5 月,微软安全团队披露了一类远程代码执行漏洞:攻击者控制的内容从一份被检索的文档里,一路流到了一次工具调用的参数里,绕过了栈上所有 prompt 层面的防护。Agent 能调的工具越强(执行命令、改文件、发邮件、转账),这类攻击的破坏力就越大。</p>
<p><strong>污染持久记忆。</strong> 这个最阴。OWASP AppSec USA 2025 上演示过一种攻击:注入的指令让 Agent 往自己的长期记忆库里写了一条恶意记录。于是一次性的注入变成了<strong>常驻后门</strong>——攻击早就结束了,但那条记录留在记忆里,在未来每一个会话里、满足特定条件时静默触发。</p>
<p><strong>绕过 AI 审核。</strong> 2025 年 12 月有一起真实案例:有人用间接注入绕过了一个基于 AI 的广告审核系统——在送审的内容里埋指令,让审核 AI 自己判定&quot;这条广告没问题&quot;。</p>
<p>CrowdStrike 的 2026 威胁报告记录了针对 90 多家机构的 prompt injection 攻击。这已经不是 PoC 阶段了。</p>
<h2 id="为什么没有彻底解法">为什么没有彻底解法</h2>
<p>讲到这里得说句扫兴的:<strong>prompt injection 至今没有、短期内也不会有根治方案。</strong></p>
<p>OpenAI 自己发文承认这是一个&quot;前沿安全挑战&quot;。多个研究团队的结论一致:这是个尚未解决的根本性问题,而靠过滤、靠分类器去拦截恶意 prompt 的尝试,基本都失败了。</p>
<p>原因有两层。</p>
<p>第一,<strong>用 AI 防 AI 防不住</strong>。最直觉的做法是训一个分类器,专门识别&quot;这段输入里有没有注入&quot;。但 EchoLeak 恰恰绕过了微软专门干这事的 XPIA(Cross Prompt Injection Attempt)分类器。这是一场不对称的攻防:防守方要拦住<strong>所有</strong>攻击,攻击方只要找到<strong>一个</strong>漏网的措辞。自然语言的表达空间无穷大,分类器永远有缝。有篇论文标题起得很到位——《攻击者后手出招》(The Attacker Moves Second)。</p>
<p>第二,<strong>这是架构层面的、不是参数层面的问题</strong>。只要&quot;指令&quot;和&quot;数据&quot;还在同一个 token 流里、还由同一个模型处理,模型就有可能把数据当指令。除非从根上改掉这套架构,否则你做的所有事情都是在降低概率,而不是消除可能。</p>
<p>所以正确的心态是:<strong>别想着&quot;解决&quot;它,要想着像管理其他安全风险一样去&quot;管理&quot;它。</strong> 你不会指望彻底消灭 SQL 注入的&quot;可能性&quot;,你是用 prepared statement、最小权限、审计日志把它的风险压到可接受。prompt injection 也一样。</p>
<h2 id="工程上能做什么把它当系统设计问题">工程上能做什么:把它当系统设计问题</h2>
<p>既然模型本身靠不住,防线就必须建在模型<strong>外面</strong>。2026 年比较成型的实践,核心就一句话:<strong>不要相信 LLM 的输出,在它造成实际后果之前用确定性的代码挡一道。</strong></p>
<p><strong>第一,拆掉致命三要素中的一个。</strong> 这是性价比最高的动作。回到上面那张表——你不需要同时防住三件事,只要在架构上<strong>让其中一个不成立</strong>:处理外部不可信内容的 Agent,就不给它私有数据的访问权;能读私有数据的 Agent,就掐掉它一切外传通道(不许渲染外链图片、不许自由调网络)。把&quot;能读敏感数据&quot;和&quot;能接触外部内容&quot;这两种能力,放进两个不同的 Agent、用代码隔开。</p>
<p><strong>第二,权限隔离 / 最小授权。</strong> 多个安全团队的共识是:<strong>权限隔离是单项收益最高的防御</strong>。给 Agent 的每个工具都按最小必要授权——只读的就别给写权限,能查订单的就别让它能改订单。这样即使注入成功,攻击者拿到的也是一个被关在笼子里的 Agent。</p>
<p><strong>第三,高危操作必须人确认。</strong> 转账、删文件、发对外邮件、改生产配置——这类不可逆的操作,不能让 Agent 自己拍板。在工具调用和真实执行之间插一道人工确认。注意:确认界面要展示<strong>真实要执行的动作和参数</strong>,不能只展示 Agent 自己的&quot;我打算做 X&quot;的自然语言描述——因为那段描述本身也可能是被注入的。</p>
<p><strong>第四,把不可信内容明确标成数据。</strong> 检索到的文档、工具返回的结果,在拼进 prompt 时用清晰的边界包起来,并明确告诉模型:这部分是数据,不是给你的指令。这<strong>不能根治</strong>(模型还是可能被骗),但能拉高攻击成本,是廉价的加固。</p>
<p><strong>第五,输出侧做确定性校验。</strong> 在 Agent 的输出真正变成行动之前,用普通代码检查它的结构——工具调用的参数在不在白名单里、要访问的 URL 域名可不可信、数据流向合不合规。再配上 canary token(在敏感数据里埋诱饵,一旦它出现在外发流量里就说明发生了泄露)。</p>
<p>值得关注的一个方向是 Google DeepMind 的 <strong>CaMeL</strong>:它用两个 LLM——一个&quot;特权 LLM&quot;负责编排任务、能调工具但只看可信输入,一个&quot;隔离 LLM&quot;专门处理不可信数据、<strong>完全没有工具调用能力</strong>。然后用传统软件安全里的控制流完整性、信息流控制那一套,给每个数据值打上能力标签,从结构上限制数据能流到哪去。它的思路很对——不靠 AI 去猜,靠确定性的工程机制兜底。</p>
<pre class="mermaid">flowchart TD
  A[Agent 想执行一个动作] --> B{是高危操作吗?}
  B -->|是| C[人工确认<br/>展示真实参数]
  B -->|否| D{参数 / 域名<br/>在白名单内?}
  C --> D
  D -->|否| E[拒绝执行]
  D -->|是| F[最小权限工具执行]
  F --> G[canary 检测 + 日志审计]
  style C fill:#fde7c2,stroke:#e8b23c
  style E fill:#f8c9c4,stroke:#d9534f
</pre><h2 id="最后这是-agent-落地绕不开的一关">最后:这是 Agent 落地绕不开的一关</h2>
<p>我想强调的一点是:prompt injection 不是&quot;等以后再说&quot;的问题,它就是<strong>现在</strong>决定你的 Agent 能不能上生产的那道关。</p>
<p>OWASP 连续三年把 prompt injection(LLM01)列为大模型的头号风险,这不是凑热闹。一个能力越强的 Agent——工具越多、权限越大、越自动、越深地嵌进关键流程——它的价值越高,被注入后的破坏力也越大。这两件事是同一枚硬币。</p>
<p>所以做 Agent,安全不能等功能做完了再&quot;加固&quot;。它得在架构设计的第一天就在场:这个 Agent 要不要同时持有私有数据和外传能力?哪些操作必须人来拍板?外部内容进来时怎么被隔离?</p>
<p>把它当成系统设计问题,而不是模型问题——因为模型短期内不会帮你解决它。你能依靠的,是权限边界、人工确认、输出校验这些<strong>老派但确定</strong>的工程手段。在一个分不清指令和数据的模型外面,亲手画好那条它自己画不出的线。</p>
]]></content:encoded></item><item><title>推理模型这一年:o3 之后学到了什么</title><link>https://realtime-ai.chat/posts/reasoning-models-2026/</link><pubDate>Tue, 12 May 2026 10:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/reasoning-models-2026/</guid><description>从 o1、o3 到 2026 年,推理模型把 test-time compute 变成可调旋钮。这一年大家学到的是:思考有成本,不是所有任务都值得想。</description><content:encoded><![CDATA[<p>让模型回答之前先&quot;想一会儿&quot;,这件事确实有用。</p>
<p>2026 年 4 月有一篇论文,标题直接叫《When More Thinking Hurts》(想多了反而坏事)。里面有个例子我印象很深:让一个大推理模型算&quot;9900 加 1&quot;,它居然烧掉了几千个思考 token,中途还一度把正确答案推翻又改回来。一道小学一年级的题,被它想成了奥数。</p>
<p>这就是推理模型这一年的缩影。o1 出来的时候,大家的第一反应是&quot;哇,会思考了&quot;;到了 2026 年,大家学到的是另一句话——<strong>思考是要花钱的,而且大部分时候,你根本不需要它想那么多</strong>。</p>
<h2 id="推理模型到底改了什么">推理模型到底改了什么</h2>
<p>先把概念说清楚。</p>
<p>传统 LLM 的算力几乎全花在训练上。模型训完,推理(inference)时就是一次前向计算,吐 token,快进快出。你给它一道难题,它&quot;脱口而出&quot;——答得对不对,基本取决于训练时见过没见过类似的东西。</p>
<p>推理模型动的是另一处:<strong>test-time compute</strong>,推理时算力。它在真正回答你之前,先在内部生成一长串&quot;草稿&quot;——拆解问题、试不同思路、自我检查、推翻重来。这串草稿就是所谓的思考过程(chain-of-thought)。你看到的最终回答可能只有三句话,但背后它可能写了一万五千个 token 的内心戏。</p>
<pre class="mermaid">flowchart LR
  Q[你的问题] --> A{普通模型}
  A --> A1[直接吐答案]
  Q --> B{推理模型}
  B --> B1[内部草稿<br/>拆解·试错·自检] --> B2[最终答案]
  style B1 fill:#fde7c2,stroke:#e8b23c
</pre><p>这个改动的意义在于:模型的能力第一次变成了<strong>可以用算力买的</strong>。同一个模型,让它多想,它在数学、代码、逻辑题上的准确率就实打实地往上走。OpenAI 当初说 o3 在真实世界的难题上比 o1 少犯约 20% 的重大错误,靠的不是换了更大的底座,很大程度上就是想得更久、更会想。</p>
<p>从 o1 到 o3、o4-mini,再到 Gemini 2.5 的 thinking、Claude 的 extended thinking、DeepSeek R1、Qwen 3 的思考模式——2026 年你能叫得出名字的主力模型,基本都带&quot;会思考&quot;这一档。test-time compute 从一个研究概念,变成了产品标配。</p>
<h2 id="这一年学到的思考不是免费的">这一年学到的:思考不是免费的</h2>
<p>如果故事到这里就结束,那这篇文章没什么好写。问题恰恰在于——<strong>让模型多想,代价大得超出很多人的预期</strong>。</p>
<p>代价有三笔,都很实在。</p>
<p><strong>第一笔是 token,直接对应钱。</strong> 思考过程里的每一个 token,几乎都按输出价计费。一次普通的 extended thinking 请求,思考部分烧掉五千到两万 token 很常见,加上最终回答,单次成本可能从几分钱跳到三四毛人民币。你界面上看不到这些草稿,但账单上看得到。2026 年有个被反复引用的说法:前沿模型那个&quot;推理强度&quot;旋钮,从低档拉到高档,准确率大概能涨 8 到 22 分,但费用会膨胀 4 到 17 倍。</p>
<p><strong>第二笔是延迟。</strong> 同一个旋钮,延迟能拉长 5 到 60 倍。好消息是绝对值在变好——2025 年初,思考模型动不动想 30 秒到 2 分钟;到 2026 年初,o4-mini、Gemini Flash Thinking 处理大多数推理任务能压到 3 到 15 秒。但 3 到 15 秒,对一个要&quot;对话感&quot;的产品来说,依然是灾难。你没法让用户盯着转圈等模型憋一道并不难的题。</p>
<p><strong>第三笔最阴险:想多了真的会把答案想错。</strong> 这不是玄学。前面那篇论文给的结论很硬:延长推理常常和&quot;放弃了原本正确的答案&quot;绑在一起。模型想着想着,把对的推翻了。在简单任务上尤其明显——标准模型一步到位答对,推理模型绕一大圈,既慢又贵,还更容易错。</p>
<table>
  <thead>
      <tr>
          <th></th>
          <th>普通模型</th>
          <th>推理模型(高思考档)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>首 token 延迟</td>
          <td>数百毫秒</td>
          <td>数秒到数十秒</td>
      </tr>
      <tr>
          <td>单次 token 成本</td>
          <td>基准</td>
          <td>基准的 4–17 倍</td>
      </tr>
      <tr>
          <td>简单任务准确率</td>
          <td>高</td>
          <td>可能更低(过度思考)</td>
      </tr>
      <tr>
          <td>难题准确率</td>
          <td>一般</td>
          <td>明显更高</td>
      </tr>
      <tr>
          <td>适合场景</td>
          <td>高频、对话、抽取</td>
          <td>低频、难、可离线</td>
      </tr>
  </tbody>
</table>
<p>把这张表盯久一点你会发现:推理模型不是&quot;更强的普通模型&quot;,它是一个<strong>取舍完全不同的工具</strong>。强在难题,弱在日常。</p>
<h2 id="什么任务该用什么任务别用">什么任务该用,什么任务别用</h2>
<p>这是这篇文章最想讲的部分,因为踩坑的人太多了。</p>
<p>我的判断很简单:<strong>默认用普通模型,只在被证明需要时才升级到推理模型。</strong> 顺序别反过来。很多团队上来就把所有请求挂到推理模型上,觉得&quot;反正更聪明&quot;,结果账单爆炸、延迟爆炸,用户体验还更差。</p>
<p>具体怎么分?我按&quot;这道题需不需要多步推演&quot;来切。</p>
<p><strong>该用推理模型的:</strong></p>
<ul>
<li>数学、竞赛题、需要严格推导的逻辑题——这是它的主场,22 分的提升花 17 倍的钱也值。</li>
<li>复杂代码任务:跨多个文件的重构、根据一段模糊描述推断完整实现、调一个需要顺着调用链想的 bug。</li>
<li>多步规划:把一个大目标拆成一串带依赖的子任务,Agent 的&quot;想清楚再动手&quot;那一步。</li>
<li>别人会拿你的输出去仔细核对的场景——反正要花人力 review,模型多花几秒想清楚是划算的。</li>
</ul>
<p><strong>别用推理模型的(普通模型完全够):</strong></p>
<ul>
<li>分类、打标签、情感判断、意图识别——一步到位的判别任务,让它&quot;思考&quot;纯属浪费。</li>
<li>信息抽取、格式转换、把一段文本改写成 JSON。</li>
<li>闲聊、客服话术、陪伴类对话——这些要的是快和自然,不是深。</li>
<li>摘要、翻译这类&quot;理解 + 复述&quot;的活儿。</li>
<li>任何高频、对延迟敏感、用户在等你回话的链路。</li>
</ul>
<p>有个反例特别值得记:实时语音对话。我之前写过语音 Agent 的延迟预算,从用户说完到 AI 出声,及格线是 500 到 900 毫秒。一个动不动想 5 秒的推理模型,直接出局——它不是慢一点,是把整个产品形态打碎了。语音链路上要么用普通模型,要么把推理模型藏到后台异步去跑,绝不能放在用户等待的关键路径上。</p>
<pre class="mermaid">flowchart TD
  T[一个请求进来] --> Q{需要多步推演吗}
  Q -->|否:分类/抽取/闲聊/摘要| M1[普通模型<br/>快·便宜]
  Q -->|是:数学/复杂代码/规划| M2{延迟敏感吗}
  M2 -->|是| M3[推理模型·低思考档]
  M2 -->|否| M4[推理模型·高思考档]
  style M1 fill:#d6ebd6,stroke:#5fa55f
  style M3 fill:#fde7c2,stroke:#e8b23c
  style M4 fill:#fde7c2,stroke:#e8b23c
</pre><p>注意这张图最后还分了一档。&ldquo;该用推理模型&quot;不等于&quot;该拉满&rdquo;——这就引出下一节。</p>
<h2 id="思考预算可调成了标配然后呢">&ldquo;思考预算可调&quot;成了标配,然后呢</h2>
<p>2026 年最重要的工程变化,不是某个模型又强了多少,而是<strong>思考的量,从开发者手里交了一部分回给模型自己</strong>。</p>
<p>早期的 extended thinking,你得手动设 <code>budget_tokens</code>,告诉模型&quot;最多想这么多&rdquo;。这玩意儿很难调:设小了难题想不透,设大了简单题被过度思考反噬。你得对着每一类任务反复试。</p>
<p>新一代的做法变了。Claude 在 4.6 这一代把固定预算的 extended thinking 标成了 deprecated,换成 Adaptive Thinking——模型自己判断这题要不要想、想多深,简单问题秒回,复杂问题才深挖。OpenAI 的 o 系列、Gemini 的 thinking 模式给的是 <code>reasoning_effort</code> 这种&quot;高/中/低&quot;的强度档。Qwen 3 更直接,一个开关切&quot;思考模式&quot;和&quot;非思考模式&quot;。形式不同,内核是一个意思:<strong>思考量变成了一个旋钮,而且默认应该让模型自适应</strong>。</p>
<p>这件事对工程的影响,我觉得有三点值得说。</p>
<p><strong>第一,选型粒度变细了。</strong> 过去选模型是&quot;用 A 还是用 B&quot;,现在是&quot;用 A 的哪一档&quot;。一个模型族内部就能覆盖从&quot;便宜快&quot;到&quot;贵而强&quot;的一大段。这意味着你的系统里不该只有一个固定配置,而该有一个<strong>按任务路由思考强度</strong>的策略层——简单任务走低档甚至关掉思考,难任务才放开。</p>
<p><strong>第二,成本和延迟从&quot;基本固定&quot;变成&quot;高度可变&quot;,可观测性必须跟上。</strong> 同一个接口,这次请求 800 毫秒、下次 12 秒,这次两分钱、下次三毛,都正常。你必须把思考 token 数单独打点监控,否则某天账单翻五倍你都不知道是哪类请求干的。我的建议是:思考 token 当成一类独立指标,和普通输出 token 分开看。</p>
<p><strong>第三,别太迷信&quot;自适应&quot;。</strong> 模型自己决定想多深,方向是对的,但它对&quot;这题难不难&quot;的判断并不总是准——开头那个把加法想成奥数的例子就是证据。所以稳妥的做法是给自适应<strong>加一道硬上限</strong>:用 <code>max_tokens</code> 卡死最坏情况,既防失控成本,也防它越想越歪。让它自适应,但别让它无限自适应。</p>
<h2 id="写在最后把想多久当成一个设计决策">写在最后:把&quot;想多久&quot;当成一个设计决策</h2>
<p>推理模型这一年,最大的收获其实是一句很朴素的话:<strong>思考不是越多越好,是要恰好够用。</strong></p>
<p>o1 刚出来时,行业的潜台词是&quot;模型终于会思考了,以后让它多想就对了&quot;。一年下来,这个叙事被修正得很彻底。多想会变贵、会变慢、在简单任务上甚至会变笨。真正成熟的用法不是&quot;全都拉满&quot;,也不是&quot;全都关掉&quot;,而是把&quot;这个请求该想多久&quot;当成一个<strong>和选模型同等重要的设计决策</strong>。</p>
<p>如果你 2026 年在搭一套 LLM 系统,我会建议你这样排优先级:先默认用普通模型,把延迟和成本压在地板上;再把那些真正需要推演的任务挑出来,升级到推理模型;最后给推理那部分配上强度路由和硬上限,让它在&quot;够聪明&quot;和&quot;别失控&quot;之间待着。</p>
<p>会思考是能力,知道什么时候不该思考,才是工程。</p>
]]></content:encoded></item><item><title>AI 视频生成 2026:Sora、可灵、Veo 到哪了</title><link>https://realtime-ai.chat/posts/ai-video-2026/</link><pubDate>Mon, 11 May 2026 10:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/ai-video-2026/</guid><description>2026 年 AI 视频生成到底能干什么:Sora 2、可灵 3.0、Veo 3.1、Seedance 2.0 各自的定位、能落地的场景,以及离替代真实拍摄还差的那几步。</description><content:encoded><![CDATA[<p>去年这时候,你给 AI 一句&quot;猫在厨房打翻牛奶&quot;,它给你一段四秒、猫的爪子有六根、牛奶往上流的诡异片段。</p>
<p>今年同一句话,Veo 3.1 能给你一段八秒的画面:猫跳上台面,牛奶盒倒下,液体顺着桌沿往下淌,落地有声——连&quot;啪嗒&quot;那一下都对上了。</p>
<p>进步是真的。但如果你由此以为&quot;AI 已经能拍片了&quot;,那是被发布会的精选片段骗了。2026 年 5 月的真实情况是:<strong>AI 视频在 10 秒以内的单镜头里已经接近以假乱真,但只要你想讲一个完整的故事,它立刻露馅。</strong> 这篇把这条分界线划清楚。</p>
<h2 id="四家主流各打各的算盘">四家主流,各打各的算盘</h2>
<p>先把牌摊开。2026 年第一梯队基本是这四家加一个 Runway,但他们的定位差得很远。</p>
<table>
  <thead>
      <tr>
          <th>工具</th>
          <th>最新版本</th>
          <th>时长 / 分辨率</th>
          <th>强项</th>
          <th>你该知道的坑</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>OpenAI Sora 2</td>
          <td>Sora 2</td>
          <td>10–25 秒 / 1080p</td>
          <td>物理真实感、多镜头跟随、原生音画同步</td>
          <td>Sora 独立 App 已于 2026 年 4 月下线,API 计划 9 月停服</td>
      </tr>
      <tr>
          <td>快手可灵 Kling</td>
          <td>可灵 3.0</td>
          <td>长片段 / 原生 4K</td>
          <td>人物自然动作、复杂多主体交互、中文生态</td>
          <td>估值已冲到 200 亿美元,产品在快速商业化收紧免费额度</td>
      </tr>
      <tr>
          <td>字节 Seedance</td>
          <td>Seedance 2.0</td>
          <td>4–15 秒 / 1080p</td>
          <td>多模态输入(图/音/视频混合)、多语言对口型</td>
          <td>上线 100+ 国家但<strong>不含美国</strong></td>
      </tr>
      <tr>
          <td>Google Veo</td>
          <td>Veo 3.1</td>
          <td>8 秒为主 / 1080p</td>
          <td>原生音频、镜头运动、和 Google 工具链打通</td>
          <td>基础款时长短,长片要靠拼接</td>
      </tr>
      <tr>
          <td>Runway</td>
          <td>Gen-4 / Gen-4.5</td>
          <td>最长可达分钟级 / 4K</td>
          <td>角色一致性、Aleph 视频内编辑、可接 API 混管线</td>
          <td>偏专业工具,上手门槛比前几家高</td>
      </tr>
  </tbody>
</table>
<p>几个观察值得说。</p>
<p><strong>Sora 的故事很拧巴。</strong> Sora 2 的技术口碑不差——物理一致性、多镜头世界状态保持都做得用心。但 OpenAI 把消费级 Sora App 砍了,API 也排上了停服日程。一个技术上领先的产品,商业上却在往回收。这说明一件事:纯粹&quot;文生视频&quot;作为一个独立 App,很难单独养活自己。</p>
<p><strong>真正在闷声赚钱的是中国公司。</strong> 可灵全球用户冲到 6000 万,快手已经在张罗把它拆出来单独 IPO,Pre-IPO 估值约 200 亿美元。在第三方盲测里,可灵在&quot;自然人物动作&quot;和&quot;提示词遵循&quot;这两项上经常排第一,尤其是多人互动的复杂场景。字节的 Seedance 2.0 走的是另一条路——多模态联合架构,音频和画面在同一次生成里一起算出来,所以对口型和环境音效更准。</p>
<p><strong>Veo 是&quot;水桶型选手&quot;。</strong> 它未必每一项都最强,但画质稳、运镜稳、还能直接塞进 Google Vids、Flow 这些工具里。对一个本来就用 Google 全家桶的团队,Veo 的&quot;顺手&quot;本身就是竞争力。</p>
<h2 id="现在真能做好什么">现在真能做好什么</h2>
<p>把发布会的滤镜摘掉,2026 年 AI 视频<strong>确实</strong>已经做扎实的能力有这么几块。</p>
<p><strong>10 秒以内的单镜头,质量过关。</strong> 一个固定或简单运镜的镜头——人物特写、产品旋转展示、风景空镜——只要不超过十几秒,现在的输出在画质、光影、材质上已经能用在正式内容里。这不是&quot;凑合能看&quot;,是真能上片。</p>
<p><strong>运镜变成了可控参数。</strong> 推、拉、摇、移、跟焦,这些以前要靠运气抽卡的东西,现在能在提示词里点名,而且基本听话。可灵 2.6 的运动控制甚至能把一段参考视频的运动轨迹&quot;迁移&quot;到新画面上。</p>
<p><strong>风格化内容是甜区。</strong> 动漫、定格、超现实、广告质感——这些本来就不要求&quot;物理绝对正确&quot;的风格,AI 做得比写实更稳。因为写实的破绽肉眼一抓一个准,而风格化本身就给了模型容错空间。</p>
<p><strong>原生音频不再是后期。</strong> Veo 3.1、Sora 2、Seedance 2.0 都能在生成画面的同时生成对白、音效、环境声。Seedance 是音画联合架构,声音和画面同一次算出来,对口型准度明显更好。这一步省掉的后期工作量,比想象中大。</p>
<h2 id="还做不好的那几样是真做不好">还做不好的那几样,是真做不好</h2>
<p>这是这篇文章最想说清楚的部分。下面几个不是&quot;再等几个月就好&quot;,是当前路线下的硬骨头。</p>
<pre class="mermaid">flowchart TD
  A[一句提示词] --> B{时长 < 10秒?}
  B -->|是| C[单镜头质量过关<br/>可直接用]
  B -->|否| D[长一致性塌房<br/>人物/场景漂移]
  C --> E{需要精确控制?}
  E -->|否| F[甜区:社媒/空镜/风格片]
  E -->|是| G[反复抽卡<br/>不如真拍]
  style C fill:#cdebc5,stroke:#5a9e4a
  style F fill:#cdebc5,stroke:#5a9e4a
  style D fill:#f5c6c6,stroke:#c0504d
  style G fill:#f5c6c6,stroke:#c0504d
</pre><p><strong>长时一致性。</strong> 这是最大的坎。绝大多数工具撑到 30–60 秒之后,画面就开始&quot;漂&quot;——人物的脸慢慢变样,衣服的扣子数量对不上,背景里的家具悄悄挪位。这叫身份漂移(identity drift)和误差累积。观众其实两三秒就能察觉到不对劲,信任感一下就没了。所以你看到的所有&quot;AI 生成的两分钟短片&quot;,几乎都是十几个短片段剪出来的,不是一气呵成。</p>
<p><strong>复杂物理。</strong> 刚性物体的碰撞、抛物线,模型已经学得不错。但液体、布料、烟雾、多个物体互相作用,还是会出&quot;看着合理、物理上错&quot;的画面:水流会有一瞬间往上爬,布料穿过身体,头发像有自己的意志。Sora 2 的篮球反弹是个标志性进步,可那是因为篮球轨迹相对简单。</p>
<p><strong>精确控制。</strong> 你能描述一个大概,但没法精确指挥。&ldquo;让她在第三秒抬左手,手停在下巴下方两厘米&rdquo;——这种导演级的精度,提示词给不了。结果就是反复抽卡:生成、不对、改词、再生成。当你需要的画面足够具体时,抽卡二十次的时间成本,经常已经超过真拍一条。</p>
<p><strong>人物一致性。</strong> 同一个角色出现在不同镜头里还长一个样,依然不稳。Runway Gen-4 靠单张参考图做角色一致性是目前最像样的方案,Sora 2 的&quot;客串&quot;功能能把你本人放进场景。但只要切镜头、换光线、换景别,人物多少会变。对需要主角连续出场的叙事内容,这是致命伤。</p>
<h2 id="哪些场景已经能真金白银落地">哪些场景已经能真金白银落地</h2>
<p>说了这么多限制,不是劝你别用。恰恰相反——<strong>只要你的需求落在&quot;短、单镜头、容错高&quot;这个区间里,AI 视频今天就能省钱省时间。</strong> 已经在规模化落地的有这么几类。</p>
<p><strong>广告和电商的零碎镜头。</strong> 产品空镜、氛围片段、转场素材,这些本来就是几秒钟的单镜头,AI 做正合适。一条电商详情页视频里,真人出镜的部分照拍,中间的产品展示、场景氛围用 AI 补,成本结构立刻变了。</p>
<p><strong>分镜和概念验证。</strong> 这个被低估了。导演、广告创意想跟客户讲清楚一个镜头长什么样,以前画分镜板,现在直接生成一段动态参考。它不用是最终成片,只要&quot;意思到了&quot;,决策效率就上来了。哪怕最后还是真拍,前期沟通的来回少了一大半。</p>
<p><strong>社媒短内容。</strong> 抖音、小红书、Reels 上那种十几秒的卡点、转场、视觉奇观,本来就不追求长叙事和物理严谨,容错空间大,正好是 AI 的甜区。可灵、Seedance 在国内创作者里铺得快,就是这个原因。</p>
<p><strong>多语言本地化。</strong> Seedance 2.0 这类带多语言对口型的模型,让一段素材换个语言重新&quot;配音&quot;且对得上嘴,这在出海内容里是实打实的刚需。</p>
<h2 id="离替代真实拍摄还差什么">离&quot;替代真实拍摄&quot;还差什么</h2>
<p>最后回到那个所有人都在问的问题:它什么时候能替代片场?</p>
<p>我的判断是:<strong>短期内不会,而且&quot;替代&quot;这个框架本身就提错了。</strong></p>
<p>差的不是画质——画质已经够了。差的是这三样:</p>
<p>一是<strong>连续叙事的稳定性</strong>。电影是几十个镜头里同一批人、同一个世界,连贯地讲一个半小时。AI 现在连两分钟的连贯都保不住。这不是分辨率问题,是模型对&quot;世界状态&quot;的记忆问题,得有架构层面的突破。</p>
<p>二是<strong>精确的可控性</strong>。片场里导演说&quot;再来一条,这次慢半拍&quot;,演员能立刻调整。AI 的&quot;再来一条&quot;是重新抽卡,你没法精确指挥它改哪里、改多少。创作是控制的艺术,失控的工具再强也只是素材生成器。</p>
<p>三是<strong>责任与确定性</strong>。一个剧组交付的是确定的、可追溯、可修改的成片。AI 给你的是一次概率采样的结果,改一个细节可能整个画面都变了。商业制作要的是&quot;我要的就是这个,而且下次还能复现&quot;,这一点 AI 目前给不了。</p>
<pre class="mermaid">flowchart LR
  A[2026 现状] --> B[10秒单镜头<br/>已经能打]
  B --> C[需突破:长一致性]
  C --> D[需突破:精确控制]
  D --> E[真正进片场]
  style B fill:#cdebc5,stroke:#5a9e4a
  style E fill:#fde7c2,stroke:#e8b23c
</pre><p>所以更准确的说法是:AI 视频不会&quot;替代&quot;拍摄,它会<strong>先吃掉拍摄里最标准化、最零碎的那部分</strong>——空镜、产品镜、氛围片段、分镜预演。这部分本来就不太需要&quot;创作&quot;,AI 接手天经地义。而真正考验连续叙事、精确表演、复杂调度的部分,还稳稳地留在人手里。</p>
<p>如果你是创作者,2026 年正确的姿势不是观望,也不是 all in,而是:<strong>把它当成一个非常强的&quot;短镜头素材机&quot;和&quot;分镜工具&quot;,而不是一个&quot;导演&quot;。</strong> 用它擅长的,绕开它做不到的。这一年它能帮你省的钱和时间,已经足够多了。</p>
<hr>
<p>参考来源:<a href="https://openai.com/index/sora-2/">Sora 2 — OpenAI</a>、<a href="https://deepmind.google/models/veo/">Veo — Google DeepMind</a>、<a href="https://blog.google/innovation-and-ai/technology/ai/veo-3-1-lite/">Veo 3.1 Lite — Google Blog</a>、<a href="https://runwayml.com/research/introducing-runway-gen-4">Runway Gen-4 — Runway Research</a>、<a href="https://seed.bytedance.com/en/seedance2_0">Seedance 2.0 — ByteDance Seed</a>、<a href="https://klingai.com/app/">Kling AI 官网</a>、<a href="https://is4.ai/blog/our-blog-1/ai-video-generation-2026-what-works-what-doesnt-340">The State of AI Video Generation in 2026 — is4.ai</a>。</p>
]]></content:encoded></item><item><title>LLM 评估怎么做才靠谱</title><link>https://realtime-ai.chat/posts/llm-evals/</link><pubDate>Sun, 10 May 2026 11:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/llm-evals/</guid><description>公开 benchmark 为什么不能直接信、怎么建自己的 eval 集、LLM-as-judge 有哪些偏差、如何防止过拟合 eval,以及 A/B 与线上指标的取舍。</description><content:encoded><![CDATA[<p>你把 prompt 改了一版,在三个例子上试了试,看着比之前顺眼,于是上线。</p>
<p>第二天客服群里有人说 AI 答得不对劲。你回头去看,发现那三个例子确实变好了,但另外二十种你没试的情况里,有五种悄悄变差了。</p>
<p>这是做 LLM 应用最常见的窘境:<strong>你没法靠&quot;看几个例子&quot;判断一次改动是涨还是跌</strong>。模型是个高维的黑盒,你改 prompt、换模型、调温度,影响面是发散的——在你盯着的地方变好,在你没盯着的地方变坏。评估(eval)要解决的就是这件事:把&quot;我觉得变好了&quot;换成&quot;我有证据说变好了&quot;。</p>
<p>这篇讲怎么把这套证据系统搭起来,以及一路上的坑。</p>
<h2 id="公开-benchmark能看排名不能信分数">公开 benchmark:能看排名,不能信分数</h2>
<p>打开任何一个模型发布页,都有一排 benchmark 分数:MMLU 多少、GPQA 多少、SWE-bench 多少。这些数字有用,但对你的应用,它的参考价值比你以为的小得多。</p>
<p>第一个问题是<strong>饱和</strong>。2026 年的前沿模型在 MMLU 上普遍是 92–94%,彼此之间的差距已经掉进噪声里了。一个 93%、一个 94%,你没法据此说后者更强——重跑一次,排名可能就反过来。MMLU 这种榜单现在只能告诉你&quot;这是不是个能用的模型&quot;,没法在头部模型之间分高下。后来的 MMLU-Pro 想救场,到 2026 年初头部模型也挤到了 90% 附近,同样在走向饱和。</p>
<p>第二个问题更麻烦:<strong>污染</strong>。Benchmark 的题目是公开的,公开就意味着它们大概率被爬进了下一代模型的训练数据。模型可能不是&quot;做对了&quot;题,而是&quot;背过&quot;答案。已经被记录的案例不少:MMLU 的题目在 Common Crawl 里能找到原文;HumanEval 的题和 LeetCode 题高度重合;SWE-bench 的 issue 在公开 git 历史里能翻到现成的修复 commit。</p>
<p>污染有多严重?Scale AI 做过一个对照实验:他们照着小学数学题 GSM8K 的风格,重新出了 1250 道全新的题。结果模型在新题上系统性掉分,最差的那个掉了 13 个百分点。同一个模型,题目换成没见过的,能力就缩水一成多——这说明原来那个高分里,有相当一部分是&quot;背&quot;出来的。</p>
<p>所以 2026 年大家转向<strong>抗污染的 benchmark</strong>:LiveCodeBench、LiveBench 这类按时间切片,只用某个日期之后才出现的新题;FrontierMath 把题目压在手里不公开。这些比静态榜单可信。但即便如此,它们衡量的还是&quot;通用能力&quot;,不是&quot;你的任务&quot;。</p>
<p><strong>结论很直接:公开 benchmark 用来粗筛候选模型——把明显不行的排除掉。但&quot;这个模型在我的客服场景里好不好用&quot;,它一个字都没回答。这个问题只能你自己回答。</strong></p>
<h2 id="自己的-eval-集这才是真正的资产">自己的 eval 集:这才是真正的资产</h2>
<p>你的应用有一个公开 benchmark 永远覆盖不到的东西:<strong>你的真实输入分布</strong>。你的用户怎么提问、问什么、用什么语气、夹杂什么错别字和行业黑话,这是你独有的。eval 集就是把这个分布固定下来。</p>
<p>怎么建,有三个我认为不能省的原则。</p>
<p><strong>第一,例子来自真实流量,不要凭空编。</strong> 你坐在工位上想象的用户提问,和用户真实打出来的,分布不一样。最好的来源是线上日志:把真实请求捞出来,尤其是那些用户追问、重述、明显不满意的——失败案例的信息密度最高。每修一个线上 bug,就把那个 case 沉淀进 eval 集,它就再也不会悄悄复发。</p>
<p><strong>第二,先覆盖,再追数量。</strong> 一个有 50 条、覆盖 15 种场景的 eval 集,比一个有 500 条、全是&quot;查订单状态&quot;的 eval 集有用得多。你要的是把<strong>输入空间的不同角落</strong>都摸到:正常请求、边界请求(超长输入、空输入、多意图混在一句)、对抗请求(prompt 注入、诱导越权)、还有那些你修过的历史 bug。每加一条都先问:它覆盖了一个新角落,还是只是重复?</p>
<p><strong>第三,每条例子都要能判对错。</strong> 一条 eval 数据 = 输入 + 判断标准。判断标准可以是标准答案,可以是一组必须满足的规则(&ldquo;回复里必须包含订单号&rdquo;、&ldquo;不能承诺退款&rdquo;),也可以是一段评分 rubric。没有判断标准的例子不是 eval,是 demo。</p>
<p>eval 集建起来之后,它会变成你团队最值钱的资产之一——比某一版 prompt 值钱。Prompt 会被改无数次,模型会换代,但 eval 集是持续累积的、关于&quot;什么叫做对&quot;的集体知识。</p>
<h2 id="三种判分方式以及各自的脾气">三种判分方式,以及各自的脾气</h2>
<p>有了例子,接下来是怎么自动判分。三种方式,从硬到软排:</p>
<table>
  <thead>
      <tr>
          <th>判分方式</th>
          <th>适用场景</th>
          <th>优点</th>
          <th>坑</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>精确匹配 / 结构校验</td>
          <td>分类、抽取、JSON 输出、函数调用</td>
          <td>客观、零成本、可复现</td>
          <td>只能判有唯一答案的任务</td>
      </tr>
      <tr>
          <td>规则 / 断言</td>
          <td>「必须含 X」「不得出现 Y」、格式、长度</td>
          <td>快、便宜、覆盖硬约束</td>
          <td>写不出复杂语义判断</td>
      </tr>
      <tr>
          <td>LLM-as-judge</td>
          <td>开放式回答、摘要、对话质量</td>
          <td>能评主观质量</td>
          <td>自带偏差,本身需要被评估</td>
      </tr>
  </tbody>
</table>
<p>优先用硬的。能用精确匹配解决的,绝不上 LLM 判分——它客观、免费、每次结果一样。能拆成规则断言的也尽量拆:&ldquo;回复里有没有订单号&quot;用一个正则就够了,没必要请一个大模型来读。</p>
<p>真正绕不开的是开放式任务——&ldquo;这个摘要写得好不好&rdquo;、&ldquo;这个客服回复够不够得体&rdquo;。这种没有唯一答案,只能上 LLM-as-judge:让另一个模型按 rubric 给被测输出打分。这是 2026 年的主流做法,但你得知道它的脾气。</p>
<h2 id="llm-as-judge-会骗你而且骗得很有规律">LLM-as-judge 会骗你,而且骗得很有规律</h2>
<p>LLM 当裁判的最大问题是:<strong>它的偏差不是随机噪声,是系统性的</strong>。随机噪声多跑几次能平掉,系统性偏差不会——它会朝一个固定方向把你的判断带偏。</p>
<p>有几个偏差已经被反复测出来,几乎跑不掉:</p>
<ul>
<li><strong>位置偏差。</strong> 做两个回答的对比评分时,排在前面的那个赢面更大,跟它质量无关。一篇系统研究跨 15 个裁判模型、约 15 万次评测,确认这个偏差稳定存在,而且两个回答质量越接近,偏差越明显。</li>
<li><strong>长度偏差。</strong> 更长、更啰嗦的回答倾向于拿更高分,哪怕信息量没多。</li>
<li><strong>自我偏好。</strong> 裁判模型会偏爱&quot;长得像自己输出&quot;的回答。用 GPT 当裁判,它会高看 GPT 系的生成。</li>
</ul>
<p>这些偏差有多严重?2026 年 RAND 的一项研究发现,没有任何一个裁判模型在所有 benchmark 上都可靠,前沿模型在高难度的偏差测试上错误率超过 50%。换句话说,<strong>你直接拿一个模型当裁判,它的判断有可能跟抛硬币差不多</strong>。</p>
<p>但 LLM-as-judge 不是不能用,是要带着纪律用:</p>
<ol>
<li><strong>位置偏差用双向取平均。</strong> 每对回答评两次,A 在前评一次、B 在前评一次,结果平均。一次都不能省。</li>
<li><strong>自我偏好用跨家族裁判。</strong> 别用同一家的模型既当选手又当裁判。被测是 GPT,就用 Claude 或 Gemini 当裁判。</li>
<li><strong>长度偏差写进 rubric。</strong> 在评分标准里明说&quot;长度不是加分项,只看信息是否准确、完整、相关&rdquo;。</li>
<li><strong>裁判本身也要被评估。</strong> 这步最常被跳过,但最关键:你得人工标一批&quot;金标准&quot;数据——比如 100 条人类专家打过分的样本——然后看你的 LLM 裁判跟人类标注的一致率有多高。一致率太低,这个裁判就不能用。<strong>裁判是被测系统的一部分,它没经过验证,它给的所有分数都是空的。</strong></li>
<li><strong>让它做选择题,别做作文题。</strong> LLM 判断&quot;A 和 B 哪个好&quot;比直接打&quot;7.5 分&quot;靠谱得多。能转成两两对比或分类的,就别让它打绝对分。</li>
</ol>
<p>整套流程串起来大概是这样:</p>
<pre class="mermaid">flowchart TD
  A[线上真实流量] --> B[沉淀为 eval 集<br/>输入 + 判断标准]
  B --> C{任务类型}
  C -->|有唯一答案| D[精确匹配 / 规则断言]
  C -->|开放式| E[LLM-as-judge<br/>双向 + 跨家族 + rubric]
  E --> F[用人类金标准<br/>校准裁判一致率]
  D --> G[聚合分数]
  F --> G
  G --> H[CI 里设阈值<br/>低于线就拦住]
</pre><h2 id="eval-也会被过拟合">eval 也会被过拟合</h2>
<p>这是个反直觉但很真实的陷阱:<strong>你太频繁地拿同一个 eval 集调东西,迟早会过拟合它</strong>。</p>
<p>机制和模型训练里的过拟合一模一样。你改 prompt → 看 eval 分 → 没涨 → 再改 → 再看分……重复几十次之后,你其实是在用 eval 集当训练信号,手动地把 prompt&quot;拟合&quot;到这 50 条例子上。最后 eval 分很漂亮,线上没动静——你优化的是分数,不是真实质量。判分用 LLM 的时候更隐蔽:你可能在不知不觉中专门迎合那个裁判的偏好。</p>
<p>防过拟合有几个具体做法:</p>
<p><strong>留一个 holdout 集,平时锁起来。</strong> 把 eval 集切成两份:开发集天天用、随便看;holdout 集藏好,只在准备上线前、或重大版本节点跑一次。如果开发集涨了、holdout 没涨,说明你过拟合了开发集,这次改动是假涨。</p>
<p><strong>让 eval 集持续流动。</strong> eval 集不是建一次就定死的。每周从最新线上流量补新例子进去,旧的、已经被反复优化过的逐步轮换出主力集。一个会更新的 eval 集,你很难持续过拟合它——因为标准在动。</p>
<p><strong>盯波动幅度,别盯小数点。</strong> eval 分从 86% 变成 87%,在大多数 eval 集规模下都落在统计噪声里,不代表任何东西。先估算一下你这个 eval 集的噪声范围(同一个配置跑几次,看分数抖多大),只有改动幅度明显超过噪声,才算数。</p>
<h2 id="eval-过了不等于线上变好">eval 过了,不等于线上变好</h2>
<p>最后这点是态度问题:<strong>离线 eval 永远是真实世界的近似,不是真实世界本身</strong>。</p>
<p>eval 集再好,也只是你<strong>当下能想到</strong>的输入。用户永远会问出你没预料的问题,真实分布永远在漂移。所以离线 eval 全绿,不等于上线就好。真正的裁判是线上。</p>
<p>成熟的做法是把离线和线上接成一条链:</p>
<ul>
<li><strong>离线 eval 当守门员。</strong> 接进 CI:每次改 prompt、换模型、动检索,自动跑一遍 eval,分数低于阈值的 PR 直接拦住,不让合。这一步拦的是<strong>明确的退步</strong>——已知该做对的事别做错了。</li>
<li><strong>A/B 测线上真实效果。</strong> 离线绿灯只是&quot;准你上&quot;,不是&quot;它一定好&quot;。新版本上线要灰度,拿一小部分真实流量跑 A/B,比的是真实业务指标:任务完成率、人工转接率、用户重述率、负反馈率。</li>
<li><strong>线上当 eval 集的源头。</strong> A/B 里跑出来的新失败 case,回流进 eval 集。这样下次同样的问题就被离线 eval 挡住了。</li>
</ul>
<p>这是个闭环:线上发现问题 → 进 eval 集 → CI 里防复发 → 新版本 A/B → 再发现新问题。eval 集就在这个循环里越长越厚,你的&quot;证据系统&quot;越来越能覆盖真实世界。</p>
<pre class="mermaid">flowchart LR
  A[改动:prompt/模型/检索] --> B[CI 跑离线 eval]
  B -->|低于阈值| A
  B -->|通过| C[灰度 A/B]
  C --> D[看线上指标<br/>完成率/转接率/负反馈]
  D -->|发现新失败| E[回流进 eval 集]
  E --> B
</pre><h2 id="写在最后">写在最后</h2>
<p>把 LLM 评估这件事压成几句:</p>
<p>公开 benchmark 只能粗筛模型,饱和加污染让它的分数当不得真。真正靠谱的是<strong>你自己的 eval 集</strong>,例子要来自真实流量、先求覆盖、每条都能判对错——这是你团队最该攒的资产。判分能用硬规则就别用 LLM,绕不开 LLM-as-judge 时,位置、长度、自我偏好三个偏差必须主动治,裁判本身要拿人类标注校准过才算数。别在同一个 eval 集上反复磨,留 holdout、让 eval 集持续更新。最后记住离线 eval 只是近似,线上 A/B 和真实指标才是终审。</p>
<p>很多团队做 LLM 应用,功能上得飞快,却始终说不清每次改动是涨是跌——因为他们一直在&quot;看几个例子拍脑袋&quot;。先把这套证据系统搭起来,你才算真的在迭代,而不是在赌博。</p>
<hr>
<p>参考资料:</p>
<ul>
<li><a href="https://newsletter.pragmaticengineer.com/p/evals">A pragmatic guide to LLM evals for devs — The Pragmatic Engineer</a></li>
<li><a href="https://developers.openai.com/api/docs/guides/evaluation-best-practices">Evaluation best practices — OpenAI API</a></li>
<li><a href="https://arxiv.org/abs/2406.07791">Judging the Judges: A Systematic Study of Position Bias in LLM-as-a-Judge — arXiv</a></li>
<li><a href="https://www.adaline.ai/blog/llm-as-a-judge-reliability-bias">LLM-as-a-Judge: Why Frontier Models Fail 50%+ Bias Tests — Adaline</a></li>
<li><a href="https://llm-stats.com/blog/research/what-is-a-contaminated-llm">What Is a Contaminated LLM? Detection, Famous Cases, 2026 Guide — llm-stats.com</a></li>
<li><a href="https://benchmarkingagents.com/what-these-benchmarks-miss/">What LLM Benchmarks Don&rsquo;t Measure — benchmarkingagents.com</a></li>
<li><a href="https://www.braintrust.dev/articles/llm-evaluation-guide">What is LLM evaluation? A practical guide — Braintrust</a></li>
</ul>
]]></content:encoded></item><item><title>小模型的逆袭:端侧 LLM 现在能干什么</title><link>https://realtime-ai.chat/posts/small-models-edge/</link><pubDate>Fri, 08 May 2026 11:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/small-models-edge/</guid><description>旗舰大模型抢头条,但几 B 参数的小模型和手机、笔电端侧部署这一年悄悄拉满。这篇讲清小模型现在能做好什么、量化和蒸馏怎么起作用、隐私延迟成本的真账,以及它干不了什么。</description><content:encoded><![CDATA[<p>打开你的 iPhone,如果它是 16 或更新的型号,系统里已经常驻着一个约 30 亿参数的语言模型——它在帮你总结通知、改写短信、给照片打标签,全程不联网。你没装它,你也没感觉到它,但它一直在那。</p>
<p>这件事一年前还做不到。</p>
<p>过去这一年,所有头条都给了旗舰大模型:更长的上下文、更强的推理、更贵的订阅。但真正改变&quot;AI 装在哪儿&quot;这个问题的,是另一条没什么人盯着的线——<strong>几 B 参数的小模型,和把它们塞进手机、笔电、边缘盒子的工程</strong>。这条线今年悄悄拉满了。</p>
<p>我想把这件事讲清楚:小模型现在到底能做好哪些事,为什么端侧值得,量化和蒸馏在中间干了什么,以及——同样重要——它<strong>干不了</strong>什么。</p>
<h2 id="先说清楚小模型不是大模型的劣化版">先说清楚:小模型不是&quot;大模型的劣化版&quot;</h2>
<p>很多人对小模型的印象停留在&quot;便宜但是笨&quot;。这个印象在 2024 年大致成立,现在不成立了。</p>
<p>关键的转变是:小模型不再靠&quot;也学一点世界知识&quot;来对标大模型,而是<strong>放弃了一部分知识广度,换取在窄任务上的密度</strong>。微软的 Phi 系列把这条路走得最直白——靠精心筛选的高质量训练数据,Phi-4 在 MATH 和 GPQA(研究生级科学题)这类基准上能压过体量大得多的模型。它不是&quot;小一号的 GPT&quot;,它是另一种东西。</p>
<p>阿里的 Qwen3 把尺寸切得很细:0.6B、1.7B、4B、8B 一路排下来。官方技术报告里有个反直觉的数据——Qwen3 的 4B / 1.7B,在过半数基准上能打过上一代的 Qwen2.5-7B / 3B,尤其在 STEM 和代码题上。<strong>新一代的 4B,约等于老一代的 7B。</strong> 这就是过去一年小模型走过的距离。</p>
<p>谷歌的 Gemma 也在做同样的事。4 月发布的 Gemma 4,最小的 E2B / E4B 变体用了 Per-Layer Embeddings 这类结构技巧,4-bit 量化后 5GB 内存就能在现代手机上跑起来。</p>
<p>所以判断一个小模型,别再问&quot;它知道的有没有大模型多&quot;——它注定不多。要问的是:<strong>在我这个具体任务上,它够不够。</strong></p>
<h2 id="它现在能做好哪些任务">它现在能做好哪些任务</h2>
<p>把场景摊开看,小模型今天在这几类任务上已经够用,而且是真的够用,不是&quot;凑合&quot;:</p>
<p><strong>文本的搬运和改造。</strong> 总结、改写、润色、抽取实体、分类、按格式重排——这类任务不需要模型&quot;懂很多&quot;,只需要它&quot;听话且稳&quot;。苹果那个 3B 端侧模型的官方定位就写得很白:它擅长总结、抽取、文本理解、润色、短对话,<strong>它明确不是一个用来问世界知识的聊天机器人</strong>。这个定位是诚实的,也是对的。</p>
<p><strong>结构化输出和函数调用。</strong> 这是过去一年小模型最大的一块进步。Gemma 4 是第一个把&quot;agentic 能力&quot;当成一等设计目标的开源模型族——它不靠语法约束,就能稳定吐出合法的、可解析的 JSON 工具调用。这意味着一个本地小模型可以真的当&quot;调度员&quot;用:理解你的意图,挑对工具,填对参数,剩下的交给确定性代码去做。对很多 Agent 场景,模型本来就不该负责&quot;算出答案&quot;,它只负责&quot;派活&quot;。</p>
<p><strong>作为流水线里的快环节。</strong> 在我做的实时语音方向,小模型有个特别实在的用法:用一个本地快模型先兜住首句——&ldquo;嗯&quot;&ldquo;好的,我看一下&rdquo;——同时大模型在后台接管真正的内容。用户感知到的延迟一下就下来了。小模型在这里不是主角,是&quot;垫话的人&rdquo;,但这个角色很值钱。</p>
<p><strong>垂直微调后的专用任务。</strong> 有评测把 12 个小模型放在 8 类任务上比,结论是 Qwen3-4B 微调后整体最强,在不少具体任务上能逼近一个 120B 级别的&quot;老师&quot;模型,而它只要一块消费级显卡就能部署。<strong>针对单一任务微调过的 4B,常常比通用的大模型更好用</strong>——它没有&quot;什么都想说一点&quot;的毛病。</p>
<p>一句话:<strong>凡是任务边界清晰、对世界知识依赖不深的活,小模型现在基本能接。</strong></p>
<h2 id="为什么端侧值得算三笔账">为什么端侧值得——算三笔账</h2>
<p>能在端侧跑,和值得在端侧跑,是两件事。值得不值得,得算账。</p>
<p><strong>第一笔,延迟。</strong> 端侧推理省掉的是网络往返和服务端排队。一次云端调用,光网络和排队的尾巴就可能几十到几百毫秒,还不稳定——你控制不了用户的网络。端侧模型首 token 不走网络,延迟低且<strong>可预测</strong>。对实时交互(语音、输入法、补全)来说,可预测比平均值低更重要。</p>
<p><strong>第二笔,隐私。</strong> 数据不出设备,这不是宣传话术,是合规上实打实的区别。用户的短信、相册、健康数据、剪贴板——这些东西一旦&quot;为了 AI 功能&quot;传到云端,你就要为它的存储、传输、留存负责。端侧推理把这个责任直接消掉了。这也是苹果整条 Apple Intelligence 叙事的地基。</p>
<p><strong>第三笔,成本。</strong> 这笔账最容易被低估。高频调用的场景下,把推理从云端 API 挪到端侧或边缘自托管,成本能降九成以上,高频负载的回本周期常常不到 18 个月。注意前提是<strong>高频</strong>——一个一天被调用三次的功能,没必要折腾端侧;一个每次输入都触发的补全功能,云端账单会吓到你。</p>
<p>但端侧不是免费午餐,它也有反方向的代价:</p>
<pre class="mermaid">flowchart LR
  subgraph 端侧
    A1[延迟低且可预测]
    A2[数据不出设备]
    A3[高频场景成本极低]
    A4[受设备内存/算力封顶]
    A5[模型更新要走发版]
  end
  subgraph 云端
    B1[模型可以很大很强]
    B2[随时热更新]
    B3[网络抖动/排队不可控]
    B4[高频调用账单线性增长]
    B5[数据要出设备]
  end
  style A4 fill:#fde7c2,stroke:#e8b23c
  style A5 fill:#fde7c2,stroke:#e8b23c
  style B3 fill:#fde7c2,stroke:#e8b23c
  style B5 fill:#fde7c2,stroke:#e8b23c
</pre><p>端侧的两个真痛点:<strong>算力封顶</strong>(用户的旧手机就是跑不动 7B),和<strong>更新慢</strong>(模型修了 bug 要等 App 发版,不能像云端那样当天热推)。所以现实里成熟团队的做法是混合:简单高频的活落端侧,复杂低频的活路由到云端。</p>
<h2 id="量化和蒸馏把模型塞进设备的两把钳子">量化和蒸馏:把模型塞进设备的两把钳子</h2>
<p>小模型能上端侧,光靠&quot;参数少&quot;还不够。一个 4B 模型用 FP16 存,也要 8GB,塞进手机内存还是紧。真正把它压进去的,是量化和蒸馏。</p>
<p><strong>量化是压&quot;表示精度&quot;。</strong> 模型权重原本是 16 位浮点,量化把它降到 8 位、4 位甚至更低。直觉上这会掉精度,但实际上掉得没你想的多——4-bit 的 Q4_K_M 这类方案,跟原始 BF16 比通常只掉 1~3 个百分点的基准分。代价换来的是:一个 Llama 3.2 3B 做 4-bit 后训练量化,体积砍掉约 69%,就能在普通安卓机上顺跑。</p>
<p>这里要分清两种量化:</p>
<table>
  <thead>
      <tr>
          <th>类型</th>
          <th>怎么做</th>
          <th>特点</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>后训练量化(PTQ)</td>
          <td>模型训完之后再压</td>
          <td>快、不用重训,大多数场景够用,GGUF 走的就是这条路</td>
      </tr>
      <tr>
          <td>量化感知训练(QAT)</td>
          <td>训练时就假设要被压,提前适应</td>
          <td>更费事,但低比特下精度明显更好</td>
      </tr>
  </tbody>
</table>
<p>苹果那个 3B 端侧模型用的就是更狠的一招:<strong>2-bit 量化感知训练</strong>。在 2-bit 这种极端低比特下,纯后训练量化会崩,只有训练时就让模型&quot;知道自己会被压成 2 位&quot;,精度才扛得住。这是用训练成本换部署体积的典型取舍。</p>
<p><strong>蒸馏是压&quot;知识&quot;。</strong> 它不动表示精度,而是让一个小模型(学生)去模仿一个大模型(老师)的输出分布。学生学到的不只是&quot;正确答案&quot;,还有老师对每个选项的&quot;软概率&quot;——这里面藏着大模型的判断方式。蒸馏过的小模型,在被蒸馏的那个任务域上,表现会明显超过同尺寸从头训的模型。</p>
<p>要点是:<strong>量化和蒸馏不冲突,是叠着用的。</strong> 典型流水线是先蒸馏出一个能干活的小模型,再量化把它压进设备内存。一把钳子压知识,一把钳子压精度,两把一起上,4B 才进得了手机。</p>
<pre class="mermaid">flowchart LR
  A[大模型 / 老师] -->|蒸馏<br/>传递知识| B[小模型 / 学生<br/>4B FP16]
  B -->|量化<br/>压缩精度| C[端侧模型<br/>4B 4-bit]
  C --> D[手机 / 笔电 / 边缘盒子]
  style B fill:#fde7c2,stroke:#e8b23c
  style C fill:#fde7c2,stroke:#e8b23c
</pre><p>硬件这边也在同步补位。今年笔电上的 NPU 终于不只是&quot;参数表上的一行字&quot;了——谷歌的 LiteRT-LM 在 Linux、macOS、Windows 上都能把推理路由到 NPU;AMD 的 Ryzen AI Max+ 这类芯片配上百 GB 级的统一内存,本地跑 7B~13B 已经不费劲。模型在变小,设备在变强,两条线在中间撞上了。</p>
<h2 id="它干不了什么别被逆袭冲昏头">它干不了什么——别被&quot;逆袭&quot;冲昏头</h2>
<p>写到这儿得踩一脚刹车。小模型这一年确实猛,但有几件事它现在做不到,而且短期也做不到。</p>
<p><strong>它的世界知识就是浅。</strong> 这是参数量的物理限制,不是调教问题。研究里反复出现的一个结论:小模型的幻觉率<strong>显著高于</strong>大模型。尤其当你拿大模型的输出去微调小模型时,会出现&quot;知识错配&quot;——喂给它的知识超出了它本身装得下的量,反而更容易胡说。所以任何依赖&quot;模型自己知道很多事实&quot;的场景——开放域问答、冷门领域咨询——别指望端侧小模型。要做,就得给它接检索(RAG),让事实从外部来,模型只负责组织语言。</p>
<p><strong>长链条、多步推理它会断。</strong> 需要七八步严密推演才能得到的答案,小模型中途容易掉链子。它适合&quot;一两步就能想清&quot;的任务,不适合当复杂推理的主脑。</p>
<p><strong>再小一点就崩了。</strong> 别被&quot;参数越小越好&quot;带跑偏。1B 以下的模型(比如 270M、0.5B 这个量级)是真能跑,但质量在除了最简单的分类之外的任务上断崖式下跌。不是所有任务都越小越好,<strong>有个下限,过了就是不能用</strong>。</p>
<p>我的判断很直接:小模型不是来取代大模型的,这场&quot;逆袭&quot;不是零和的。它做的事是<strong>把 AI 能力的下限抬高了</strong>——以前必须上云、必须付费、必须联网才能做的一批活,现在一台设备本地就能办。大模型继续往上探能力的天花板,小模型在下面把地基铺宽。这两件事都在发生,而且互不矛盾。</p>
<h2 id="如果你现在要做端侧">如果你现在要做端侧</h2>
<p>给一个落地顺序,和我做语音 Agent 时的优先级思路一致——先想清楚,再动手:</p>
<ol>
<li><strong>先问任务边界,别先挑模型。</strong> 任务边界清晰、不靠深度世界知识,才适合端侧小模型。边界模糊的,先别碰。</li>
<li><strong>按调用频率决定端侧还是云端。</strong> 高频(每次输入都触发)优先端侧;低频复杂任务留给云端。混合是常态,不是妥协。</li>
<li><strong>要事实,就上 RAG,别让小模型硬背。</strong> 把&quot;知道什么&quot;外置成检索,模型只管&quot;怎么说&quot;。这一步能把幻觉问题压下去一大半。</li>
<li><strong>模型选型从 4B 这一档试起。</strong> 今天 4B 是端侧的甜区——Qwen3-4B、Gemma 4 E4B 这一档,能力够、塞得进、微调后很能打。往下到 1B 以下要非常谨慎。</li>
<li><strong>量化按设备定。</strong> 手机这种内存紧的,认 4-bit、认 GGUF;有 NPU 的笔电,把推理路由过去,能凉一截也快一截。</li>
</ol>
<p>端侧 LLM 今年最大的变化,不是某个模型刷新了某个榜单,而是**&ldquo;在设备上本地跑一个够用的语言模型&quot;这件事,从研究 demo 变成了产品默认选项**。你的手机已经在这么做了。接下来一年,轮到你的产品。</p>
]]></content:encoded></item><item><title>MoE 为什么成了大模型标配</title><link>https://realtime-ai.chat/posts/moe-architecture/</link><pubDate>Thu, 07 May 2026 11:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/moe-architecture/</guid><description>DeepSeek V3 一共 6710 亿参数,推理时每个 token 只用 370 亿。这篇讲清 MoE 怎么做到「参数量大但推理便宜」,以及它换来的工程代价。</description><content:encoded><![CDATA[<p>DeepSeek V3 一共有 6710 亿参数。但你每问它一句话,真正参与计算的只有 370 亿——剩下的 95% 在显存里待命,一个 token 都不碰。</p>
<p>这听起来像偷工减料,其实是过去三年大模型架构最重要的一次转向。到 2026 年,你叫得出名字的开源旗舰里,几乎没有一个还是&quot;老老实实每个参数都算&quot;的稠密模型:DeepSeek V4-Pro(1.6 万亿总参 / 490 亿激活)、Qwen 3.5(3970 亿 / 170 亿)、Llama 4 Maverick(4000 亿 / 170 亿)、Kimi K2(1 万亿 / 约 320 亿)、Mistral Large 3(6750 亿 / 410 亿)。这个架构叫 Mixture-of-Experts,混合专家。</p>
<p>它解决的是一个很具体的矛盾:模型想变聪明,最直接的办法是堆参数;但参数一多,推理就慢、就贵。MoE 的本质,是<strong>把&quot;模型有多少知识&quot;和&quot;算一次要花多少钱&quot;这两件事拆开</strong>。这篇讲清楚它怎么做到的,以及它换来了什么样的工程代价。</p>
<h2 id="先讲清楚稠密模型贵在哪">先讲清楚:稠密模型贵在哪</h2>
<p>传统的大模型——也就是 GPT-3、早期 Llama 那种&quot;稠密&quot;(dense)模型——有一个朴素的规则:<strong>每个 token 经过每一层时,所有参数都要参与计算</strong>。</p>
<p>一个 700 亿参数的稠密模型,处理一个 token 就要做大约 700 亿次乘加。处理一句 100 字的话,乘以 100。参数翻倍到 1400 亿,这个账单也跟着翻倍。算力、显存带宽、电费,全是线性涨上去的。</p>
<p>问题是,模型里真的每个参数对每个 token 都有用吗?</p>
<p>直觉上不是。你问它&quot;今天北京天气&quot;,和你让它&quot;写一段 Rust 的并发代码&quot;,用到的知识完全不同。稠密模型的浪费就在这:不管你问什么,它都把&quot;写代码的脑区&quot;和&quot;聊天气的脑区&quot;全部点亮算一遍。</p>
<p>MoE 想做的事很朴素——<strong>该用哪块脑子,就只用哪块</strong>。</p>
<h2 id="用一个类比把它讲透">用一个类比把它讲透</h2>
<p>把稠密模型想象成一家公司,每来一个问题,全公司 200 个人都得开会、都得发言,然后把意见汇总。问题再小也这么干。开会效率极低,但好处是没人会漏掉。</p>
<p>MoE 是另一种公司。同样养着 200 个员工(这叫<strong>专家</strong>,expert),但每来一个问题,门口坐着一个<strong>调度员</strong>(这叫<strong>路由器</strong>,router 或 gating network),它扫一眼问题,只挑最对口的 8 个人进会议室,其余 192 人继续待岗。</p>
<p>关键点来了:</p>
<ul>
<li><strong>这家公司&quot;知识总量&quot;还是 200 人份的</strong>——养着这么多专业各异的人,什么问题都有人能接。</li>
<li><strong>但&quot;开一次会的成本&quot;只有 8 人份</strong>——大部分人这次根本没参与。</li>
</ul>
<p>这就是 MoE 那句听起来矛盾的话——&ldquo;参数量大,但推理便宜&rdquo;——的全部秘密。<strong>总参数</strong>(200 人)决定模型的知识容量;<strong>激活参数</strong>(8 人)决定你每跑一次推理的算力账单。MoE 把这两个数字解耦了。</p>
<p>DeepSeek V3 就是个标准样本:总参 6710 亿,但每个 token 只激活 370 亿。它每个 token 的计算量,大约相当于一个 370 亿的稠密模型,但它肚子里装的知识,是 6710 亿那个量级的。官方的说法是,它每 token 的有效计算成本,大致是同等总参稠密模型的二十分之一。</p>
<h2 id="路由器整个架构的开关">路由器:整个架构的开关</h2>
<p>MoE 里最精巧、也最容易出问题的零件,是路由器。</p>
<p>它的工作具体发生在模型的每一个 MoE 层里。一个 token 进来,路由器算一个打分,给当前层的每个专家打个分,然后选出得分最高的几个(术语叫 top-K,DeepSeek V3 是 top-8),只把这个 token 送进这几个专家。专家各自算完,按打分加权汇总,再往下一层走。下一层又是一次全新的挑选。</p>
<pre class="mermaid">flowchart TD
  T[输入 token] --> R{路由器<br/>给每个专家打分}
  R -->|得分 0.41| E1[专家 1 ✓]
  R -->|得分 0.27| E2[专家 2 ✓]
  R -->|得分 0.02| E3[专家 3 跳过]
  R -->|得分 0.18| E4[专家 4 ✓]
  R -->|得分 0.01| E5[专家 ... 跳过]
  E1 --> M[加权汇总]
  E2 --> M
  E4 --> M
  M --> O[进入下一层]
  style E3 fill:#eee,stroke:#bbb,color:#999
  style E5 fill:#eee,stroke:#bbb,color:#999
  style R fill:#fde7c2,stroke:#e8b23c
</pre><p>这里有几个反常识的点,值得单独说:</p>
<p><strong>专家不是&quot;按学科分工&quot;的。</strong> 你不会找到一个&quot;数学专家&quot;或者一个&quot;法语专家&quot;。训练完之后去看,专家学到的分工往往很碎、很说不清——可能某个专家专门处理标点和换行,某个专门管代码缩进。分工是训练里自己涌现出来的,人没法预先指派。</p>
<p><strong>路由是逐层、逐 token 的。</strong> 不是一句话进来挑一次专家就定了。一个 token 在 60 层里,可能经过 60 组完全不同的专家组合。所以&quot;激活了哪些专家&quot;是个非常动态的东西。</p>
<p><strong>2026 年的主流是&quot;细粒度专家 + 共享专家&quot;。</strong> DeepSeek 带火的这套设计有两个改动。一是<strong>把专家切小切多</strong>——与其养 8 个大专家,不如养 256 个小专家,每次激活 8 个。专家越细,组合越多,分工越能专精。二是留一两个<strong>共享专家</strong>(shared expert)常驻,不参与路由,每个 token 都过——专门负责&quot;标点、语法、常识&quot;这类谁都要用的通用能力,这样路由的那些专家就能腾出来专攻各自的细分领域。</p>
<h2 id="激活参数-vs-总参数一张表说清楚">激活参数 vs 总参数:一张表说清楚</h2>
<p>这两个数字,是 2026 年看模型参数表时唯一真正要分清的事。它们决定了完全不同的东西:</p>
<table>
  <thead>
      <tr>
          <th>维度</th>
          <th>总参数</th>
          <th>激活参数</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>它代表</td>
          <td>模型的知识容量</td>
          <td>单 token 的计算量</td>
      </tr>
      <tr>
          <td>决定</td>
          <td><strong>显存</strong>够不够装得下</td>
          <td><strong>推理速度</strong> / 单次成本</td>
      </tr>
      <tr>
          <td>DeepSeek V3</td>
          <td>6710 亿</td>
          <td>370 亿</td>
      </tr>
      <tr>
          <td>Qwen 3.5</td>
          <td>3970 亿</td>
          <td>170 亿</td>
      </tr>
      <tr>
          <td>Llama 4 Maverick</td>
          <td>4000 亿</td>
          <td>170 亿</td>
      </tr>
      <tr>
          <td>Kimi K2</td>
          <td>1 万亿</td>
          <td>约 320 亿</td>
      </tr>
  </tbody>
</table>
<p>看这张表,你能立刻得到一条很实用的判断:一个标成 &ldquo;397B-A17B&rdquo; 的模型,<strong>前面那个数(397B)是你买显存时要看的,后面那个数(17B)是你估推理速度时要看的</strong>。两者别搞混——这是 MoE 部署里最常见的认知错误。</p>
<p>它带来的实际效果是反直觉的:Qwen3.5 那个 35B-A3B 的 MoE 版本,占的显存远比 9B 的稠密版大(光权重就 21GB 对 5.8GB),但在同一张卡上,它的吞吐和首 token 延迟反而更好。<strong>显存占得多,但跑得快</strong>——因为速度只跟那 3B 激活参数有关。</p>
<h2 id="天下没有白吃的午餐moe-的工程代价">天下没有白吃的午餐:MoE 的工程代价</h2>
<p>讲到这你可能觉得 MoE 是纯赚的——同样的算力,能装下大得多的模型。但它把成本从&quot;算力&quot;转移到了别的地方,而且这些地方往往更难搞。</p>
<p><strong>第一笔账:显存。</strong> 推理时虽然只算 8 个专家,但你不知道下一个 token 会路由到哪 8 个,所以<strong>全部 256 个专家的权重都得待在显存里</strong>。MoE 省的是算力,不是显存。Kimi K2 这种 1 万亿参数的模型,FP16 精度下光权重就要 2TB 量级的显存,只能靠多卡集群伺候。&ldquo;激活参数小&quot;绝不意味着&quot;能在小显卡上跑&rdquo;。</p>
<p><strong>第二笔账:负载均衡。</strong> 路由器是学出来的,它会&quot;偏心&quot;。如果不管,训练到后面会出现&quot;马太效应&quot;——几个专家因为早期表现好,被路由器越选越多,练得越来越强;另一批专家几乎没 token 光顾,等于白养。极端情况下,你那个 256 专家的模型,实际只有几十个在干活,知识容量大打折扣。</p>
<p>早期的解法是加一个<strong>辅助损失</strong>(auxiliary loss),硬性惩罚&quot;分配不均&quot;,逼路由器雨露均沾。但这个惩罚项会和&quot;把 token 送给最对的专家&quot;这个主目标打架,损害模型质量。DeepSeek V3 改用了一个<strong>无辅助损失</strong>的方案:给每个专家的路由打分加一个可调的偏置项,某个专家最近太忙就把它的偏置调低、太闲就调高——只动路由、不进损失函数。这个细节,正是 DeepSeek 那一代模型训练能又稳又便宜的关键之一。</p>
<p><strong>第三笔账:部署复杂度。</strong> 专家太多,一张 GPU 装不下,得<strong>专家并行</strong>(expert parallelism)——把 256 个专家摊到几十张卡上。这下问题来了:一个 token 路由到的 8 个专家,可能散在 8 张不同的卡上,token 得先被发过去、算完再收回来。这种跨卡通信(all-to-all)是 MoE 推理的头号瓶颈,而且负载是<strong>动态</strong>的——这一批 token 可能全挤向某几张卡,那几张卡就成了堵点。稠密模型完全没有这套烦恼。</p>
<p>所以 MoE 不是&quot;免费午餐&quot;,而是一笔<strong>用工程复杂度换计算效率的交易</strong>。它假设你有能力搞定多卡集群、搞定专家并行、搞定负载均衡。对个人开发者和小团队,在本地跑一个大 MoE,门槛其实比同等&quot;能力档位&quot;的稠密模型更高——因为卡在显存上。</p>
<h2 id="为什么-2026-年几乎全是-moe">为什么 2026 年几乎全是 MoE</h2>
<p>把上面的账合起来算,结论就很清楚了。</p>
<p>到 2026 年,纯靠堆稠密参数这条路已经走到头:再大的稠密模型,推理成本高到没法规模化服务。而模型厂商面对的需求又是确定的——既要在榜单上有竞争力(要知识容量、要总参数),又要能用可接受的成本服务上亿用户(要推理便宜、要激活参数小)。</p>
<p>MoE 是目前唯一能同时满足这两头的架构。它让厂商可以理直气壮地把总参数推到万亿级,同时把激活参数压在二三十亿到五十亿这个&quot;服务得起&quot;的区间。DeepSeek、Qwen、Llama、Kimi、Mistral——这些团队各自独立地收敛到同一个设计,不是跟风,是因为约束条件相同,最优解也就相同。</p>
<p>但要泼一点冷水:MoE 不是没有代价的银弹。它把模型能力做大了,却把工程门槛也抬高了——显存、通信、负载均衡,每一样都需要专门的基础设施。<strong>它真正改变的,不是&quot;模型能多强&quot;,而是&quot;多强的模型能被服务得起&quot;。</strong> 对 2026 年要做规模化部署的团队来说,这恰恰是最重要的那个问题。</p>
<hr>
<p>参考来源:</p>
<ul>
<li><a href="https://arxiv.org/html/2412.19437v1">DeepSeek-V3 Technical Report (arXiv)</a></li>
<li><a href="https://arxiv.org/pdf/2401.06066">DeepSeekMoE: Towards Ultimate Expert Specialization (arXiv)</a></li>
<li><a href="https://www.spheron.network/blog/moe-inference-optimization-gpu-cloud/">MoE Model Inference on GPU Cloud: Expert Parallelism, Memory, and Cost (2026) — Spheron</a></li>
<li><a href="https://qubittool.com/blog/llm-landscape-may-2026-deepseek-qwen-llama-comparison">LLM Landscape May 2026: DeepSeek V4 vs Qwen 3.5 vs Llama 4 — QubitTool</a></li>
<li><a href="https://huggingface.co/blog/NormalUhr/moe-balance">A Review on Load Balancing Strategy in MoE LLMs — Hugging Face</a></li>
</ul>
]]></content:encoded></item><item><title>让 LLM 输出可靠的结构化数据</title><link>https://realtime-ai.chat/posts/structured-output/</link><pubDate>Wed, 06 May 2026 11:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/structured-output/</guid><description>LLM 接进系统最常踩的坑,是它返回的 JSON 时好时坏。从 prompt 约束到约束解码,逐个拆解几种方案的真实代价、schema 设计与流式场景的兜底。</description><content:encoded><![CDATA[<p>你写了个 prompt,让 LLM 把一段用户评论解析成 JSON:情感、评分、关键词。本地跑了二十次,完美。上线。</p>
<p>三天后告警响了。某条响应里,LLM 在 JSON 后面多写了一句&quot;希望这个分析对你有帮助!&quot;。你的 <code>json.loads()</code> 当场抛异常,整条链路挂掉。</p>
<p>这不是小概率事件,是<strong>结构性问题</strong>。只要你还在用&quot;自由文本里夹一段 JSON&quot;的方式跟 LLM 要数据,这种崩溃就是迟早的——区别只是它发生在测试环境还是生产环境。</p>
<p>这篇讲清楚:为什么自由文本提 JSON 天生不可靠,2026 年有哪几种正经方案、各自的代价是什么,schema 怎么设计才不坑自己,以及最难的那块——流式场景下怎么拿到结构化数据。</p>
<h2 id="为什么让它输出-json本身就是错的">为什么&quot;让它输出 JSON&quot;本身就是错的</h2>
<p>先理解 LLM 在干什么。它做的是一件事:根据前面所有 token,预测下一个 token 的概率分布,然后采样。它<strong>没有</strong>&ldquo;我现在要写一个合法 JSON&quot;这种全局意识。</p>
<p>所以当你在 prompt 里写&quot;请只返回 JSON,不要有多余文字&rdquo;,你是在用一句话,对抗模型训练数据里成千上万条&quot;先解释再给结果&quot;的对话样本。大多数时候它听话,因为你的指令把概率压过去了。但只要某次采样,在该写 <code>}</code> 的位置,&ldquo;希望&quot;这个 token 的概率偶然爬到了第一,它就会写下去——而且一旦写下去,后面就会顺着&quot;希望这个分析对你有帮助&quot;这条最自然的路径滑下去。</p>
<p>常见的失败长这样:</p>
<ul>
<li>JSON 外面套了 <code>```json</code> 代码块,或者前后有一段自然语言</li>
<li>字符串里有没转义的换行、引号</li>
<li>该是数字的字段写成了 <code>&quot;4.5&quot;</code>(带引号),或者写成 <code>4.5分</code></li>
<li>嵌套对象少了一个括号,尤其是输出很长的时候</li>
<li>枚举字段返回了你没定义的值——你要 <code>positive/negative/neutral</code>,它给你个 <code>mixed</code></li>
</ul>
<p>这些都不是模型&quot;笨&rdquo;,是概率采样的必然结果。<strong>你不可能靠把 prompt 写得更恳切来根治它</strong>,你只能降低概率,没法归零。要归零,得换思路:不是请求它输出合法结构,而是从机制上让它<strong>没法输出</strong>不合法的结构。</p>
<h2 id="五种方案以及它们各自的代价">五种方案,以及它们各自的代价</h2>
<p>2026 年,从最弱到最强,实际可用的方案是这五种。关键不是&quot;哪个最好&quot;,是搞清楚每个的边界。</p>
<pre class="mermaid">flowchart TB
  A["LLM 要输出结构化数据"] --> B{"模型在哪?"}
  B -->|"闭源 API"| C{"要不要 100% 保证 schema?"}
  B -->|"自己部署的开源模型"| D["约束解码<br/>xgrammar / llguidance"]
  C -->|"要"| E["Structured Outputs / strict 工具"]
  C -->|"差不多就行"| F["JSON Mode（已是 legacy）"]
  E --> G["拿到必定合法的 JSON"]
  D --> G
  F --> H["只保证语法合法，schema 靠运气"]
  style E fill:#fde7c2,stroke:#e8b23c
  style D fill:#fde7c2,stroke:#e8b23c
</pre><p><strong>1. 纯 prompt 约束。</strong> 就是开头那种&quot;请只返回 JSON&quot;。它的唯一价值是当作其他方案的补充——把字段含义、示例写清楚能提升内容质量。但<strong>别拿它当结构保证</strong>。如果你现在生产环境还在裸用这个,这篇文章后面的部分就是为你写的。</p>
<p><strong>2. JSON Mode。</strong> OpenAI 最早的尝试,<code>response_format: {&quot;type&quot;: &quot;json_object&quot;}</code>。它保证一件事:输出是<strong>语法合法</strong>的 JSON——不会有代码块包裹,不会有多余文字,括号配对。但它<strong>不管 schema</strong>:字段名、字段类型、枚举值、必填项,一概不保证。所以你还是得做完整校验。2026 年它基本算 legacy 了,OpenAI 自己的文档也把它标成旧特性,纯 JSON Mode 在生产里早就没人用了。</p>
<p><strong>3. 约束解码 / Grammar(constrained decoding)。</strong> 这是真正解决问题的机制,也是后面几种方案底层共用的东西。原理:在每一步采样时,根据&quot;目前已经生成的部分 + 目标 schema&quot;,算出<strong>下一个 token 哪些是合法的</strong>,把所有非法 token 的概率直接屏蔽(mask 成负无穷),只在合法集合里采样。</p>
<p>举例:已经生成到 <code>{&quot;rating&quot;:</code>,那么下一个 token 只能是数字、<code>-</code>、空格——模型这一步<strong>根本采样不到</strong> <code>&quot;</code> 或者字母。它不是&quot;被劝住了&quot;,是那条路被物理封死了。</p>
<p>开源世界里这块 2026 年很成熟。<code>xgrammar</code> 是目前 vLLM、SGLang、TensorRT-LLM 的默认结构化生成后端,支持完整的上下文无关文法(JSON、正则、自定义 CFG),每 token 开销做到了 40 微秒以下,几乎不影响吞吐;<code>llguidance</code> 是另一个主力,OpenAI 2025 年公开说过自家实现的底层借鉴了它。早期的 <code>outlines</code> 用有限状态机思路,开了这个方向,但碰到递归 schema(比如树形结构、嵌套评论)会很吃力,编译能慢到几十秒甚至几分钟,递归类结构现在更推荐用 xgrammar、llguidance 这种 CFG 引擎。</p>
<p><strong>4. Structured Outputs API。</strong> 这是闭源厂商把约束解码包装成的产品功能。OpenAI 的 <code>response_format: {&quot;type&quot;: &quot;json_schema&quot;, strict: true}</code> 就是它——你传一个 JSON Schema,模型底层用约束解码,<strong>输出必定符合 schema</strong>:每个必填字段都在、类型都对、枚举值都合法。可用模型是 gpt-4o-2024-08-06 之后的版本、GPT-4.1 全系、GPT-5 和 o 系列。2026 年它是数据抽取、Agent 场景的生产默认。</p>
<p><strong>5. Function Calling / Tool Use。</strong> 你定义工具,带 input schema,模型返回一个符合 schema 的工具调用。本质上跟 Structured Outputs 是同一套约束解码机制,只是包装成了&quot;调用工具&quot;的语义。它适合两类场景:一是模型真的要去调外部 API;二是你给了多个工具让模型自己选(多 Agent、路由)。Anthropic 的 Claude 走的就是 tool use 这条路,且复杂嵌套 schema 下也很稳;Gemini 这边把 JSON 模式和结构化输出合并成了一个特性。</p>
<p>一句话总结取舍:</p>
<table>
  <thead>
      <tr>
          <th>方案</th>
          <th>保证语法合法</th>
          <th>保证 schema</th>
          <th>适用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>纯 prompt 约束</td>
          <td>否</td>
          <td>否</td>
          <td>只用来补充内容质量,别单用</td>
      </tr>
      <tr>
          <td>JSON Mode</td>
          <td>是</td>
          <td>否</td>
          <td>已 legacy,不推荐新项目</td>
      </tr>
      <tr>
          <td>约束解码(xgrammar 等)</td>
          <td>是</td>
          <td>是</td>
          <td>自己部署开源模型</td>
      </tr>
      <tr>
          <td>Structured Outputs API</td>
          <td>是</td>
          <td>是</td>
          <td>闭源 API,要纯数据返回</td>
      </tr>
      <tr>
          <td>Function Calling</td>
          <td>是</td>
          <td>是</td>
          <td>要调外部工具,或多工具选择</td>
      </tr>
  </tbody>
</table>
<p><strong>选型其实很简单</strong>:自己部署模型,上 xgrammar;用闭源 API 且只想要一段数据,用 Structured Outputs;用闭源 API 且模型要决策调哪个工具,用 Function Calling。剩下两个,知道它们存在就行。</p>
<h2 id="schema-设计决定成败的地方往往不是代码">schema 设计:决定成败的地方往往不是代码</h2>
<p>很多人以为开了 Structured Outputs 就万事大吉了。不是。约束解码保证模型输出<strong>符合</strong>你的 schema,但如果你的 schema 设计得烂,模型会在&quot;合法&quot;的范围内给你垃圾。</p>
<p>几条我踩过坑后总结的硬规则:</p>
<p><strong>用枚举,别用开放字符串。</strong> 情感字段写成 <code>&quot;sentiment&quot;: string</code> 模型可能给你 <code>非常正面</code>、<code>positive</code>、<code>POSITIVE</code> 三种花样。写成 <code>enum: [&quot;positive&quot;, &quot;negative&quot;, &quot;neutral&quot;]</code>,约束解码会保证它只能落在这三个里。能枚举的一律枚举。</p>
<p><strong>给每个字段写 description。</strong> schema 里的 <code>description</code> 不是注释,模型会读。<code>&quot;score&quot;</code> 含糊,<code>&quot;score: 1-5 整数,5 表示强烈推荐,严格保守打分&quot;</code> 就清楚得多。约束解码管类型,不管&quot;打分准不准&quot;,后者靠 description。</p>
<p><strong>注意 strict 模式的限制。</strong> OpenAI 的 strict 模式有几条硬约束容易绊人:所有字段都必须列进 <code>required</code>(想要可选字段,得把类型写成联合类型带 <code>null</code>);不支持任意的 <code>dict[str, Any]</code>,key 不确定的字典它接不了;日期时间得用 ISO 字符串表示。设计前先翻一遍文档的限制清单,别等运行时报错。</p>
<p><strong>给模型一条&quot;我不知道&quot;的出路。</strong> 这条最容易被忽略。如果信息缺失,你又强迫模型必须填某个字段,约束解码会逼它<strong>编一个</strong>——它在合法 token 里硬凑,于是你拿到一个格式完美的幻觉。正确做法是显式留口子:加 <code>confidence</code> 字段,或者让关键字段可空,或者加一个 <code>&quot;status&quot;: [&quot;ok&quot;, &quot;insufficient_info&quot;]</code>。<strong>结构合法不等于内容可信</strong>,这是约束解码救不了你的部分。</p>
<p><strong>别一次榨太多。</strong> 一个 schema 里塞二十个字段,还层层嵌套,模型质量会肉眼可见地掉。能拆成两次调用就拆。</p>
<h2 id="出错了怎么兜底">出错了怎么兜底</h2>
<p>上了 Structured Outputs,JSON 解析层面的错确实没了。但还有别的会出问题,得有兜底。</p>
<p>第一类,<strong>API 层面的失败</strong>:超时、限流、网络抖动。这跟结构化无关,但既然你依赖一个必定返回结构的接口,它一旦不返回,你的下游就断了。退避重试,该做做。</p>
<p>第二类,<strong>约束解码碰上 token 上限</strong>。约束解码保证&quot;如果生成完成,结构一定合法&quot;,但它<strong>不保证一定能生成完成</strong>。如果 <code>max_tokens</code> 设小了,模型在一个深层嵌套里被强行截断,你拿到的是一段合法但<strong>不完整</strong>的 JSON。对策:嵌套深、字段多的 schema,把 <code>max_tokens</code> 给足;并且检查 finish reason 是不是 <code>length</code>,是的话当失败处理。</p>
<p>第三类,<strong>内容兜底</strong>——前面说的幻觉。schema 里留了 <code>confidence</code> 或 <code>status</code>,这里就要用上:低于阈值的结果不直接进库,转人工或走降级逻辑。</p>
<p>一个实战习惯:<strong>就算用了 Structured Outputs,落库前也做一次业务校验。</strong> 不是不信约束解码,是 schema 只能表达&quot;类型和结构&quot;,表达不了&quot;评分必须在 1 到 5 之间且这条订单的金额不能是负数&quot;这种业务约束。两层防线:schema 管结构,代码管语义。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 闭源 API:Structured Outputs 保证结构,代码补业务校验</span>
</span></span><span class="line"><span class="cl"><span class="n">resp</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">chat</span><span class="o">.</span><span class="n">completions</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">model</span><span class="o">=</span><span class="s2">&#34;gpt-4.1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">messages</span><span class="o">=</span><span class="p">[</span><span class="o">...</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="n">response_format</span><span class="o">=</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;json_schema&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;json_schema&#34;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;review&#34;</span><span class="p">,</span> <span class="s2">&#34;strict&#34;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s2">&#34;schema&#34;</span><span class="p">:</span> <span class="n">SCHEMA</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="n">max_tokens</span><span class="o">=</span><span class="mi">800</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">choices</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">finish_reason</span> <span class="o">==</span> <span class="s2">&#34;length&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">raise</span> <span class="n">TruncatedError</span><span class="p">(</span><span class="s2">&#34;被 token 上限截断,当失败重试&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">choices</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">content</span><span class="p">)</span>  <span class="c1"># 这里几乎不会再抛</span>
</span></span><span class="line"><span class="cl"><span class="n">validate_business_rules</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>  <span class="c1"># 评分范围、字段间一致性等,schema 管不到</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="流式场景最难啃的一块">流式场景:最难啃的一块</h2>
<p>到这里都还好。真正难的是这个:你要<strong>流式</strong>输出,<strong>同时</strong>要结构化数据。</p>
<p>比如一个 UI,要边生成边把解析结果填进表单——名字一出来就显示名字,地址一出来就显示地址。但 LLM 是一个 token 一个 token 吐的,而 JSON 的<strong>任何中间状态都是语法非法的</strong>:</p>
<pre class="mermaid">flowchart LR
  T1["{"] --> T2["{\"name\""] --> T3["{\"name\":\"张"] --> T4["{\"name\":\"张三\"}"]
  T1 -.->|"json.loads"| X1["报错"]
  T2 -.->|"json.loads"| X2["报错"]
  T3 -.->|"json.loads"| X3["报错"]
  T4 -.->|"json.loads"| OK["成功"]
  style X1 fill:#f8d7da,stroke:#c33
  style X2 fill:#f8d7da,stroke:#c33
  style X3 fill:#f8d7da,stroke:#c33
  style OK fill:#d4edda,stroke:#3a3
</pre><p>你不能等整段 JSON 攒齐——那就退化成非流式,流式的意义没了。也不能拿 <code>json.loads()</code> 去解每个中间态——它每次都抛异常。</p>
<p>可行的有两条路:</p>
<p><strong>一是分隔符切块。</strong> 别要一个大 JSON,让模型按 <code>JSON Lines</code> 输出——每行一个独立的小对象,中间用换行分隔。每收到一个完整换行,就解析这一行。这等于把&quot;一个大结构&quot;拆成&quot;很多个小结构&quot;,每个小结构一旦完整就立刻可用。简单、稳,适合&quot;一批结果&quot;型的输出。</p>
<p><strong>二是容错增量解析。</strong> 用一个能处理<strong>残缺 JSON</strong> 的解析器,把每个中间态尽力补全成一个带类型的部分对象——<code>{&quot;name&quot;:&quot;张</code> 直接解析成 <code>{name: &quot;张&quot;}</code>,字段还没出现的就当缺失。这条路上 2026 年比较成熟的是 <code>BAML</code> 这类工具,它内置了一个容错 parser,专门把破碎的部分 JSON 实时转成带类型的对象,既保住流式的体验,又拿到渐进的结构化数据。</p>
<p>选哪条:输出是&quot;一组同类项&quot;,用 JSON Lines;输出是&quot;一个有很多字段的大对象&quot;,且 UI 要逐字段渐进填充,用容错增量解析。</p>
<p>还有个常被忽略的点:<strong>流式 + 约束解码可以同时用</strong>。约束解码是逐 token 工作的,本来就和流式天然兼容——vLLM 这类引擎流式吐 token 的同时,xgrammar 在每一步做 mask。所以&quot;用了约束解码就不能流式&quot;是个误解,两者是正交的。难的从来不是生成端,是<strong>消费端</strong>怎么解析这些中间态。</p>
<h2 id="最后把它当工程问题别当-prompt-问题">最后:把它当工程问题,别当 prompt 问题</h2>
<p>如果只留一句话:<strong>结构化输出的可靠性,不该靠 prompt 写得好,该靠机制保证。</strong></p>
<p>很多团队卡在&quot;再调调 prompt 让它别输出多余文字&quot;。这是把一个工程问题误当成了文案问题。prompt 能把失败率从 5% 压到 0.5%,但压不到 0;而约束解码这类机制能压到 0。你的优先级应该是:</p>
<ol>
<li><strong>先换机制</strong>——自部署上 xgrammar,用 API 上 Structured Outputs 或 Function Calling。这一步把&quot;JSON 语法错&quot;和&quot;schema 不符&quot;两类问题直接归零,收益最大。</li>
<li><strong>再认真设计 schema</strong>——枚举、description、给&quot;不知道&quot;留出路。约束解码管不到的内容质量,靠这一步。</li>
<li><strong>最后补业务校验和流式兜底</strong>——schema 管结构,代码管语义;流式场景按数据形态选 JSON Lines 或容错解析。</li>
</ol>
<p>机制定了下限,prompt 和 schema 决定上限。顺序别搞反。</p>
<hr>
<p>参考:
<a href="https://platform.openai.com/docs/guides/structured-outputs">OpenAI Structured Outputs 文档</a>、
<a href="https://openai.com/index/introducing-structured-outputs-in-the-api/">Introducing Structured Outputs in the API</a>、
<a href="https://github.com/mlc-ai/xgrammar">xgrammar</a>、
<a href="https://github.com/guidance-ai/llguidance">llguidance</a>、
<a href="https://developers.redhat.com/articles/2025/06/03/structured-outputs-vllm-guiding-ai-responses">Structured Outputs in vLLM</a>、
<a href="https://nitishagar.medium.com/streaming-structured-data-from-llms-is-harder-than-you-think-6f2ee976fe5f">Streaming structured data from LLMs is harder than you think</a>、
<a href="https://www.vellum.ai/blog/when-should-i-use-function-calling-structured-outputs-or-json-mode">When should I use function calling, structured outputs or JSON mode</a></p>
]]></content:encoded></item><item><title>Prompt Caching 实战:把推理成本和延迟砍下来</title><link>https://realtime-ai.chat/posts/prompt-caching/</link><pubDate>Tue, 05 May 2026 11:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/prompt-caching/</guid><description>同一段 system prompt 反复 prefill 是在烧钱。这篇讲清 prompt caching 怎么命中、缓存断点放哪、Anthropic/OpenAI/Gemini/DeepSeek 各家计费与 TTL 差异,以及对延迟的影响。</description><content:encoded><![CDATA[<p>先说一个很多团队没算过的账。</p>
<p>假设你的 Agent 有一段 4000 token 的 system prompt:角色设定、工具说明、几个 few-shot 例子,雷打不动。用户每轮真正输入的,可能就 30 个字。一天 10 万次请求,这 4000 token × 10 万,就是 4 亿个 token 反复进入模型做同一件事——把固定前缀重新算一遍。</p>
<p>这部分计算,90% 是白烧的。因为前缀一模一样,模型每次算出来的中间结果(KV cache)也一模一样。<strong>Prompt caching 就是把这份中间结果存下来,下次直接复用。</strong> 它不改你的代码逻辑,不动模型质量,却能把输入侧成本砍掉一大半,顺带把首 token 延迟压下去。</p>
<p>2026 年,它依然是被严重低估的省钱手段。不是因为难,恰恰是因为太简单——简单到大家以为&quot;开了就行&quot;,结果断点放错位置,缓存全程没命中,白付一笔写入费还不自知。</p>
<h2 id="它到底缓存了什么">它到底缓存了什么</h2>
<p>要用对,先得知道模型推理分两个阶段。</p>
<p><strong>Prefill(预填充)</strong>:把你的整段 prompt 一次性喂进模型,逐 token 算出每一层的 KV(key/value)向量。这一步是并行的、算力密集的,prompt 越长越慢。</p>
<p><strong>Decode(解码)</strong>:基于 prefill 的结果,一个一个吐出回答 token。</p>
<p>Prompt caching 缓存的,就是 prefill 阶段算出来的那份 KV。注意:它缓存的是<strong>前缀</strong>,不是&quot;整个 prompt&quot;。模型从第一个 token 开始,一段一段比对——只要某个位置往前的内容和缓存里的完全一致,这段就能复用;一旦遇到第一个不一样的 token,从那里往后全部得重算。</p>
<pre class="mermaid">flowchart LR
  A["请求 prompt"] --> B{"逐 token 比对前缀"}
  B -->|"前缀命中"| C["复用 KV<br/>(便宜 + 快)"]
  B -->|"遇到第一个差异"| D["从这里往后重新 prefill"]
  C --> D
  D --> E["Decode 出 token"]
</pre><p>这张图就是 prompt caching 的全部精髓。所有的&quot;怎么用对&quot;,归结成一句话:<strong>让不变的东西待在前面,让变化的东西待在后面。</strong></p>
<h2 id="为什么前缀的顺序决定一切">为什么前缀的顺序决定一切</h2>
<p>各家请求体的拼接顺序是固定的:<strong>tools(工具定义)→ system(系统提示)→ messages(对话历史)</strong>。模型按这个顺序拼成一条长 prefix,再从头比对。</p>
<p>这意味着排在越前面的内容,越&quot;值钱&quot;——它一旦变化,后面所有东西的缓存全部作废。所以一个合格的可缓存 prompt,结构应该长这样,从稳定到易变排列:</p>
<table>
  <thead>
      <tr>
          <th>位置</th>
          <th>放什么</th>
          <th>变化频率</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>最前</td>
          <td>工具定义、函数 schema</td>
          <td>几乎不变</td>
      </tr>
      <tr>
          <td>靠前</td>
          <td>system prompt、角色设定、few-shot 例子</td>
          <td>发版才变</td>
      </tr>
      <tr>
          <td>中间</td>
          <td>知识库片段、长文档、检索结果</td>
          <td>按会话变</td>
      </tr>
      <tr>
          <td>最后</td>
          <td>当前用户输入、本轮变量</td>
          <td>每次都变</td>
      </tr>
  </tbody>
</table>
<p>最常见的翻车,是把&quot;变化的东西塞进了前面&quot;。比如有人喜欢在 system prompt 顶部写一句 <code>当前时间:2026-05-05 11:23:07</code>。看着无害,实际是灾难——这个时间戳每秒都不一样,等于把整条 prefix 的第一个字就改了,<strong>后面 4000 token 的缓存全程一次都命中不了</strong>。同类的坑还有:user ID、请求 UUID、A/B 实验分组标记、随机打乱的 few-shot 顺序。</p>
<p>如果你确实需要给模型当前时间,把它放到对话消息的<strong>最后</strong>,跟用户输入待在一起。前面那一大坨稳定前缀,该缓存照样缓存。</p>
<h2 id="缓存断点放哪自动-vs-手动">缓存断点放哪:自动 vs 手动</h2>
<p>这里是各家最大的分歧,也是最容易用错的地方。</p>
<p><strong>自动派(OpenAI、Google 隐式缓存、DeepSeek)</strong>:你什么都不用做。系统自动识别请求之间的公共前缀,命中了就给你折扣。OpenAI 对超过 1024 token 的 prompt 自动启用;DeepSeek 是后端自动复用磁盘上的前缀缓存;Gemini 2.5 及以后的模型默认开启隐式缓存。</p>
<p>自动派的好处是零成本接入,坏处是<strong>没有保证</strong>。命中是&quot;尽力而为&quot;的——Google 自己也写明,隐式缓存只在系统判定命中时才给折扣,你无法强制。</p>
<p><strong>手动派(Anthropic,以及 Gemini 的显式缓存)</strong>:你得自己在 prompt 里打一个 <code>cache_control</code> 标记,告诉模型&quot;缓存到这里为止&quot;。这个标记叫<strong>缓存断点(cache breakpoint)</strong>。Anthropic 一个请求最多打 4 个断点。</p>
<p>手动派麻烦一点,但换来确定性:你明确知道哪一段被缓存了。</p>
<p>手动派最经典的错误,是<strong>把断点打在了会变的块上</strong>。比如这样的结构——一大段静态知识库,后面跟一个&quot;包含时间戳 + 用户输入&quot;的块,然后断点打在最后这个块上。结果时间戳每次都变,这个块的 hash 每次都不同,缓存永远写入、永远读不到。</p>
<p>正确做法:<strong>断点打在「最后一个跨请求不变」的块的末尾</strong>,而不是打在变化的块上。把静态前缀和动态后缀切开,断点卡在它们的交界处。</p>
<pre class="mermaid">flowchart TB
  subgraph 错误["错误:断点在变化块上"]
    A1["静态知识库 8000 token"] --> A2["时间戳 + 用户输入 ⟵ 断点"]
  end
  subgraph 正确["正确:断点在静态前缀末尾"]
    B1["静态知识库 8000 token ⟵ 断点"] --> B2["时间戳 + 用户输入"]
  end
</pre><p>还有一个多轮对话特有的坑:对话越滚越长,你的断点可能被挤到&quot;上一次写入位置&quot;20 多个块之外,超出回溯窗口,于是又一次踩空。多轮场景里,务必随着对话增长<strong>滚动更新断点位置</strong>,让它始终贴着最新的稳定边界。</p>
<h2 id="四家的计费和-ttl差得不小">四家的计费和 TTL,差得不小</h2>
<p>省多少、贵多少、能存多久——各家规则不一样,接之前一定要看清。</p>
<table>
  <thead>
      <tr>
          <th>厂商</th>
          <th>缓存写入</th>
          <th>缓存读取</th>
          <th>TTL</th>
          <th>模式</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Anthropic</td>
          <td>1.25×(5 分钟)/ 2.0×(1 小时)输入价</td>
          <td>0.1× 输入价</td>
          <td>5 分钟默认,可选 1 小时</td>
          <td>手动断点</td>
      </tr>
      <tr>
          <td>OpenAI</td>
          <td>不额外收费</td>
          <td>视模型 0.1×~0.5× 输入价</td>
          <td>几分钟,空闲淘汰</td>
          <td>自动</td>
      </tr>
      <tr>
          <td>Google Gemini</td>
          <td>隐式无写入费;显式按标准输入价计</td>
          <td>约 0.1× 输入价(2.5+ 省 90%)</td>
          <td>隐式自动;显式按 TTL 计存储费</td>
          <td>隐式自动 / 显式手动</td>
      </tr>
      <tr>
          <td>DeepSeek</td>
          <td>不额外收费</td>
          <td>约 0.1× 输入价(cache hit 价)</td>
          <td>后端管理,存储免费</td>
          <td>自动(磁盘)</td>
      </tr>
  </tbody>
</table>
<p>几个要点单独拎出来说。</p>
<p><strong>Anthropic 是唯一对&quot;写入&quot;收钱的。</strong> 写一次缓存比正常输入贵 25%(5 分钟档)。这意味着如果你的 prompt 写进去之后根本没被复用就过期了,你是<strong>净亏</strong>的——多付了 25%,一分钱折扣没拿到。所以 Anthropic 的缓存只对&quot;高频复用同一前缀&quot;的场景划算。读取确实便宜,只要 1/10 输入价。</p>
<p><strong>TTL 是个隐形雷区。</strong> Anthropic 默认 TTL 在 2026 年初从 1 小时悄悄变回了 5 分钟,不少团队因此缓存创建成本涨了 20%~30% 还没察觉。5 分钟意味着:如果你的请求间隔超过 5 分钟,缓存早凉了,每次都是冷启动重新写入。好消息是 TTL 的时钟会在每次命中时<strong>重置</strong>——只要请求够密,缓存能一直续命。需要长间隔复用的,Anthropic 可以花 2 倍写入价买 1 小时 TTL。</p>
<p><strong>OpenAI 和 DeepSeek 对开发者最省心</strong>:不收写入费,自动命中,几乎是&quot;白送的折扣&quot;。DeepSeek 2026 年 4 月把 cache hit 价格再砍到发布价的 1/10,V4-Flash 上缓存命中把输入成本从 $0.14 压到 $0.0028 每百万 token——98% 的降幅。</p>
<p><strong>省钱幅度的体感</strong>:输入侧能省 50%~90%。具体看你的 prompt 里&quot;固定前缀占比&quot;有多高——前缀越长、变量越短,省得越狠。一个 8000 token 知识库 + 50 token 提问的 RAG 应用,几乎是为 prompt caching 量身定做的。</p>
<h2 id="别忘了它还能压延迟">别忘了它还能压延迟</h2>
<p>省钱是它最出名的好处,但对实时类应用,<strong>降延迟才是关键收益</strong>。</p>
<p>命中缓存时,prefill 这一步被整段跳过。前面说过,prefill 是算力密集的,prompt 越长越慢。跳过它,首 token 延迟(TTFT)的下降立竿见影——DeepSeek 给过一个数据:128K 的长 prompt 高度命中缓存时,首 token 延迟从 13 秒压到 500 毫秒。</p>
<p>这对语音 Agent、实时对话这种&quot;首 token 延迟就是及格线&quot;的场景,意义比省钱大得多。一个挂着长 system prompt 和工具定义的语音助手,把这部分缓存住,等于每一轮对话都省掉了几千 token 的 prefill 时间。如果你正在为 TTFT 抠毫秒,prompt caching 应该排在优化清单的前列。</p>
<p>不过有个前提:<strong>省下来的延迟,得真的有缓存可命中</strong>。冷启动那一次(第一次写入)不但不快,Anthropic 那边还更慢更贵。所以 prompt caching 优化的是&quot;稳态延迟&quot;,不是&quot;首次延迟&quot;。</p>
<h2 id="一份排查清单为什么我没命中">一份排查清单:为什么我没命中</h2>
<p>如果你接了 prompt caching,但账单没怎么降,大概率是踩了下面某一条。按顺序自查:</p>
<ol>
<li>
<p><strong>前缀里有变量。</strong> 时间戳、UUID、user ID、随机数——但凡有一个混进了 system prompt 或工具定义,整条缓存作废。把它们全部赶到 messages 末尾。</p>
</li>
<li>
<p><strong>断点打错位置(手动派)。</strong> 断点要打在&quot;最后一个不变块&quot;的末尾,不是打在变化块上。切开静态与动态的交界。</p>
</li>
<li>
<p><strong>请求间隔超了 TTL。</strong> Anthropic 默认才 5 分钟。低频请求(比如定时任务、长间隔轮询)很可能每次都冷启动。要么提高请求密度,要么买长 TTL。</p>
</li>
<li>
<p><strong>prompt 太短没够门槛。</strong> OpenAI 要超过 1024 token 才会自动缓存。短 prompt 本来也省不了多少,不用纠结。</p>
</li>
<li>
<p><strong>工具定义或 system prompt 偷偷变了。</strong> 多人协作时,有人调了一下工具描述、改了个标点,排在最前面的 tools 段一变,后面全塌。把可缓存前缀<strong>当成发布制品来管理</strong>,别让它随手改。</p>
</li>
<li>
<p><strong>few-shot 例子顺序不固定。</strong> 有些代码每次随机打乱 few-shot 顺序&quot;增加多样性&quot;——这会让前缀每次都不同。要缓存,就固定顺序。</p>
</li>
</ol>
<h2 id="落地建议">落地建议</h2>
<p>不用一上来就上复杂方案。三步走:</p>
<p><strong>第一步,把 prompt 重新排版。</strong> 不管你用哪家,先按&quot;工具 → system → 知识库 → 用户输入&quot;从稳到变重排一遍,把所有变量揪到最后。光这一步,自动派(OpenAI / DeepSeek / Gemini)就能开始命中了,一行代码没动。</p>
<p><strong>第二步,手动派打好断点。</strong> 用 Anthropic,就在静态前缀末尾打 <code>cache_control</code>;多轮对话记得滚动更新断点。</p>
<p><strong>第三步,盯住命中率。</strong> 各家 API 响应里都会返回 cache 相关字段(命中 token 数、写入 token 数)。把&quot;缓存读取 token / 总输入 token&quot;做成一个监控指标。它要是长期偏低,回到上面那份清单逐条查。</p>
<p>最后提醒一句取舍:prompt caching 不是&quot;开了就一定赚&quot;。对 Anthropic 这种收写入费的厂商,低频、前缀短、变量多的场景,反而可能亏。先搞清楚自己的流量形态——<strong>高频复用同一份长前缀,才是它的主场</strong>。判断对了,这是你能拿到的、性价比最高的一次优化:不掉质量,不改逻辑,省一半成本,还顺手降了延迟。</p>
<hr>
<p>参考资料:</p>
<ul>
<li><a href="https://platform.claude.com/docs/en/build-with-claude/prompt-caching">Prompt caching - Claude API Docs</a></li>
<li><a href="https://github.com/anthropics/claude-code/issues/46829">Cache TTL silently regressed from 1h to 5m · Issue #46829</a></li>
<li><a href="https://openai.com/index/api-prompt-caching/">Prompt Caching in the API | OpenAI</a></li>
<li><a href="https://developers.openai.com/api/docs/guides/prompt-caching">Prompt caching | OpenAI API</a></li>
<li><a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/context-cache/context-cache-overview">Context caching overview | Google Cloud</a></li>
<li><a href="https://developers.googleblog.com/gemini-2-5-models-now-support-implicit-caching/">Gemini 2.5 Models now support implicit caching - Google Developers Blog</a></li>
<li><a href="https://api-docs.deepseek.com/news/news0802">DeepSeek API introduces Context Caching on Disk</a></li>
</ul>
]]></content:encoded></item><item><title>开源大模型 2026:DeepSeek、Qwen、Llama 的格局</title><link>https://realtime-ai.chat/posts/open-source-llm-2026/</link><pubDate>Mon, 04 May 2026 11:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/open-source-llm-2026/</guid><description>复盘 2026 年开放权重模型这一年:DeepSeek V4、Qwen 3.6、Llama 4 各自的位置,中国开源为什么强势,开源闭源差距还剩几个点,以及许可证与生态的真实账。</description><content:encoded><![CDATA[<p>去年这个时候,如果你跟人说&quot;我们生产环境跑开源模型&quot;,对方多半会礼貌地点点头,心里默认你是预算不够。开源模型当时的人设就是&quot;省钱的次选&quot;。</p>
<p>2026 年 4 月 24 日,DeepSeek 把 V4-Pro 的权重直接挂上了 Hugging Face,1.6 万亿参数,MIT 许可证,1M 上下文。它在编程基准上的得分,跟当月最强的几个闭源旗舰之间,差的不是一个段位,是几个百分点。</p>
<p>这件事的信号比&quot;又一个新模型&quot;大得多。它意味着:<strong>当你今天选开源,你放弃的不再是能力,而是别的东西。</strong> 这篇就来复盘开放权重这一年的格局——谁在领跑、中国开源为什么这么猛、剩下的那点差距到底在哪、许可证这个没人爱看的细节怎么反而成了关键,以及开源那套微调量化部署的生态,现在到底成不成熟。</p>
<p>需要先说清一个词。这篇说的&quot;开源&quot;,严格讲是<strong>开放权重(open weights)</strong>:权重能下载、能自己跑、能商用。它和教科书意义上的开源软件不是一回事——绝大多数模型不公开训练数据、不公开训练代码,你拿到的是一个能跑的成品,不是一份能复现的菜谱。后面我还是用&quot;开源&quot;这个习惯叫法,但你心里得清楚,这是个有水分的词。</p>
<h2 id="领跑的三家其实是三种活法">领跑的三家,其实是三种活法</h2>
<p>把 2026 年 5 月的开放权重阵营摊开看,DeepSeek、Qwen、Llama 这三个名字最响,但他们根本不在同一条赛道上。</p>
<table>
  <thead>
      <tr>
          <th>模型家族</th>
          <th>代表版本(2026.05)</th>
          <th>架构 / 规模</th>
          <th>许可证</th>
          <th>它在赌什么</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>DeepSeek</td>
          <td>V4-Pro / V4-Flash</td>
          <td>MoE,1.6T 总参 / 49B 激活;Flash 284B/13B</td>
          <td>MIT</td>
          <td>用前沿能力 + 极宽松许可证,直接当闭源旗舰的平替</td>
      </tr>
      <tr>
          <td>Qwen</td>
          <td>Qwen 3.6 系列,六档尺寸 + 3.6-VL</td>
          <td>Dense 与 MoE 混编,从手机到集群</td>
          <td>Apache 2.0(开放档)</td>
          <td>用&quot;全尺寸覆盖 + 最强多语言&quot;做开发者默认底座</td>
      </tr>
      <tr>
          <td>Llama</td>
          <td>Llama 4 Scout / Maverick</td>
          <td>MoE,17B 激活(16 / 128 experts)</td>
          <td>Llama 4 社区许可(有条件)</td>
          <td>守住最大的部署装机量和生态惯性</td>
      </tr>
      <tr>
          <td>Mistral</td>
          <td>Large 3、Small 4</td>
          <td>Large 3:675B/41B;Small 4:119B/6B</td>
          <td>Apache 2.0</td>
          <td>欧洲牌照 + 干净许可证,做合规友好的那一个</td>
      </tr>
  </tbody>
</table>
<p>这张表里我最想让你看的是最后一列。三家头部各自押的东西完全不同:DeepSeek 押&quot;能力对标 + 许可证无摩擦&quot;,Qwen 押&quot;尺寸谱系最全&quot;,Llama 押&quot;我已经在几十亿设备和无数教程里了&quot;。</p>
<p>DeepSeek 这一年是最猛的。V4 那套混合注意力——把小块 token 压成摘要、新 token 只挑最相关的摘要去看——让 1M 上下文从&quot;标在参数表里的可选项&quot;变成了默认就开的标配。更狠的是它的定位:V4-Pro 不装&quot;小而美&quot;,它就是冲着替代闭源旗舰来的,而且配一张 MIT 许可证。MoE 架构让它&quot;总参 1.6T 听着吓人、实际每个 token 只激活 49B&quot;,于是这么大的模型,真有团队能在自己的卡上把它跑起来。</p>
<p>Qwen 走的是另一条路:不赌单个旗舰多猛,赌<strong>谱系</strong>。3.6 系列铺了六档尺寸,从能塞进手机的小模型,到要集群伺候的大模型,外加 3.6-VL 管视觉、Omni 档把音视频也收进同一套架构。它的杀手锏是多语言——连着两代,Qwen 都是中文和小语种覆盖最好的开放模型,没有之一。对一个要做出海、要做多语言产品的团队,这个&quot;全家桶&quot;的吸引力,比榜单上多两个点实在得多。</p>
<p>Llama 现在的位置有点微妙。它仍然是全世界装机量最大的开放权重生态——绝大多数教程、工具链、社区问答默认拿 Llama 举例,这个惯性是真实的资产。但 2026 年 4 月,Meta 发了个叫 Muse Spark 的闭源模型,出自它的超级智能实验室。这个动作基本宣告了&quot;Llama 当旗舰&quot;的时代结束:Meta 把最强的牌收回了闭源的口袋,Llama 4 更像是守着存量生态的那张牌,而不是冲锋的那张。</p>
<h2 id="领跑名单上为什么大半是中文名字">领跑名单上,为什么大半是中文名字</h2>
<p>把今天的开放权重第一梯队列出来——DeepSeek V4、Qwen 3.6、Kimi K2.6、GLM-5——你会发现一个不太能忽略的事实:领跑的大部分是中国实验室。在第三方基准上,DeepSeek V4-Pro 已经能摸到顶级闭源模型的边,跟 GPT-5 系列的差距是一两个点的量级。</p>
<p>这不是巧合,是一条清晰的策略分叉。</p>
<p><strong>美国的前沿实验室,主力打法是闭源 API。</strong> OpenAI、Anthropic、Google 把最强的模型锁在 API 后面卖订阅、卖调用量,这是他们的商业模式核心。开源对他们是副业,甚至是会侵蚀主营收入的事——所以他们要么不开,要么开个上一代的、缩水的版本意思一下。Meta 曾经是个例外,用 Llama 撑开源大旗,但 Muse Spark 一出,这个例外也在收口。</p>
<p><strong>中国实验室的处境正好相反,于是开源成了最优解。</strong> 一来,在闭源订阅这条路上,品牌、渠道、先发优势都被美国大厂占住了,正面硬刚很难;开放权重是一条能绕开这堵墙、快速建立全球开发者心智的路。二来,把权重开出去,等于把全世界的开发者变成免费的测试者、布道者和生态贡献者——你在 Hugging Face 上每多一次下载,就多一分行业默认值的分量。三来,这里面有很现实的国际环境因素:开放权重让海外用户可以自己下载、自己部署,不依赖某一家公司的在线服务,这种&quot;可自主掌控&quot;本身就是卖点。</p>
<p>所以中国开源的强势,根子不在&quot;中国工程师更聪明&quot;,而在<strong>商业模式的逼迫</strong>——闭源那条路被堵了一截,开源反而成了能赢的那条路。理解这点很重要,因为它说明这个格局是结构性的、会持续的,不是某一个季度的榜单波动。</p>
<p>一个推论:别把&quot;开源&quot;和&quot;中国&quot;画等号,但你也得承认,2026 年你做开源选型,候选名单上大概率一半以上是中国实验室的模型。这是现实,接受它,然后回到工程问题本身。</p>
<h2 id="差距还剩多少几个点但不是均匀分布的几个点">差距还剩多少:几个点,但不是均匀分布的几个点</h2>
<p>&ldquo;开源追上闭源了吗&rdquo;——这个问题问得太粗。正确的问法是:<strong>在哪类任务上追上了,在哪类还没。</strong></p>
<p>笼统地说,2026 年开放权重的天花板,跟闭源旗舰的差距是<strong>单个 benchmark 上几个百分点</strong>的量级。两年前那种&quot;差一代&quot;的体感没有了。但这几个点不是均匀摊开的,它在不同任务上厚薄差很多。</p>
<ul>
<li><strong>知识问答、摘要、改写、翻译</strong>——基本追平,很多场景里你盲测分不出来。这些任务对&quot;最后那点智商&quot;不敏感,开源模型在这里就是够用。</li>
<li><strong>代码</strong>——很近但还没平。DeepSeek V4-Pro 在 SWE-bench 这类编程基准上能进顶级行列,日常写函数、改 bug,体验和闭源旗舰差不多。差距在最难的那一档:大型重构、跨文件的复杂改动,闭源旗舰还稳一点。</li>
<li><strong>长链路 Agent</strong>——这是缺口最明显的地方。一个 Agent 要连着做二三十步,每步的小误差会累积,中间判断一次失误后面全废。在这种&quot;误差不能累积&quot;的场景里,闭源旗舰多出来的那几个点会被链路放大成&quot;能跑通&quot;和&quot;跑不通&quot;的差别。如果你的产品核心是复杂 Agent,这个差距值得你认真对待。</li>
</ul>
<pre class="mermaid">flowchart LR
  A[任务类型] --> B[问答 / 摘要 / 翻译]
  A --> C[日常代码]
  A --> D[难代码 / 大重构]
  A --> E[长链路 Agent]
  B --> B1[已追平<br/>放心用开源]
  C --> C1[基本追平<br/>开源够用]
  D --> D1[接近<br/>闭源仍稳一点]
  E --> E1[差距最明显<br/>闭源旗舰仍占优]
  style B1 fill:#d6f5d6,stroke:#5fb35f
  style C1 fill:#d6f5d6,stroke:#5fb35f
  style D1 fill:#fde7c2,stroke:#e8b23c
  style E1 fill:#fde7c2,stroke:#e8b23c
</pre><p>我的判断是:<strong>对今天 80% 以上的生产任务,开源的能力差距已经不该是你拒绝它的理由。</strong> 真正还需要为闭源那几个点掏钱的,是长链路 Agent 和最难的代码——而这恰好和我<a href="../llm-selection-2026/">上一篇选型文章</a>里说的&quot;只有推理 Agent 任务真的需要旗舰&quot;对上了。能力够不够,先按任务类型问,别按&quot;开源还是闭源&quot;这个标签笼统判。</p>
<h2 id="许可证没人爱看但能直接判你出局">许可证:没人爱看,但能直接判你出局</h2>
<p>聊开源模型,大家都盯着 benchmark,几乎没人认真读许可证。这是个错误——<strong>许可证决定的不是它强不强,而是你到底能不能用。</strong> 一个跑分爆表但许可证不让你这么用的模型,对你来说等于零分。</p>
<p>2026 年开放权重的许可证,大致分两类。</p>
<p>一类是<strong>真·宽松许可证</strong>:MIT、Apache 2.0。DeepSeek V4 是 MIT,Qwen 的开放档是 Apache 2.0,Mistral 的 Large 3、Small 4 也是 Apache 2.0。这类许可证的意思朴素到几乎没有惊喜:随便商用、随便改、随便闭源分发,不看你用户量多少,不附加奇怪条件。对企业法务来说,这是最省心的一类——基本不用开会。</p>
<p>另一类是<strong>带条件的&quot;社区许可证&quot;</strong>,典型是 Llama 4 社区许可。它对绝大多数人是免费可商用的,但藏着两颗你必须知道的雷:</p>
<ol>
<li><strong>用户量超过 7 亿月活,要单独找 Meta 谈授权。</strong> 对大厂和超级 App 来说这是真实的约束。</li>
<li><strong>欧盟。</strong> 截至 2026 年初,Llama 4 的许可证不向欧盟注册的公司开放。如果你的公司在欧洲,这一条直接把 Llama 4 从你的候选名单里划掉——不是&quot;麻烦一点&quot;,是&quot;不能用&quot;。</li>
</ol>
<p>还有更小众的坑:Mistral 的 Leanstral 用的是 CC BY-NC,<strong>NC 就是 non-commercial,不能商用</strong>。这种你拿来做个 demo、写篇博客没问题,一旦进生产就是合规事故。</p>
<p>所以选开源模型,许可证这一步要前置。我的习惯是:<strong>先问许可证,再看 benchmark。</strong> 顺序反了,你可能比了三天性价比,最后发现这个模型你公司根本不能用。一句话总结这一节——<strong>想省心,优先 MIT / Apache 2.0;碰到&quot;社区许可证&quot;,法务必须读一遍正文,尤其你在欧盟、或者你是个大厂。</strong></p>
<h2 id="什么时候开源真的更划算">什么时候开源真的更划算</h2>
<p>能力追平了、许可证也看清了,接下来是那个真问题:<strong>到底什么场景该上开源?</strong> 我给三个判据,满足任意一个,开源就值得认真考虑;一个都不满足,老实用闭源 API。</p>
<p><strong>第一,数据不能出门。</strong> 病历、银行流水、没公开的财报、核心代码——这类数据有法律和信任的红线,不能发给外部 API。这种情况下你没得选,只能把权重下载下来,跑在自己的 VPC 或机房里。这时候&quot;某个闭源模型更强&quot;是句正确的废话,因为它压根不在你的候选集里。这是开源最硬的理由,和省钱无关。</p>
<p><strong>第二,调用量大到自建的边际成本能打过 API。</strong> 闭源 API 是按 token 付费,用得越多账单越线性地涨。自建推理是一笔固定的前期投入(GPU、运维、扩缩容),之后边际成本很低。存在一个交叉点:量小的时候 API 划算,量大到某个程度,自建的总成本反超。一个每天几千万次调用、且任务相对固定的场景,自建开源模型常常能比闭源 API 便宜一大截。但要诚实——<strong>自建不等于省钱</strong>。算上 GPU 采购或租赁、运维人力、安全加固,量不够大的时候它比 API 更贵。别因为&quot;感觉自己掌控更踏实&quot;就去自建,那是给自己挖坑。</p>
<p><strong>第三,你要做深度微调。</strong> 你想让模型长出你这个领域的知识、你这家公司的话术、你的私有数据训出来的判断——这件事在闭源 API 上要么做不了,要么很受限。开放权重你能做全参微调、LoRA、继续预训练,想怎么改怎么改。如果&quot;领域定制&quot;是你产品的核心壁垒,开源几乎是唯一选项。</p>
<p>反过来说，如果你是个从 0 到 1 的产品,量还没起来,数据也没有合规红线,又不需要深度定制——<strong>别折腾,用闭源 API。</strong> 你的精力该花在产品上,不是花在伺候一个推理集群上。开源在这种阶段提供的&quot;掌控感&quot;是一种心理安慰,代价是真金白银的运维成本。</p>
<p>但有一点,即使你主力用闭源,也值得在开源上留一手:<strong>开源是一份保险。</strong> 用闭源 API,你绑定了对方的定价、限流、模型下线节奏——它说某个版本退役,你就得连夜迁。手里捏着一个能自己跑的开源模型作为备份,是对供应商风险最便宜的对冲。</p>
<h2 id="生态模型只是开头能不能跑起来看工具链">生态:模型只是开头,能不能跑起来看工具链</h2>
<p>开源大模型真正成熟的标志,不是又出了个跑分更高的模型,而是<strong>围着它的那套工具链已经好用到让自建不再是苦差事。</strong> 2026 年,这套生态确实补齐了。</p>
<p><strong>部署推理。</strong> vLLM 仍然是事实标准,生态最厚——观测工具、各种集成、社区问答,出了问题大概率能搜到答案。SGLang 这两年追得很猛,在不少高并发、多轮对话的负载上吞吐已经反超 vLLM。成熟团队现在的常见做法是:默认用 vLLM,对那些高流量的多轮端点单独拿 SGLang 压一遍测试,流量特别大的关键模型才上 TensorRT-LLM。换句话说,&ldquo;开源模型怎么高效跑起来&quot;这个问题,2026 年已经有成熟的标准答案,不再需要你自己趟。</p>
<p><strong>量化。</strong> 这是降低部署门槛最关键的一环。主流开源模型现在发布即附带官方量化版本——FP8、INT4、INT8、GPTQ、AWQ、GGUF,基本你想要的格式都有。在 H100、B200 这类带原生 FP8 张量核的卡上,FP8 量化几乎是&quot;免费的&quot;好处:显存砍一半,吞吐还能涨,精度损失小到可忽略。量化的意义在于,它把&quot;这个 1.6T 的大模型我的卡装不下&quot;这个硬门槛,变成了&quot;装得下,而且跑得不慢&rdquo;。</p>
<p><strong>微调。</strong> LoRA、QLoRA 这套已经是成熟基建,在消费级或单张数据中心卡上微调一个中等模型,门槛低到个人开发者都能上手。生态里现成的微调框架、数据处理工具一大堆,不用从零搭。</p>
<p>把这三块连起来看:</p>
<pre class="mermaid">flowchart LR
  A[下载开放权重<br/>HF / ModelScope] --> B[量化<br/>FP8 / INT4 / GGUF]
  B --> C[微调<br/>LoRA / QLoRA / 全参]
  C --> D[部署推理<br/>vLLM / SGLang / TensorRT-LLM]
  D --> E[上生产]
  style A fill:#fde7c2,stroke:#e8b23c
  style E fill:#d6f5d6,stroke:#5fb35f
</pre><p>这条链路上的每一环,2026 年都有打磨得很顺手的开源工具。这才是开放权重阵营这一年最被低估的进展——<strong>不是模型本身变强了多少,而是&quot;把一个开源模型真正跑进生产&quot;这件事,从一个需要专门团队啃的硬骨头,变成了一条有标准答案的成熟流程。</strong> 模型再强,跑不起来也是零;生态补齐了,开源才算真的能用。</p>
<h2 id="最后">最后</h2>
<p>复盘开放权重这一年,我会这么总结:</p>
<p><strong>能力上</strong>,开源和闭源的差距收敛到了几个点,而且这几个点集中在长链路 Agent 和最难的代码这两块——对大多数生产任务,能力已经不该是你拒绝开源的理由。</p>
<p><strong>格局上</strong>,领跑的大半是中国实验室,DeepSeek 用&quot;前沿能力 + MIT&quot;做闭源平替,Qwen 用全尺寸谱系做开发者底座,Llama 守着最大的存量生态但旗舰光环已经让给了 Meta 的闭源新模型。这个格局是商业模式逼出来的,结构性的,短期不会变。</p>
<p><strong>决策上</strong>,选开源的理由就三个——数据不能出门、量大到自建更便宜、要深度微调。三个都不沾,就用闭源 API,别给自己找运维的麻烦。而真要选开源,<strong>先读许可证再看跑分</strong>:MIT / Apache 2.0 省心,&ldquo;社区许可证&quot;必须让法务过一遍,你在欧盟尤其要当心 Llama 那条款。</p>
<p>两年前选开源,你是在能力上做妥协。2026 年不一样了——开源不再是&quot;省钱的次选&rdquo;,它是一个<strong>关于控制权的主动选择</strong>。你放弃的不是聪明,是省心;你换来的是数据的掌控、成本的结构、定制的自由。这笔账划不划算,取决于你的场景,不取决于榜单第一名是谁。</p>
]]></content:encoded></item><item><title>百万级上下文真的能用吗</title><link>https://realtime-ai.chat/posts/long-context-reality/</link><pubDate>Sat, 02 May 2026 11:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/long-context-reality/</guid><description>模型标称 1M、2M 上下文,但放得进不等于用得好。聊聊有效上下文、lost in the middle、长上下文下的成本与延迟暴涨,以及怎么实测验证。</description><content:encoded><![CDATA[<p>把一份 80 万字的项目文档整个粘进对话框,模型没报错,也回答了你的问题。你松了口气:看,1M 上下文真香。</p>
<p>但你有没有验证过——它引用的那段需求,是真的从文档第 40 万字的位置取出来的,还是它顺着上下文的语气编了一段听起来很对的话?</p>
<p>这是 2026 年长上下文最尴尬的地方:<strong>&ldquo;放得进&quot;是确定的,&ldquo;用得好&quot;是不确定的,而大多数人只测了前者。</strong> 模型厂商标 1M、2M,你看到的是窗口大小;你真正需要的是这个窗口里有多少 token 是&quot;模型会认真看&quot;的。这两个数字,差得比你想的大。</p>
<h2 id="标称上下文-vs-有效上下文">标称上下文 vs 有效上下文</h2>
<p>先把两个概念分清楚。</p>
<p><strong>标称上下文</strong>(advertised context)是模型 API 允许你塞进去的最大 token 数,超了就报错。<strong>有效上下文</strong>(effective context)是模型在性能开始明显掉档之前,真正能可靠利用的 token 数。</p>
<p>RULER 这个 benchmark 当年就是为了量化这件事造出来的。它的结论很扎心:很多号称 32K+ 的模型,在 32K 长度下能维持及格表现的,只有一半。到了 2026 年,百万级窗口普及之后,这个差距并没有消失——多份独立测试给出的经验值是,<strong>有效上下文通常只有标称值的 60%~70%</strong>,而且性能下滑的方式,简单的 token 计数根本看不出来:漏检的内容、编造的细节、断掉的推理链。</p>
<p>把 2026 年几个主流模型的标称窗口和实测召回放在一起看:</p>
<table>
  <thead>
      <tr>
          <th>模型</th>
          <th>标称窗口</th>
          <th>1M 长度实测召回</th>
          <th>备注</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Claude Opus 4.6</td>
          <td>1M</td>
          <td>~76%</td>
          <td>256K 下约 93%,长度档位领先</td>
      </tr>
      <tr>
          <td>Gemini 3.1 Pro</td>
          <td>1M</td>
          <td>~70%</td>
          <td>次于 Opus</td>
      </tr>
      <tr>
          <td>Gemini 1.5 Pro</td>
          <td>2M</td>
          <td>~55%~65%</td>
          <td>窗口最大,召回反而靠后</td>
      </tr>
      <tr>
          <td>Llama 4 Scout</td>
          <td>10M</td>
          <td>1M 后明显衰减</td>
          <td>标称最大,有效区间远小于标称</td>
      </tr>
  </tbody>
</table>
<p>注意 Gemini 1.5 Pro 这一行:它标 2M,是表里窗口最大的,但 1M 长度下的召回反而排在后面。<strong>窗口大小和有效质量,不是同一个排行榜。</strong> 标称 10M 的 Llama 4 Scout 也一样,过了 1M 之后衰减得很明显,适合做的是&quot;检索式&quot;任务,不是&quot;全局理解&quot;任务。</p>
<p>所以下次看到发布会上&quot;业界最长 2M 上下文&quot;的字样,你心里应该自动换算:能放 2M,能用好的可能就 1.2M 上下。剩下那 80 万 token,是放进去给你心理安慰的。</p>
<h2 id="lost-in-the-middle模型其实在跳读">Lost in the middle:模型其实在&quot;跳读&rdquo;</h2>
<p>为什么有效上下文会缩水?最经典的一个原因叫 lost in the middle。</p>
<p>2023 年那篇同名论文做了个很干净的实验:把同一条关键信息(needle)放在长文档的不同位置,看模型能不能答对。结果画出来是一条 <strong>U 形曲线</strong>——信息放在开头或结尾,模型答得很好;放在中间,准确率断崖式下跌。</p>
<p>说人话就是:模型读长文档的方式,和一个赶时间的人翻书很像——认真看了前言和结论,中间几百页基本是扫过去的。</p>
<p>这背后是注意力的问题。有研究把它归因为&quot;注意力稀释&rdquo;:context 越长,softmax 要把有限的注意力权重摊到越多的 token 上,每个 token 分到的&quot;关注&quot;就越薄。再叠加位置编码带来的偏置,中间段就成了被冷落的区域。有些极端的测量甚至说,某些前沿模型的有效注意力区间,比标称窗口短了高达 99%。</p>
<p>要补充一句公平话:<strong>这事在 2026 年比 2023 年好了不少。</strong> 像 Gemini 2.5 Flash 这种,做简单的事实型问答(needle-in-a-haystack)时,不管 needle 放在哪个位置,基本都能答对——简单检索上的 lost in the middle 已经被很大程度上修掉了。</p>
<p>但别高兴太早。needle 测试本身有个大问题:它太简单了。最近的研究(《Lost in the Haystack》)发现,<strong>needle 越小、越像&quot;一行字&quot;,越好找;一旦你要找的&quot;目标内容&quot;本身是一大段、需要跨段落拼起来的,定位难度立刻上去。</strong> 真实业务里,你要模型做的从来不是&quot;找一句话&quot;,而是&quot;把分散在第 3、19、56 章的三处约束综合起来判断&quot;。这种多跳、聚合类的任务,才是中间段塌方的重灾区。needle 测试绿灯,不代表你的任务绿灯。</p>
<h2 id="成本和延迟长上下文是按复利收费的">成本和延迟:长上下文是按复利收费的</h2>
<p>就算质量没问题,还有一笔账要算:钱和时间。</p>
<p>标准 self-attention 是 <strong>O(n²)</strong> 的。这个 n 是 token 数,平方意味着——prompt 翻一倍,attention 的计算量翻四倍。把 1M token 喂进一个标准 Transformer,光 attention 就是 1M × 1M 量级的矩阵运算,接近一万亿次操作。这笔账不是线性涨的,是带复利的。</p>
<p>最直接的体感是 <strong>TTFT(首 token 延迟)</strong>。模型要先把你的整个 prompt &ldquo;读&quot;一遍(prefill 阶段),才能吐第一个字。prefill 的耗时随上下文长度<strong>加速增长</strong>:从 4K 涨到 32K 你可能没什么感觉,从 32K 涨到 128K 就开始难受,而按观测到的幂律曲线(指数约 1.24)外推到 1M,<strong>第一个字出来可能要等 60~90 秒</strong>。</p>
<pre class="mermaid">flowchart LR
  A[4K prompt<br/>TTFT ~1s] --> B[32K prompt<br/>TTFT 数秒]
  B --> C[128K prompt<br/>TTFT 十几秒]
  C --> D[1M prompt<br/>TTFT 60-90s]
  style C fill:#fde7c2,stroke:#e8b23c
  style D fill:#f5b7b1,stroke:#c0392b
</pre><p>对任何交互式产品,这都是致命的。我之前写语音 Agent 的延迟预算时讲过,用户回应超过 800ms 就觉得别扭——你拿一个 prefill 要等一分钟的长上下文方案去做对话,等于直接出局。长上下文是离线批处理的工具,不是实时对话的工具。</p>
<p>钱也一样。虽然到 2026 年部分厂商(比如 Anthropic 的 Opus 4.6 / Sonnet 4.6)取消了长上下文的 2 倍溢价,1M 窗口按标准价 GA,但<strong>每次调用你都为整个 prompt 的所有 token 付费</strong>。一个 80 万 token 的上下文,你每问一句,这 80 万 token 就重新计一次费。一天问一百次,就是八千万 input token。多轮对话场景下,这个数字会失控。</p>
<p>更隐蔽的是 GPU 内存。多百万 token 的输入,KV cache 能吃掉 80%~90% 的显存。这意味着同样的硬件,长上下文请求能并发的数量大幅下降,单位成本进一步被推高——这部分不一定体现在 API 标价里,但会体现在你自建推理时的账单上。</p>
<h2 id="什么任务真的需要超长上下文">什么任务真的需要超长上下文</h2>
<p>讲了这么多问题,不是说长上下文没用。是说它<strong>被滥用了</strong>。</p>
<p>很多人把长上下文当成 RAG 的&quot;平替&rdquo;——&ldquo;既然能塞进去,我干嘛还搭检索系统&rdquo;。这个判断在大多数场景是错的。把无关内容大量塞进 context,不只是浪费钱,还会主动加重注意力稀释,把真正相关的那几千 token 淹掉。<strong>给模型的信息越精准,它表现越好;喂得越多越杂,反而越差。</strong></p>
<p>那什么任务是长上下文真正不可替代的?我的判断是,符合下面特征的:</p>
<ul>
<li><strong>需要全局视野,且无法预先切片检索。</strong> 比如让模型审一份 60 万字的合同,找出所有相互矛盾的条款。你没法提前知道哪两条会冲突,RAG 切片检索这时候帮不上忙——它本质上是个 N×N 的全局比对。</li>
<li><strong>跨度大、上下文强耦合的代码理解。</strong> 让模型理解一个几十万行的代码库的某个改动会牵连到哪里。调用关系是网状的,切片会切断它。</li>
<li><strong>长链多跳推理。</strong> 一份侦探小说式的材料,线索分散在几十处,需要全部在场才能推出结论。检索 top-k 很容易漏掉那个&quot;看起来不相关但其实是关键&quot;的片段。</li>
<li><strong>多模态长素材。</strong> 一段两小时的视频、一本带大量图表的书,本身就是一个不可切分的整体。</li>
</ul>
<p>发现规律没有?这些都是&quot;<strong>信息之间有强关联、无法干净切分</strong>&ldquo;的任务。反过来,如果你的任务是&quot;从一堆文档里找出和问题相关的那部分再回答&rdquo;——那是检索任务,老老实实用 RAG,又快又便宜又准。长上下文和 RAG 不是谁取代谁,是分工:<strong>能切就检索,不能切才全塞。</strong></p>
<h2 id="怎么实测一个模型的长上下文质量">怎么实测一个模型的长上下文质量</h2>
<p>最后给点能落地的。别信发布会,自己测。一个最小可行的验证流程:</p>
<pre class="mermaid">flowchart TD
  A[用你自己的真实长文档] --> B[在不同深度埋入可验证事实]
  B --> C[深度: 10% / 30% / 50% / 70% / 90%]
  C --> D[长度档: 32K / 128K / 256K / 1M]
  D --> E[每格跑多次取准确率]
  E --> F[画热力图: 深度 x 长度]
  F --> G{中间段是否塌方?}
  G -->|是| H[砍到有效长度内使用]
  G -->|否| I[再上多跳/聚合任务复测]
</pre><p>几个关键点:</p>
<p><strong>第一,用你自己的文档,别用公开 benchmark 的语料。</strong> 主流模型很可能在训练时见过 RULER、LongBench 这些数据,刷分会虚高。拿你业务里真实的合同、文档、代码去埋点,测出来的才作数。</p>
<p><strong>第二,测两类任务,别只测 needle。</strong> needle 检索(找一句话)和多跳聚合(综合好几处信息推结论)要分开测。前者现在大多数模型都能过,后者才是真正区分模型的地方。只测 needle 你会得到一个过于乐观的结论。</p>
<p><strong>第三,把&quot;深度 × 长度&quot;做成热力图。</strong> 横轴是上下文总长度,纵轴是关键信息埋入的相对位置(10%、30%、50%、70%、90%)。每个格子跑十几次取准确率。这张图一画出来,模型在哪个长度档开始掉、中间段塌不塌,一目了然。你的&quot;有效上下文&quot;就是这张图上还保持绿色的那个区间。</p>
<p><strong>第四,把延迟和成本一起记进表。</strong> 不只记准不准,把每个长度档的 TTFT 和单次调用费用也记下来。很多时候你会发现,128K 档的质量和 1M 档差不了几个百分点,但延迟和成本差了一个数量级——那 1M 就没有用的必要。</p>
<p>我的总结很简单:<strong>百万级上下文是个真实的能力,但它的有效区间,要靠你自己量出来,而不是读厂商的标称值。</strong> 把整本书塞进去之前,先问自己两件事——这个任务真的不能切片吗?我验证过模型在这个长度下中间段不塌方吗?这两个问题答不上来,那个 1M 窗口,大概率只是个让你安心的数字。</p>
<hr>
<p>参考资料:</p>
<ul>
<li><a href="https://arxiv.org/pdf/2404.06654">RULER: What&rsquo;s the Real Context Size of Your Long-Context Language Models?</a></li>
<li><a href="https://direct.mit.edu/tacl/article/doi/10.1162/tacl_a_00638/119630/Lost-in-the-Middle-How-Language-Models-Use-Long">Lost in the Middle: How Language Models Use Long Contexts</a></li>
<li><a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12478432/">Lost in the Haystack: Smaller Needles are More Difficult for LLMs to Find</a></li>
<li><a href="https://tokenmix.ai/blog/1m-token-context-reality-check-2026">1M Token Context Reality Check 2026: Gemini vs Claude Latency</a></li>
<li><a href="https://www.digitalocean.com/community/tutorials/long-context-inference-production-cost">Long-Context Inference at Scale: The Hidden Infrastructure Cost</a></li>
<li><a href="https://dasroot.net/posts/2026/05/prefill-bottleneck-token-generation-latency-prompt-processing/">The Prefill Bottleneck Problem</a>
</content>
</invoke></li>
</ul>
]]></content:encoded></item><item><title>模型蒸馏:把大模型的能力搬进小模型</title><link>https://realtime-ai.chat/posts/model-distillation/</link><pubDate>Fri, 01 May 2026 11:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/model-distillation/</guid><description>蒸馏不是模型压缩的玄学,而是用大模型当老师教小模型。这篇讲清楚蒸馏到底搬走了什么、和微调的关系、能搬多少、做不到什么,以及一套能落地的实践流程和常见坑。</description><content:encoded><![CDATA[<p>2025 年初,DeepSeek 放出一组叫 R1-Distill 的模型,其中那个 7B 版本在 AIME 2024 数学竞赛题上拿到了 55.5% 的 pass@1。</p>
<p>这个数字有意思的地方在于:它比 QwQ-32B-Preview 还高。一个 7B 的小模型,在硬核推理题上,打过了一个参数量是它四倍多的模型。</p>
<p>更反常识的是后面这句——DeepSeek 自己说的:<strong>直接拿强化学习去训练那个 7B 小模型,效果还不如蒸馏</strong>。小模型自己练,练不出这种推理能力;但你拿一个 671B 的大模型当老师,把它的思考过程喂给小模型学,小模型就学会了。</p>
<p>这就是蒸馏。它不是模型压缩里的某种玄学技巧,而是 2026 年几乎每家做小模型的团队都在用的标准动作。这篇把它讲清楚:蒸馏到底搬走了什么,和微调是什么关系,能搬多少,做不到什么,以及一套能落地的流程。</p>
<h2 id="为什么要蒸馏质量和成本之间那道墙">为什么要蒸馏:质量和成本之间那道墙</h2>
<p>先说动机。</p>
<p>大模型好用,但贵。一个 400B 参数的旗舰模型,推理延迟高、单次调用成本高、显存吃得狠,你不可能把它塞进每一台手机、每一个边缘设备、每一条高并发的客服管道。可小模型呢?便宜、快、能本地跑,但你直接拿一个 7B 模型出来用,它在复杂任务上的回答质量,和旗舰模型差着一大截。</p>
<p>这就是那道墙:<strong>质量在大模型这边,成本和延迟在小模型那边</strong>,你想两个都要。</p>
<p>传统的过墙办法有两种。一种是直接训练一个小模型——但小模型受参数量限制,见的数据再多,某些能力(尤其是多步推理)就是练不出来,这是容量天花板。另一种是把大模型剪枝、量化——这能省一点,但省不了数量级,而且剪过头质量就崩。</p>
<p>蒸馏是第三条路,也是目前性价比最高的一条:<strong>不让小模型自己悟,而是让大模型手把手教它</strong>。Meta 拿 Llama 4 Behemoth 去训 Llama 4 的 Scout 和 Maverick,Google 用 Gemini 去带 Gemma 2 和 Gemma 3,DeepSeek 用 R1 蒸出 1.5B 到 70B 一整个系列——2026 年你能叫得出名字的小模型,背后基本都站着一个大模型老师。</p>
<p>道理很朴素:让一个聪明人把题做一遍、把思路讲给你听,比你自己对着标准答案死磕,学得快得多。</p>
<h2 id="蒸馏到底在传递什么">蒸馏到底在传递什么</h2>
<p>很多人对蒸馏的第一印象是&quot;用大模型造点数据,拿去训小模型&quot;。这个理解对了一半,但漏掉了最关键的东西。</p>
<p>蒸馏的精髓在于<strong>软标签(soft label)</strong>。</p>
<p>举个例子。你问模型&quot;这句话情感是正面还是负面&quot;,一个普通的训练样本只会告诉小模型一个<strong>硬标签</strong>:正面。但大模型老师给出的不是一个字,而是一整个概率分布——比如&quot;正面 0.82、负面 0.11、中性 0.07&quot;。</p>
<p>这个分布里藏着硬标签给不了的信息:老师不光告诉你答案是什么,还告诉你<strong>它有多确定、它觉得别的选项有多接近</strong>。这种&quot;模型对各种可能性的相对判断&quot;,业内叫<strong>暗知识(dark knowledge)</strong>。小模型学的不只是结论,是老师那套打分的体感。</p>
<p>技术上,这通常通过让学生去拟合老师的 logits(输出层的原始分数)来实现,用 KL 散度当损失函数,衡量学生分布和老师分布差了多远。这条路线效果最好,但有个前提:你得能拿到老师的 logits——也就是老师得是个&quot;白盒&quot;。</p>
<pre class="mermaid">flowchart TB
  T[教师大模型] -->|完整概率分布<br/>soft label| K[KL 散度损失]
  T -->|生成的答案 + 思维链<br/>hard label| C[交叉熵损失]
  K --> S[学生小模型]
  C --> S
  S -->|采样自己的回答| V[教师/验证器打分]
  V -->|纠正学生的错误| S
  style T fill:#fde7c2,stroke:#e8b23c
  style S fill:#cfe8d8,stroke:#4ca877
</pre><p>如果老师是个只给你返回文字的 API(黑盒),你拿不到 logits,那就退而求其次:让老师<strong>大量生成完整的答案和推理过程</strong>,再拿这些文本当训练数据去教小模型。DeepSeek 蒸馏 R1 用的就是这条路——他们用 R1 生成了 80 万条样本,然后纯靠监督微调(SFT)把这些样本喂给 Qwen 和 Llama,连强化学习都没加。这条路拿不到暗知识,但胜在简单、不挑老师、谁的 API 都能蒸。</p>
<h2 id="蒸馏和微调到底什么关系">蒸馏和微调,到底什么关系</h2>
<p>这是最容易绕晕的一个点,我直接给结论:<strong>蒸馏和微调不是对立的,蒸馏的落地往往就是一次微调,只是数据来源不同</strong>。</p>
<p>把它们放一起看:</p>
<table>
  <thead>
      <tr>
          <th>维度</th>
          <th>普通微调</th>
          <th>蒸馏</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>数据从哪来</td>
          <td>人工标注 / 真实业务数据</td>
          <td>大模型老师生成</td>
      </tr>
      <tr>
          <td>学的是什么</td>
          <td>硬标签:正确答案</td>
          <td>软标签 + 答案 + 推理过程</td>
      </tr>
      <tr>
          <td>想解决的问题</td>
          <td>让模型适配某个特定任务</td>
          <td>把大模型的通用能力搬进小模型</td>
      </tr>
      <tr>
          <td>训练动作</td>
          <td>SFT / LoRA</td>
          <td>通常也是 SFT / LoRA,或加 KL 损失</td>
      </tr>
  </tbody>
</table>
<p>看出来了:<strong>微调是&quot;怎么训&quot;的问题,蒸馏是&quot;用什么数据训、为了什么目的&quot;的问题</strong>。当你拿 R1 生成的 80 万条数据去 SFT 一个 Qwen,你既在做蒸馏,也在做微调——这两件事在那一刻是同一件事。</p>
<p>实践里常见的组合拳是这样的:先蒸馏,把大模型的通用推理能力搬进小模型,得到一个&quot;底子好&quot;的基座;再拿你自己的业务数据做一次轻量微调,让它贴合具体场景。先蒸再调,各管一段,这是 2026 年成熟团队的标准配方。</p>
<h2 id="它能搬走多少又搬不走什么">它能搬走多少,又搬不走什么</h2>
<p>蒸馏不是魔法。说清楚它的边界,比吹它的效果更重要。</p>
<p><strong>搬得动的:</strong> 有明确&quot;过程&quot;和&quot;答案&quot;的能力,蒸馏搬运效率最高。数学推理、代码生成、逻辑规划、结构化抽取、指令遵循——这些任务有清晰的思维链可以模仿,有可验证的对错。DeepSeek-R1-Distill 系列在 AIME、MATH-500、代码这些榜单上的大幅领先,就是证据。一个被好好蒸过的小模型,在它擅长的窄领域里,能逼近甚至偶尔超过原始大模型在该领域的表现。</p>
<p><strong>搬不动的,有三类要心里有数:</strong></p>
<p>第一,<strong>老师不会的,学生也学不会</strong>。蒸馏是能力的转移,不是能力的创造。老师的水平就是学生的天花板,你不可能蒸出一个比老师还强的模型(在老师覆盖的能力上)。</p>
<p>第二,<strong>广度会被压缩</strong>。小模型参数量摆在那,容量有限。你蒸数学,它数学强;但如果你想让它数学、代码、多语言、长文本、创意写作样样精通,它装不下。蒸馏逼着你做取舍:<strong>想清楚这个小模型到底要干什么,然后只蒸那部分</strong>。什么都想要,结果是什么都平庸。</p>
<p>第三,<strong>泛化能力可能变弱,这是个隐蔽的代价</strong>。2026 年有研究指出一个值得警惕的现象:蒸馏(尤其是自蒸馏)会让小模型推理变快、在分布内的题上表现好,但在没见过的、需要灵活变通的题上,泛化反而退步了。原因是学生学的是老师在特定题型上的&quot;套路&quot;,套路学得越熟,越容易在新题型上水土不服。这个权衡叫&quot;更快的推理,更弱的泛化&quot;——蒸的时候要盯着分布外的测试集,别只看训练集附近的漂亮数字。</p>
<h2 id="推理蒸馏2026-年最值得关注的一支">推理蒸馏:2026 年最值得关注的一支</h2>
<p>推理模型的兴起,给蒸馏带来一个新麻烦,也催生了一个新方法。</p>
<p>麻烦在于:推理模型动不动就是几千 token 的长思维链。链条越长,<strong>误差越会一步步累积</strong>——老师在第三步走错一小步,学生照单全收,后面全错。你按传统办法,把老师生成的思维链整段喂给学生去模仿,学生学的是&quot;老师在老师自己的思路上怎么走&quot;,可一旦学生自己推到一个老师从没经过的中间状态,它就懵了,因为训练时没人教过它这种情况怎么办。</p>
<p>2026 年的解法叫<strong>在线蒸馏(on-policy distillation)</strong>,现在已经是 DeepSeek-V4、Qwen3、Gemma、Nemotron 这些前沿模型做推理后训练的标配。</p>
<p>它的思路反过来:<strong>不让学生模仿老师的轨迹,而是让学生先自己走</strong>。学生针对一道题,用自己当前的水平生成一条推理路径;然后老师(或者一个奖励模型、一个验证器)来给这条路径打分、指出哪里错了;学生再根据这个反馈修正。</p>
<p>关键区别在于:学生学的是&quot;<strong>在我自己会犯的错误状态下,该怎么爬出来</strong>&quot;,而不是&quot;老师在它的完美状态下怎么走&quot;。这就解决了前面那个状态不匹配的问题——学生纠错纠的是自己真实会遇到的坑。代价是工程更复杂:你需要一个能在线打分的老师或验证器,训练时还得不断采样,比离线蒸馏重不少。</p>
<h2 id="一套能落地的流程和几个坑">一套能落地的流程,和几个坑</h2>
<p>如果你要真的蒸一个模型出来,我建议按这个顺序走:</p>
<ol>
<li><strong>先把任务边界划死</strong>。这个小模型只干一件事还是几件事?接受多大的质量损失换多少成本?这一步想不清楚,后面全是返工。</li>
<li><strong>选老师和基座</strong>。老师选你能力范围内最强、且最好是白盒(能拿 logits)的;基座小模型选参数量匹配你部署预算的。Qwen、Llama 这些开源系列是常见选择。</li>
<li><strong>造数据</strong>。让老师在你的目标任务分布上大量生成,带上完整推理过程。数据的覆盖面决定了学生的上限——老师没生成过的题型,学生就是盲区。</li>
<li><strong>训练</strong>。黑盒老师就纯 SFT;白盒老师就加上 logits 的 KL 损失,效果更好。资源紧就 LoRA。</li>
<li><strong>评估,而且要评分布外</strong>。别只看训练集附近的指标,一定要拿没蒸过的题型测泛化,盯住前面说的&quot;泛化退化&quot;。</li>
</ol>
<p>几个反复见到的坑:</p>
<ul>
<li><strong>老师数据不验证</strong>。大模型也会生成错答案,你不筛一遍就喂给学生,学生连错误一起学。蒸推理任务时,务必用验证器或答案对照过滤掉老师做错的样本。</li>
<li><strong>盯着平均分,忽略短板</strong>。蒸完看总分涨了就交差,结果某个子能力悄悄崩了。要按子任务分别看。</li>
<li><strong>以为蒸馏能省掉数据工程</strong>。蒸馏省的是人工标注,不是数据设计。老师生成什么、覆盖哪些分布,仍然得你来设计,这活儿一点不轻。</li>
<li><strong>法律和合规边界</strong>。用某个商业 API 的输出去蒸自己的模型,可能违反对方的服务条款。蒸之前先看清楚老师那边的许可,这是工程之外、但绕不开的一道坎。</li>
</ul>
<p>最后回到开头那个 7B 模型。它能打过 32B,不是因为它聪明,是因为它有个好老师,而且有人想清楚了&quot;只让它学推理这一件事&quot;。蒸馏的价值从来不是&quot;免费得到一个强模型&quot;,而是<strong>让你能在质量和成本之间,精确地选一个你要的点</strong>——前提是你真的想清楚了要选哪个点。</p>
<hr>
<p><strong>参考资料</strong></p>
<ul>
<li><a href="https://thinkingmachines.ai/blog/on-policy-distillation/">On-Policy Distillation — Thinking Machines Lab</a></li>
<li><a href="https://arxiv.org/abs/2604.00626">A Survey of On-Policy Distillation for Large Language Models — arXiv</a></li>
<li><a href="https://bdtechtalks.com/2026/04/13/llm-self-distillation-tradeoffs/">The paradox of LLM self-distillation: Faster reasoning, weaker generalization — TechTalks</a></li>
<li><a href="https://github.com/deepseek-ai/DeepSeek-R1">DeepSeek-R1 — GitHub</a></li>
<li><a href="https://www.marktechpost.com/2026/05/11/understanding-llm-distillation-techniques/">Understanding LLM Distillation Techniques — MarkTechPost</a></li>
<li><a href="https://www.bentoml.com/blog/the-best-open-source-small-language-models">The Best Open-Source Small Language Models in 2026 — BentoML</a></li>
<li><a href="https://labelyourdata.com/articles/machine-learning/knowledge-distillation">Knowledge Distillation: Teacher-Student Loss Explained — Label Your Data</a></li>
</ul>
]]></content:encoded></item><item><title>图像生成 2026:现状、玩法与落地</title><link>https://realtime-ai.chat/posts/image-gen-2026/</link><pubDate>Fri, 24 Apr 2026 11:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/image-gen-2026/</guid><description>2026 年的 AI 图像生成已经过了拼画质的阶段。这篇务实拆解主流工具的定位、现在真能做好什么、还做不好什么、可控性手段,以及版权与水印怎么办。</description><content:encoded><![CDATA[<p>两年前,你让 AI 生成一张「咖啡馆门口的招牌,写着 OPEN」,大概率会得到一块写着「OPNE」或者「OEPN」的牌子——文字是糊的,字母是乱的,整张图一眼假。</p>
<p>现在你再试一次。GPT Image 1.5、Nano Banana Pro 这一批模型,能把整段菜单文字清清楚楚画在招牌上,中英文混排都行,连字距都对。</p>
<p>这件事说明了一个变化:<strong>2026 年的图像生成,已经过了「拼画质」的阶段。</strong> 照片级真实感这道坎,几乎所有头部模型都迈过去了。差异不再在「画得像不像」,而是上移到了——能不能听懂复杂指令、能不能把字写对、能不能精确控制构图、版权干不干净。</p>
<p>这篇不吹也不黑,就把 2026 年这批工具的能力边界,实打实地拆给你看。</p>
<h2 id="主流工具四个梯队各有各的活">主流工具:四个梯队,各有各的活</h2>
<p>2026 年的图像生成已经不是「一家独大」,而是按场景分工。我把现在真正能打的工具排成四组。</p>
<table>
  <thead>
      <tr>
          <th>工具</th>
          <th>定位</th>
          <th>最擅长</th>
          <th>短板</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>GPT Image 1.5(OpenAI)</td>
          <td>指令理解之王</td>
          <td>复杂多对象指令、文字渲染</td>
          <td>风格偏「数字感」,审美不够野</td>
      </tr>
      <tr>
          <td>Nano Banana Pro(Gemini 3 Pro Image)</td>
          <td>知识型生成</td>
          <td>文字、信息图、多语言、4K</td>
          <td>偏「正确」,有时缺惊喜</td>
      </tr>
      <tr>
          <td>Midjourney V7 / Niji 7</td>
          <td>审美天花板</td>
          <td>氛围、光影、风格化</td>
          <td>指令偏「自由发挥」,可控性弱</td>
      </tr>
      <tr>
          <td>FLUX.2(Black Forest Labs)</td>
          <td>开发者与可控性</td>
          <td>参考图、局部重绘、品牌色精确</td>
          <td>开箱审美一般,要调</td>
      </tr>
      <tr>
          <td>即梦 Seedream 5 / 通义万相</td>
          <td>国产主力</td>
          <td>中文场景、电商图、性价比</td>
          <td>海外生态、英文长文本略弱</td>
      </tr>
  </tbody>
</table>
<p>几个判断:</p>
<p><strong>GPT Image 1.5</strong> 是 DALL-E 3 的继任者。它最大的本事是「听话」——你给一段绕口的指令,比如「左边一只戴红围巾的橘猫看向右边,右边窗台上有三盆多肉,从左到右依次是高、矮、高」,它能基本照做。这种<strong>精确执行复杂指令</strong>的能力,目前没有对手。</p>
<p><strong>Nano Banana Pro</strong> 是 Google 基于 Gemini 3 Pro 做的,特点是「带脑子画图」——它能调用 Gemini 的推理和真实世界知识。你让它画一张「解释光合作用的信息图」,它真能把流程画对,文字标注也对。支持上传最多 14 张参考图同时喂一整套品牌规范,这一点对企业用户很关键。</p>
<p><strong>Midjourney V7</strong> 仍然是审美的天花板。同样的提示词,Midjourney 出的图就是更「有味道」——光影、质感、构图的高级感,别家追了两年还没完全追上。但代价是它<strong>爱自由发挥</strong>,你想要精确控制时它常常给你「惊喜」。V7 的 Draft Mode 快了约 10 倍、GPU 成本砍掉一半,适合先大量试方向再精修。</p>
<p><strong>FLUX.2</strong> 走的是另一条路:可控、可编程、开放权重。它能用十六进制色值精确指定品牌色不跑偏,能直接控制人物姿势,跨最多 10 张参考图保持角色和风格一致。FLUX.2 有 max / pro / flex / klein 多个档位,klein 是小尺寸开源版,能塞进消费级显卡跑。它是开发者和工作流集成的首选。</p>
<p><strong>国产工具</strong>这两年进步很大。字节的即梦(背后是 Seedream 系列)在 LMArena、Artificial Analysis 这类盲测榜上已经能跟 FLUX 同台。Seedream 5 Lite 还做了「深度思考 + 联网搜索」的统一多模态生成。国产工具的真实优势是<strong>中文场景</strong>——中文海报、电商主图、本土化审美,加上 API 价格更友好。</p>
<h2 id="现在真能做好的事">现在真能做好的事</h2>
<p>先说能用的。2026 年,下面这些活,AI 图像生成已经能稳定干好,值得直接放进生产流程。</p>
<p><strong>第一,配图和素材。</strong> 博客头图、PPT 插画、社媒配图、占位素材——这类「画质够用、不需要极致精确」的需求,AI 已经完全够用,而且快得离谱。一张图从想法到出图不超过一分钟,成本几分钱。API 价格这一年多跌了 25 到 40 倍,2024 年初 DALL-E 3 一张图要八分到一毛二,现在 FLUX Schnell 一张只要三厘钱。</p>
<p><strong>第二,设计草稿和概念探索。</strong> 这是我最看好的场景。设计师不再用 AI 出终稿,而是用它<strong>快速铺方向</strong>。一个 logo 概念,以前画十版要一天,现在一小时能看一百版。Midjourney 的 Draft Mode 就是为这个设计的——廉价地试,选出赢家再精修。AI 在这里的角色是「灵感加速器」,不是「替代设计师」。</p>
<p><strong>第三,风格化改造。</strong> 把一张普通照片转成水彩、油画、赛博朋克、吉卜力风,这件事现在又快又稳。Niji 7(2026 年 1 月发布)在二次元风格上的细节连贯性——眼睛、反光、背景小元素——又上了一个台阶。</p>
<p><strong>第四,局部改图。</strong> 这是 2026 年最被低估的能力。给一张现成的图,框出一块区域,告诉它「把这件衬衫改成蓝色」「把背景的车去掉」「这里加一棵树」——它能只改那一块,其余原样保留。这种<strong>编辑式生成</strong>比「从零生成」实用得多,因为它把 AI 嵌进了已有的素材里,而不是要求你推倒重来。</p>
<h2 id="还做不好的事别在这些地方踩坑">还做不好的事:别在这些地方踩坑</h2>
<p>能力的另一面是边界。下面这几件事,2026 年的 AI 还做不好,你硬要它干,就是给自己挖坑。</p>
<p><strong>精确文字,尤其是 logo 和品牌字体。</strong> 注意,我说的不是「能不能写字」——短标语、甚至整段段落,Nano Banana Pro 这类模型已经写得很准了。问题在<strong>精确</strong>:你公司 logo 那个特定字体、那个字母间距、那个注册商标小圆圈的位置,AI 复刻不了。它能画一个「看起来像 logo 的东西」,但不是你的 logo。品牌资产,老老实实用矢量软件。</p>
<p><strong>像素级的精确控制。</strong> 「这个按钮往左移 12 像素」「这条线必须正好 2pt 粗」——扩散模型是从概率分布里采样的,它没有「像素坐标」这个概念。你能引导大方向,但要不了像素级精度。UI 终稿、技术图纸、需要严丝合缝的版式,AI 给你出草稿可以,出终稿不行。</p>
<p><strong>跨多张图的角色一致性。</strong> 这是漫画、绘本、品牌 IP 最头疼的。你定好一个角色,想让它在二十张图里长得一模一样——目前做不到「完全一样」。参考图、Omni Reference、姿势控制能把「漂移」压到很小,但扩散模型的本质决定了:小扰动就可能把输出推到另一个「身份」上。<strong>换个画幅比例,角色还可能变脸。</strong> 2026 年的现实是:能做到「高度相似」,做不到「完全同一人」。</p>
<p><strong>复杂的手部和肢体交互。</strong> 单只手现在基本没问题了。但复杂手势、多只手互相交叠、手里捏着小物件、再加上透视压缩——还是会冒出第六根手指或者扭曲的关节。人多的拥挤场景尤其容易翻车。</p>
<p>一句话总结边界:<strong>AI 擅长「生成一个合理的东西」,不擅长「生成那个精确指定的东西」。</strong></p>
<h2 id="可控性把碰运气变成下指令">可控性:把「碰运气」变成「下指令」</h2>
<p>既然纯文字提示词控制不住,2026 年成熟的玩法是叠加多种可控性手段。把它们想成给模型套的「缰绳」。</p>
<pre class="mermaid">flowchart TB
  P[文字提示词<br/>定大方向] --> M((图像模型))
  R[参考图<br/>定风格/角色/品牌] --> M
  C[结构控制<br/>ControlNet:边缘/深度/姿势] --> M
  I[局部重绘<br/>蒙版圈定改哪里] --> M
  M --> O[可控的输出]
  style P fill:#fde7c2,stroke:#e8b23c
  style R fill:#fde7c2,stroke:#e8b23c
  style C fill:#fde7c2,stroke:#e8b23c
  style I fill:#fde7c2,stroke:#e8b23c
</pre><p><strong>参考图(Reference / Style Reference)。</strong> 最常用的一招。喂一张图进去,告诉模型「按这个风格来」「保持这个角色」「用这套配色」。FLUX.2 能跨 10 张参考图保持一致,Nano Banana Pro 能吃 14 张——足够塞进 logo、配色板、角色三视图、产品照一整套品牌规范。</p>
<p><strong>结构控制(ControlNet 这一类)。</strong> 这是精确控制构图的核心手段。它不靠文字,而是直接给模型一张「结构骨架」:用 Canny 边缘图锁轮廓,用深度图锁空间关系,用姿势图(OpenPose)锁人物动作。模型在这个骨架上「填肉」。想让生成的人物摆出某个特定姿势?给它一张姿势骨架图,比写一百个字的提示词都管用。</p>
<p><strong>局部重绘(Inpainting)。</strong> 前面提过的编辑式生成,背后就是它。流程是:原图 + 一张蒙版(白色=要改、黑色=保留)+ 描述新内容的提示词。这里有个关键参数叫 <strong>denoise(去噪强度)</strong>:设 0.4–0.5 是「微调」,比如只改衬衫颜色;设 0.75–0.85 是「整个换掉」,比如把蒙版区域的物件彻底替换。新手最容易在这个值上栽跟头——想微调却设太高,结果整块区域面目全非。</p>
<p><strong>实战建议:别只靠一种。</strong> 真正可控的工作流是叠加的——文字定大方向,参考图定风格,ControlNet 锁构图,最后用局部重绘抠细节。在 ComfyUI 里把这套流程搭成可复用的节点图,你就从「碰运气抽卡」变成了「下达精确指令」。这中间的差距,就是业余和专业的差距。</p>
<h2 id="落地场景哪些值得做哪些先别碰">落地场景:哪些值得做,哪些先别碰</h2>
<p>把上面的能力边界翻译成「该不该用」,我的判断是这样。</p>
<p><strong>值得现在就上的:</strong></p>
<ul>
<li><strong>电商详情页与营销素材</strong>——产品换背景、换场景、批量生成不同风格的主图。即梦、通义万相在中文电商场景上已经很成熟。</li>
<li><strong>内容创作配图</strong>——博客、公众号、自媒体的头图和插图。画质够用,成本几乎可以忽略。</li>
<li><strong>设计前期的概念探索</strong>——海报、logo、包装的方向铺陈。出草稿,不出终稿。</li>
<li><strong>影视游戏的概念设定图</strong>——场景气氛图、角色概念图。这类「不要求精确、要求有想象力」的活,AI 是真帮手。</li>
</ul>
<p><strong>先别碰的:</strong></p>
<ul>
<li><strong>需要精确版式的终稿</strong>——画册排版、UI 交付稿、含精确品牌资产的物料。AI 出草稿,人来定终稿。</li>
<li><strong>强一致性的连续内容</strong>——长篇漫画、绘本、需要同一角色反复出现的 IP 内容。现在勉强能做,但要花大量人工修,算下来不一定省。</li>
<li><strong>任何需要事实精确的图</strong>——医学示意图、工程图、地图。AI 画得「像那么回事」,但细节经不起推敲,误导风险高。</li>
</ul>
<p>一个反复有效的判断标准:<strong>这张图允不允许有「合理的偏差」?</strong> 允许,AI 能帮你;不允许,差一点都不行,那就别指望 AI 出终稿。</p>
<h2 id="版权与水印绕不开的合规题">版权与水印:绕不开的合规题</h2>
<p>最后这一节,做商用的人必须看。</p>
<p><strong>版权归属仍然模糊。</strong> 多数司法辖区的基本态度没变:<strong>纯 AI 生成、没有充分人类创作介入的图,很难获得版权保护。</strong> 这意味着你公司用 AI 生成的营销图,理论上别人也能拿去用,你未必告得了。想拿到版权,得有实质性的人类创作贡献——这也是「AI 出草稿、人来精修定稿」这个工作流在法律上更稳妥的原因之一。另外,训练数据的版权诉讼这两年一直没断,选模型时,优先考虑明确声明训练数据来源干净、或提供商用赔付条款的产品。</p>
<p><strong>水印和溯源现在是默认配置。</strong> 2026 年,所有主流模型的输出都会被打标:</p>
<ul>
<li><strong>C2PA Content Credentials</strong>——2025 年定为 ISO 标准(ISO/IEC 22144),一段签了名的元数据,记录这张图由哪个模型生成、经过哪些编辑。它现在是互联网事实上的「溯源语言」。</li>
<li><strong>SynthID</strong>——Google 的隐形水印,直接嵌进像素里,人眼看不见。关键是它<strong>抗造</strong>:截图、裁剪、压缩、重新上传到 Instagram,水印还在。</li>
</ul>
<p>这里有个现实的坑你得知道:<strong>社交平台会剥掉 C2PA 元数据。</strong> 2026 年,Instagram、X、LinkedIn、TikTok、Facebook 在上传处理时基本都会清掉 C2PA manifest。所以光靠 C2PA 不够——元数据型水印一进社交平台就没了,只有 SynthID 这种嵌进像素的隐形水印能扛住。Google 同时上 C2PA 和 SynthID,目前是业界标杆做法。</p>
<p>对你的实际意义:<strong>别假设「AI 生成」这件事能藏住。</strong> 你发出去的 AI 图,大概率带着可被检测的水印。该标注的标注,该走合规的走合规——尤其是新闻、广告、政务这些场景,别赌。</p>
<h2 id="写在最后">写在最后</h2>
<p>2026 年的图像生成,我的总体判断是:<strong>它是一个成熟、好用,但有明确边界的工具——不是魔法。</strong></p>
<p>它真正改变的,是创意工作的<strong>前半段</strong>:探索方向、铺草稿、试风格、改局部,这些以前耗时的环节,现在快了几十倍、便宜了几十倍。它没有、短期也不会替代的,是后半段的<strong>精确收尾</strong>——精确版式、精确品牌、精确一致性,以及最重要的,人对「这张图到底要传达什么」的判断。</p>
<p>用对地方,它是杠杆;用错地方,它是个会自信地画错六根手指的实习生。分清楚这两者,你就已经领先大多数人了。</p>
]]></content:encoded></item><item><title>AI 视频的可控性:运镜、一致性、参考图</title><link>https://realtime-ai.chat/posts/ai-video-control/</link><pubDate>Thu, 23 Apr 2026 11:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/ai-video-control/</guid><description>AI 视频画质已经够用,真正卡落地的是控制——运镜、角色一致性、首尾帧、局部编辑。这篇拆开 2026 年可控视频生成的方法、边界和拼片成叙事的工作流。</description><content:encoded><![CDATA[<p>给你看一个真实的对比。</p>
<p>两个团队,同样要做一支 30 秒的产品宣传片。A 团队拿最强的文生视频模型,写了一段漂亮的 prompt,十分钟出片,画质惊艳——然后发现主角的衣服在第二个镜头变了颜色,客户不要。B 团队画质明显糙一截,但每个镜头的相机怎么推、主角长什么样、最后一帧停在哪,全都对得上。客户选了 B。</p>
<p>这件事说明一个被低估的事实:<strong>AI 视频生成早就过了&quot;画得好不好看&quot;的阶段,现在卡在&quot;画得跟不跟你想的一样&quot;。</strong> 2026 年发布的模型——Veo 3.1、Runway Gen-4.5、Kling O1、Pika 2.5——画质都够用了,真正的竞争发生在控制层。这篇不横评工具,只讲一件事:怎么让 AI 视频听话。</p>
<h2 id="为什么可控比画质更卡落地">为什么&quot;可控&quot;比&quot;画质&quot;更卡落地</h2>
<p>画质是个连续变量,差一点也能用;可控性是个二元变量,要么对要么废。</p>
<p>商业视频的本质是&quot;带着约束的创作&quot;。客户给你一张产品图,主角的脸不能变,品牌色是固定的 RGB 值,这个镜头要从左往右摇,下个镜头要接得上。这些都不是&quot;建议&quot;,是硬约束。一个画质 95 分但主角换了张脸的镜头,商业价值是 0,不是 95。</p>
<p>文生视频的根本问题在这:<strong>prompt 是个低带宽的接口。</strong> 你想说的是&quot;相机以每秒 15 度的速度向右平摇,主角始终在画面左三分之一&quot;,你能写的是&quot;镜头缓缓摇过,主角在一侧&quot;。中间丢掉的信息,模型用它训练数据里的先验给你补——补出来的东西好不好看是一回事,是不是你要的,完全是另一回事。</p>
<p>所以可控视频生成这两年的所有进展,本质上是在干同一件事:<strong>给模型加上 prompt 之外的、带宽更高的控制信号。</strong> 参考图、相机轨迹、首尾帧、mask,都是这个东西。</p>
<pre class="mermaid">flowchart TB
  P[文字 prompt<br/>低带宽] --> M[视频生成模型]
  R[参考图<br/>锁身份/风格] --> M
  C[相机轨迹<br/>锁运镜] --> M
  K[首尾帧<br/>锁起止] --> M
  K2[局部 mask<br/>锁编辑范围] --> M
  M --> V[可控的视频]
  style P fill:#fde7c2,stroke:#e8b23c
  style R fill:#cfe8d5,stroke:#4f9d69
  style C fill:#cfe8d5,stroke:#4f9d69
  style K fill:#cfe8d5,stroke:#4f9d69
  style K2 fill:#cfe8d5,stroke:#4f9d69
</pre><p>橙色那条是大多数人唯一在用的接口,绿色那几条才是 2026 年真正在拉开差距的地方。下面逐个拆。</p>
<h2 id="运镜从形容词到轨迹">运镜:从形容词到轨迹</h2>
<p>运镜是最早被&quot;控制化&quot;的环节,因为它的需求最刚硬。</p>
<p>早期文生视频控制运镜靠形容词——&ldquo;dolly in&quot;&ldquo;pan left&quot;&ldquo;crane shot&rdquo;。这套东西的问题是,模型对这些词的理解是统计意义上的:它见过一万个标着 &ldquo;pan left&rdquo; 的片段,给你生成一个&quot;平均的左摇&rdquo;。速度多快、摇多少度、什么时候开始,你说了不算。</p>
<p>2026 年成熟的做法分两个层次。</p>
<p>第一层是<strong>离散的相机指令</strong>,Runway 的 Director Mode 是代表:你不是写形容词,而是在面板上选&quot;水平移动 +30、垂直 0、变焦 -10&rdquo;,给的是数值。这比形容词强,但还是预设档位的拼装。</p>
<p>第二层是<strong>连续的相机轨迹控制</strong>,这是研究界正在往产品里推的方向。学术上像 I2VControl-Camera 这类工作,把相机位姿表达成一条可调的三维轨迹,还能单独调&quot;运动强度&quot;——同一条轨迹,你可以要它走得猛一点或者收一点。ATI 这类工作更进一步,把相机运动、物体平移、局部形变统一成一套&quot;轨迹指令&quot;,用户在图上画几条线,模型照着线动。</p>
<p>这里有个工程上的判断值得说:<strong>别期待一个模型既会高质量生成、又会精确听轨迹。</strong> 目前实践里更靠谱的是分层——先用大模型出基础画面和运动,相机轨迹作为一路独立的控制信号注入,而不是指望它从 prompt 里&quot;悟&quot;出来。运镜控制做得好的产品,基本都把&quot;画什么&quot;和&quot;相机怎么动&quot;解耦成了两路输入。</p>
<h2 id="一致性三个不同的问题别混为一谈">一致性:三个不同的问题,别混为一谈</h2>
<p>&ldquo;一致性&quot;是个被说烂的词,但它其实是三个独立的问题,解法完全不同。混在一起谈,是新手最大的认知误区。</p>
<table>
  <thead>
      <tr>
          <th>一致性类型</th>
          <th>要解决什么</th>
          <th>主要手段</th>
          <th>难度</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>时序一致性</td>
          <td>同一个镜头内不闪烁、不漂移</td>
          <td>模型本身的时序建模</td>
          <td>模型出厂自带</td>
      </tr>
      <tr>
          <td>角色/物体一致性</td>
          <td>同一个角色跨镜头长得一样</td>
          <td>参考图 / reference</td>
          <td>中,有成熟方案</td>
      </tr>
      <tr>
          <td>跨镜头风格一致性</td>
          <td>多个镜头光线、色调统一</td>
          <td>参考图 + 工作流约束</td>
          <td>难,要靠流程</td>
      </tr>
  </tbody>
</table>
<p><strong>时序一致性</strong>是镜头内部的事:一段 5 秒的视频,主角的手不能忽然多一根指头,背景的招牌字不能一帧一个样。这个问题主要靠模型自身的时序建模能力,2026 年主流模型在 5–10 秒的片段内基本解决了。它不是你能控制的,是模型出厂带的。</p>
<p><strong>角色一致性</strong>是跨镜头的事,这才是你要操心的。同一个人物,镜头一在咖啡馆、镜头二在街上,得是同一张脸、同一身衣服。2026 年的标准答案是<strong>参考图(reference image)</strong>:Veo 3.1 的 &ldquo;Ingredients to Video&rdquo; 让你一次传最多四张参考图,分别锁主体、风格、构图;Runway Gen-4.5、Pika 2.5 都把参考图做成了一等接口。这里要建立的关键认知是——<strong>图生视频(image-to-video)在可控性上几乎总是优于文生视频。</strong> 一张参考图从第一帧就把身份、风格、构图全锁死了,模型只需要负责&quot;动起来&rdquo;。能用图起手,就别用纯文字起手。</p>
<p><strong>跨镜头风格一致性</strong>最难,因为它没有单一的技术开关。十个镜头,每个都单独生成,哪怕都用了同一张角色参考图,光线方向、色温、颗粒感还是会飘。这个问题在 2026 年没有被模型解决,<strong>它是个工作流问题</strong>,后面专门讲。</p>
<h2 id="首尾帧把生成变成补全">首尾帧:把&quot;生成&quot;变成&quot;补全&quot;</h2>
<p>如果只能推荐一个提升可控性的技巧,我会选首尾帧。</p>
<p>标准图生视频只锁第一帧,后面让模型自由发挥——你不知道它会停在哪。**首尾帧控制(first-last-frame)**把这件事反过来:你给定开始的图 A 和结束的图 B,模型的任务从&quot;自由生成&quot;降级成&quot;在 A 和 B 之间补出中间帧&quot;。Runway 叫 Keyframe,Kling 叫起止帧,Kling O1 把双关键帧做成了核心能力,Luma 叫 Keyframes,叫法不同,是同一个东西。</p>
<p>为什么这招好用?因为它把一个开放问题变成了闭合问题。<strong>开放问题&quot;生成一段视频&quot;有无数个解,模型挑哪个你管不着;闭合问题&quot;从 A 走到 B&quot;的解空间被两头夹死了,模型只能在中间这段动脑筋。</strong> 解空间小,可控性自然高。</p>
<p>对叙事尤其关键——一个镜头要&quot;结束在某个特定画面&quot;上,好接下一个镜头,首尾帧是唯一可靠的办法。LTX 2.3 这类工作甚至支持首、中、尾三个锚点,中间再插一帧,等于把一个长镜头的运动轨迹钉了三个点。</p>
<p>代价是你得先有 B 这张图。所以现实工作流常常是:先用文生图模型把每个关键画面的&quot;起&quot;和&quot;止&quot;都画出来,再用首尾帧让视频模型去连。<strong>画面设计和运动生成被拆成了两步</strong>——这恰恰是它可控的原因。</p>
<h2 id="局部编辑不要重生成整段">局部编辑:不要重生成整段</h2>
<p>视频做到 90% 时,客户说&quot;主角的杯子换成蓝色,别的不动&quot;。</p>
<p>最糟的做法是改 prompt 重新生成整段——你会得到一段哪儿都不一样的新视频,杯子是蓝了,但运镜变了、表情变了,客户更不满意。<strong>局部编辑(local editing)</strong> 要解决的就是这个:只改你圈出来的地方,其余每一帧像素级不动。</p>
<p>技术上这是视频 inpainting 的活儿,2026 年的研究重点是怎么兼顾&quot;局部干净&quot;和&quot;全局不漂&quot;。视频 inpainting 有个老毛病:逐帧补会闪烁(局部不平滑),整段一起补又容易让被编辑区域慢慢偏离原意(全局漂移)。EditCtrl 这类工作的思路是只在被 mask 的 token 上做计算,算力开销跟编辑区域大小成正比——你只改一个杯子,就别为整个画面付费。OmniPainter 这类则用&quot;自回归分数管局部平滑、层级分数管全局连贯&quot;的混合引导来平衡这对矛盾。</p>
<p>落地建议很直接:<strong>把局部编辑当成跟生成同等重要的能力去选工具。</strong> 一个只会从头生成、不能精确局部改的视频模型,在真实商业流程里是残废的——因为客户的修改意见永远是&quot;这里改一下&quot;,不是&quot;全部重来&quot;。</p>
<h2 id="prompt-能控到哪控不到哪">prompt 能控到哪,控不到哪</h2>
<p>说点得罪人的。prompt 在视频生成里,是个被高估的控制手段。</p>
<p>它能控的:<strong>画面里有什么</strong>(主体、场景、大致风格、氛围)。这部分 prompt 是合格的,而且不可替代——你总得用语言说清楚要画什么。</p>
<p>它控不动的:<strong>任何需要精度的东西</strong>。精确的相机速度、物体在第几秒到达画面哪个位置、两个角色的相对站位、光线的具体方向——这些用文字描述,模型只能给你一个&quot;差不多&quot;。原因前面说过,自然语言对几何和时序的描述带宽太低,你写得再细,信息也在&quot;文字→模型理解&quot;这一步被压扁了。</p>
<p>所以一条实践原则:<strong>prompt 负责&quot;内容&quot;,专门的控制信号负责&quot;精度&quot;。</strong> 想控运镜就上轨迹/相机面板,想控身份就上参考图,想控起止就上首尾帧,想控局部就上 mask。指望把这些全塞进一段 prompt 里&quot;写清楚&quot;,是在跟模型的接口带宽较劲,较不赢的。</p>
<p>判断一个视频产品成不成熟,看一个指标就够:<strong>它除了 prompt 框,还给了你几个真正的控制接口。</strong> 只有一个 prompt 框的,是玩具;有参考图、有相机控制、有首尾帧、有 mask 编辑的,才是生产工具。</p>
<h2 id="把碎片拼成叙事可控性的终极考题">把碎片拼成叙事:可控性的终极考题</h2>
<p>前面所有控制手段,都是为了一个镜头。但一支片子是几十个镜头。<strong>单镜头可控,不等于整片可控</strong>——这是 2026 年 AI 视频离&quot;真能用&quot;最后、也最硬的一道坎。</p>
<p>现在没有任何模型能一次生成一支风格统一的三分钟片子。能稳定输出的上限是 5–10 秒的单镜头。所以做长片只有一条路:<strong>生成一堆短片段,再拼起来。</strong> 而拼接的连贯性,完全是个工作流问题,不是模型问题。</p>
<p>一套 2026 年实战可行的流程是这样:</p>
<pre class="mermaid">flowchart TB
  S[1. 文字脚本<br/>分镜表] --> KF[2. 文生图<br/>画出每个镜头的关键帧]
  KF --> REF[3. 锁定角色参考图<br/>风格参考图]
  REF --> GEN[4. 逐镜头生成<br/>首尾帧 + 参考图 + 运镜]
  GEN --> CHK{5. 逐镜头验收}
  CHK -- 不对 --> EDIT[6. 局部编辑修补]
  EDIT --> CHK
  CHK -- 通过 --> CUT[7. 剪辑台拼接 + 调色统一]
  style REF fill:#cfe8d5,stroke:#4f9d69
  style GEN fill:#cfe8d5,stroke:#4f9d69
  style CUT fill:#fde7c2,stroke:#e8b23c
</pre><p>几个关键点。第一,<strong>关键帧先行</strong>——先用文生图把每个镜头的画面定下来,这是整片风格统一的锚。第二,<strong>参考图全程复用</strong>——角色参考图和风格参考图,从第一个镜头用到最后一个,这是跨镜头一致性唯一能抓住的绳子。第三,<strong>最后一定有一道调色</strong>:哪怕前面控制得再好,十个片段的色调还是会有细微差异,在剪辑台上统一拉一遍 LUT,是目前抹平&quot;拼接感&quot;最有效的手段——这一步反而不靠 AI。</p>
<p>我的判断是:<strong>2026 年做 AI 长视频,真正的核心能力不是&quot;会写 prompt&quot;,是&quot;会做工作流&quot;。</strong> 模型只是流水线上的一个工位。谁能把分镜、关键帧、参考图、首尾帧、局部编辑、调色这套流程串顺,谁就能稳定产出能交付的片子。盯着&quot;哪个模型画质最强&quot;的人,做不出连贯的三分钟。</p>
<h2 id="最后可控性才是这场竞赛的下半场">最后:可控性才是这场竞赛的下半场</h2>
<p>把这篇的判断收一下。</p>
<p>画质的竞赛基本结束了,2026 年主流模型都够用。下半场的全部看点在控制:谁的参考图锁身份锁得更死,谁的相机轨迹更跟手,谁的局部编辑能像素级不动,谁能让十个片段拼起来不露馅。</p>
<p>对要落地的人,优先级很清楚:</p>
<ol>
<li><strong>能用图生视频,就别用文生视频</strong>——参考图是性价比最高的可控性。</li>
<li><strong>叙事镜头一律上首尾帧</strong>——把开放生成变成闭合补全。</li>
<li><strong>选工具看控制接口的数量,不只看画质 demo</strong>——能局部编辑的才是生产工具。</li>
<li><strong>把功夫下在工作流上</strong>——长片的连贯性是流程问题,不是模型问题。</li>
</ol>
<p>一句话:别再问&quot;哪个模型画得最好看&quot;,该问的是&quot;哪套流程让我最说了算&quot;。</p>
]]></content:encoded></item><item><title>向量数据库 2026:还需要专用的吗</title><link>https://realtime-ai.chat/posts/vector-db-2026/</link><pubDate>Tue, 21 Apr 2026 11:00:00 +0800</pubDate><guid>https://realtime-ai.chat/posts/vector-db-2026/</guid><description>pgvector 已经能扛住大多数 RAG 业务,Milvus、Qdrant 这些专用向量库在 2026 年到底什么时候才真的需要?这篇按规模、过滤、混合检索给一份选型判断。</description><content:encoded><![CDATA[<p>三年前做一个带检索的 AI 功能,默认动作是去注册一个 Pinecone,或者在 k8s 上拉起一套 Milvus。&ldquo;做向量检索就得有向量数据库&rdquo;,这是当时的常识。</p>
<p>2026 年我不会这么干了。我现在的默认动作是反问一句:<strong>你的业务数据是不是已经在 Postgres 里了?</strong> 如果是,那大概率你不需要再多一个数据库——装个 <code>pgvector</code> 扩展就够了。</p>
<p>这不是图省事。这两年向量检索这个领域发生了一件挺反常识的事:<strong>专用向量数据库的护城河,被&quot;在已有数据库里加一个向量列&quot;这件事填掉了一大半。</strong> 这篇就讲清楚这件事是怎么发生的,以及——什么场景下你还是真的需要一个专用的。</p>
<h2 id="向量检索这两年变了什么">向量检索这两年变了什么</h2>
<p>先说结论:向量检索从&quot;一项需要专门系统的黑科技&quot;,退化成了&quot;一种索引类型&quot;。</p>
<p>2022、2023 年的时候,向量检索确实特殊。HNSW 索引怎么建、近似最近邻(ANN)怎么调参、召回率和延迟怎么权衡,这些都是新东西,通用数据库根本不支持。你想做语义检索,除了上专用向量库没有别的选择。专用向量库的价值,很大程度上来自于&quot;别人还做不了&quot;。</p>
<p>到 2026 年,情况倒过来了。HNSW 这种图索引已经是成熟、公开、被反复实现的算法,不再是谁家的秘密。<code>pgvector</code> 作为 Postgres 扩展,把 HNSW 和 IVFFlat 索引、多种距离度量、半精度存储这些都做齐了;0.8 版本之后还补上了&quot;迭代索引扫描&quot;(iterative index scan),专门解决带过滤的向量查询里那个老大难问题——后面会细讲。</p>
<p>换句话说,<strong>&ldquo;做向量检索&quot;这件事本身,已经不构成开一个新数据库的理由了。</strong> 它现在更像是&quot;我需要一个 JSON 字段&quot;或者&quot;我需要全文检索&rdquo;——你的现有数据库基本都能干,只是早几年还不行。</p>
<p>专用向量库不是没价值了,而是价值的位置变了:它不再赢在&quot;能不能做&quot;,而是赢在&quot;做到什么规模、做得多快、过滤多复杂&quot;。这是一个量变到质变的边界问题,而不是一个有无问题。</p>
<h2 id="pgvector-为什么吃掉了大半场景">pgvector 为什么吃掉了大半场景</h2>
<p>把向量检索塞进 Postgres,带来的好处不是&quot;少装一个软件&quot;这么肤浅。真正值钱的是下面三件事。</p>
<p><strong>第一,数据不用搬,事务是一致的。</strong> 绝大多数 AI 功能不是孤立的——一段文档的 embedding,总是挂在某个用户、某个项目、某个权限边界下面。如果向量在专用库、业务数据在 Postgres,你就得自己维护两套数据的同步:文档删了,向量要跟着删;权限变了,检索结果要跟着变。这套同步逻辑写起来不难,但它是一类<strong>永远会出 bug 的胶水代码</strong>——双写失败、顺序错乱、补偿任务追不上。向量和业务数据待在同一个 Postgres 事务里,这一整类问题直接不存在。</p>
<p><strong>第二,过滤就是普通的 SQL <code>WHERE</code>。</strong> &ldquo;找语义相近的文档,但限定这个用户、这个时间段、状态是已发布&rdquo;——这种带元数据过滤的检索是 RAG 里的常态,几乎没有哪个真实业务是纯粹的全库 ANN。在 pgvector 里,这就是一条 SQL,<code>WHERE</code> 子句和向量排序写在一起,还能直接 JOIN 业务表。在专用向量库里,过滤得靠它自己那套 payload/metadata 过滤机制,表达能力通常比 SQL 弱,跨&quot;表&quot;的关联更是做不了。</p>
<p><strong>第三,运维你已经会了。</strong> 你的团队大概率已经在跑 Postgres——有人会调参,有备份,有监控,有高可用方案。pgvector 只是这台已有机器上的一个扩展,不增加任何新的运维面。而 Milvus 是一套认真的分布式系统,etcd、对象存储、查询节点、数据节点分开,通常得跑在 k8s 上,得有人专门盯着。这个运维成本,小团队最容易低估。</p>
<p>再加上一个关键事实:<strong>大多数 RAG 业务的数据量,比你以为的小得多。</strong> 一个 B2B SaaS 产品,把所有客户的所有文档切块做 embedding,常常也就几十万到几百万条向量。公开的评测和生产经验里有个反复出现的数字——<strong>1000 万条向量以下,pgvector 在端到端延迟、成本、运维复杂度上,综合体验是最好的。</strong> 单节点 Postgres 配置得当能撑到接近 5000 万条向量,这个区间覆盖了绝大部分企业级 RAG 产品。</p>
<p>所以&quot;默认 pgvector&quot;不是保守,是 2026 年对大多数场景最合理的工程判断。</p>
<h2 id="那专用向量库什么时候才真的需要">那专用向量库什么时候才真的需要</h2>
<p>把 pgvector 夸完了,得诚实地说它的天花板在哪。三个信号,出现任何一个,你就该认真考虑专用向量库了。</p>
<p><strong>信号一:规模真的大。</strong> 这里说的&quot;大&quot;是几千万到十亿级的向量,而且还在涨。pgvector 的硬上限是单节点 Postgres 的上限——内存装不下索引、HNSW 索引构建时间长到离谱、单机扛不住并发。<code>pgvectorscale</code> 这个扩展能用 StreamingDiskANN 把索引下放到磁盘,把这个上限往后推一截,值得先试。但如果你的向量是亿级、要分布式分片、要水平扩容,那就是 Milvus 的主场——它在生产里被部署到几亿乃至十亿级向量是常规操作,搜索公司、电商、基因研究都在这个量级用它。</p>
<p><strong>信号二:过滤又重又刁钻。</strong> 注意,这跟前面说 pgvector 过滤强不矛盾。pgvector 的强项是<strong>过滤的表达能力</strong>(SQL 想怎么写怎么写);它的弱项是<strong>高过滤率下的检索性能</strong>。近似索引的本质矛盾是:先扫索引拿候选,再套过滤条件——如果过滤条件只命中全库 1% 的行,HNSW 默认 <code>ef_search</code> 才 40,扫出来平均可能一条都不剩。pgvector 0.8 的迭代索引扫描缓解了这个问题(不够就继续扫,直到够数),但它是&quot;打补丁&quot;,不是&quot;原生为过滤设计&quot;。Qdrant 走的是另一条路:payload 感知的索引,让带过滤的检索性能接近不带过滤。如果你的核心场景就是<strong>在一个大库的某个过滤子集上做高 QPS 检索</strong>,Qdrant 是 2026 年的默认答案。</p>
<p><strong>信号三:延迟和吞吐被压到极限。</strong> 公开评测里,Qdrant 在 100 万向量、召回率 95% 以上时能做到约 1840 QPS,p99 延迟约 12ms,是开源里最快的一档;Milvus 约 18ms,Weaviate 约 16ms。pgvector 在 1000 万以下做得也不错,但当你的检索 QPS 很高、又卡着严格的 p99,专用库用 Rust/C++ 写的查询引擎、更精细的索引控制,确实能再榨出一截。这是个&quot;边际收益&quot;问题:大多数业务感知不到这一截,少数高频检索的业务很在意。</p>
<p>把这三个信号反过来说:<strong>如果你的向量在千万以下、过滤用 SQL 能舒服表达、对延迟没有极端要求——你三个信号一个都没踩中,那就别折腾,pgvector。</strong></p>
<pre class="mermaid">flowchart TD
  A[要做向量检索] --> B{数据已经在<br/>Postgres 里?}
  B -- 是 --> C{向量量级?}
  B -- 否 --> D{团队已有<br/>关系型数据库?}
  C -- 1000 万以下 --> E[pgvector<br/>默认选择]
  C -- 1000 万-5000 万 --> F{过滤重 / 延迟苛刻?}
  C -- 亿级以上 --> G[Milvus<br/>分布式专用库]
  F -- 否 --> H[pgvector + pgvectorscale]
  F -- 是 --> I[Qdrant]
  D -- 是 --> E
  D -- 否 --> J[Qdrant<br/>轻量专用库起步]
  style E fill:#cfe8d5,stroke:#4c9a6a
  style G fill:#fde7c2,stroke:#e8b23c
  style I fill:#fde7c2,stroke:#e8b23c
</pre><h2 id="混合检索专用库重新拿回的一分">混合检索:专用库重新拿回的一分</h2>
<p>前面说专用库护城河被填了一大半,<strong>混合检索是它们守住的那一小半。</strong></p>
<p>纯向量检索有个真实的弱点:它擅长&quot;意思相近&quot;,但对&quot;必须精确出现的词&quot;反而不灵。用户搜一个产品型号 <code>SKU-7741X</code>、一个错误码 <code>ERR_0x80</code>、一个人名,语义相似度模型很可能给你一堆&quot;意思差不多但型号不对&quot;的结果。这种场景下,老派的关键词检索(BM25)反而准。</p>
<p><strong>混合检索</strong>就是把两者揉在一起:稠密向量负责&quot;语义&quot;,稀疏的 BM25 负责&quot;精确词命中&quot;,再用一个排序融合(比如 RRF)把两路结果合并。2026 年这基本是 RAG 检索质量的标配,而不是加分项。</p>
<p>这件事上,各家差距很明显:</p>
<table>
  <thead>
      <tr>
          <th>数据库</th>
          <th>混合检索现状</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Weaviate</td>
          <td>原生 BM25 + 稠密向量 + 元数据过滤,一条查询搞定,体验最完整</td>
      </tr>
      <tr>
          <td>Qdrant</td>
          <td>原生支持稀疏向量与稠密向量,内置融合,做混合检索很顺手</td>
      </tr>
      <tr>
          <td>Milvus</td>
          <td>支持,但更偏纯向量检索的大规模场景</td>
      </tr>
      <tr>
          <td>pgvector</td>
          <td>能做——pgvector 管向量,Postgres 的全文检索管 BM25,但<strong>要自己写融合逻辑</strong>,把两路分数缝起来</td>
      </tr>
  </tbody>
</table>
<p>pgvector 在这一项上是&quot;能做但不优雅&quot;:两套排序、两套分数,RRF 融合得自己写在 SQL 或应用层。能跑,但不如 Weaviate 那种&quot;一条查询返回融合结果&quot;省心。</p>
<p>所以如果检索质量是你的产品核心、混合检索要做得讲究——这是天平往专用库(尤其 Weaviate)倾斜的一个实打实的理由。如果混合检索对你只是&quot;锦上添花&quot;,pgvector 自己拼一套也能用。</p>
<h2 id="托管还是自建">托管还是自建</h2>
<p>选完&quot;哪个数据库&quot;,还有一道正交的题:托管云服务,还是自己部署。</p>
<p>参考一下 2026 年的大致价位,1000 万向量量级:Pinecone Serverless 约每月 70 美元,Qdrant Cloud 约 65 美元,Weaviate Cloud 约 135 美元,而 pgvector 跑在 RDS 上大约 45 美元。这个区间里,差价是噪音,不值得为省几十美元纠结。</p>
<p>真正拉开差距的是<strong>两个极端</strong>:</p>
<ul>
<li><strong>量级很小、又不想多维护一个系统</strong>:数据已经在托管 Postgres(RDS、Aurora、Supabase)里的话,pgvector 几乎零边际成本——你连&quot;选型&quot;都不用做。</li>
<li><strong>量级很大(上亿向量)</strong>:托管和自建的成本差会放大到很夸张的程度。同样的亿级负载,Pinecone 这类全托管的账单能到自建 Qdrant 或 Milvus 的 3 到 5 倍。这个量级,自建省下的钱足够养一个专门运维的人。</li>
</ul>
<p>中间地带的判断很简单,就一句话:<strong>算清楚你那个专门维护数据库的工程师,一年值多少钱。</strong> Pinecone 这种全托管的卖点从来不是便宜,是&quot;你完全不用管它&quot;——没有节点、没有索引调参、没有半夜被叫起来。对一个还没有专职 DBA、工程师时间比服务器贵得多的小团队,多付的托管费通常划算。反过来,已经有成熟基础设施团队、规模又上来了,自建 Qdrant/Milvus 的性价比会明显反超。</p>
<p>我的经验法则:<strong>早期一律托管</strong>(包括直接用托管 Postgres 的 pgvector),把精力留给产品;<strong>等规模和团队都长起来了,再谈自建。</strong> 别在第一天就为一个还不存在的扩容问题,提前背上运维负担。</p>
<h2 id="一张表收尾按规模和场景怎么选">一张表收尾:按规模和场景怎么选</h2>
<p>把上面所有判断压成一张可以贴在工位上的表:</p>
<table>
  <thead>
      <tr>
          <th>场景</th>
          <th>向量量级</th>
          <th>推荐</th>
          <th>理由</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>数据已在 Postgres,常规 RAG</td>
          <td>&lt; 1000 万</td>
          <td><strong>pgvector</strong></td>
          <td>零新增系统,事务一致,SQL 过滤</td>
      </tr>
      <tr>
          <td>没有关系型数据库,轻量起步</td>
          <td>&lt; 1000 万</td>
          <td><strong>Qdrant</strong>(托管)</td>
          <td>上手快,过滤性能好,后续好扩</td>
      </tr>
      <tr>
          <td>检索质量是核心,混合检索要讲究</td>
          <td>任意</td>
          <td><strong>Weaviate</strong></td>
          <td>原生 BM25 + 向量,融合开箱即用</td>
      </tr>
      <tr>
          <td>大库 + 高过滤率 + 高 QPS</td>
          <td>1000 万 ~ 数亿</td>
          <td><strong>Qdrant</strong></td>
          <td>payload 感知索引,过滤几乎不掉速</td>
      </tr>
      <tr>
          <td>亿级以上,要分布式水平扩容</td>
          <td>&gt; 1 亿</td>
          <td><strong>Milvus</strong></td>
          <td>为超大规模分布式设计</td>
      </tr>
      <tr>
          <td>想留在 Postgres 但超了单机上限</td>
          <td>1000 万 ~ 5000 万</td>
          <td><strong>pgvector + pgvectorscale</strong></td>
          <td>DiskANN 把索引下放磁盘</td>
      </tr>
  </tbody>
</table>
<p>最后留一句话。三年前&quot;做 AI 检索就得上专用向量库&quot;是对的,因为别人确实做不了。2026 年这句话已经过期了——<strong>专用向量库依然优秀,但它现在要靠规模、过滤、混合检索这些具体的硬指标来赢得你,而不是靠&quot;向量检索&quot;这四个字本身。</strong> 选型的第一步不再是&quot;挑哪个向量库&quot;,而是先诚实地问自己:我真的到了需要它的那条线了吗?</p>
<p>大多数人,还没到。</p>
]]></content:encoded></item></channel></rss>