news 2026/9/3 20:02:04

任务条件Adapter:用一个小模块应对持续学习中的多任务挑战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
任务条件Adapter:用一个小模块应对持续学习中的多任务挑战

把 Adapter、Task-Conditioned、Continual Learning 这三个词拼在一起,初看是一串论文关键词;放到持续学习的研究语境里,它其实压在不少工程团队面前的一个共同问题上:当新任务源源不断到来,模型能不能不推倒重来,只增加一小块参数,就把所有旧任务和新任务都照顾到。我第一次看到 "One Adapter, Many Tasks: Task-Conditioned Feature Transformations for Continual Learning" 这个标题时,第一反应不是公式,而是想起软件里的“适配器模式”:调用方和具体实现之间夹一层接口适配,外部变化尽量被局部消化,而不是逼着所有上游模块跟着改。后来把标题拆开看,发现持续学习里的 adapter 也是类似的位置,但它不是在接口层中转调用,而是在特征层做条件变换。

先说明一个容易混淆的地方:Adapter 这个词在热门搜索里并不“学术”。有人搜无线网卡驱动,是为了解决网络识别不了;有人搜图像生成里的 IP-Adapter,是为了控制创作风格;有人搜蓝牙设备感叹号,是为了让外设恢复工作。同样一个词,在不同语境里指的东西完全不同。这种同名不同义,恰好是理解这篇论文的最大障碍:如果你用“硬件插头”或“图像风格插件”的思路去套,会很自然地把 task-conditioned adapter 理解成一个“万能转换头”——给不同任务分别转换输入。这样理解不算全错,但会漏掉它在持续学习中最本质的取舍:不是为了适配输入,而是为了在不覆盖旧知识的前提下,让同一个特征提取器学会多个任务的差异化表示。

1. 持续学习的真正痛点不是“记忆”,而是“更新的方式”

先聊要解决的问题。持续学习有一个非常反直觉的现象:你让模型按顺序学习 A、B、C 三个任务,如果用当前数据去微调同一个网络,通常会出现“学完 C,忘了 A”的结果。这不是模型训练不够认真,而是神经网络里的梯度更新存在相互覆盖:参数在 A 上学到的权重位置,常常也是 B、C 里需要改动的位置。当你用新任务的损失去更新这些共享参数时,旧任务积累下来的决策边界就被改写了。

1.1 灾难性遗忘的本质:共享参数上的梯度冲突

为什么会出现这种冲突?可以从分类边界角度理解:假设已经在一个任务上训练出一个由很多超平面分割好的特征空间。新任务又要求超平面发生偏移来适应新类别。如果这些变化发生在同一个特征表征上,新任务希望通过改变高维参数来压低损失,而这些改动恰恰会把过去已经贴合旧任务的决策面挤变形。于是,最好的不动点不是“旧任务准确率仍然很高”的点,而是“新任务取得高准确率”的新区域,两者在参数空间里通常不是一个位置。

从工程体感上看,这个问题往往比论文里说的更隐蔽。比如你已经用一批用户行为数据做过预训练,产品里效果不错。后来来了一个新需求,你用一个新模式在新数据上继续训练原来的模型,很快就发现旧场景的某些预测开始漂移。可能不是旧知识被完全清空,而是过去很稳定的边界出现了不可控的扰动。这种扰动刚开始不明显,等过了几个版本才被线上告警发现。持续学习研究要解决的,正是如何让这种“继续学习”变得更安全、更可控。

1.2 三条经典路线,以及各自的代价

目前处理灾难性遗忘,大致有三类路线,各有代价,但很多方案并不是互相排斥的。

第一类是数据回放,让模型在训练新任务时混入部分旧任务样本。它很直接,效果通常也不错,但在真实场景里,旧数据可能有隐私限制、存储开销、标注过期、数据分布变动,不一定能长期保留。

第二类是正则约束,比如对重要参数做较大惩罚,迫使新任务更新时不要过多改动对旧任务重要的权值。这个方法不需要保留太多旧数据,但怎么定义“重要参数”决定了效果上限;任务如果差异很大,正则常常压不住遗忘。

第三类是动态结构,每来一个新任务就扩展一部分网络结构,保留旧结构不动。该方案遗忘率通常很低,但代价是模型规模会随任务数持续膨胀,而且很多方法会引入越来越复杂的路由策略和部署成本。

下面这张表可以作为快速对照。它把动态扩展的思路再往前走了一小步:不扩展整层网络,只扩展一个低维条件变换。

方法核心思想主要代价适用体感
数据回放旧样本混入新训练数据可用性、存储、隐私旧数据能留存且分布稳定时最直接
正则约束对重要参数加约束任务差异大时遗忘压不住任务边界模糊,但希望统一模型的场景
动态结构每任务扩展新结构模型规模随任务线性膨胀任务数少、算力充足、对遗忘极致敏感
冻结主干 + 任务条件 Adapter共享表征 + 轻量条件变换依赖任务标识,仍需设计路由和消融有稳定主干且任务边界明确的持续服务

1.3 为什么“冻结主干 + 小模块更新”是一个值得优先考虑的方向

先把思考方式调转一下:不追求一套共享权重无限吸收知识,而是在训练新任务时,尽量不改动已经被验证的主干参数。把“知识迁移”的机会缩小到一层很窄的适配器里。就像接手一个新项目,不是把整个团队流程推翻重写,而是额外写一个小模块,输入先经过这个模块做转换,再进入原有流程。原有流程没变,新项目也被承接了。

这种做法的第一个优势是旧任务不会被直接破坏,因为主干权重几乎没有被优化器触碰;第二个优势是学习成本下降,因为你不需要为一个新任务重新训练整个网络的大部分参数;第三个优势是它给持续学习提供了一个更自然的“更新单位”:一套共享特征提取器 + 若干任务条件模块。每个任务需要新知识时,不必把旧知识抹去,只要在特征进入决策面之前做一次差异化加工。

这个判断听起来简单,但它解释了为什么近些年很多持续学习研究开始关注 adapter、LoRA、prefix tuning 这类参数高效微调手段:它们本质上都是“把学习限制在低维小模块里”的工程化思想。让模型继续学习的核心,不是单纯增加数据或计算量,而是改变模型更新的粒度和范围。

2. “一个 Adapter”如何承接多个任务?问题全在“条件”上

如果再回到那篇论文的标题,我建议把 "One Adapter, Many Tasks: Task-Conditioned Feature Transformations for Continual Learning" 拆成三个部分读:One Adapter、Many Tasks、Task-Conditioned Feature Transformations。这三个部分不是在罗列独立概念,而是在讲同一个设计:只用一套可复用的适配器参数,让不同任务通过条件信号改变它的输出行为。

2.1 也许不是一张任务存储卡,而是一套条件化处理器

很多第一次接触的人会把这个标题理解成:给每个任务训练一个独立 adapter,最后把它们全部存起来。这种看法并不正确。如果真是这样,它和动态结构方法就没有本质区别,只是把“扩展整层网络”换成“扩展一个小模块”。这里想表达的更可能是:Adapter 的核心参数是一份,但任务条件信号会决定它当前按哪种方式变换特征。听起来有点像把不同的命令注入同一个处理器,处理器本身不变,每次执行逻辑会根据命令切换。

一开始看这是有点反直觉的。我们往往认为模型要表达多个任务,就必然要为每个任务留出独立通道。如果只有一个通道,怎么避免多个任务的表示互相混合?关键就在于“任务条件”不是加在数据上的简单标签,而是参与特征变换的输入变量。Adapter 的输出不再只由特征决定,而由特征和任务条件共同决定。用更概括的话说,它希望学习一个函数 f(x, t),而不是一组 f_1(x)、f_2(x)、f_3(x)。

2.2 Task-Conditioned Feature Transformations 解决了什么问题

可以这样理解:假设主干网络已经能把一张图或一段文本映射成一个语义向量,这个向量对很多任务是相对通用的。但“通用”不等于在各个任务上都最优。当任务分布差异较大时,你可能还需要在通用特征上再做一次变换,把它变成更贴合当前任务的特征。这就像公共后端只提供最基础接口,不同业务方需要写一个轻量插件,把基础接口返回的内容改成自己需要的样子。业务参数不同,插件的行为就不同。

“特征变换”这层通常不会做得太复杂。常见的设计思路是:输入特征先经过一个瓶颈降维,做一层线性或非线性变换,再映射回原特征维度,再与原特征相加,或与门控机制做自适应加权。这种方式既保留了共享表征的大部分信息,又让任务条件有机会在局部空间里“拨动”表示。

“任务条件”如何注入,在不同实现里也有多种选择。可以用 task id 的 one-hot 向量,可以学一个低维 task embedding;可以拿条件向量作为 Adapter 内部线性层的 bias,也可以拿它生成一组缩放系数。还有一种更直观的做法是:同一个特征,不同任务条件对应不同的参数化变换,但这些变换共享同一个 Adapter 骨架。可以说,标题里最关键的词不是 Adapter,而是 Task-Conditioned。它决定了这套模块有能力在“资源最省”和“任务数量多”之间找到折中。

2.3 常见实现链路:看起来不复杂,但每个设计点都有取舍

按照常见的 task-conditioned adapter 思路,模型结构大致是这样的:

  • 共享主干:一个已经预训练的特征提取器,在前序任务上冻住或基本冻住。
  • 任务条件模块:把任务信息编码成向量,连同共享特征一起输入 Adapter。
  • Adapter 层:一个瓶颈结构,内部参数跨任务共享,任务条件通过缩放、平移或条件生成方式影响计算。
  • 输出部分:可以根据任务分头,也可以在同一个扩展分类头上做增量。具体取决于增量场景。

我在这里写一个只用于帮助理解的伪代码结构,并不是对某篇论文原实现的复刻:

class TaskConditionedAdapter(nn.Module): def __init__(self, feat_dim, bottleneck_dim, num_tasks): super().__init__() self.task_embedding = nn.Embedding(num_tasks, bottleneck_dim) self.down = nn.Linear(feat_dim, bottleneck_dim) self.up = nn.Linear(bottleneck_dim, feat_dim) self.act = nn.GELU() def forward(self, x, task_id): cond = self.task_embedding(task_id) # 条件向量 h = self.act(self.down(x)) h = h * cond.unsqueeze(1) # 条件缩放,一种示例写法 h = self.up(h) return x + h # 残差回到主干特征

这类结构里有几个值得注意的设计点。

条件注入的位置很重要。如果直接在特征维度上做整体缩放,任务条件改变的只是特征的“比例”;如果作为 bias 加在 down 或 up 层,它能平移特征;如果使用条件归一化,它会影响特征维度上的统计量。选择哪种注入方式,背后其实是对“任务差异应该体现在哪里”的判断。

Adapter 内部维度也很关键。设得太小,任务变换能力不足;设得太大,新任务学起来容易,但也可能逼近“每任务一套独立模型”的效果。可以把这层维度看成稳定性和可塑性之间的旋钮。调参时建议多做几档实验,而不是从一个先验值上直接定死。

3. 想把它用在自己的项目里,先确认三个问题

不少同学读完这类论文,很容易直接想去改代码。但这里更建议先不要进入具体模型,而是先确认三个问题:你的任务边界是否可得、你的主干能否冻结、你能否接受带路由或任务标识的部署结构。这些问题没想清楚,后面再精巧的 Adapter 设计也落不了地。

3.1 确认你的增量场景是 Task-IL、Class-IL 还是 Domain-IL

不同类型的持续学习,难度和对任务条件的依赖程度很不一样。

  • Task-IL:训练和测试都提供任务 ID。你只要区分任务 A 和任务 B 的数据,此时使用 task-conditioned adapter 非常自然,因为训练时有 ID,推理时也有 ID。
  • Class-IL:模型要不断看到新类别,但测试时不告诉一条样本来自哪个旧任务。这就难很多,因为你不能在推理时把输入送进“当前任务的那一个 Adapter”,否则如果测试数据来自旧任务,路由本身就会出错。
  • Domain-IL:类别体系不变,但数据分布域在变化。比如同一个分类任务,训练集从白天照片换到夜晚照片。任务条件如果捕捉到域信息,可以帮助模型在域之间切换。

一个简单判断表格如下:

场景是否需要任务 ID任务条件的可用性推荐程度
Task-IL训练和测试都给非常适合优先考虑
Class-IL推理时通常不给需要伪标签、子类路由等额外机制中等难度
Domain-IL域标签可能可得可以用,但边界要清晰视数据流而定

因此,看到 One Adapter, Many Tasks 这种设计,不要默认它可以在所有持续学习场景里通吃。它在 Task-IL 类评测上最容易取得干净结论;到了 Class-IL 或真实无边界数据流,真正的工作量很可能不在 Adapter 内部,而在“谁能判断当前数据应该用哪个任务条件”上。

3.2 主干到底冻结到什么程度

任务条件特征变换天然建立在“共享特征提取器已存在”这个前提上。这个主干可以是通用的预训练模型,也可以是此前多个任务已经形成的公共底座。你要问自己的是,这个底座能不能胜任新任务?

如果主干本身质量不够,只靠 Adapter 在顶层做变换,很难补齐底层能力的缺失。反之,如果主干已经足够通用,把它完全冻结也往往可行。实际操作里常见的情况是分层处理:浅层特征更通用,可以冻结;深层语义和具体任务绑定更紧,可以放开少量参数继续更新。但放开越多,遗忘风险越大,需要更谨慎地监控。

一个比较稳健的启动路径是:先冻结主干,只用新任务数据训练 Adapter 和任务条件模块。跑通后做一组对比实验,看放开最后一两层特征层是否对旧任务有明显伤害。如果提升很小,就继续冻结;如果提升很大,再判断是不是主干中间层已经不适合新任务。

3.3 你用传统评测基准,还是真实在线数据流

很多持续学习论文的评测协议是分好任务、按固定顺序训练,然后算平均准确率和平均遗忘率。这种评测干净、可复现,但它和一个真实增量系统最大的差异在于:真实数据流的任务边界经常模糊,甚至是未知的。用户行为在缓慢漂移,一个新的细分场景会突然出现,不同业务数据在时间上重叠,很难保证某一段时间只来一个任务。

如果只是做学术复现或研究调研,跟随论文评测协议没有问题。但如果是做业务原型,建议把“到底有没有清晰任务边界”放到最前面。如果没有,单纯依赖 task id 的 adapter 不够,必须额外加任务检测或边界发现模块,或者退一步,用回放库加正则约束来吸收分布变化。这个提醒看似基础,但往往是最容易被落到代码后忽略的。

4. 实际落地时会遇到哪些坑?

持续学习方案真正折磨人的地方,往往不是模型表达空间不够,而是流程里那些没说清楚的细节。从工程经验看,有几个坑值得单独列出来。

4.1 任务 ID 在部署阶段会变成“玄学”

训练的时候,task id 很自然,一个数据集一个编号。上线后才会发现,真实请求的数据流可能来自多个入口,很难给一条新样本标一个明确编号。一种办法是前面跑一个轻量分类器,判断它属于哪一段用户群体或哪一个业务域,再把结果作为条件。可这样一来,系统的误差就多了一层:任务分类错,整条推理就错。如果任务类别本身重叠,误差会一路传导。

因此落地前要明确,任务标识是外部直接给到的强信息,还是需要额外推断的弱信号。如果是后者,就必须把任务分类器的准确率指标单独拿出来监控,否则你很难判断最终持续学习效果变差,到底是因为 Adapter 不够强,还是任务路由已经错了。

4.2 Adapter 的结构和位置会显著影响后续表现

一个小 Adapter 层通常包括降维、非线性、升维与残差连接。降维后维度如果只在 16 到 64 之间,它更偏向低秩表达;如果设到 256 甚至更高,它已经接近一个小型全连接网络。自己复现的时候,不要默认一组 hidden size 可以通吃所有任务。

更重要的是,Adapter 插在哪里,直接决定条件变换能够影响哪一层表达。如果只插在最后一层以上,能做的只是把最后特征重新排列,容易流失中低层特征对任务差异的敏感度;如果深入多个 block 内部,训练成本会明显上升。实际工程里常见的选择是在最后几个 block 的输出处插入,因为那里特征已经高度语义化,任务差异容易被捕捉。如果任务变换主要来自领域风格差异,可以再早一层插入;如果主要来自类别语义差异,就不需要太早。

4.3 条件向量太强,可能让“一个 Adapter”名存实亡

如果用 task embedding 直接控制整个 Adapter 参数,那么每个任务都学会了完全不同的映射,最后甚至相当于每个任务维护独立小网络。存储规模同样会随任务数线性上涨。这种情况下,标题里“One Adapter”的承诺就没有太大意义。

建议持续观察参数量随任务数的增长曲线,并关注每多一个任务时表现提升是否明显。如果每增加一个任务,新增参数几乎等价于复制一份完整 Adapter,性能却没有明显改善,那就是条件表达太强了。可以尝试用更轻的注入方式,比如只对 bottleneck 中间特征做缩放或偏置,而不是直接生成大量参数。

4.4 “旧任务看起来没掉”不等于所有细节都没掉

持续学习判断里,平均准确率是一个常见指标,但它会掩盖很多问题。比如新任务 10 个类别学会了 9 个,旧任务 10 个类别掉了一个,平均下来可能变化不大,某些细分类却被明显劣化。因此,在评测时至少要把每个任务、甚至每个类别的准确率单独保留下来,不要只盯平均遗忘率。

另外,在线持续训练还需要做好数据和模型版本管理。如果同一个旧任务数据被无意中重复送到新任务里,模型可能通过“记住见过的东西”而不是“学到可迁移表示”来保住分数,这会让后续新任务更加脆弱。评估协议和回放库的使用方式,都应该写进实验日志。

5. 如果训练崩了,可以按这条链路排查

这类项目刚开始跑的时候,崩溃几乎是一定会发生的。现象通常可以归成几类:新任务不收敛;旧任务断崖式下跌;新旧任务都正常但某个类别明显变差;任务切换时结果震荡。遇到问题,不要急着调大 Adapter 维度,先按顺序排查。

5.1 第一层:数据流和任务标识是否真的对齐

先确认训练流里每个 batch 的 task id 是否真的对应数据来源。常见问题包括任务标签错位、数据文件混排、因为 shuffle 导致一个 batch 里混了多个任务而条件向量只取了一个固定值。这一步看似初级,实际很高发。尤其是从多个数据集目录循环读取时,如果忘记在每轮迭代切换 task id,条件模块可能从头到尾只见过同一个编号。

5.2 第二层:参数更新范围是不是超出了预期

检查优化器到底在更新哪些参数。最简单的做法是打印参数名,确认主干确实没有出现在可训练列表里。即使你设置了 requires_grad=False,也不能完全放心。某些归一化层在 train 模式下即使参数不更新,也会继续更新 running_mean 和 running_var。这些统计量同样会影响旧任务结果。持续学习的代码里,这种隐藏状态很让人头疼,需要单独确认需要关闭的层是不是真正关闭。

5.3 第三层:残差连接和初始化方式

如果 Adapter 的输出没有加回原特征,或者加错位置,就会在训练刚开始时直接破坏主干特征。比较稳妥的初始化方式是让 Adapter 最后一个线性层输出接近 0,这样初始阶段相当于直连主干。从这种状态开始训练,后续有没有破坏旧知识也会更容易分析。

5.4 第四层:条件信号有没有真正参与计算

如果 task embedding 维度过小、训练不足,或条件向量和特征计算的方式过于简单,模型可能很难区分任务。可以尝试把 task embedding 维度调高,或者在训练阶段给条件模块加一个辅助分类头,比如要求它从条件向量中预测任务 ID。这样做能让条件表达更快分化,便于确认问题是否出在条件信号太弱上。

5.5 第五层:评测口径是不是搞混了

最后要看评测协议。Task-IL 和 Class-IL 的协议很容易被混。Task-IL 下,测试时必须给 task id;Class-IL 下,测试时不应该把每个样本来自哪个旧任务告诉模型。如果消息传错,结果会虚高,并且论文之间也不可比较。拿到分数前,先检查评测代码里是否偷偷把任务 ID 喂进了 Adapter。

6. 把任务条件特征变换放进更大的背景看

这类研究表面上是在改进持续学习基准,但如果往长远看,它和参数高效微调、插件化模型服务、多场景机器学习都有同一个趋势:尽量保留一个稳定底座,用更小粒度的模块去适应变化。

6.1 它真正可能解决的问题,是模型更新时的“多租户”需求

假设团队已经训练好一个高成本的服务模型,不同客户或不同业务线后续需要不同的能力扩展。传统做法是为每个需求复制一个完整模型再微调,存储、算力和运维成本很快变成负担。用 task-conditioned adapter 的思路,可以把底座模型共享,按业务域或客户群挂上轻量特征变换层,推理时再按条件选择对应变换。

这种形态更像“给公共 API 加插件”,而不是重新部署一套服务。它尤其适合多任务底座已经稳定、后续需求以领域粒度不断增加的场景。可以把这种思路理解成把模型从“单体服务”逐步拆成“底座 + 插件”。

6.2 同时也要想清楚:什么时候不该用它

任何方法都有适用边界。如果任务数量很少,旧数据也可以保存,那直接数据回放往往更简单可靠。如果任务边界完全无法识别,任务检测也做不出来,依赖任务标识的方案就会失效。如果主干本身不够强,新任务和旧任务差异又极大,你可能需要在主干层次做结构改造,而不是只在顶层加一个小变换。

如果你的核心目标只是对存量数据做一次更充分的全量训练,而不是处理未来增量,离线重训当然是最稳妥的选择。它最擅长的地方,其实是“有一个稳定可泛化的共享主干;新需求以任务、领域或客户为单位分批到达;训练和推理阶段都能拿到较可靠的任务指示;并且不希望为每次增量创建完整模型副本”。

6.3 值得带走的判断

持续学习的难点从来不只在设计一个漂亮的 Adapter 层,而在知道什么时候该增补参数、什么时候该冻结旧知识、用什么条件把两者接起来。One Adapter, Many Tasks 这个标题真正的价值,是在提醒我们:环境不断变化时,与其每次给模型换一个身体,不如让它在同一个身体上学会按不同任务切换工作方式。这种从全量更新走向局部化、条件化更新的思路,才是它值得长期关注的原因。

如果你正面临增量学习需求,也先别急着把整套机制搬进系统。先从两个任务、一个冻结主干、一个小 Adapter 的最小实验开始,把每个任务的遗忘曲线画出来,再逐步加入任务条件。单次跑通只能说明流程没有断;真正需要投入的,是让这套适配框架在看不到尽头的任务流中依然稳定、可控、可解释。

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

IEEE33节点配电网Simulink模型搭建与仿真应用实践指南

简介:基于MATLAB Simulink的IEEE33节点配电网模型,是电力系统教学与科研中广泛采用的标准测试系统,尤其适合潮流计算分析、故障波形仿真以及分布式电源接入等研究方向。这套资源压缩包共包含45个文件,整体大小仅3.02MB&#xff0c…

作者头像 李华
网站建设 2026/9/3 19:59:50

中国水系及流域矢量数据获取与ArcMap实操全攻略

简介:中国水系及流域矢量数据是一份以2019年OpenStreetMap为基础的地理信息系统资源,采用SHP格式存储全国主要河流网络、水系中心线与流域边界,面向GIS开发、环境科研、水资源管理及城市规划等领域的从业者和学习者,尤其适合需要全…

作者头像 李华
网站建设 2026/9/3 19:58:44

从像素到字符:用Python实现皮卡丘终端动画与字符画

“去吧皮卡丘”不只是一句台词,也是很多程序员进入编程世界后,第一个想用代码“召唤”出来的角色。这篇文章会从字符画渲染、终端动画到工程化封装,带你完整跑通一个皮卡丘终端项目,顺便把图像处理、灰度映射、终端控制这些基本功…

作者头像 李华
网站建设 2026/9/3 19:51:09

真正的Skill:代码做决策,LLM只当工具

什么才是真正的 Skill? 目录 什么才是真正的 Skill? 一句话定义 核心区别:谁在做判断? 正确案例:代码报错自动修复 Skill 运行输出 逐点对照:这个案例里谁在做判断? 两种模式的本质区别 一、先看反面:这些都不是真正的 Skill ❌ 不是 Skill 之"工作流" ❌ 不…

作者头像 李华
网站建设 2026/9/3 19:50:33

向僵尸开炮辅助工具小橘子V4.783实测:安装、功能与使用心得

简介:面向《向僵尸开炮》玩家的辅助工具小橘子V4.783以zip包形式发布,大小80.22MB,共756个文件。包内除主程序exe外,还包含大量png界面素材、json配置、gft字体/图形资源、dll运行库、bin模型数据,以及两段avi操作演示…

作者头像 李华
网站建设 2026/9/3 19:45:11

地平线扭亏为盈背后:车规级AI芯片平台的技术体系与工程兑现

37.84 亿元,2026 年上半年归母净利润,同比扭亏为盈。看到这个数据的瞬间,很多人的第一反应是兴奋,第二反应则是怀疑:地平线机器人,这家从 AI 芯片一路做到智能驾驶计算平台的公司,真的开始规模化…

作者头像 李华