1. 从“智能”这个词被用烂说起
这两年不管参加什么技术沙龙,十个人里有八个在聊智能体、聊大模型、聊具身智能。但如果你真的追问一句“你说的智能到底指什么”,场面往往会突然安静下来。有人说是参数量,有人说是推理能力,有人说是能调用工具,还有人干脆说“能通过图灵测试就算”。这些答案听起来都有道理,但放在一起就互相打架——一个能背下整本百科全书的系统,和一个能在陌生厨房里找到开瓶器、拧开一瓶酱菜的系统,哪个更“智能”?
我做了十多年一线项目,从早期的规则引擎、专家系统,到后来的深度学习落地,再到这两年折腾各种智能体框架,踩过的坑比读过的论文还多。越做越觉得,行业里对“智能”的定义跑偏了。大家习惯性地把“智能”等同于“在某个基准测试上得分高”,但基准测试是封闭的、静态的、有标准答案的。真实世界不是这样。真实世界是开放的、动态的、没有标准答案的,而且最要命的是——它一直在变。
所以当我看到“基于物理世界感官交互、自主学习、自适应与柔性遗忘的自生长智能”这个提法时,第一反应是:终于有人把话说清楚了。它不是在描述一个“训练好的模型”,而是在描述一个“活着的系统”。这两者的区别,就像标本和活物的区别。标本很完美,但它不会动;活物会动,会犯错,会忘记,会长大。
这篇文章我想聊的就是这条演化路径。不是空谈哲学,而是从工程实现的角度,把“感官交互”“自主学习”“自适应”“柔性遗忘”这四个词拆开,讲清楚它们各自意味着什么、为什么缺一不可、以及如果你真想动手做一个这样的系统,应该从哪里下手。适合谁看?适合那些已经不满足于“调个API做个问答机器人”的开发者,适合对智能体有更高期待的产品经理,也适合单纯好奇“机器到底能不能自己长大”的技术爱好者。我会尽量说人话,把复杂的东西用生活里的例子讲明白,同时给出可以直接抄作业的思路和参数。
2. 为什么“自生长”才是智能的唯一真实路径
2.1 静态训练出来的东西,本质上是个高级复读机
先泼一盆冷水。现在绝大多数所谓的智能系统,不管包装得多花哨,底层逻辑都是一样的:在一个固定的数据集上训练,然后部署上线,之后就不再变化(或者变化极小)。这个过程像什么呢?像把一个人关在屋子里,让他把图书馆的书全背下来,然后放出来回答问题。他确实能答对很多题,但他没有“生活过”。他没有闻过雨后的泥土味,没有因为踩到乐高而疼得跳脚,没有在跟人吵架后后悔自己说错了话。这些经历才是智能的原材料。
静态训练的系统有一个致命缺陷:它无法处理训练数据分布之外的情况。你可能会说,现在有持续学习、有在线学习啊。没错,但这些技术大多停留在论文里,真正落地的少之又少,原因很简单——灾难性遗忘。你让模型学新东西,它就把旧东西忘了。这就像一个人学了法语之后把中文忘了,听起来很荒谬,但这就是当前技术的真实状态。
所以“自生长”的核心诉求是:系统必须能够在运行过程中持续获取新信息、整合新信息,同时不丢掉已经掌握的有用能力。这不是一个锦上添花的功能,而是智能能否成立的前提。一个不会生长的系统,不管出厂时多强大,它的上限在出厂那一刻就已经锁死了。
2.2 物理世界是最好的老师,因为它从不撒谎
为什么强调“物理世界感官交互”?因为数字世界的信息是可以造假的,但物理世界不会。你在仿真环境里训练一个机械臂抓杯子,它可以抓一万次成功一万次,但一到真实世界,光照变了一下、杯子表面多了点水渍、桌子的摩擦系数跟仿真不一样,它就抓空了。这不是算法不够好,而是仿真环境永远无法完全复现真实世界的复杂性。
物理世界的交互有一个数字世界不具备的特性:它提供的是连续的、多模态的、带噪声的、不可逆的反馈。你推一个杯子,它会滑动,滑动的距离取决于桌面的材质、杯子的重量、你推的力度和角度。这些变量之间的关系不是离散的标签,而是连续的物理规律。一个系统如果只在数字世界里打转,它学到的永远是符号之间的统计关联,而不是因果。而因果理解,才是智能从“看起来聪明”跨越到“真的聪明”的关键一步。
我举个具体的例子。你教一个系统“杯子掉在地上会碎”,如果你只是给它看一万张碎杯子的图片,它学到的可能是“碎玻璃+地板=碎杯子”这种表面关联。但如果你让它自己拿一个杯子,松手,看它掉下去摔碎,它学到的是一条因果链:松手导致下落,下落导致撞击,撞击导致破裂。这条因果链可以被泛化到无数新场景——比如它以后看到鸡蛋,会知道松手也会碎;看到皮球,会知道松手不会碎。这种泛化能力,是纯数字训练给不了的。
2.3 自适应不是调参,是改变自己的行为模式
“自适应”这个词被用得太随意了。很多系统号称自适应,其实只是根据输入调整输出,比如推荐系统根据你的点击历史调整推荐内容。这顶多叫“响应”,不叫“自适应”。真正的自适应,是系统改变自己的内部结构或行为策略,以适应环境的变化。
打个比方。你刚到一个新城市,一开始你按地图导航走,这是“响应”。走了几个月之后,你脑子里形成了一张活地图,知道哪条路早高峰堵、哪条路晚上有夜市、下雨天哪个路口容易积水。你不再需要导航了,因为你的认知结构已经改变了。这才是自适应。
对智能系统来说,自适应意味着几件事:第一,它要能检测到环境变了(比如某个传感器的读数分布发生了漂移);第二,它要能判断这种变化是暂时的噪声还是持久的趋势;第三,它要能调整自己的策略来应对。这三步每一步都很难,尤其是第二步。很多系统一检测到异常就疯狂调整,结果把噪声当成了信号,越调越乱。这就像一个人偶尔失眠一天就觉得自己得了重病,开始吃各种药,反而把身体搞垮了。
2.4 柔性遗忘:不会忘,就不会学
这是最反直觉的一点。大家通常觉得,记得越多越好,遗忘是缺陷。但在自生长系统里,遗忘是一种能力,而且必须是“柔性”的。
什么叫柔性遗忘?不是简单地把旧数据删掉,而是根据信息的重要性、时效性、与当前任务的相关性,动态地调整不同记忆的权重。重要的、反复被验证的、与当前环境强相关的记忆,权重高;过时的、偶然的、与当前环境弱相关的记忆,权重低。权重低到一定程度,就自然“淡出”了。
这跟人脑的工作方式很像。你现在还记得三年前某天中午吃了什么吗?大概率不记得了。但如果那顿饭是你跟一个重要的人吃的,或者吃完之后发生了某件大事,你可能记得很清楚。人脑不是均匀地遗忘,而是有选择地遗忘。这种选择性,恰恰是智能的体现。
为什么不会遗忘的系统反而学不好?因为它的记忆容量是有限的(不管是物理存储还是模型的参数空间),如果所有信息都同等重要地塞进去,新信息就挤不进来,或者挤进来之后把旧信息覆盖得乱七八糟。这就是灾难性遗忘的根源。柔性遗忘要解决的,就是让新旧信息能够共存,让系统在保持核心能力的同时,不断吸收新东西。
3. 四个核心模块的工程化拆解
3.1 感官交互层:别一上来就搞视觉,先从触觉和力反馈开始
很多人一想到“物理世界感官交互”,第一反应就是上摄像头、做视觉识别。视觉确实重要,但视觉也是最容易作弊的——你可以在仿真里渲染出以假乱真的图像,但力反馈和触觉很难仿真。所以如果你真想做一个跟物理世界打交道的系统,我建议从触觉和力反馈入手。
具体来说,你需要一套能够实时采集力、力矩、位置、速度、加速度的传感器系统。采样率至少要到1kHz,因为很多物理交互的关键信息(比如碰撞的瞬间)发生在毫秒级别。低于这个采样率,你拿到的就是模糊的、丢失了关键细节的数据。
然后你需要一个能够施加力的执行器。这可以是机械臂、可以是振动马达、可以是任何能产生可控物理输出的装置。关键是要形成闭环:传感器采集状态,控制器计算输出,执行器施加动作,传感器再采集新状态。这个闭环的频率决定了系统的“反应速度”。对于精细操作(比如插拔连接器),闭环频率至少要500Hz;对于粗放操作(比如推箱子),100Hz就够了。
这里有一个很容易踩的坑:传感器噪声。真实世界的传感器没有一个是干净的。力传感器会有温漂,位置传感器会有量化误差,加速度计会有高频噪声。如果你直接把原始数据喂给决策模块,系统会疯掉。所以必须做滤波。我常用的方案是:对力信号用二阶低通滤波,截止频率设在50Hz左右;对位置信号用卡尔曼滤波,把速度和加速度也估计出来。滤波的参数需要根据你的具体硬件调,没有万能值。
注意:滤波会引入相位延迟。截止频率越低,延迟越大。对于需要快速响应的任务,这个延迟可能是致命的。我的经验是,先确定你的任务能容忍的最大延迟,然后反推截止频率。比如你的任务要求响应延迟不超过10ms,那截止频率就不能低于16Hz(经验公式:截止频率 ≈ 1/(2π×延迟))。
3.2 自主学习层:用“预测误差”驱动学习,而不是用标签
传统的监督学习需要标签,但物理世界里没有标签。你推一个杯子,没人告诉你“这一推是成功的”还是“失败的”。那系统怎么学?答案是:用预测误差。
原理很简单:系统内部有一个世界模型,它根据当前状态和动作,预测下一个状态。如果预测和实际观测不符,就产生预测误差。这个误差就是学习信号。系统通过调整世界模型的参数来减小误差,从而让自己对世界的理解更准确。
这个方法的好处是,它不需要外部奖励,也不需要人工标注。系统自己跟自己玩,自己给自己出题。比如它推了一下杯子,预测杯子会滑10厘米,结果滑了15厘米。误差是5厘米。它就调整模型,下次预测得更准。这个过程可以无限循环,而且随着模型越来越准,系统对物理规律的理解也越来越深。
但这里有一个关键问题:探索与利用的平衡。如果系统只做它已经预测得很准的动作,它就学不到新东西;如果它只做随机动作,它就学不到有用的东西。所以需要一个探索策略。我常用的方案是:以一定概率(比如10%)选择随机动作,其余时间选择预测误差最大的动作。预测误差大,说明这个区域系统的理解还不够,值得探索。这个策略在多个项目里实测有效,比纯随机探索的收敛速度快3到5倍。
还有一个细节:世界模型的结构。我建议用概率模型而不是确定性模型。因为物理世界是有噪声的,同样的动作不一定产生同样的结果。概率模型可以输出一个分布,而不是一个点估计。这样预测误差就可以用KL散度或者负对数似然来度量,比均方误差更合理。
3.3 自适应层:用“变化点检测”触发策略调整
自适应层的核心任务是检测环境变化,并决定是否调整策略。这里的关键技术是变化点检测。简单说,就是监控传感器数据的统计特性(均值、方差、分布形状),当这些特性发生显著变化时,判定为“变化点”。
常用的算法有CUSUM(累积和)和贝叶斯在线变化点检测。CUSUM适合检测均值漂移,计算量小,适合嵌入式部署。贝叶斯方法更灵活,可以检测分布形状的变化,但计算量大一些。我的建议是:如果算力有限,用CUSUM;如果算力充足,用贝叶斯方法。
检测到变化点之后,不能立刻调整策略。因为变化可能是暂时的(比如有人从传感器前面走过,遮挡了一下),也可能是持久的(比如换了工作环境)。所以需要一个确认机制:连续检测到N个变化点,或者变化持续超过T时间,才触发策略调整。N和T的取值取决于你的应用场景。对于快速变化的环境(比如自动驾驶),N可以取3,T取0.5秒;对于慢速变化的环境(比如室内服务机器人),N可以取10,T取30秒。
策略调整的方式有两种:一种是调整现有策略的参数(比如PID控制器的增益),另一种是切换到一个完全不同的策略。前者适合渐变型变化,后者适合突变型变化。判断依据是变化点检测输出的置信度:置信度低,说明变化不明显,微调参数就行;置信度高,说明变化剧烈,需要切换策略。
实操心得:我习惯在自适应层加一个“安全回退”机制。如果调整后的策略导致性能下降超过阈值(比如成功率下降20%),就自动回退到调整前的策略,并把这个变化点标记为“疑似噪声”。这个机制帮我避免了很多次因为误检变化点而导致的系统崩溃。
3.4 柔性遗忘层:用“重要性加权”代替“一刀切删除”
柔性遗忘的实现,核心是给每条记忆打一个“重要性分数”。这个分数是动态更新的,取决于三个因素:使用频率、预测贡献、时效性。
使用频率好理解:一条记忆被调用的次数越多,重要性越高。预测贡献是指:这条记忆对减少预测误差的贡献有多大。如果去掉这条记忆,预测误差显著增大,说明它很重要。时效性是指:这条记忆有多“新”。越新的记忆,重要性越高,但随时间衰减。
具体的计算公式可以这样设计:
importance = w1 * usage_count + w2 * prediction_contribution + w3 * exp(-age / tau)其中w1、w2、w3是权重,tau是时间衰减常数。w1和w2通常取0.3到0.4,w3取0.2到0.3。tau取决于你的应用场景:如果环境变化快,tau取小一点(比如1小时);如果环境稳定,tau取大一点(比如24小时)。
当记忆的总量超过容量上限时,就按重要性分数从低到高删除,直到总量降到上限的80%以下。留20%的余量是为了避免频繁触发删除操作。
这里有一个容易忽略的点:记忆的粒度。你不能把一整段经历当作一条记忆,那样太粗了;也不能把每一个传感器读数当作一条记忆,那样太细了。我建议的粒度是“事件”:一次完整的交互过程(比如从开始推杯子到杯子停下)算一个事件。每个事件包含状态序列、动作序列、预测误差序列。这样既保留了上下文,又不会太碎。
还有一个进阶技巧:记忆的“重组”。当系统学到新知识后,旧记忆可能需要重新解释。比如系统一开始以为“杯子掉下去会碎”,后来发现“塑料杯掉下去不会碎”。这时候,旧的“杯子掉下去会碎”的记忆不应该被删除,而应该被标记为“仅适用于易碎材质”。这种重组能力,是柔性遗忘的高级形态,也是自生长系统真正“活”起来的标志。
4. 从零搭建一个最小可行系统的完整流程
4.1 硬件选型:别追求高大上,够用就行
如果你想动手做一个原型,硬件不需要很贵。我的建议配置是:
- 一个六轴机械臂(比如国产的桌面级,几千块就能搞定)
- 一个六维力传感器(装在机械臂末端)
- 一个RGB-D摄像头(比如Intel RealSense系列)
- 一个计算平台(NVIDIA Jetson系列或者一台带GPU的工控机)
总预算控制在两万以内。别一上来就买几十万的设备,因为你大概率会把它弄坏。先用便宜的设备把流程跑通,再升级硬件。
机械臂的选择有一个关键指标:重复定位精度。这个指标决定了你的系统能不能做精细操作。对于抓取、放置这类任务,重复定位精度至少要达到±0.5mm。如果只是做推、拉这类粗放操作,±2mm就够了。
力传感器的量程要匹配你的任务。抓鸡蛋和搬砖头的力差了好几个数量级。我建议选量程可调的,或者至少选一个量程比你预期最大力大50%的。量程太小会饱和,量程太大分辨率不够。
4.2 软件架构:用ROS做骨架,但别被它绑死
ROS(Robot Operating System)是机器人领域的标准框架,但它不是操作系统,而是一套通信中间件和工具集。用它来做传感器数据的采集和分发很方便,但它的实时性一般,不适合做高频控制。我的做法是:用ROS做上层的数据管理和任务调度,用单独的实时线程做底层控制。
具体来说,底层控制线程跑在1kHz,直接读传感器、算控制量、写执行器,不经过ROS。上层用ROS的topic和service来管理世界模型、学习模块、遗忘模块。两者之间用一个共享内存或者无锁队列来通信。这样既保证了实时性,又利用了ROS的生态。
世界模型的实现,我推荐用PyTorch或者JAX。PyTorch的生态更成熟,调试工具多;JAX的性能更好,适合做大规模并行。如果你只是做原型,PyTorch就够了。模型结构可以用一个简单的循环神经网络(RNN)或者Transformer,输入是状态和动作,输出是下一个状态的分布。参数量不用太大,几百万就够了。物理世界的规律没有那么复杂,不需要几十亿参数。
4.3 训练循环:从“随机乱动”到“有目的探索”
系统刚启动的时候,世界模型是随机初始化的,预测误差很大。这时候系统基本上就是随机乱动。别慌,这是正常的。你需要让它跑一段时间,积累数据,更新模型。
我的经验是:前1000次交互,纯随机探索。这1000次交互大概需要几个小时(取决于每次交互的时长)。1000次之后,切换到“预测误差最大化”的探索策略。这时候系统开始有目的地去探索它不理解的地方。
训练循环的伪代码大概是这样:
for episode in range(num_episodes): state = env.reset() episode_data = [] for step in range(max_steps): if episode < 1000: action = random_action() else: action = select_action_by_prediction_error(state) next_state, reward = env.step(action) prediction = world_model.predict(state, action) prediction_error = compute_error(prediction, next_state) world_model.update(state, action, next_state) episode_data.append((state, action, next_state, prediction_error)) state = next_state memory.add(episode_data) if memory.size() > capacity: forget_module.prune(memory)这个循环跑起来之后,你会看到预测误差逐渐下降,系统的动作越来越有目的性。大概跑一万次交互之后,系统就能对基本的物理规律有不错的理解。
4.4 参数调优:哪些参数最关键,怎么调
整个系统里有几个参数对性能影响最大:
| 参数 | 作用 | 推荐范围 | 调整策略 |
|---|---|---|---|
| 学习率 | 世界模型更新步长 | 1e-4 到 1e-3 | 误差震荡就调小,收敛太慢就调大 |
| 探索率 | 随机动作的概率 | 0.05 到 0.2 | 环境复杂就调大,环境简单就调小 |
| 记忆容量 | 最多存多少事件 | 1000 到 10000 | 看存储和算力,越大越好但边际递减 |
| 遗忘阈值 | 重要性低于多少就删 | 0.1 到 0.3 | 遗忘太快就调低,记忆爆炸就调高 |
| 变化点灵敏度 | 检测变化的敏感度 | 3σ 到 5σ | 误报多就调高,漏报多就调低 |
调参的顺序建议是:先调学习率和探索率,让系统能稳定学习;再调记忆容量和遗忘阈值,让系统能持续学习;最后调变化点灵敏度,让系统能适应变化。别一上来就调所有参数,那样你根本不知道是哪个参数起了作用。
踩过的坑:我曾经把探索率设成0.5,结果系统一直在乱动,永远学不到有用的东西。后来降到0.1,效果立刻好了。探索率不是越高越好,太高了系统就变成随机数生成器了。
5. 实际运行中绕不开的那些坑
5.1 预测误差不下降,反而震荡
这是最常见的问题。原因通常有三个:学习率太大、模型容量不够、或者传感器噪声太大。
排查顺序:先把学习率降一个数量级,看误差是否稳定。如果稳定了但下降很慢,说明学习率太小,往上调一点。如果降了学习率还是震荡,检查模型容量。你可以试着增加一层或者增加隐藏单元数。如果还不行,那就是传感器噪声的问题。回到第3.1节,检查你的滤波参数。
有一个隐蔽的原因:数据归一化。不同传感器的量纲不一样,力是牛顿,位置是米,速度是米每秒。如果不做归一化,量纲大的信号会主导损失函数,量纲小的信号被忽略。我习惯把所有输入归一化到[-1, 1]或者标准正态分布。这个步骤看起来简单,但效果立竿见影。
5.2 系统学会了新任务,但旧任务全忘了
这是灾难性遗忘的典型表现。原因通常是记忆回放机制没做好。解决方法是:在训练新任务时,从记忆库里随机采样一些旧任务的数据,混合在一起训练。混合比例大概是新数据:旧数据 = 1:1 到 1:3。旧数据太少,遗忘严重;旧数据太多,新任务学得慢。
另一个技巧是弹性权重巩固(EWC)。它的核心思想是:对那些对旧任务重要的参数,在学新任务时限制它们的变化幅度。具体实现是给每个参数加一个约束项,约束的强度取决于该参数对旧任务的重要性(用Fisher信息矩阵衡量)。这个方法在多个项目里帮我减少了50%以上的遗忘。
5.3 变化点检测太敏感,系统一直在调整
这说明你的灵敏度设得太高了。把阈值从3σ调到4σ或者5σ。另外,加一个“冷却期”:检测到变化点后,至少等T时间才能检测下一个变化点。T可以设为你的任务周期的2到3倍。比如你的任务周期是10秒,冷却期就设20到30秒。
还有一个原因:传感器本身的漂移。有些传感器会随着温度变化慢慢漂移,这不是环境变化,是传感器的问题。解决方法是在变化点检测之前,先做漂移补偿。简单的方法是定期(比如每小时)重新校准传感器的零点。
5.4 记忆库增长太快,存储扛不住
这说明你的遗忘阈值太低了,或者记忆粒度太细了。先把遗忘阈值调高,从0.1调到0.2或者0.3。如果还不够,就调整记忆粒度:把多个小事件合并成一个大事件。比如把“推杯子-杯子滑动-杯子停下”合并成一个事件,而不是三个。
另外,你可以对记忆做压缩。比如用自编码器把高维的状态序列压缩成低维的嵌入向量,存储嵌入向量而不是原始数据。这样存储量可以减少一到两个数量级,代价是损失一些细节。对于长期记忆,这个代价是值得的。
5.5 系统在仿真里表现很好,一到真实世界就崩
这是sim-to-real gap,老生常谈的问题。根本原因是仿真无法完全复现真实世界的物理特性。缓解方法有几个:一是在仿真里加入域随机化,随机改变摩擦系数、质量、光照、噪声等参数,让模型学会忽略这些无关变量;二是在真实世界里做少量微调,用真实数据更新模型的后几层;三是用系统辨识的方法,先用真实数据估计物理参数,再把估计的参数填回仿真里。
我的经验是:域随机化最有效,但需要仔细设计随机化的范围。范围太小,模型学不到鲁棒性;范围太大,模型学不到有用的东西。我通常的做法是:先测量真实环境里各个参数的分布范围,然后在这个范围的基础上扩大20%到50%作为随机化范围。
6. 这套东西到底能用在哪些场景
6.1 家庭服务机器人
这是最直接的应用场景。家庭环境是高度非结构化的,每个家庭的布局、物品、生活习惯都不一样。一个预训练好的机器人到了新家庭,基本上什么都干不了。但如果它有自生长能力,它可以在新环境里自己探索、自己学习、自己适应。比如它一开始不知道你家的垃圾桶在哪里,但它可以通过观察你的行为(你每天什么时候、往哪个方向扔垃圾)来推断。这种能力,是静态系统给不了的。
6.2 工业质检
工业质检看起来是个结构化场景,但实际上变化很多。不同批次的原材料可能有细微差异,设备的磨损会导致产品特征漂移,环境温湿度也会影响检测结果。一个自生长的质检系统可以持续监控自己的预测误差,当误差增大时自动调整模型,而不需要人工重新标注数据、重新训练。这能大幅降低维护成本。
6.3 农业机器人
农业环境是典型的非结构化环境。光照变化剧烈,作物形态各异,土壤条件千差万别。一个在A农场训练好的采摘机器人,到了B农场可能完全不能用。自生长系统可以在新农场里快速适应,通过试错学会新的采摘策略。而且农业有季节性,系统需要记住去年的经验,同时适应今年的新情况。柔性遗忘在这里特别重要。
6.4 个人助理
这个可能有点反直觉,但个人助理其实也需要物理世界的交互能力。一个真正懂你的助理,应该能感知你的情绪(通过语音语调、面部表情)、理解你的习惯(通过你的行为模式)、适应你的变化(比如你换了工作、搬了家)。这些都需要感官交互、自主学习、自适应和柔性遗忘。纯文本的助理做不到这些。
7. 关于这条路的一些个人体会
我在这条路上走了大概三年,从最开始的天真乐观,到中间的反复怀疑,再到现在的谨慎乐观。有几个体会特别深。
第一,别指望一步到位。自生长系统不是设计出来的,是养出来的。你需要给它时间,让它慢慢长大。我见过太多项目,一开始就想做一个全能系统,结果什么都做不好。正确的做法是:先做一个能完成单一任务的最小系统,让它跑起来,然后慢慢加功能。
第二,物理世界的复杂性远超想象。你在仿真里调好的参数,到了真实世界可能完全不对。所以一定要尽早接触真实硬件,哪怕只是一个简单的传感器。真实数据里包含的信息,是任何仿真都给不了的。
第三,遗忘比记忆更难。设计一个能记住东西的系统不难,设计一个知道该忘什么、不该忘什么的系统很难。我花了最多时间的地方,就是在调遗忘策略。到现在也不敢说完全解决了,只能说在特定场景下够用。
第四,评估指标很重要。你不能只看任务成功率,还要看学习速度、遗忘率、适应时间、记忆效率。这些指标共同决定了系统是不是真的在“生长”。我习惯用一张雷达图来跟踪这些指标,每周更新一次,这样能直观地看到系统的变化趋势。
最后说一个我觉得最有意思的观察:当系统真的开始自生长之后,它的行为会变得不可预测。不是随机的那种不可预测,而是有创造性的不可预测。它会做出一些你没教过它的动作,而这些动作往往是解决当前问题的最优解。这种时刻,是我做这个方向最大的动力。它让你觉得,你面对的不是一个程序,而是一个正在成长的东西。