news 2026/10/20 14:49:41

用信息论重构智能体的模型组合与算力分布

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用信息论重构智能体的模型组合与算力分布

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% 的低熵样本也支付了高算力成本,边际收益很低。如果统一配置小模型,高熵样本又处理不好。动态路由的思路是:

  1. 训练一个轻量路由器,输入当前样本,输出一个复杂度分数。
  2. 复杂度分数低于阈值的样本,交给轻量模型处理。
  3. 复杂度分数高于阈值的样本,路由到重量模型。
  4. 定期用线上日志重新校准阈值,确保高低熵样本的比例与模型容量匹配。

这里有个细节:路由器本身也是一个模型,占用算力,也会出错。所以路由器的选型要尽可能轻,哪怕它偶尔把高熵样本错判成低熵样本,只要错误率控制在一定范围内,整体收益仍然可观。我在实践中发现,路由器只需要一个很小的分类模型,输入用 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.820.91
高熵子集准确率0.680.84
低熵子集准确率0.890.92

成本降了一大半,准确率不降反升。这本身就说明原来的算力分布严重错配:资源大量投在了低熵样本上,而真正需要更多互信息的复杂样本反而没有得到足够支持。

这个项目的最大教训是:不要默认"大模型 = 更好的模型",在具体链路上,如果任务互信息需求不高,大模型只是昂贵的装饰品。信息论给我们提供了一个判断框架,让"值不值得换"变成可以量化的问题。

6. 信息论不是银弹:四个容易误用的边界

6.1 互信息近似值不能当精确测量用

我在实践中虽然大量使用 logits 熵、嵌入距离这类代理指标,但要明确说一句:这些都不是真正的互信息。真正的互信息需要对联合分布做积分,而我们在系统中能拿到的只是有限样本。尤其当训练数据和线上分布漂移时,样本估算出来的熵会明显失真。

所以我把这些指标当成"排序工具"而不是"绝对标尺"。它们适合用来找出哪条链路最缺信息、哪个模型替换收益最大,但不适合用来声称某个模型的理论互信息是多少。如果团队里有人试图用这些近似值做精细的理论推导,我会及时叫停,直接用消融实验验证。

6.2 信息量大不等于业务重要

信息论视角容易带来一个误用:把互信息缺口最大的链路当成最值得投入的链路。但业务权重 w_i 才是决定优先级的关键。举个例子,一个偶尔出现的闲聊话题,输入熵极高,模型确实经常答得不好,但它在业务上的价值可能远低于一个"退货金额计算"链路,后者的输入熵虽然低,一旦出错就是真金白银的损失。

正确的做法是把 w_i 乘到互信息增量前面再排序,而不是只看 ΔI/ΔC。业务权重应该来自产品方和运营方,靠技术团队自己拍脑袋定权重,很容易把系统调得"看起来很聪明,但业务上不赚钱"。

6.3 静态熵覆盖不了时序和策略反馈

这套信息论框架比较适合单轮或短上下文的任务型智能体,一旦进入多轮对话、强化学习、长程规划,问题就复杂得多。因为信息的价值不只是当前这一轮减少不确定性,还在于它如何影响后续动作的选择。

多轮对话里的策略熵、奖励信号、状态价值都带有时间结构,静态的 I(X; Y) 无法完整刻画。我在做长程 Agent 时,会额外引入"决策信息增益"的概念:某个模型输出不仅要降低当前任务的不确定性,还要让下游策略能做出更优的动作选择。这种场景下,光靠输入熵路由就不够了,需要考虑历史状态的压缩和记忆机制。

6.4 数据标注偏差会污染一切测量

最后也是最重要的一点:整套测量都依赖验证集和反馈标注。如果标注本身有偏差,模型输出排序和互信息估算都会被带偏。最常见的问题是标注者只认"表面正确"的答案,而忽略了需要深层推理的正确解,导致模型在高熵样本上的真实能力被低估,最终我们可能把算力错误地分配到其他链路上。

我的建议是,在测量任务互信息缺口之前,先做一轮标注一致性分析,确认高熵样本的标注分歧率是否可控。如果标注分歧本身就很大,那就先解决标注标准问题,否则信息论框架给出的分配方案也只是在错误的地图上做规划。

回过头看,用信息论来求解模型组合和算力分布,确实是我这几年做过最值得的一步。它没有给我一个"排排坐分果果"的简单答案,但它把模糊的"哪个模型更强""哪里该花算力"变成了可计算、可比较、可复盘的问题。如果你也在搭智能体,我建议不要急着给每个模块上大模型,先花一两周把链路的信息流画像做出来,你可能会发现,真正缺算力的地方和你原先以为的完全不一样。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 14:49:16

mysql-connector-java与mysql-connector-j:MySQL JDBC驱动坐标迁移全解析

在Java后端开发的日常里,有一个特别有意思的现象:网上搜JDBC驱动的配置教程,有的写 mysql:mysql-connector-java ,有的写 com.mysql:mysql-connector-j ,两个看上去只差了一小截,但用错了就可能让Maven…

作者头像 李华
网站建设 2026/10/20 14:47:21

C++内存泄漏排查实战:用Valgrind Memcheck定位new与delete的失配问题

记得有一次,我接手了一个已经跑了两年多的后台服务,功能看着都正常,就是内存占用像温水煮青蛙一样,每天涨一点点,两周后稳稳触顶,然后 OOM 重启。查了一整天,valgrind也跑了,gdb也挂…

作者头像 李华
网站建设 2026/10/20 14:46:53

Codeblocks下载安装汉化全指南:从官网到中文界面避坑详解

折腾过 C 语言入门的朋友,大概率都绕不开 Codeblocks 这个名字。可很多人卡在了第一步:官网下载慢、装完发现没带编译器、汉化包找不到地方放。这篇教程就把 Codeblocks 下载、安装、汉化整条链路掰开揉碎讲清楚,从官网下载到界面变中文&…

作者头像 李华
网站建设 2026/10/20 14:46:44

广义正态分布优化算法GNDO详解:原理、Python实现与调参实战

你如果做过多目标优化、超参搜索或者路径规划这类工作,大概率绕不开“元启发式算法”。早几年大家最喜欢用粒子群和遗传算法,后来灰狼、鲸鱼、麻雀一个个出来,效果参差不齐。这里面有一个相对小众但设计很讨喜的算法,叫广义正态分…

作者头像 李华
网站建设 2026/10/20 14:46:27

RRT-Connect双树搜索MATLAB代码详解:从原理到实现

简介:面向机器人运动规划与路径规划研究者,这份资源提供了RRTConnect算法的完整MATLAB实现。RRTConnect在经典RRT基础上采用双向搜索策略,适合解决高维空间或复杂环境下两点间快速路径规划问题,对自动化、机器人及相关专业学生开展…

作者头像 李华
网站建设 2026/10/20 14:46:02

纯血鸿蒙+WebSocket:从零实现跨端实时聊天Demo

如果你手里正好有一台纯血鸿蒙设备,又需要一个"能立刻跑起来、而且能和 PC、其它手机互相收发消息"的聊天 Demo,这篇内容就是你照着做就能跑通的完整记录。所谓纯血鸿蒙,指的是不再兼容安卓 APK 的那一代系统,应用只能用…

作者头像 李华