开发者分享用纯JS从零实现LLM系统的完整过程,包含架构和优化技巧。有教学价值,适合学习LLM原理的开发者。
有时候,最棒的项目源自一个简单的问题:“如果……会怎样?”
一天晚上,我翻看自己以前写的一些代码,其中有一个叫作 slmnet 的微型 JS 神经网络库,是我出于兴趣写的。一个念头突然冒了出来:如果不只是用它解决一些玩具问题,而是构建一个真正可交互的“生命体”,让它直接生活在浏览器里,并在其中不断学习,会怎么样?
于是,“Living Brain”项目诞生了。
目标:创建一个具备以下特性的聊天机器人:
我使用的工具包括:
我原以为这会很容易。事实证明,我错了。这个机器人经历了三个进化阶段,而每个阶段遇到的都是 AI 领域的经典问题。
第一个版本糟糕透顶。它只会记住最后一次教给它的答案,然后无论面对什么问题,都重复这个答案。无聊至极。
我解决了问题一,却又制造出了一个新问题。
机器人可以完美学会一条新知识,例如:
但在学习过程中,它会彻底忘掉之前掌握的一切,例如:
这是一个经典的 AI 问题:新知识会将旧知识完全覆盖。我实际上是在逼它临时抱佛脚,只为应付一道考试题,同时把它原有的记忆全部清空。
我教会了它如何避免忘记旧知识。但只要向词汇表中添加一个新单词,它的大脑,也就是神经网络架构,就必须重新构建。
我的代码会直接创建一个全新的空白大脑。尽管它会用所有旧样本重新训练,但由于权重是随机初始化的,它的“性格”会彻底改变。它可能开始用“See you later.”来回答“Hello”。
它毫无稳定性可言。
当我不再以程序员的方式思考,而是开始像一个……训练师那样思考时,解决方案出现了。
我不再让机器人死记硬背单条知识,而是创建了一个“记忆库”,保存过去的所有对话。
现在,每次训练时,机器人都会重新遍历自己的全部历史记录,在学习新知识的同时,缓慢调整权重并强化旧知识。
当新单词出现时,我不再“拆掉整栋房子”,而是实现了一次“大脑移植”:创建一个容量更大的新模型,再小心地将旧模型中的全部权重复制到新模型中。
这样一来,它的性格得以保留,同时也获得了容纳新知识的空间。
我的项目是一个“小型”语言模型,而不是 Large Language Model。
但你知道吗?这并不重要。
这个只花了一个晚上完成的项目,让我亲身经历了 AI 研究人员走过的同一段旅程:从最简单的错误开始,一路走到实现那些基础而重要的概念。而这一切,都发生在你的浏览器窗口中。
这是一段令人无比着迷的旅程。有时候,旧代码恰恰是孕育新想法的最佳试验场。
部分评论可能仅对已登录的访客可见。请登录以查看所有评论。
如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。