news 2026/8/30 7:23:10

执行噪声下的多智能体意图推断:分离Aleatoric与Epistemic Uncertainty

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
执行噪声下的多智能体意图推断:分离Aleatoric与Epistemic Uncertainty

做多智能体决策的时候,最麻烦的往往不是单个智能体怎么选动作,而是它能不能在别人的动作都不太可靠时,仍然判断出对方到底想干什么。这个方向有一个很具体的研究切口:Intention Inference Under Execution Noise,也就是“执行噪声下的意图推断”。核心要解决的问题很直接:智能体观察到的动作,并不是真实意图的完美表达,因为动作执行可能带上随机扰动。更关键的是,这类研究会把不确定性拆成 Aleatoric Uncertainty 和 Epistemic Uncertainty 两类,分开建模、分开算量,再决定怎么使用。这个拆法不是学术上的咬文嚼字,它直接决定了后续推断、决策和主动询问的策略。

如果你正在做机器人协作、自动驾驶决策、人机交互或者多智能体博弈相关的系统,而且发现“对方动作老是不稳定,导致意图判断总是出问题”,那么这个方向值得认真看一遍。下面我会按理解、建模、求解、决策、实验、排查的顺序拆开讲。

1. 先厘清:执行噪声为什么会让意图推断失效

1.1 社会困境里的意图推断是什么

社会困境可以简单理解成“个人利益和集体利益冲突”的决策场景。典型例子包括公共资源分配、囚徒困境、雪堆博弈、交通路口让行、多人协作搬运等。在这些场景里,每个智能体都有自己的目标,但最终结果取决于多方动作的相互作用。如果想做出对自己有利又不会破坏长期合作的决策,智能体就必须推断其他智能体的“意图”。

意图不等于动作。意图是潜在的、没有完全暴露的东西,比如“对方想合作”“对方想占便宜”“对方正在试探我”。动作是外部可观测的,比如“让出一条路”“直接冲过去”“先等待一秒”。

没有噪声时,动作和意图之间存在相对稳定的映射。比如在一个简单博弈里,选择合作动作大概率意味着合作意图。一旦引入执行噪声,这个映射就会被破坏。噪声不是对方“换了一个策略”,而是同一个策略在执行层被随机因素干扰。于是,一个本来想合作的智能体,可能因为控制误差、通信抖动、环境物理扰动,做出了一个看起来像背叛的动作。

1.2 “执行噪声”不等于随机策略

这里要区分两个概念。随机策略是智能体主动按概率选择动作,比如“有 30% 概率合作,70% 概率背叛”。这是策略层面的随机性,逻辑上符合某种最优权衡。执行噪声则发生在策略已经定下来之后。它相当于一个确定性策略被加了一层扰动:意图是“合作”,策略输出也是“合作”,但真正执行出来却是“背叛”。

放在控制论里看,这就像你给机器人下了一条“走到目标点”的指令,但轮子打滑、传感器误差、电机延迟导致实际轨迹偏离。在博弈论模型里,这种偏差通常不会被建模成策略的一部分,而是被当作干扰项。

如果把执行噪声误当成策略随机性,就会出现一个典型错误:推断器认为对方有很强的背叛倾向,从而自己也选择背叛,最后陷入“双方都把噪声当恶意”的恶性循环。所以第一步就是确认你遇到的噪声来源,是在策略层,还是在执行层。模型选错了,后面怎么调参都别扭。

1.3 一个具体场景:观察到的动作如何误导推断

假设两个无人车在窄路口相遇。A 车本来打算让行,但制动系统有轻微延迟,导致它比正常让行动作晚了一些。B 车观察到的结果是“A 车在路口犹豫,且没有及时让行”。如果 B 车只按动作推断意图,就会得到“A 车不合作”的结论,于是选择抢先通过。最终路口双方同时踩油门,造成死锁或危险。

在这个例子里,A 车的真实意图是让行,动作层面却表现为不让行。这个偏差不是策略随机性,而是执行噪声在时间和空间上的误差。如果系统能把“动作执行噪声估计”和“意图推断”分开建模,B 车就会多一个判断维度:A 车的动作虽然看起来像不让行,但它的噪声水平高,不能只凭这一次动作下结论。

理解了这一层,后面所有建模才有意义。

2. 分离两类不确定性:Aleatoric 和 Epistemic 分别是什么

2.1 Aleatoric Uncertainty:噪声本身带来的随机性

Aleatoric Uncertainty 通常被翻译成偶然不确定性或随机不确定性。它来自系统内在的随机性,比如执行噪声、传感器噪声、环境物理扰动。这类不确定性有一个特点:即便你拥有无限数据,也不能完全消除它。它不是因为你不知道才不确定,而是因为这个过程本身就是有随机性的。

举个例子。一个机械臂每次执行“拿起杯子”动作,末端位置都会有一个正态分布扰动,均值是目标位置,方差是 0.5 厘米。就算你采集了一百万次数据,下次执行时位置仍然会有差不多的方差。这个方差就是 Aleatoric Uncertainty。

在意图推断里,Aleatoric Uncertainty 表示“真实意图到动作映射”这一步被随机噪声污染的程度。它回答的问题是:给定我推断出的意图,观察到的动作和这个意图一致的可能性有多高。噪声方差越大,单次动作对意图推断的证据价值就越低。

2.2 Epistemic Uncertainty:模型不知道导致的低估

Epistemic Uncertainty 被称为认知不确定性。它来自模型知识的不足,比如训练数据太少、覆盖场景不够、分布外输入、参数还没有收敛。和数据无关的噪声不同,认知不确定性会随着数据增加而下降,也会随着模型结构改进而下降。

放在意图推断场景里,认知不确定性回答的问题是:我手里这些历史观测,真的足以区分“对方想合作”和“对方想背叛”吗?如果只见过五次合作,见过三次背叛,而且每次都混着大量执行噪声,那么模型对意图的把握就非常低。这种低不是“对方动作随机”,而是“我的证据不足”。

我见过很多初学者把两类不确定性混在一起,只输出一个置信度分数。这样做在单任务里可能还能用,但一旦遇到样本变化、环境迁移、连续决策,就会出问题。因为你无法判断置信度低是因为对方动作太随机,还是因为自己训练数据太少。两种不低原因对应的处理方式完全不同。

2.3 为什么分离比只算一个总不确定性更有用

只用一个总不确定性,决策层会非常被动。

  • 如果是 Aleatoric Uncertainty 高,说明执行噪声大。这个时候最好的策略是增加观测次数、降低对单次动作的信任、在动作空间上做平滑滤波。
  • 如果是 Epistemic Uncertainty 高,说明模型训练不足或场景没见过。这个时候最好的策略是主动收集数据、询问对方意图、提高探索率,或者暂时切换到保守策略。

如果把两类不确定性混在一起,系统会误以为“必须多观察才能确认对方意图”,但实际上问题可能只是执行噪声太大,观察再多也未必能提升多少。反过来,如果模型在某个新场景下数据很少,但单次动作看起来干净,总不确定性看着不高,系统就会过早信任一个证据不足的推断,最终产生误判。

所以,分离的意义不是“多算一个数”,而是给决策模块提供两种不同语义的信号。

不确定性类型来源随数据增加典型处理
Aleatoric执行噪声、传感器噪声、环境扰动不显著下降多次观测、滤波、降低单次动作权重
Epistemic数据不足、分布外输入、模型未收敛明显下降主动采集、查询、保守策略、增强探索

在实际系统里,我会建议至少同时输出两个值:一个表示动作层噪声方差,一个表示意图层认知不确定度。不要只给一个总分数。

3. 建模思路:从概率图到意图隐变量

3.1 把意图建模为隐变量

在概率图视角下,整个问题可以拆成三个核心部分:意图隐变量 z、策略输出 a_star、实际执行动作 a。很多研究假设策略输出 a_star 由意图 z 和当前观测决定,然后再从一个带噪声的分布中采样得到实际动作 a。

伪代码形式大概是这样的:

for each agent i: z_i ~ p(z_i | history) # 意图的先验 a_star_i = policy(z_i, s) # 策略层最优动作 a_i ~ N(a_star_i, sigma_noise) # 执行噪声引入扰动

这里的 sigma_noise 就是 Aleatoric Uncertainty 的体现。z_i 是否确定,则对应 Epistemic Uncertainty。如果 p(z_i | history) 后验分布很宽,说明模型对意图的认识还很模糊。

把意图当成隐变量,而不是直接用一个分类器输出结果,有两个好处。第一,隐变量可以表达“多峰意图”。比如对方可能是合作意图,也可能是试探意图,两者概率都高,并不是简单地取一个最大概率。第二,隐变量可以自然连接博弈论中的奖励结构,让推断出来的意图反过来用于决策。

3.2 动作生成过程的噪声项

真实系统里的执行噪声很少是简单的高斯白噪声。更常见的是:

  • 高斯噪声:执行值在目标值附近波动,方差固定。
  • 重尾噪声:偶尔出现大幅度偏离,比如通信丢包导致的动作失效。
  • 状态相关噪声:高速度或高负载时噪声明显变大。
  • 动作相关噪声:快速切换动作时误差更大。

建模时不能只看数据拟合,还要分析物理约束。比如在机器人场景里,加速度限制会使得动作变化不能太突兀,即使有噪声也会被平滑。在博弈场景里,某些动作有明确边界,噪声不会把“合作”变成完全相反的“背叛”,只会变成“延迟合作”或“不完整合作”。

因此在建模时,我要先定义执行噪声的支撑空间。如果真实系统中噪声不可能让动作完全反向,就不要在模型里允许这种极端情况。否则,推断器会把大量概率分配给“对抗意图”,导致误判。

3.3 联合建模社会困境中的奖励和约束

社会困境不能只推断意图,还要考虑奖励结构。如果你只做意图分类,不考虑对方意图如何影响你的收益,分离两类不确定性的价值会下降很多。

一个常见做法是把博弈的奖励矩阵嵌入概率图模型。比如:已知双方候选意图 z1 和 z2,通过奖励函数 R(a1, a2, z1, z2) 计算当前联合动作的期望收益,再根据期望收益选择动作。这里的 z 不单是“合作还是背叛”,还可以是“是否愿意长期协作”“是否在惩罚对方”等更细分的意图。

把奖励和意图联合建模之后,系统就能在决策时做反事实推理:如果我认为对方意图是合作,但我观察到动作像背叛,那么我应该如何调整自己的动作来最大化长期收益?这种情况下,执行噪声和认知不确定性会分别影响计划的不同部分。

4. 训练与求解:贝叶斯推断和变分近似的关键点

4.1 先验设计:不是随便选分布

贝叶斯方法需要先验。很多人会随手选一个简单分布,比如高斯或均匀分布,然后让模型自己学。这样往往会出现一个问题:先验太弱或太强,都会导致意图后验失真。

在意图推断里,先验通常来自两个地方:

  • 领域知识。比如在交通场景中,大多数司机都是合作的,恶意驾驶是少数。这个先验可以设置成“合作意图 0.8,对抗意图 0.2”。
  • 历史频率。如果系统已经运行了一段时间,可以把历史推断结果的频率作为先验。

更稳妥的做法是使用弱信息先验。它不会过度压制数据,但也不会让模型在零样本时做出离谱推断。比如可以设置一个 Beta(2, 2) 作为合作概率的先验,它既保留了不确定性,也避免了在数据很少时采用极端概率。

这里有个踩坑点:先验要放在意图隐变量上,而不是放在执行噪声上。噪声方差应该由执行层的物理误差模型决定,不能靠意图后验去猜。如果两者混在一起,就会出现“噪声很大时,模型把所有不确定性都归给意图”,让意图后验看起来特别不确定,但实际上噪声是已知的。

4.2 变分推断:用一个近似后验逼近真实后验

真实后验通常无法直接计算,因为意图隐变量和动作观测之间可能包含非线性映射、逐时刻依赖和奖励结构。常见做法是使用变分推断,用一组参数化的近似后验 q(z | history, action) 去逼近真实后验。

变分推断中需要关注三个关键量:

  • 重构误差:模型能不能根据采样出的意图重建出观测动作。
  • KL 散度:近似后验与先验的偏差。
  • 噪声方差:执行噪声的估计值。

优化目标一般可以用 ELBO 形式来理解,但实际使用中更常见的是把问题拆成两个阶段。第一阶段固定噪声方差,更新意图后验;第二阶段固定意图后验,更新噪声方差。交替迭代,和期望最大化很像。

如果模型不收敛,优先看 KL 散度和重构误差是否在交替下降。如果重构误差一直低但 KL 散度很大,说明模型在用复杂的后验去硬拟合噪声,这是过拟合信号。此时需要增大噪声方差,或者降低模型的表达能力。

4.3 在线更新:数据变多后如何减少认知不确定性

在博弈或协作环境中,数据是逐步到达的,不是一次性拿到全量训练集。所以推断模块不能只在离线阶段训练,还需要在线更新。

在线更新时,认知不确定性会因为数据增加而下降,这种变化要能在量化指标上体现出来。常见方法是用粒子滤波或在线变分推断。粒子滤波在意图空间较小时非常直观:维护一堆意图粒子,每观测到一个动作就按噪声分布重新加权,最后通过有效样本数衡量不确定性。

例如:

# 伪代码:粒子滤波式意图推断 particles = init_particles(prior) for each observation action: for particle in particles: weight *= likelihood(action | particle, noise_scale) normalize(weights) if effective_sample_size < threshold: resample(particles) epistemic_uncertainty = 1 - max(weights) # 低 max 意味着多峰或分散 aleatoric_uncertainty = estimate_noise(history, action)

这里的 epistemic_uncertainty 用“后验分布是否集中在某个意图上”来表示,aleatoric_uncertainty 则直接用执行噪声的方差估计。两者被分离开,互不干扰。

5. 决策中使用不确定性:保守策略、主动询问和退避机制

5.1 用认知不确定性决定要不要问

一旦分离出认知不确定性,就可以把它当成“是否主动获取额外信息”的触发器。如果模型对某个智能体的意图非常确定,就没有必要频繁询问或试探。如果认知不确定性很高,说明当前证据不足以支撑可靠推断,这时应该主动询问、采集更多样本,或降低对推断结果的信任。

在真实系统里,这个阈值怎么定?通常要看误判代价。比如在自动驾驶场景中,误把“让行意图”判断成“抢行意图”可能会造成碰撞。这种情况下,阈值应该设得很低:只要认知不确定性稍微偏高,就进入保守模式或主动通信。

我建议不要只看某一时刻的值,而是看连续一段时间内的变化趋势。如果认知不确定性一直高,可能是模型结构有问题,或者输入特征不够;如果只是偶尔高,可能是出现了分布外样本。

5.2 用随机不确定性决定要不要保守

Aleatoric Uncertainty 高的时候,问题不在于“我不知道对方想干嘛”,而在于“对方已经执行了某个动作,但这个动作不可靠”。此时即使你推断出了意图,也不能完全按这个意图做反应。

处理方式有几种:

  • 增加观察窗口。多等一个或几个时间步,减少单步噪声影响。
  • 动作平滑。在动作空间上做滤波,不让自己的决策被单次异常动作带偏。
  • 保守退避。选择对噪声鲁棒的动作,而不是最优但脆弱的动作。

比如路口场景中,如果检测到对方车辆的轨迹波动较大,即便模型推断其意图是直行,你也应该稍微减速或偏移,因为直行动作存在较大执行误差。

5.3 多智能体环境下的协调代价

不确定性分离在单个智能体里已经很有用,在多智能体系统里价值更大。因为每个智能体都有自己的执行噪声,各自也有独立的推断结果。如果两个智能体都采用“信任对方推断结果”的策略,噪声误差会被级联放大。

这时需要额外的协调机制。常见做法是让每个智能体把自己的“不确定性估计”作为通信内容之一。比如发送一个动作的同时,附带一个可靠性分数。这不是必须遵守的协议,但在实际工程里非常有效。它让其他智能体知道,这个动作值不值得被当作证据使用。

如果你设计的目标是让多个机器人协作完成一个任务,我建议在系统接口里预留两个字段:intent_distribution 和 noise_estimate。前者是意图后验,后者是执行噪声方差。两个字段分开传,下游决策模块才能分开处理。

6. 验证实验怎么设计:指标、基线和容易踩的坑

6.1 在模拟环境里构造可控噪声

要验证“分离执行噪声和认知不确定性”到底有没有用,最稳妥的方法是先做一个完全可控的模拟环境。你不能直接拿真实大规模数据来跑,因为真实数据里噪声来源混杂,很难评估分离效果。

模拟环境至少应该包含:

  • 一个真实的意图生成器,比如一组预定义的策略。
  • 一个策略层,负责根据意图输出理想动作。
  • 一个执行噪声层,负责产生有量级可控的扰动。
  • 一个观测层,只暴露带噪声的动作。

噪声不能只在训练时加,要在验证时也加,并且要能调节。比如设置三档噪声:低噪声 0.1、中噪声 0.5、高噪声 1.0。然后观察不同噪声水平下,意图推断的准确率如何变化。

如果模型真的分离了两类不确定性,那么在中高噪声下,Aleatoric Uncertainty 会明显上升,而 Epistemic Uncertainty 不一定同步上升。这是判断分离是否有效的第一道标准。

6.2 评价指标:意图识别准确率、后悔值、协作收益

评价指标不能只看准确率。准确率只能告诉你“模型判断对了没有”,不能告诉你“不确定性估计是否合理”。

我更推荐三个指标组合使用:

  • 意图识别准确率:基础指标,但要在不同噪声档位下分开看。
  • 后悔值或期望收益损失:把推断结果接入决策模块后,对比理想情况下的收益差。后悔值越低,说明推断结果越能支撑好决策。
  • 不确定性校准度:预测置信度与实际正确率是否一致。比如模型宣称 80% 置信时,实际正确率应该约为 80%。可以通过 reliability diagram 或 ECE 来看。

校准度是衡量不确定性估计的核心指标。如果只关心准确率,模型完全可以用过度自信的方式把分数拉高,但真实系统里这种过度自信会导致灾难。

6.3 基线对比不能只看最终奖励

做对比实验时,基线不能只选一个“不区分不确定性的普通网络”。至少要对比几种方案:

  • 不区分两类不确定性,只输出一个总置信度。
  • 区分两类不确定性,但决策时只用其中一个。
  • 区分两类不确定性,且决策时两个都用。
  • 拥有“上帝视角”的完美信息模型,作为上限参考。

需要注意,最终奖励差异不显著时,不代表方案不好。因为社会困境场景里,双方策略会互相影响,可能长期收益差异只在特定噪声区间明显。所以要做多轮随机种子实验,并重点观察中高噪声区域的稳定性。

我自己做这类实验时,习惯先固定噪声方差,调节数据量,看 Epistemic Uncertainty 是否随数据量增加而下降。然后固定数据量,调节噪声方差,看 Aleatoric Uncertainty 是否随噪声增加而上升。这套流程能快速判断模型有没有把两个不确定性学反。

7. 工程落地的几个排查方向

7.1 观察数据和动作噪声来源不一致

实际落地时,最常遇到的问题不是模型不 work,而是训练时使用的噪声模型和真实环境不一致。比如训练时假设噪声是高斯分布,但真实执行层有通信丢包,偶尔会完全丢弃某个动作。这种重尾事件会让噪声方差估计严重偏高,进而干扰意图推断。

排查顺序是:先记录真实执行动作和期望动作之间的误差分布,画出直方图。看是单峰对称,还是多峰、重尾。如果是重尾,需要改用 Student-t 分布或混合分布,不要硬套高斯。

7.2 后验不收敛或 collapse

变分推断里常见两种状态:后验坍缩和过度自信。

后验坍缩指近似后验越来越接近先验,模型不再从数据中学习。此时重构误差一直高,KL 散度几乎不变。常见原因是噪声方差被优化得太大,模型认为所有观测都是噪声,不值得更新意图。

解决方案是给噪声方差加上限,或者用先验约束它。过度自信则相反,模型把噪声方差估计得极小,导致每个动作都被当成强证据。这时即便意图推断错误,置信度也很高。可以通过噪声方差的统计量与物理模型对比来识别。

7.3 先验对结果影响过大

如果你发现系统刚开始运行时,推断结果完全跟着先验走,并且很长时间都拉不回来,说明数据置信度太低,或者似然函数不够敏感。此时需要检查似然函数是否真的把“动作-意图”关系表达清楚了。

如果先验设得太强,比如合作先验 0.9,那么即使观察到大量对抗动作,后验也可能仍然倾向合作。这种情况不是模型学不会,而是先验压过了数据。处理方式是使用弱信息先验,并逐步把先验权重调到数据能覆盖的水平。

7.4 日志和中间状态怎么沉淀

工程实践里,只输出最终意图和置信度是远远不够的。一定要把中间量记录下来:

  • 每个时刻的意图后验分布。
  • 噪声方差估计值。
  • 两类不确定性的数值。
  • 模型使用的先验参数。
  • 输入观测的原始动作和经过滤波后的动作。

这样做最大的好处是,当线上行为异常时,你能反推出是数据噪声变大,还是模型进入分布外状态,还是决策策略对不确定性响应过激。没有这些中间量,你只能看到“系统做出了一个奇怪动作”,但完全不知道是哪一段出了问题。

我个人的习惯是,先用小样本把完整链路跑通,录下每一层输出的数值分布,作为基准。之后每次改动模型参数,都和这条基准日志对比。这比只看最终指标要可靠得多。

如果你准备把这个思路落地到自己的系统里,我最大的建议是:先构造一个完全可控的噪声环境,把两个不确定性分别测一遍,再谈算法优化。很多问题不是模型不够强,而是噪声来源不确定、先验设得太随意,导致模型根本没有机会把两类不确定性看清楚。从一个小场景、一条干净日志、一次可控实验开始,是最稳妥的路径。

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

将LLM调用编译进传统数据管道:缓存、重试与确定性实践

这个标题看起来像是一个纯理论问题&#xff0c;但背后是一个非常现实的工程需求&#xff1a;团队已经有成熟的 Airflow、Spark、dbt 之类的数据管道&#xff0c;现在想在 ETL 里加一个“用 LLM 做文本分类、实体抽取、摘要、打标”的步骤。结果一接进去就发现问题&#xff1a;延…

作者头像 李华
网站建设 2026/8/30 7:21:57

影栈是一款在线抖音内容下载工具

一、产品概述影栈是一款在线抖音内容下载工具&#xff0c;用户无需安装任何软件&#xff0c;只需在网页端粘贴抖音链接&#xff0c;即可将公开视频、图文、合集等内容下载到本地。平台提供任务队列管理、实时进度追踪和多格式文件输出。图 1&#xff1a;影栈首页概览核心特性&a…

作者头像 李华
网站建设 2026/8/30 7:20:25

LSPIA曲面拟合:B样条渐进迭代逼近工程实践

简介&#xff1a;本资源是基于2014年CAD期刊论文《Progressive and iterative approximation for least squares B-spline curve and surface fitting》实现的LSPIA&#xff08;渐进迭代逼近&#xff09;算法完整MATLAB代码包&#xff0c;面向计算几何、CAD/CAM、逆向工程及图形…

作者头像 李华
网站建设 2026/8/30 7:16:21

Self-Guided Function Calling in Large Language Models via Stepwise Experience Recall

文章总结与翻译 一、文章主要内容 本文聚焦大型语言模型(LLMs)在多步骤工具调用中的挑战,提出了一种名为逐步经验召回(Stepwise ExperiencE Recall, SEER) 的自引导方法,旨在提升LLMs与外部系统交互时的工具选择、参数生成和工具链规划能力。 1. 研究背景 现有LLMs虽…

作者头像 李华
网站建设 2026/8/30 7:16:05

爱家房产V9.39商业版:一站式房产门户系统部署与运营实战指南

简介&#xff1a;这是一套面向房产中介公司、本地化房产平台及Web开发者的技术交付型PHP商业源码&#xff0c;专为快速搭建专业级二手房与新房门户网站而设计。资源完整包含PC端红色宽屏大气界面、全新触屏手机端、楼盘沙盘可视化模块及微信小程序对接能力&#xff0c;覆盖从房…

作者头像 李华
网站建设 2026/8/30 7:14:21

嵌入式中必会的Linux小操作(第二章)

给文件解压缩压缩&#xff1a;把多个文件、文件夹&#xff0c;或者单个大文件通过算法变小、打包成一个压缩包作用&#xff1a;1、文件体积变小、省存储空间2、多个文件合并成一个包&#xff0c;方便传输拷贝&#xff08;.zip .tar.gz .7z这些都是压缩包&#xff09;解压缩…

作者头像 李华