1. 别急着堆模型:一次让我重新审视"模型组合和算力分布"的失败经历
我最早接触智能体的时候,和大多数团队的做法一样:按功能把任务拆成几个子模块,给每个子模块分一个"感觉最合适"的模型。意图识别不够准,就换更大的底座;知识库问答效果差,就再并联一个检索模型;到了汇总生成环节,干脆把所有高配模型都堆上去。结果呢?延迟涨了三倍,成本翻了一倍,最终效果却没有想象中那种"1+1>2"的提升,反而在几个关键链路上出现了更隐蔽的错误。
那次排查让我印象很深。系统明明每个环节单独评测都是可用的,一旦连起来,信息就在子模块之间不断"走样"。某个上游分类模型把用户意图分错了,后面的所有生成环节都被带偏;某个摘要模型提前丢掉了关键数字,下游的决策模块却完全感知不到这份信息损失。我们围绕模型组合和算力分布做了好几轮调参,把各个模型换了一遍,问题依旧。
后来我把这个问题从"选哪个模型"里抽出来,换成信息论的坐标系重新看了一遍,才意识到问题出在哪:模型组合的本质是信息链路的串联与并联,算力分布的本质是在总成本约束下最大化任务相关的互信息。这个视角一开始看起来像理论玩具,但真正落地之后,它确实给出了一个能把"感觉"变成"计算"的统一答案。这篇文章就是把我这几轮实践里的推导、测量方式和踩坑记录完整写出来,给同样在搭智能体、做模型选型、分算力预算的同学一个可以照着算、照着验的参考。
2. 从"选强模型"到"算信息量":智能体的信道化建模
2.1 一次推理到底在传递什么
先抛一个反直觉的观点:当我们说"这个模型更好"的时候,往往说的是一些模糊的整体印象——生成更流畅、推理更严谨、指令遵循更好。但在模型组合的场景里,真正重要的是一个更局部、更可计算的东西:这条链路上的模型,在多大程度上保留了完成任务所需要的信息。
信息论里有个工具就叫互信息,记作 I(X; Y),衡量的是观察 Y 之后,关于 X 的不确定性减少了多少。如果我们把一次智能体调用看成这样的过程:输入 X(用户原始问题)经过模型 Z 的处理,得到输出 Y,那么模型的价值就可以写成:
I(X; Y) = H(X) - H(X|Y)
其中 H(X) 是输入的熵,H(X|Y) 是看到输出之后仍然残留的不确定性。一个理想的模型,应该让 H(X|Y) 尽量小,也就是输出把输入里跟任务相关的信息几乎无损地保留下来。
但实际任务里,我们不需要模型保留全部输入信息。用户问"今天天气如何",系统不需要保留这句话是几点几分说的、用了什么语气、输入法有没有打错字,只需要提取出地点、时间、天气意图这几个关键维度。于是更准确的目标不是最大化 I(X; Y),而是最大化任务相关互信息 I(T; Y),其中 T 是任务真正需要的抽象表示。
这就是信息瓶颈思想的雏形:我们允许模型压缩输入,但压缩的过程中要尽量保留与任务标签相关的信息,丢掉无关的细节。数学上常见的形式是:
max I(Z; T) - β I(Z; X)
其中 Z 是模型内部或输出的压缩表示,β 控制压缩力度。β 越小,模型越倾向于保留更多输入细节;β 越大,表示越是只留任务相关部分。套到智能体选型上,这句话的含义非常实在:一个模型是否适合某个子任务,取决于它能否在你的算力预算内,提供恰好够用的 I(Z; T),而不是它的参数规模有多大。
2.2 三个关键量:输入熵、任务互信息、算力代价
我用信息论做模型组合和算力分布规划时,只盯三个量。
第一个是输入熵 H(X)。它刻画的是到达这个子任务的信息流有多"乱"。比如一个开放域闲聊输入,话题漂移大,H(X) 通常偏高;一个经过严格枚举的工单分类输入,候选项就那几个,H(X) 偏低。输入熵高,意味着模型需要更大的容量去建模复杂分布。
第二个是任务互信息需求 I(T; Z)。某个子任务到底需要从输入里提取多少信息?做一个二分类意图判断,可能只需要极少的互信息;做一份包含多条件约束的合同审查,需求就高得多。这个量决定了我们至少需要多"强"的模型。
第三个是算力代价 C。这里的算力不光是 GPU 时数,还包括延迟、内存、每 token 成本、运维复杂度。信息论给我们的不是一个"能力排名",而是一个约束优化问题:
在总算力 C_total 的约束下,选择一组模型组合方式,使得所有子任务的任务相关互信息之和最大。
用数学写出来就是:
max Σ_i w_i · I_i(T_i; Z_i) s.t. Σ_i C_i ≤ C_total
其中 w_i 是子任务在业务上的权重,I_i 是第 i 条链路的互信息,C_i 是第 i 条链路消耗的算力。模型组合和算力分布,本质上就是解这个约束优化问题的工程化过程。
2.3 为什么"能力排行"选不出最佳组合
以前我们团队做选型,习惯把所有模型按照某个基准测试分数排个序,然后默认"分高的用在关键链路,分低的用在简单链路"。这个思路听起来合理,但它忽略了一件事:基准测试分数是在特定数据分布上测出来的,不等于在你的任务分布上能提供足量的 I(T; Z)。
举个例子。某个轻量模型在通用推理基准上分数不高,但在你的垂直领域里,因为预训练和微调数据覆盖了大量领域表达,它可能已经把这个领域的输入熵压得很低。此时你引入一个更大的通用模型,虽然整体能力更强,但它对领域内任务互信息的边际提升很小,而算力代价却是轻量模型的几十倍。从约束优化的角度看,这笔账完全不划算。
反过来说,一个看似"够用"的小模型,如果部署在一个输入熵极高的链路(比如开放域多轮对话),它可能频繁产生低置信输出,导致下游互信息骤降。这时候花在它身上的算力虽然便宜,但整体系统因为这条链路失败而产生的高成本,远超省下的那点预算。
所以我把选型问题拆成了三个步骤:先量化每条链路的输入熵和任务互信息需求,再估计候选模型在对应数据分布上的互信息供给,最后在总算力约束下做分配。这个过程看似多了一步测量,实际上省掉了大量以"感觉"为名的排列组合实验。
3. 模型组合的信息论推导:串联不增信息,并联才有选择余地
3.1 数据处理不等式:组合系统的"天花板"
模型组合为什么经常越组越差?信息论里有一个非常基础的结论可以解释:数据处理不等式。它说的是,如果 X → Y → Z 构成一个马尔可夫链,也就是 Z 只依赖于 Y,而不直接看到 X,那么:
I(X; Z) ≤ I(X; Y)
换句话说,信息在串联链路中只会减少,不会增加。任何后处理模型,无论它多强大,都无法凭空恢复上游已经丢弃的信息。
这条定理在智能体系统里到处都是影子。一个 OCR 模型识别错了数字,后面的表格理解模型读到的就已经是错误的输入;一个意图分类模型把"退款"错判成"投诉",后面所有生成和路由都建立在错误前提上。我们之前做优化时,花了很多精力调下游大模型的 prompt,让它"更聪明"地理解上游结果,但最终效果始终被上游的信息损失卡住。数据处理不等式告诉我们,这不是 prompt 写得不够好,而是链路拓扑本身决定了信息上界。
因此,做模型组合的第一原则不是"每个环节选最强的模型",而是先保住上游的信息,或者缩短串联路径,给关键信息留出旁路。就像电路设计中,重要的信号不能只经过一条高损耗的传输线。
3.2 组合收益的上界计算
既然串联会损耗信息,那为什么我们还要组合多个模型?因为组合方式不止串联一种。把多个模型并联起来,相当于多个信道同时传输信息,系统可以选择信任其中一个,或者做加权融合。这时候系统的总互信息上界,不是某个模型的 I(X; Y),而是所有模型能提供的互信息之并集。
更实用的分析方式是把组合看成一种"路由选择":在每一个决策节点,输入 X 先经过一个低成本探测器,估算当前输入在哪个模型上能获得更高的任务互信息,然后把样本分发给对应的模型。此时系统的等价互信息可以近似写成:
I_total ≈ Σ_k P(k) · I(X; Y|route=k)
其中 P(k) 是路由到第 k 个模型的样本比例。这个公式非常有用,因为它解释了为什么"一个超大模型 + 一组小模型"的组合常常优于"两个中大型模型并联":前者可以通过路由把高熵样本交给大模型,把低熵样本交给小模型,整体互信息供给更贴近任务分布。
我还用一个更直白的工程指标做组合收益估算:同一批验证样本,每一条链路单独跑一遍,记录每个样本的输出与标准答案之间的互信息近似值(可以用 logits 熵或嵌入距离代替),然后看两个模型之间是互补还是冗余。如果两个模型在同一批高熵样本上同时犯错,说明它们的任务互信息缺口高度重叠,并联带来的增益很低;如果错误分布互补,并联融合的收益才值得投入额外算力。
3.3 三类实际可用的组合拓扑
在真实系统里,我逐渐把常用的组合方式收敛成三类,每一类都能用信息论解释清楚。
第一类是并联路由。适用于输入分布很宽、但单条链路算力有限的场景。典型做法是训练一个输入熵探测器,低熵样本走轻量模型,高熵样本走重模型。这里的原理就是按需分配互信息,让不同容量的模型处理不同复杂度的输入。
第二类是串联校验。适用于错误代价很高的链路,比如金额计算、法律条款抽取。先用低成本模型给出一个结果,再用另一个模型对结果做一致性校验。注意,校验模型看到的是前一个模型的输出 Y,而不是原始输入 X,因此它能恢复的信息上限受数据处理不等式约束。校验的真正价值不是"补全信息",而是消除前一个模型输出中的部分不确定性,所以校验模型的设计重点应该放在"能否识别出异常输出"上,而不是"能否重新生成一遍更好的答案"。
第三类是冗余共识。多个模型独立处理同一个输入,再对输出做投票或交叉验证。这种组合只有在各个模型错误相互独立时才划算。如果所有模型都源自同一条训练数据分布,它们往往会在同样的偏置上同时出错,冗余共识的收益就会大幅缩水。我在实践中发现,真正有效的冗余往往是异构的:一个重推理模型加一个检索增强模型,或者一个生成模型加一个规则校验器,它们的互信息缺口重叠度低,融合才有意义。
4. 算力分布不是"分蛋糕",而是边际信息收益最大化
4.1 目标函数与算力约束下的最优分配
把算力想象成一笔可以分配到不同链路的预算,每个子任务都是一项投资,回报是任务互信息的提升。这时候我们遇到的不是"哪个模型最重要"的问题,而是一个标准的资源分配问题。
给定总预算 C_total,我们希望最大化:
Σ_i w_i · ΔI_i(C_i)
其中 ΔI_i(C_i) 是给第 i 条链路投入 C_i 算力后,它获得的互信息增量。由于大多数模型的互信息供给存在边际递减效应——最开始的投入改善最明显,继续追加算力收益越来越小——所以最优策略不是平均分配,也不是按业务优先级从高到低"喂饱"关键链路,而是每一轮都选择边际收益最高的那条链路:
ΔI_i / ΔC_i 最大的链路优先分配算力
这是个经典的贪心思路,实际工程中我基本都用它做起步方案,再根据线上效果微调。
举个例子。某个对话系统有两条链路:链路 A 是简单意图分类,输入熵很低,轻量模型已经达到了 95% 正确率,此时再投入更多算力,正确率可能只提升 0.3 个百分点;链路 B 是复杂文档问答,输入熵高,当前模型经常答错,追加算力的边际收益非常明显。按照 ΔI/ΔC 排序,显然应该把预算优先给链路 B。但大多数团队在实操时会下意识保护链路 A,因为它是"核心入口",生怕它出问题。信息论视角在这里的作用就是帮我们克服这种直觉偏差,把分配依据变成可比较的数值。
4.2 实操步骤:从链路画像到分配矩阵
我落地这套方法时,按下面几步走,每一步都能直接用工程手段完成,不需要论文级别的严谨估计。
第一步,画链路拓扑。把智能体系统里所有模型调用点列出来,标注它们之间的数据流向。这个步骤的价值是找出隐藏的串联路径,因为数据处理不等式告诉我们,串联路径越长,信息损耗越严重。
第二步,统计输入熵。对每条链路的线上日志做采样,把输入文本嵌入到一个固定维度的向量空间,然后在样本集合上估算熵。实操上用近似方法:算每个样本 embedding 到领域聚类中心的距离分布,分布越散,熵越高。不需要精确计算,只需要一个相对排序。
第三步,估算任务互信息缺口。用当前模型的 logits 熵或者输出置信度作为代理指标。如果某条链路在大量样本上 logits 熵偏高,说明模型对输出不确定,任务互信息供给不足。把高熵样本的比例作为"缺口大小"。
第四步,计算边际收益。挑一个候选模型,替换掉当前模型,在同一批高熵样本上重新估算 logits 熵下降量,再除以算力成本增量,得到 ΔI/ΔC。这个数值不需要对所有链路做,只对前几个高优先级的链路做即可。
第五步,生成分配矩阵。用表格把每条链路的输入熵、任务权重、当前互信息供给、边际收益、推荐模型和算力成本列出来,然后按 ΔI/ΔC 排序。这张表就是模型组合和算力分布的决策依据。
我通常还会在分配矩阵里加一列"路由策略":如果一条链路的输入熵跨度极大,就标记为"需要动态路由",而不是给它分配一个固定的大模型。
4.3 高频小模型、低频大模型与输入熵路由
动态路由是我这几年做智能体算力优化收益最大的一招。它的出发点很简单:很多链路的输入熵不是均匀的,而是长尾分布。拿客服工单分类来说,可能有 70% 的工单属于常见类别,输入模式非常固定,轻量模型就能处理;剩下 30% 的工单涉及复杂背景和罕见组合,需要更强的推理模型。
如果给整条链路统一配置大模型,等于对那 70% 的低熵样本也支付了高算力成本,边际收益很低。如果统一配置小模型,高熵样本又处理不好。动态路由的思路是:
- 训练一个轻量路由器,输入当前样本,输出一个复杂度分数。
- 复杂度分数低于阈值的样本,交给轻量模型处理。
- 复杂度分数高于阈值的样本,路由到重量模型。
- 定期用线上日志重新校准阈值,确保高低熵样本的比例与模型容量匹配。
这里有个细节:路由器本身也是一个模型,占用算力,也会出错。所以路由器的选型要尽可能轻,哪怕它偶尔把高熵样本错判成低熵样本,只要错误率控制在一定范围内,整体收益仍然可观。我在实践中发现,路由器只需要一个很小的分类模型,输入用 TF-IDF 或小 embedding 足以,不需要大模型参与。
这套"高频小模型、低频大模型"的分布并不是拍脑袋拍出来的,它就是信息论约束优化的自然结果:低熵分布用低容量模型,高熵分布用高容量模型,算力消耗向最难的信息流倾斜。
5. 落地记录:某企业知识问答智能体的重构过程
5.1 重构前的链路数据
前年我们接手一套企业内部知识库问答智能体,它的结构很典型:用户提问 → 检索召回 → 重排 → 大模型生成回答。当时系统的做法是每个环节都用同一个高配通用模型,理由是"通用模型什么都能干,省心"。成本报表出来之后,单次问答平均消耗的算力是同类系统的三倍,而且回答质量并没有明显优势。
我们先花了一周时间采集线上日志,把链路画像数据做出来。原始数据大致是这样的:
- 检索阶段:输入是用户问题 + 候选文档标题,绝大多数问题的检索结果排序正确率很高,logits 熵低。
- 重排阶段:输入熵中等,因为需要综合用户问题、文档相关性和上下文。
- 生成阶段:输入熵跨度极大。有些问题是"这个报销单怎么填",知识库里有现成标准流程,生成难度低;有些问题是跨多个文档的复杂推断,例如"如果项目延期,原定预算还能不能用于设备采购",需要很强的推理能力。
从互信息缺口看,检索和重排的缺口不大,主要问题集中在生成阶段的高熵样本上。而当时的系统给所有样本都配置了同一个大模型,等于在低熵问题上支付了高额成本,又在高熵问题上没有额外冗余。
5.2 信息论指标怎么落地测量
测量过程我们分了四步。
第一步,跑一批带标注的验证集,收集每条链路每个样本的 logits 熵。这是最简单的代理指标。不需要直接算互信息,直接看模型在正确答案上的置信度分布。
第二步,对每条链路做"熵分层"。按照 logits 熵把样本分成十等份,看每一层里的错误率。如果错误率随熵升高而急剧上升,说明这条链路存在明显的互信息缺口,需要更强模型或者更好的提示策略。
第三步,用嵌入距离做一个粗略的输入熵估计。把所有用户问题嵌入到向量空间,计算它们与领域中心的距离,距离分布越宽,输入熵越高。这一步帮助我们把"哪些问题复杂度高"从定性判断变成定量分布。
第四步,对不同候选模型做小规模替换实验。在生成链路的高熵样本上,只把选取的 20% 样本改用重模型,其他样本保持原模型,对比整体回答质量。这一步得到的 ΔI/ΔC 特别直观:只替换高熵样本,成本只增加 10%,但整体回答正确率提升了 8 个百分点。如果全量替换,成本增加 300%,正确率只再提升 1.5 个百分点。
5.3 重构后的效果与教训
最终的重构方案是:
- 检索和重排统一换成了轻量模型,因为它们的任务互信息需求低,大模型在这里属于浪费。
- 生成链路拆成两条:低熵问题走轻量模型,高熵问题走重模型。
- 动态路由用一个小分类器实现,输入的复杂度特征来自问题长度、关键词数量和召回文档得分分布。
上线运行一个月后的数据,和重构前对比:
| 指标 | 重构前 | 重构后 |
|---|---|---|
| 单次问答平均算力成本 | 1.0(基准) | 0.42 |
| 整体回答准确率 | 0.82 | 0.91 |
| 高熵子集准确率 | 0.68 | 0.84 |
| 低熵子集准确率 | 0.89 | 0.92 |
成本降了一大半,准确率不降反升。这本身就说明原来的算力分布严重错配:资源大量投在了低熵样本上,而真正需要更多互信息的复杂样本反而没有得到足够支持。
这个项目的最大教训是:不要默认"大模型 = 更好的模型",在具体链路上,如果任务互信息需求不高,大模型只是昂贵的装饰品。信息论给我们提供了一个判断框架,让"值不值得换"变成可以量化的问题。
6. 信息论不是银弹:四个容易误用的边界
6.1 互信息近似值不能当精确测量用
我在实践中虽然大量使用 logits 熵、嵌入距离这类代理指标,但要明确说一句:这些都不是真正的互信息。真正的互信息需要对联合分布做积分,而我们在系统中能拿到的只是有限样本。尤其当训练数据和线上分布漂移时,样本估算出来的熵会明显失真。
所以我把这些指标当成"排序工具"而不是"绝对标尺"。它们适合用来找出哪条链路最缺信息、哪个模型替换收益最大,但不适合用来声称某个模型的理论互信息是多少。如果团队里有人试图用这些近似值做精细的理论推导,我会及时叫停,直接用消融实验验证。
6.2 信息量大不等于业务重要
信息论视角容易带来一个误用:把互信息缺口最大的链路当成最值得投入的链路。但业务权重 w_i 才是决定优先级的关键。举个例子,一个偶尔出现的闲聊话题,输入熵极高,模型确实经常答得不好,但它在业务上的价值可能远低于一个"退货金额计算"链路,后者的输入熵虽然低,一旦出错就是真金白银的损失。
正确的做法是把 w_i 乘到互信息增量前面再排序,而不是只看 ΔI/ΔC。业务权重应该来自产品方和运营方,靠技术团队自己拍脑袋定权重,很容易把系统调得"看起来很聪明,但业务上不赚钱"。
6.3 静态熵覆盖不了时序和策略反馈
这套信息论框架比较适合单轮或短上下文的任务型智能体,一旦进入多轮对话、强化学习、长程规划,问题就复杂得多。因为信息的价值不只是当前这一轮减少不确定性,还在于它如何影响后续动作的选择。
多轮对话里的策略熵、奖励信号、状态价值都带有时间结构,静态的 I(X; Y) 无法完整刻画。我在做长程 Agent 时,会额外引入"决策信息增益"的概念:某个模型输出不仅要降低当前任务的不确定性,还要让下游策略能做出更优的动作选择。这种场景下,光靠输入熵路由就不够了,需要考虑历史状态的压缩和记忆机制。
6.4 数据标注偏差会污染一切测量
最后也是最重要的一点:整套测量都依赖验证集和反馈标注。如果标注本身有偏差,模型输出排序和互信息估算都会被带偏。最常见的问题是标注者只认"表面正确"的答案,而忽略了需要深层推理的正确解,导致模型在高熵样本上的真实能力被低估,最终我们可能把算力错误地分配到其他链路上。
我的建议是,在测量任务互信息缺口之前,先做一轮标注一致性分析,确认高熵样本的标注分歧率是否可控。如果标注分歧本身就很大,那就先解决标注标准问题,否则信息论框架给出的分配方案也只是在错误的地图上做规划。
回过头看,用信息论来求解模型组合和算力分布,确实是我这几年做过最值得的一步。它没有给我一个"排排坐分果果"的简单答案,但它把模糊的"哪个模型更强""哪里该花算力"变成了可计算、可比较、可复盘的问题。如果你也在搭智能体,我建议不要急着给每个模块上大模型,先花一两周把链路的信息流画像做出来,你可能会发现,真正缺算力的地方和你原先以为的完全不一样。