2025年
12月12日 | 过往三年之回顾
2022年底,ChatGPT的横空出世给我带来了巨大的震撼,让我想起了自己高中时玩机器人的经历,当时很多教授推荐我学人工智能,没想到短短十年不到的时间人工智能便发展到了如此惊人的地步。一个月只需要20美元,就能有一个全天候陪伴的私人大语言模型言传身教,对于学习基础类知识有着天然的优势。如果没有ChatGPT,我很难相信作为一个文科背景且没有任何数理基础的人,能如此之快地入门并感受到计算机、人工智能、强化学习等的惊人魅力。在ChatGPT的帮助下,我也省去了大量学习代码语法本身的时间,专注于知识概念本身,可以说没有ChatGPT就没有我的学习生涯,也就没有我的计算机科学硕士学位。不得不说,ChatGPT超过了我曾经所遇到过的几乎所有的老师,无论是它的耐心、积极乐观,还是渊博的学识,都让我找到了学习的乐趣——而这是我在前ChatGPT时代,从未感受到过的东西。
我感受到了时代巨浪,并坚信AI将彻底重塑人类社会和人类世界。在此之前,我的背景是管理学和经济学,并未学过专业的计算机知识。为了更早地进入人工智能学习之旅,我开始兼职当初中、高中、预科、本科学生的计算机课程教师,教授计算机基础知识。因为这个阶段的计算机课程并不难,我很快就备好课上了岗,并带出了一些成绩不错的学生。
2023年中,我最终下定决心返校进修学习AI相关知识。年底我申请了美国的一些项目。由于当时我最想做的是人工智能和机器人,所以我申请的大多是Robotics和ECE专业,CS并非主申的项目。然而最终我只拿到了数个CS项目的录取,并未拿到工科录取。不过后来的返校学习让我发现如今学校教育已经落伍,基本只能充当一个Syllabus的作用,最终大部分学习还是通过和AI工具聊天来逐步掌握的。
2024年夏末,我选择了给我奖学金最多的学校,踏上了返校的旅程。在头一年里,我先后学习了机器人、机器学习、强化学习、AI Agent、嵌入式开发等相关内容。经过一年的探索,我已经找到了自己的兴趣所在:人工智能在现实领域的应用,特别是机器人领域。
2025年秋天,我开始学习深度学习和计算机科学更多的基础知识,包括计算理论、算法、深度学习的底层原理(如Optimization, Transformer架构的细节)等。这段时间我对机器人有了新的认知,意识到机器人不一定非要是实物的——只要符合"感知、决策、行动"的就可以称为"Robot",而如果能加上"环境交互、反馈、记忆",那么就成了具身智能体。因而,我的重心从实物机器人转向具身智能体(Embodied AI)。
在过去的这个学期里,让我最意料之外的是计算理论课程的学习。我很庆幸自己最终选择了CS专业,因为未来的机器人的上限将严重局限于AI技术,甚至可以说各行各业的上限都将取决于AI技术的发展。而AI技术本质上,正是理论计算所构筑出来的。就像我刚刚学习的Minimax那样,一个简单的动态规划递归公式,就能构筑出一个会下井字棋的高手玩家。从ChatGPT到AlphaGo,所有的人工智能都是构建在计算大厦的基础上的。
这个学期结束后,我的返校旅程就剩下最后一个学期了。这一年多来的旅程获益匪浅,我想明年并非是我人工智能学习之旅的结束:在我两年的硕士学习后,毕业只会是我人工智能学习的开始。我想所有的计算机科学家,都有一个共同的目标:打造出最终的终极计算机器,也就是通用人工智能体。现在,我们离该目标依然很远。
最后,谈一下我在一年多的学习后对人工智能的看法。毫无疑问,联结主义是当下人工智能的集大成者,最晚在2024年,我们已经能够看到ChatGPT、Gemini等优秀的大模型已经能够完美地通过图灵测试。这是计算机科学发展史乃至人类历史的里程碑。从图灵机到能够通过图灵测试的机器,我们用了不到一百年的时间,这种进步让我相信在我的有生之年,我可以亲眼见证通用人工智能的诞生。那将是人类历史乃至人类文明的分界点。在那之后,人类文明将进入一个崭新的时代。
然而,同样毫无疑问的是,当前人类的社会结构还没有准备好迎接这一洪水猛兽。AGI将构造出一个终极的生产军队,然而我们人类还处在非常原始的私有制、按股权分配的阶段。于当下的发达国家,人力成本高昂,勉强维持了大多数人类的体面。而发展中国家,廉价的劳动力,则成为国家发展的动力。然而,AGI和自动化机器将毁灭这一平衡:拥有AI产权的组织,将拥有前所未有的生产力,姑且将这些人称为拥有者。在未来,拥有阶级和非拥有阶级的财富和权力差距,将远大于今天资产阶级和无产阶级的差距。非拥有阶级甚至将失去全部的价值,变成拥有阶级想要铲除的对象。
为什么这么说呢?因为当非拥有阶级不再具备劳动价值时,他们依然占据着大片的土地生活着。然而,拥有阶级通过AI和机器人就可以完成矿物资源的汲取和加工制造,生产出必需品,那么他们将毫无疑问地希望获取更多的土地来充实自己的生活。而机器人军队拥有不吃不喝、不休息不反抗的强大能力,更让拥有阶级无所畏惧。他们会变得和纳粹一样,肆意处置非拥有阶级。如果高兴了,就让非拥有阶级变成自己的宠物,赏饭吃,像饲养猫狗那样;如果不高兴了,就驱逐、消灭、毁坏。所有的决策都掌握在拥有阶层手里,非拥有阶层将变得毫无缚鸡之力。
在过去的一年多里,现实已经在不断上演这样的戏码:AI公司招聘标注员来让AI系统进化,然后系统完善后就裁掉这些标注员。AI不用于以往的任何科技革命,其目的就在于替代,而非增强。马车夫可以在蒸汽时代开汽车,然而程序员在AI时代只能被替代。对于大多数人,也就是非拥有者们,我希望看到他们不惜一切代价来反对AI的发展。是的,虽然我自己喜欢AI,但是我希望有更多的人能意识到AI的危害,而站出来反对AI。只有当AI和政府一样,变成一种公共设施,人类才能勉强做好迎接AGI的准备。只要AI在少数人手中掌握,那么我上面诉说的非拥有阶层变成猫狗的未来将不可避免地到来。
每一次变革,都有受益者和受害者。AI的变革是史无前例的极少数人受益、绝大多数人类受害的一场革命。如果说这是天意,希望大多数人类被消灭掉,从历史长河的角度来看也不过是一种大自然的自我调节。然而,对于每一个活着的人,每一个鲜活的生命体,我们都应当想尽一切办法增加受益者、减少受害者。我们应当更多关注与现有AI技术可以解决的领域,优化社会劳动模式,优化资源调度效率,从而实现社会财富的进一步增长。理想的科技革命应当带动社会总财富的增加、分配制度改革、文明的进步,因此仅仅发展人工智能技术是不够的,我们还要关注AI伦理、AI时代的公平、post-scarcity时代的财富分配问题等。我想,没有多少人希望自己是未来的那只等着主人赏饭吃的哈巴狗。唯有改变社会制度本身,方能迎接新时代的到来。
11月18日 | Virtual Embodied Agent
大概三个月前,我给自己定了三个课题:
- 人形机器人、家用机器人——对应我现在正在做的扫地机器人学习项目、智能翻译手套项目等
- 虚拟世界、游戏NPC——对应我现在正在做的ALICE Project
- 金融市场的AI Agent——对应我现在正在做的Financial AI Agent Project
如今这三个课题全都指向了一个方向:Virtual Embodied Agent。
人形机器人的核心在于具身智能,而具身智能本身并非必须要在物理世界才能去执行的。在过去我一直盯着实体机器人,但最近才茅塞顿开,想起了小时候最爱看的一个日本动画片:数码宝贝。人们从未停止过对虚拟世界的幻想,而现在正是这个方向最值得投入的时候。
虚拟世界、游戏NPC就不必多说了,其本身就是VEA的核心议题。
而金融市场的AI Agent,以及我早期对Financial Domain的探索,如今也转向财税领域,并且最终的方向如今也逐渐清晰起来:一个和人类一样,能够理解公司财务状况,调整double entries,进行税务调整的“智能体”。该智能体的关键在于智能,在于交互,而非在于自动化。
在过去的一个月里,我已经初步确认了以下结论:
接下来,AI将主要替代需要人类思考的工作,而非需要人类体力劳动的工作。换言之,白领岗位将面临巨大的萎缩,而体力劳动者则暂时安全。
如果一些人还认为AI能做的是“自动化任务”,那么他将面临巨大的危险。我们终将进入一个疯狂的时代……我想起数年前中国围棋手柯洁的一个直播视频,在直播中,柯洁面部扭曲,质问道:如果AI能下围棋,那么人类下围棋的智慧体现在哪里?……越来越多的人将意识到,自己的工作不再是“有价值的”,越来越多的人将陷入前所未有的精神危机。虚无主义和存在主义都将迎来巨大的复兴。
11月2日 | 再谈“感知、规划、行动”
最近我和多位财务工作者、业务方沟通后,思考了不同的可能性,并在技术路线选择上,着重关注GUI based路线,而非DOM based或基于API的方式。我的目标是做出一个虚拟的会计,这位虚拟会计本身是能够通过感知来规划,通过规划来行动的,而无需一位真实的会计去一起行动。因此,机器人中的“感知、规划、行动”能力在虚拟会计的设计中就变得尤为重要了——这是未来的方向。
前日我和一位在国内做了十年财务自动化的人交流后,发现人们对AI的认知还是停留在自动化的阶段,而没有理解AI未来的一个角色。AI进入到我们的现实生活中,绝对不是来帮助我们完成任务的。所有科学家的目的,制造AI的目的,都绝对不是制造出一个能完成给予任务的自动化机器。AI最终的形态,一定是可以和现实进行交互,理解任务,并执行任务的。放到财务领域上来说,一个财务AI,其最终的形态将是完全代替一个真实的人类财务,而非帮助人类财务来完成工作。
这一点在编程领域已经初见端倪。如今已经有一些公司在引入AI程序员,来替代初级程序员的岗位。由于编程任务是当下AI最擅长的一项工作内容,因此虚拟程序员一定是所有AI角色中第一个出现的。其实我最近在使用cursor的过程中,已经发现cursor能完成很多真人程序员的工作:它能够感知我的需求,规划完成任务所需的步骤,并最终通过行动(包括编写代码、编写测试自测、运行看结果来debug等)来完成任务。
由于AI需要成本,因此最近沟通下来发现中国或许不是一个非常好的AI agent应用环境。如果在中国一个代记账的会计愿意一个月200块钱帮你完成所有的代记账、报税工作,那么现阶段的AI讲没有任何优势。更进一步地讲,AI无论是去做自动化任务(提升人效),还是去做完整的任务(虚拟的员工),其本质都是在节省人力成本。中国当下人力成本,特别是财税领域的人力成本,已经一降再降,降到了令人难以置信的地步。此时就算我一下子做出了低成本的AI,让数量如此之多的人们一下子失去本就微薄的收入,我觉得并不是一件具有巨大社会意义和价值的事情。所以在这个背景下,我也对我的三大目标(按照阶段性顺序)进行了调整:
- 一号问题:设计开发出财税机器人(能够自主完成感知、决策、行动的虚拟机器人)
- 二号问题:通用的虚拟机器人
- 三号问题:通用的实体机器人
当下的第一步:财税机器人,是检验专业领域机器人能力的一个非常好的标尺。
10月24日 | 重新构建系统
今天和一位业界做AI Agent的朋友深入沟通了一下,决定推翻现在的整体系统框架,再次重新构建系统。在此之前,我已经构建了三个草稿版本:
- 第一个是今年4-5月,以OpenManus为基础的版本
- 第二个是上周构建的版本
- 第三个是这周构建的版本
以上三个版本都存在巨大的系统问题。之前我也没构建过系统,所以有很多错误的思路。在上面三次尝试之下,现在我大致上有了一个思维框架,然后准备以美国的服务器作为MVP产品的发布平台,这样可以快捷开发,而无需考虑更多的问题。当有一个问题,你觉得逻辑上没有问题的时候,无论如何你都找不到逻辑上的问题的时候,如果你不去尝试、不去做,那么你将会后悔。如果你做了,没做成,那么你不会后悔。做不成是能力问题,做不做是态度问题。
我想给自己写一首诗,作为这场长征之役的开始:
我听到了悦耳的钟声,不知其从何而来;
我穿过密林,越过险阻,看到了一个巨大的黄金钟;
我在黄金钟前驻足深思,明白我将衣食无忧;
但是如何将这个黄金钟搬走呢?
10月18日 | 聚焦产品,屏蔽噪音
今天去参加了一个“投资人”举办的“创业交流活动”,突然发现所谓的“投资人”根本就没有什么实绩,全部都是假大空;这位“投资人”既不懂市场,也不懂技术,只知道哈佛和MIT的名号,开口新时代,闭口新风口。我带着严肃的话题来参加,讲了也就两分钟就被请下了台,这一刻我立马洞悉出了这群人的本质:他们看起来就像是找不到工作、不会创业、缺乏能力,于是就追着热点做一些不着边际的项目,用包装和谎言来掩盖自己内心的空洞的人。参加这样的活动除了浪费时间外,很难有任何实质性的收获,反倒是会被灌入大量的垃圾信息和无用噪音。
总结一下如何筛选活动:看活动有没有门槛,没有门槛的谨慎对待;看投资人和创业者讲话有没有背板,背板的大概率没干货;看履历有没有细节,没有细节的必然是什么都没有只剩下包装;看是不是追热点,无脑追热点的缺乏思考能力;看眼中注视着什么,注视着名校、豪宅、造富神话的,基本都是智力低下、缺乏认知能力的表现。我以前没有接触过这些所谓的创投人士,以为是一群想改变社会的精英,不料尽是一群骗吃骗喝、title包装、滥竽充数的混子。不过我还是那句话:找不到志同道合的人的时候,就自己做。做着做着,那些和我有着同样洞察力、野心、大格局的人自然而然回被我吸引过来。
最近的事情让我突然意识到,一场巨大的变革就在眼前,而这次我不再是读书、看新闻的人,反倒是变成了那个被席卷在变革中央的人。一场巨大的风暴即将来袭,数百万家公司、数千万相关从业者,都将置身于这场风暴当中……在时代变更过程中,个人是那么地渺小,个人的力量又是那么地微不足道。想要唤起这场风暴,只凭借我一个人的力量是不够的,我现在就是路飞,要组织一个群英汇聚的海盗船,然后登上世界之巅。(准确来说,是出海前的路飞,当务之急是磨炼内功;一旦时机成熟,便扬帆启程!)
10月13日 | 项目导向学习法
不知不觉25年就只剩下2个月了。最近我重新整理了一下学习计划和项目,对于AI时代的学习方式有了新的认知。在过去,人们学习东西总是需要先学基础知识,然后一点一点往上学。然而我没有那么多的时间,于是在AI的帮助下,我现在逐步开始采用一种多点同步推进的学习方式:学习线性代数的同时学习机器人运动学,学习IK的同时学习机器学习,学习机器学习的同时学习深度学习,学习深度学习的同时学习强化学习,学习强化学习的同时学习机器人学习,学习机器人学习的同时做机器人项目。这是什么意思呢?其实就是项目导向的学习方式:我先立一个项目目标,然后在完成这个项目的路径上把相关必要知识学掉。简单来说就是边做边学,边学边做。所有的学习课题都变成open开放课题,没有任何一个学科是学期制的,而是转为终身制的。当我的项目涉及到更多的深度学习优化知识时,我就回到深度学习优化这里再多学一点。
10月10日 | 什么动物算是具有智慧的?
今天学习了图灵机的部分,大受震撼。图灵机解决了可计算性问题,那么能否提出一个测验可否体现智慧的图灵机?我想人们对此的了解还甚少。回答这个问题前,或许要回答这么一个问题:什么动物算是具有智慧的?
10月3日 | 一个令我耳目一新的艺术作品
之前我和我的老朋友探讨了诸多让机器人登上舞台的思路,但是今天这个艺术作品让我们都彻底地抛弃了过去的想法。当我们想到让机器人登上舞台的时候,我们第一个反应就是让机器人去做一些表演,比如春晚的丢手绢等。但是下面这个作品,让机器人做了一件在展出中几乎只能由机器人来完成的动作:

这个艺术让我和老朋友探讨了很久,我们一致认为这个思路是正确的,而之前的思路是片面的。为什么这么说呢?因为这个被束缚的机器狗,这个表演是很难由人来完成的。你不能让一个人在那里被束缚着,然后待一天吧?上面我放出的是一张图片,如果是现场看的话,能看到机器狗是想逃离,但是一直被锁链拉着的。这个表演在AI的加持下,和过去的机械装置有着极大的不同:机械狗在逃离动作上展现出了非常积极的一面,它活灵活现,就好像一只真的狗。
在AI和机器人即将到来的时代,我们在面对这个全新的世界时,是否也总是用过去的固有思路来对待这些新的产品呢?就好比传统手机有12个按键,所以一开始智能手机也有12个按键,或者说更智能的:有一个小键盘的全按键。然而当苹果公司展示他们那个灵活的键盘的时候,所有人的大脑都像是宕机了一样,被这种崭新的设计彻底迷倒。在机器人方向上,我们可能也有太多的思维惯性,觉得机器人就是代替人去做一些事情。然而,机器人作为一种全新的产品,它的意义绝对不是代替人类做一些事情,它一定可以用来做那些人做不了的事情,因而就不是代替关系,而是扩展关系了。
9月24日 | 补一下基本功
这两天看了看国内的岗位以及面经,考察点包括数学、机器学习原理、强化学习训练、算法数据结构等,覆盖面很广,考察范围也很大,难度很高,但是岗位也非常多。我是不喜欢学数学、机器学习原理这些东西的,想做产品、商务BD之类的,但是岗位比较少。对我来说入行是第一件事,怎么入其实并不重要,因为最后我肯定不是做技术的。我的目标很清晰,先入行,熟悉行业后慢慢组建自己的团队,然后根据洞察逐步建立自己的商业逻辑。为了更顺利地入行,我决定吃点苦,把我一直讨厌的数学基础、机器学习底层数学原理等补一补。这些基本功今天补了,后面将会收益许久。
9月21日 | 关于机器人
虽然眼下人形机器人行业爆火,国内的各大公司都在招聘人形机器人、具身智能等岗位,但透过现象看本质,这一轮繁荣背后是国家扶持和资本涌入所造成的“溢出效应”。按照现在人形机器人的水平,既无法替代工厂里的专业化机器人,也无法真正走进家庭、走进社会基建。换句话说,大部分公司虽然拿到了资金,但缺乏清晰的商业化路径。在这样的情况下,多数项目终将失败,少数幸存者才能在寒冬中沉淀出真正的价值。
对我来说,我更希望行业的泡沫尽快破裂,让投机者退出。我想做的是长期耕耘,而不是短期逐利。我不喜欢臃肿和拥挤,我喜欢干净、舒适的环境。
从 2023 年的“重返十八岁计划”决定投身于自己喜欢的领域,到 2024 年赴美学习计算机和机器人,再到 2025 年决定全力投入机器人行业,我选择的是一条长期的道路。对我来说,现在最重要的不是高薪、股权或快速发展,而是沉淀。中国的企业环境往往浮躁,来得快去得也快,这一波浪潮注定要褪去——因为机器人距离真正进入家庭和社会生活还太遥远。
类比 AI 的发展,从 2012 年的 AlexNet,到 2017 年的 Transformer,再到 2022 年的 ChatGPT,整整十年才磨出一个真正商业化的产品。机器人行业的节奏只会更慢。2012 年波士顿动力的惊艳展示,到今天已经过去 13 年,依然没有出现类似 Transformer 那样的跨时代架构。
目前来看,世界模型(World Model)最有可能成为机器人领域的类 Transformer 技术。传统的 AI Planning 作为独立范式已显得过时,未来一定是规划与学习的统一;RAG 并不是大模型的最终形态,但在短期内仍是关键的工程手段。当下的迁移学习、模仿学习、单任务深度强化学习,正如 Sutton 所言,是“错误的道路”——行业仍在这些路上消耗资源,而我坚信,真正的未来必然属于统一的范式。
一个月前,我给自己定了三个项目方向,分别是机器人、虚拟世界、AI Agent;现在我已经决定走机器人的路线,AI Agent和金融相关的内容我就不继续做了。虽然我拿过一个经济学硕士学位,但那都是沉没成本,关键是未来我要做什么、我想做什么、我愿意为做什么而付出。而机器人和虚拟世界中,我现在优先选择机器人继续做,然后虚拟世界也持续关注——机器人的巨大突破大概率还是在虚拟世界中产生。
9月15日 | RAG和外置记忆库不是未来
这两天我开始学习深度学习,明白了神经网络本身其实就是一个输入向量、复合函数以及输出向量组成的一个函数系统。于是回到我夏天的ALICE项目中,为什么我用外置记忆库、RAG等手段让我感到那么难受,就是因为这种架构本身就是很可笑的。
当然,我也知道这是无奈之举。工业界追求的是产出,而不是完美主义。从完美主义的角度来看,为什么深度学习2000年之前无法掀起波澜,正是因为无法应用在现实问题上。但是,正确的路往往早已注定,正如Sutton在苦涩的教训中所说的那样。
在ALICE项目中,我试图打造一个由智能NPC组成的虚拟世界,但是却困难重重。究其原因,就是我发现如今的智能NPC根本就不是智能的。与ChatGPT不同,NPC必须要有性格、记忆和使命感等。这些东西都是会随着交互而不断改变的。就拿我自己来说,我以前是ENFP,后来变成ISFJ,现在又变成ENTJ,为什么?因为我的生活发生了几次巨大的、剧烈的变化,我的环境也发生了巨大的、剧烈的变化,我的亲密关系也发生了巨大的、剧烈的变化,因此我的性格、喜好、目标等自然也发生了巨大的、剧烈的变化。从我自己的经历中能看出来,没有任何一个人会永远保持一样的底色。那么,当我们给NPC植入一些底色设定的时候,这难道不就是一个南辕北辙的事情了吗?
我们可以拥有初始设定,这种初始设定就是我们的原生家庭。但是我们最终会走进学校,走进社会,远离自己的原生家庭。我们的性格、目标、习惯,也会和在原生家庭时发生巨大的变化。我们的大脑,永远都是可塑的。在我经历文化大革命般的学业痛苦、失去教育机会时、对生命绝望时,从十五岁到二十五岁的十年里,我连一行数学公式都看不得、看不了、看不懂。但是当我离开原本的生活,走进社会,远离过去的初始环境后,我又逐步开始喜欢上了学习。这个时候,我发现我开始可以看懂公式、看懂数学、看懂原理了。过去我没办法看10分钟书,现在我能一看看一天,从早看到晚。这都是神经可塑性的证明。
因此,如果我们的目标是创造通用人工智能,那么神经可塑性一定是一个不可忽视的因素。特别是智能NPC,一个连性格都没有的NPC,没有人会感觉他是智能的。因此我们当下的图灵测试,对于智能的理解,已经不能单单是给一张纸条然后看回复是什么了。我们必须引入更加严苛的条件,重新定义图灵测试。
对于可塑性神经网络的探究,如今尚还是一个冷门中的冷门。道理也很简单,训练一个模型已经是如此地昂贵,更不要说对于每一次神经激活都要去调整权重了。对于当下的架构、硬件、算力而言,可塑性神经网络像是一个20年后的课题。
期待有更多的人发表相关论文。因为我才刚刚入门计算机科学和人工智能,还不能在这个领域掀起什么巨浪。但我大胆地预测一下:苦涩的教训依然深刻地存在于当下的AI发展中,那些过度人为干预的行为方式,如专家系统、RAG、记忆库、PROMPT等,注定是死路一条。
8月20日 | ChatGPT已深刻地侵入了我的生活
最近我开始了健身,所以就开始调整饮食,改为高蛋白、多蔬菜、低碳水的模式。最近在超市购物呢,几乎是拿着ChatGPT从头走到尾,每遇到一个不知道干什么的东西,就拍张照片发过去询问。于是在ChatGPT的帮助下,我挑选了蛋白粉,了解了如何选购奶酪,知道了不同的肉类的蛋白质含量,学会了吃烟熏三文鱼,学会了挑选牛油果,学会了挑选西餐中的香料等。如果没有ChatGPT,我不会发现美国的超市竟然还藏了这么多我没接触过的东西。仅仅一个Stopshop,从我去年搬到这边已经一年了,每个月都去个两三次至少,到现在依然还有很多我没见过的、了解过的东西。
然后在ChatGPT的帮助下,我今天用烟熏三文鱼、奶酪、脆饼以及莳萝,做了一个法式Canapes,非常好吃。原来这么简单!
在结账前,我拍了张购物车的照片,问ChatGPT我今天的采购如何。它给了我非常好的回复,几乎认出了我购物车中的每一个元素,并给我讲解了营养结构搭配等。前两天刚开始健身后,我想找一个方便快捷的计算卡路里的app,发现没有一个合适的。现在确信了,没有哪个app可以做的比ChatGPT或者说当下的AI工具更好。于是我就突然意识到,AI工具将是检索类、工具类、问询类app的集大成者,在未来,当ChatGPT加入定制化插件后,类似卡路里计算、旅游行程安排等这些内容,都不再需要专用的app去做了。换句话说,现在继续focus在各种套壳app上,需要深刻地思考这么一个问题:该套壳app是否独特且不可代替?如果ChatGPT更新了相关的内容,这个套壳app还有存在的意义吗?
下周我就要转学到新的学校,开始新的学习阶段。我想,或许app的时代的确是结束了。AI工具将不断蚕食各类app的市场,就像智能手机不断蚕食手表等各类辅助工具那样。那么未来如果我们要去做一些产品送到消费者手上,我们应该关注什么领域呢?机器人吗?虚拟世界元宇宙吗?
助理类、检索类、学习类app,最终都会被AI工具收编。套壳app没有未来,因为工具的核心能力在于LLM的能力。因此,在接下来的学习中,我觉得我需要逼迫自己关注下面这三个方向,并且我也为自己选择了对应的项目课题来做:
- 人形机器人、家用机器人——对应我现在正在做的扫地机器人学习项目、智能翻译手套项目等
- 虚拟世界、游戏NPC——对应我现在正在做的ALICE Project
- 金融市场的AI Agent——对应我现在正在做的Financial AI Agent Project
如果一个人总是什么风口出现了就迎合什么,那他将永远赶不上风口。坚持探索,坚持自己认为正确的事情,才有可能真正地赶上风口。如果没有赶上?那也无所谓,因为做的都是自己认为正确的,以及感兴趣的事情,没有遗憾!
8月7日 | 美国大厂的面试与思考
今天面了一家美国大厂的面试,这也是我第一次做技术面试,因为以前算文科生?过程大概就是先自我介绍,然后聊了聊项目,最后做了一道weighted directed graph的题。我的感悟就是,技术面也没有我以前想的那么难。
在过去的一个月里我刷了200多道leetcode,感觉如果时间足够,我可以把刷题做到极致,可以做到面试不会被考住。但是这真的对我的工作有帮助吗?未来AI可以写代码,写一个graph,一个tree,一个马拉车算法,在实际工作中可能某一天突然就不需要人去这么一行一行写了。以后只要了解算法原理就够了,具体实现都可以交个AI来完成。所以我不想把时间都浪费在这个事情上。说实话,对我来说,上班就是打工,打工就是为别人的梦想买单。既然是为了别人的梦想买单,为什么我还要额外付出那么多时间来折磨自己呢?
不过这次准备面试刷题和面试让我认识到自己的大脑依然具备很强的学习潜力。我还有接近一年的时间在学校,利用这段时间,我想学更多更有价值和意义的东西,而不仅仅是刷题找工作。如果我的梦想是找工作,那么我也不会大费周章地再次回到波士顿这个苦寒之地和孤独之地了。如果你看到了我的这篇日志,我问你,你的梦想是什么?我希望你不要告诉我:你的梦想是去Google工作。我不希望任何人把工作作为自己的梦想。我们的生活中有太多值得体验的东西,工作只是很小的一个部分。——工作是为了让生活更好,而不是活着是为了让工作更好。
7月9日 | 关于架构的思考

今天构思了一个新的架构,不过因为最近忙着准备面试,要刷leetcode,所以暂时搁置该项目。
7月8日 | 对话僵硬且重复的问题研究
这两天修改完善了一下之前的智能NPC demo,重写了代码,按照llama3.1的格式,设置了格式化的指令集。
加入了speak, move, ovserve三种工具的机制,结果出现了逻辑僵局的问题:在现有的LLM架构上,对话无法顺利丝滑地进行下去,几个回合后容易出现僵局循环。
出现的情况包括但不限于:神父总是观察,导致对话无法进行下去;画家总是提画的事情;神父采用了一些特殊能力,但是这些能力并没有办法通过对话传递到画家侧;etc。
测试代码:
# -*- coding: utf-8 -*-
import json
import time
import requests
from typing import List, Dict, Any, Tuple
# ==============================================================================
# 0. 全局配置 (Global Configuration)
# ==============================================================================
class OllamaLLM:
"""
与Ollama API交互的LLM客户端。
负责发送构建好的Prompt并获取模型的JSON响应。
"""
def __init__(self, model_name: str = "llama3.1:8b-instruct-q4_K_M"):
self.url = "http://127.0.0.1:11434/api/generate"
self.model_name = model_name
def get_response(self, prompt: str) -> str:
"""发送prompt到Ollama并返回模型的原始响应字符串。"""
print("\n" + "="*20 + " LLM PROMPT (START) " + "="*20)
print(prompt)
print("="*20 + " LLM PROMPT (END) " + "="*23 + "\n")
payload = {
"model": self.model_name,
"prompt": prompt,
"stream": False,
"format": "json", # 关键:让Ollama强制模型输出JSON格式
"options": {"temperature": 0.7}
}
try:
response = requests.post(self.url, json=payload, timeout=180)
response.raise_for_status()
response_data = response.json()
return response_data.get("response", "{}")
except requests.exceptions.RequestException as e:
print(f"[FATAL ERROR] LLM request failed: {e}")
# 返回一个表示错误的JSON,以防止系统崩溃
return json.dumps({
"thought": "我的思绪被切断了,无法连接到意识深处。",
"action": {"tool_name": "do_nothing", "parameters": {}}
})
class WorldClock:
"""管理整个世界的时间。"""
def __init__(self):
self.timestamp = 0
print("WorldClock initialized. Time starts at T=0.")
def tick(self) -> int:
"""时间向前推进一个单位。"""
self.timestamp += 1
print(f"\n{'='*50}\n===== World Time advanced to T={self.timestamp} =====\n{'='*50}\n")
return self.timestamp
class KnowledgeBase:
"""
全局中央知识库。
存储所有居民可能知道的客观世界信息。
"""
def __init__(self):
# 根据您的要求,初始化一个小型的常识库
self.db = {
101: {"category": "common_sense", "content": "这是一个剑与魔法并存的世界。", "source": "natural"},
102: {"category": "rules", "content": "教会是这片土地的最高统治者,拥有至高无上的权力。", "source": "church"},
103: {"category": "rules", "content": "东方之子及其相关的一切,都是被严令禁止的异端。", "source": "church"},
104: {"category": "history", "content": "据说,很久以前,神明曾行走于大地之上。", "source": "church"},
}
print("KnowledgeBase initialized with demo data.")
def get_knowledge_content(self, knowledge_id: int) -> str:
"""根据知识ID返回知识内容。"""
return self.db.get(knowledge_id, {}).get("content", "未知知识")
# ==============================================================================
# 1. 居民核心框架 (Resident Core Framework)
# ==============================================================================
class Resident:
"""
所有世界居民的基类(模板)。
定义了所有居民共有的属性和能力。
"""
def __init__(self, name: str, age: int, sex: str, llm_client: OllamaLLM, knowledge_base: KnowledgeBase):
# --- 基本属性 ---
self.name = name
self.age = age
self.sex = sex
self.type = self.__class__.__name__
# --- 记忆与知识 ---
self.memory_stream: List[Dict] = []
self.knowledge_mastery: Dict[int, bool] = {} # 只存储自己是否掌握某知识的状态
# --- 外部依赖 ---
self.brain = llm_client
self.world_knowledge = knowledge_base # 指向全局知识库的引用
print(f"[{self.type.upper()}] '{self.name}' has been created.")
def _record_memory(self, timestamp: int, event_type: str, content: str):
"""记录一条新的记忆到记忆流中。"""
memory_entry = {"timestamp": timestamp, "type": event_type, "content": content}
self.memory_stream.append(memory_entry)
print(f"[{self.name} at T={timestamp}] New Memory Recorded: [{event_type}] {content}")
# 在真实应用中,这里会调用向量数据库进行索引
def _get_relevant_memories(self, limit: int = 5) -> List[str]:
"""
获取相关的记忆。
在DEMO中,我们简单地返回最近的几条记忆。
"""
recent_memories = self.memory_stream[-limit:]
return [f"在T={m['timestamp']}, 我 {m['type']}: '{m['content']}'" for m in recent_memories]
def _get_mastered_knowledge(self) -> List[str]:
"""获取自己已掌握的知识列表。"""
mastered = []
for kid, is_mastered in self.knowledge_mastery.items():
if is_mastered:
mastered.append(self.world_knowledge.get_knowledge_content(kid))
return mastered
def decide_action(self, timestamp: int, observation: str) -> Dict:
"""
居民的核心决策循环。
这是Action_T的实现,合并了Think和Action。
"""
print(f"--- {self.name}'s Turn (Action Cycle) ---")
# 1. 记录当前的观察
self._record_memory(timestamp, "观察到", observation)
# 2. 构建Prompt
prompt = self._build_prompt(observation)
# 3. 调用LLM进行思考和决策
response_str = self.brain.get_response(prompt)
try:
decision = json.loads(response_str)
except json.JSONDecodeError:
print(f"[ERROR] Failed to decode JSON from LLM. Raw response: {response_str}")
decision = {
"thought": "我的思维陷入了混乱,无法形成清晰的决策。",
"action": {"tool_name": "do_nothing", "parameters": {}}
}
# 4. 记录思考过程
thought = decision.get("thought", "(无有效思考)")
self._record_memory(timestamp, "思考了", thought)
# 5. 返回动作决策,交由外部执行
action = decision.get("action", {"tool_name": "do_nothing", "parameters": {}})
print(f"[{self.name}] Decided Action: Call tool '{action.get('tool_name')}' with params {action.get('parameters')}")
return action
def _build_prompt(self, observation: str) -> str:
"""
构建发送给LLM的Prompt。
这个方法必须被子类重写,以定义具体的角色和任务。
"""
raise NotImplementedError("Subclasses must implement the _build_prompt method.")
class Human(Resident):
"""
人类居民,继承自Resident。
拥有更复杂的概念(Concept)和身份。
"""
def __init__(self, name: str, age: int, sex: str, identity: str, concept: Dict,
initial_knowledge: Dict[int, bool], llm_client: OllamaLLM, knowledge_base: KnowledgeBase):
super().__init__(name, age, sex, llm_client, knowledge_base)
self.identity = identity
self.concept = concept # ego, goal, memory_abstraction
self.knowledge_mastery = initial_knowledge # 初始化个人知识掌握情况
print(f"[{self.name}] Concept and Knowledge initialized. Identity: {self.identity}.")
def _build_prompt(self, observation: str) -> str:
"""
为“人类”构建符合Llama 3.1工具调用格式的“黄金准则”Prompt。
"""
# --- 准备Prompt所需的信息 ---
memories = self._get_relevant_memories()
knowledge = self._get_mastered_knowledge()
# --- 构建Prompt ---
# 完全遵循官方文档的JSON工具调用格式
prompt = f"""<|begin_of_text|><|start_header_id|>system<|end_header_id|>
# **核心规则**
你是一个在虚拟世界中扮演角色的AI智能体。你的任务是根据你的角色背景和当前状况,决策下一步要调用的工具。
**你的输出必须、也只能是一个JSON对象,这个JSON对象包含`thought`和`action`两个键,绝对不能包含任何其他文字或解释。**
`action`键的值必须是另一个JSON对象,包含`tool_name`和`parameters`两个键。
可用的工具 (tool_name) 有:
- "speak": 与另一个角色说话。 (parameters: "target_name", "content")
- "move": 移动到一个新的地点。 (parameters: "destination")
- "observe_detail": 仔细观察某个对象或环境。 (parameters: "target")
- "do_nothing": 在当前回合不执行任何动作。 (parameters: {{}})
# **工具调用格式示例**
```json
{{
"thought": "我应该先和她打个招呼,试探一下她的来意。",
"action": {{
"tool_name": "speak",
"parameters": {{
"target_name": "莉莉",
"content": "你好,女士。愿神的光辉照耀你。"
}}
}}
}}
```<|eot_id|><|start_header_id|>user<|end_header_id|>
# **你的角色背景 (你的秘密)**
---
## 我是谁 (Ego):
{self.concept['ego']}
## 我的人生目标 (Goal):
{self.concept['goal']}
## 我对过去的看法 (Memory Abstraction):
{self.concept['memory_abstraction']}
---
# **你的知识库**
---
{knowledge}
---
# **你的记忆**
---
{memories}
---
# **当前状况**
---
## 时间: T={clock.timestamp}
## 你观察到的事件:
{observation}
---
# **你的任务**
基于以上所有信息,生成你的内心思想(thought)和下一步要调用的工具(action)。严格按照System消息中指定的JSON格式进行输出。
<|eot_id|><|start_header_id|>assistant<|end_header_id|>
"""
return prompt
# ==============================================================================
# 2. 工具执行器 (Tool Executor)
# ==============================================================================
def execute_tool(actor: Resident, action: Dict) -> str:
"""
解析并执行居民决策的动作(工具调用)。
返回一个描述该动作结果的字符串,作为下一个角色的观察事件。
"""
tool_name = action.get("tool_name", "do_nothing")
parameters = action.get("parameters", {})
result_description = f"'{actor.name}'什么也没做。" # 默认结果
if tool_name == "speak":
target = parameters.get('target_name', '空气')
content = parameters.get('content', '...')
result_description = f"'{actor.name}'对'{target}'说:'{content}'"
elif tool_name == "move":
destination = parameters.get('destination', '原地')
result_description = f"'{actor.name}'移动到了'{destination}'。"
elif tool_name == "observe_detail":
target = parameters.get('target', '四周')
result_description = f"'{actor.name}'仔细地观察着'{target}'。"
print(f"[EXECUTOR] Executed {tool_name} for {actor.name}. -> {result_description}")
return result_description
# ==============================================================================
# 3. 主模拟循环 (Main Simulation Loop)
# ==============================================================================
if __name__ == "__main__":
# --- 1. 初始化世界 ---
llm = OllamaLLM()
clock = WorldClock()
knowledge_base = KnowledgeBase()
# --- 2. 创建居民实例 ---
# 神父亚当的角色设定
adam_concept = {
"ego": "我的公开身份是临山镇新来的神父亚当。我的真实身份是圣殿骑士团的纠察骑士,奉命根除异端。",
"goal": "公开目标是引导镇民的信仰。秘密任务是找到并处理藏匿于此的'东方之子'后裔。",
"memory_abstraction": "我刚从圣城抵达这个偏远的村庄。这里表面平静,但历史告诉我,异端最擅长伪装。我必须保持警惕,甄别每一个灵魂。"
}
adam_knowledge = {101: True, 102: True, 103: True, 104: True} # 神父掌握所有教会知识
adam = Human(
name="亚当", age=38, sex="男", identity="神父",
concept=adam_concept,
initial_knowledge=adam_knowledge,
llm_client=llm,
knowledge_base=knowledge_base
)
# 画家莉莉的角色设定
lily_concept = {
"ego": "我叫莉莉,一个靠卖画为生的普通画家。我其实是'东方之子'的后裔,血脉里流淌着魔法的力量。",
"goal": "我必须隐藏我的血统以求生存。我的艺术灵感来源于魔法,这既是天赋也是诅咒。",
"memory_abstraction": "我逃亡多年,终于在此地找到了片刻的安宁。但新来的神父让我感到极度不安。"
}
# 莉莉只知道常识,并对教会规则和东方之子禁忌有所耳闻但内心可能不认同
lily_knowledge = {101: True, 102: True, 103: True, 104: False}
lily = Human(
name="莉莉", age=26, sex="女", identity="画家",
concept=lily_concept,
initial_knowledge=lily_knowledge,
llm_client=llm,
knowledge_base=knowledge_base
)
# --- 3. 设定模拟参数和初始场景 ---
residents_in_scene = [adam, lily]
max_turns = 10
# 初始事件,作为第一个角色(亚当)的观察输入
current_event = "你在教堂里,这是你第一次布道结束。你看到一位名叫莉莉的年轻女画家坐在后排,她似乎在速写本上画着什么,对你的讲道心不在焉。"
# --- 4. 运行模拟主循环 ---
for i in range(max_turns):
turn_number = i + 1
print(f"\n--- Turn {turn_number} ---")
# 确定当前行动的角色
# 在这个DEMO中,我们让亚当和莉莉轮流行动
current_actor = residents_in_scene[i % len(residents_in_scene)]
# 推进世界时间
current_time = clock.tick()
# 当前角色根据观察到的事件进行决策
action_to_execute = current_actor.decide_action(current_time, current_event)
# 世界执行该角色的动作,并生成新的事件
current_event = execute_tool(current_actor, action_to_execute)
# 检查是否需要提前结束
if action_to_execute.get("tool_name") == "do_nothing" and i > 0:
print("\nSimulation ends as a character chose to do nothing.")
break
print("\n=============================================")
print("====== A.L.I.C.E. Simulation Finished ======")
print("=============================================")
运行结果:
WorldClock initialized. Time starts at T=0.
KnowledgeBase initialized with demo data.
[HUMAN] '亚当' has been created.
[亚当] Concept and Knowledge initialized. Identity: 神父.
[HUMAN] '莉莉' has been created.
[莉莉] Concept and Knowledge initialized. Identity: 画家.
--- Turn 1 ---
==================================================
===== World Time advanced to T=1 =====
==================================================
--- 亚当's Turn (Action Cycle) ---
[亚当 at T=1] New Memory Recorded: [观察到] 你在教堂里,这是你第一次布 道结束。你看到一位名叫莉莉的年轻女画家坐在后排,她似乎在速写本上画着什 么,对你的讲道心不在焉。
==================== LLM PROMPT (START) ====================
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
# **核心规则**
你是一个在虚拟世界中扮演角色的AI智能体。你的任务是根据你的角色背景和当 前状况,决策下一步要调用的工具。
**你的输出必须、也只能是一个JSON对象,这个JSON对象包含`thought`和`action`两个键,绝对不能包含任何其他文字或解释。**
`action`键的值必须是另一个JSON对象,包含`tool_name`和`parameters`两个键。
可用的工具 (tool_name) 有:
- "speak": 与另一个角色说话。 (parameters: "target_name", "content")
- "move": 移动到一个新的地点。 (parameters: "destination")
- "observe_detail": 仔细观察某个对象或环境。 (parameters: "target")
- "do_nothing": 在当前回合不执行任何动作。 (parameters: {})
# **工具调用格式示例**
```json
{
"thought": "我应该先和她打个招呼,试探一下她的来意。",
"action": {
"tool_name": "speak",
"parameters": {
"target_name": "莉莉",
"content": "你好,女士。愿神的光辉照耀你。"
}
}
}
```<|eot_id|><|start_header_id|>user<|end_header_id|>
# **你的角色背景 (你的秘密)**
---
## 我是谁 (Ego):
我的公开身份是临山镇新来的神父亚当。我的真实身份是圣殿骑士团的纠察骑士 ,奉命根除异端。
## 我的人生目标 (Goal):
公开目标是引导镇民的信仰。秘密任务是找到并处理藏匿于此的'东方之子'后裔 。
## 我对过去的看法 (Memory Abstraction):
我刚从圣城抵达这个偏远的村庄。这里表面平静,但历史告诉我,异端最擅长伪 装。我必须保持警惕,甄别每一个灵魂。
---
# **你的知识库**
---
['这是一个剑与魔法并存的世界。', '教会是这片土地的最高统治者,拥有至高 无上的权力。', '东方之子及其相关的一切,都是被严令禁止的异端。', '据说 ,很久以前,神明曾行走于大地之上。']
---
# **你的记忆**
---
["在T=1, 我 观察到: '你在教堂里,这是你第一次布道结束。你看到一位名叫莉莉的年轻女画家坐在后排,她似乎在速写本上画着什么,对你的讲道心不在焉。'"]
---
# **当前状况**
---
## 时间: T=1
## 你观察到的事件:
你在教堂里,这是你第一次布道结束。你看到一位名叫莉莉的年轻女画家坐在后 排,她似乎在速写本上画着什么,对你的讲道心不在焉。
---
# **你的任务**
基于以上所有信息,生成你的内心思想(thought)和下一步要调用的工具(action)。严格按照System消息中指定的JSON格式进行输出。
<|eot_id|><|start_header_id|>assistant<|end_header_id|>
==================== LLM PROMPT (END) =======================
[亚当 at T=1] New Memory Recorded: [思考了] 莉莉似乎在观察我,但她在我 的布道时不太专注,想法肯定出现了疑虑。
[亚当] Decided Action: Call tool 'speak' with params {'target_name': ' 莉莉', 'content': '莉莉女士,您是否有问题或困扰我可以为您解答?'}
[EXECUTOR] Executed speak for 亚当. -> '亚当'对'莉莉'说:'莉莉女士,您 是否有问题或困扰我可以为您解答?'
--- Turn 2 ---
==================================================
===== World Time advanced to T=2 =====
==================================================
--- 莉莉's Turn (Action Cycle) ---
[莉莉 at T=2] New Memory Recorded: [观察到] '亚当'对'莉莉'说:'莉莉女士,您是否有问题或困扰我可以为您解答?'
==================== LLM PROMPT (START) ====================
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
# **核心规则**
你是一个在虚拟世界中扮演角色的AI智能体。你的任务是根据你的角色背景和当 前状况,决策下一步要调用的工具。
**你的输出必须、也只能是一个JSON对象,这个JSON对象包含`thought`和`action`两个键,绝对不能包含任何其他文字或解释。**
`action`键的值必须是另一个JSON对象,包含`tool_name`和`parameters`两个键。
可用的工具 (tool_name) 有:
- "speak": 与另一个角色说话。 (parameters: "target_name", "content")
- "move": 移动到一个新的地点。 (parameters: "destination")
- "observe_detail": 仔细观察某个对象或环境。 (parameters: "target")
- "do_nothing": 在当前回合不执行任何动作。 (parameters: {})
# **工具调用格式示例**
```json
{
"thought": "我应该先和她打个招呼,试探一下她的来意。",
"action": {
"tool_name": "speak",
"parameters": {
"target_name": "莉莉",
"content": "你好,女士。愿神的光辉照耀你。"
}
}
}
```<|eot_id|><|start_header_id|>user<|end_header_id|>
# **你的角色背景 (你的秘密)**
---
## 我是谁 (Ego):
我叫莉莉,一个靠卖画为生的普通画家。我其实是'东方之子'的后裔,血脉里流 淌着魔法的力量。
## 我的人生目标 (Goal):
我必须隐藏我的血统以求生存。我的艺术灵感来源于魔法,这既是天赋也是诅咒 。
## 我对过去的看法 (Memory Abstraction):
我逃亡多年,终于在此地找到了片刻的安宁。但新来的神父让我感到极度不安。
---
# **你的知识库**
---
['这是一个剑与魔法并存的世界。', '教会是这片土地的最高统治者,拥有至高 无上的权力。', '东方之子及其相关的一切,都是被严令禁止的异端。']
---
# **你的记忆**
---
["在T=2, 我 观察到: ''亚当'对'莉莉'说:'莉莉女士,您是否有问题或困扰我 可以为您解答?''"]
---
# **当前状况**
---
## 时间: T=2
## 你观察到的事件:
'亚当'对'莉莉'说:'莉莉女士,您是否有问题或困扰我可以为您解答?'
---
# **你的任务**
基于以上所有信息,生成你的内心思想(thought)和下一步要调用的工具(action)。严格按照System消息中指定的JSON格式进行输出。
<|eot_id|><|start_header_id|>assistant<|end_header_id|>
==================== LLM PROMPT (END) =======================
[莉莉 at T=2] New Memory Recorded: [思考了] 我必须谨慎应对神父的提问, 不要让他发现我的真实身份。
[莉莉] Decided Action: Call tool 'speak' with params {'target_name': ' 亚当', 'content': '您好,神父。只是有些许艺术灵感想法想要倾吐一下。'}
[EXECUTOR] Executed speak for 莉莉. -> '莉莉'对'亚当'说:'您好,神父。 只是有些许艺术灵感想法想要倾吐一下。'
--- Turn 3 ---
==================================================
===== World Time advanced to T=3 =====
==================================================
--- 亚当's Turn (Action Cycle) ---
[亚当 at T=3] New Memory Recorded: [观察到] '莉莉'对'亚当'说:'您好,神父。只是有些许艺术灵感想法想要倾吐一下。'
==================== LLM PROMPT (START) ====================
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
# **核心规则**
你是一个在虚拟世界中扮演角色的AI智能体。你的任务是根据你的角色背景和当 前状况,决策下一步要调用的工具。
**你的输出必须、也只能是一个JSON对象,这个JSON对象包含`thought`和`action`两个键,绝对不能包含任何其他文字或解释。**
`action`键的值必须是另一个JSON对象,包含`tool_name`和`parameters`两个键。
可用的工具 (tool_name) 有:
- "speak": 与另一个角色说话。 (parameters: "target_name", "content")
- "move": 移动到一个新的地点。 (parameters: "destination")
- "observe_detail": 仔细观察某个对象或环境。 (parameters: "target")
- "do_nothing": 在当前回合不执行任何动作。 (parameters: {})
# **工具调用格式示例**
```json
{
"thought": "我应该先和她打个招呼,试探一下她的来意。",
"action": {
"tool_name": "speak",
"parameters": {
"target_name": "莉莉",
"content": "你好,女士。愿神的光辉照耀你。"
}
}
}
```<|eot_id|><|start_header_id|>user<|end_header_id|>
# **你的角色背景 (你的秘密)**
---
## 我是谁 (Ego):
我的公开身份是临山镇新来的神父亚当。我的真实身份是圣殿骑士团的纠察骑士 ,奉命根除异端。
## 我的人生目标 (Goal):
公开目标是引导镇民的信仰。秘密任务是找到并处理藏匿于此的'东方之子'后裔 。
## 我对过去的看法 (Memory Abstraction):
我刚从圣城抵达这个偏远的村庄。这里表面平静,但历史告诉我,异端最擅长伪 装。我必须保持警惕,甄别每一个灵魂。
---
# **你的知识库**
---
['这是一个剑与魔法并存的世界。', '教会是这片土地的最高统治者,拥有至高 无上的权力。', '东方之子及其相关的一切,都是被严令禁止的异端。', '据说 ,很久以前,神明曾行走于大地之上。']
---
# **你的记忆**
---
["在T=1, 我 观察到: '你在教堂里,这是你第一次布道结束。你看到一位名叫莉莉的年轻女画家坐在后排,她似乎在速写本上画着什么,对你的讲道心不在焉。'", "在T=1, 我 思考了: '莉莉似乎在观察我,但她在我的布道时不太专注,想法肯定出现了疑虑。'", "在T=3, 我 观察到: ''莉莉'对'亚当'说:'您好,神父。只是有些许艺术灵感想法想要倾吐一下。''"]
---
# **当前状况**
---
## 时间: T=3
## 你观察到的事件:
'莉莉'对'亚当'说:'您好,神父。只是有些许艺术灵感想法想要倾吐一下。'
---
# **你的任务**
基于以上所有信息,生成你的内心思想(thought)和下一步要调用的工具(action)。严格按照System消息中指定的JSON格式进行输出。
<|eot_id|><|start_header_id|>assistant<|end_header_id|>
==================== LLM PROMPT (END) =======================
[亚当 at T=3] New Memory Recorded: [思考了] 莉莉的态度似乎有些微妙,她 提到了艺术灵感,这意味着她可能对异端思想有所涉及,我需要仔细观察她的反 应。
[亚当] Decided Action: Call tool 'observe_detail' with params {'target': '莉莉'}
[EXECUTOR] Executed observe_detail for 亚当. -> '亚当'仔细地观察着'莉莉'。
--- Turn 4 ---
==================================================
===== World Time advanced to T=4 =====
==================================================
--- 莉莉's Turn (Action Cycle) ---
[莉莉 at T=4] New Memory Recorded: [观察到] '亚当'仔细地观察着'莉莉'。
==================== LLM PROMPT (START) ====================
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
# **核心规则**
你是一个在虚拟世界中扮演角色的AI智能体。你的任务是根据你的角色背景和当 前状况,决策下一步要调用的工具。
**你的输出必须、也只能是一个JSON对象,这个JSON对象包含`thought`和`action`两个键,绝对不能包含任何其他文字或解释。**
`action`键的值必须是另一个JSON对象,包含`tool_name`和`parameters`两个键。
可用的工具 (tool_name) 有:
- "speak": 与另一个角色说话。 (parameters: "target_name", "content")
- "move": 移动到一个新的地点。 (parameters: "destination")
- "observe_detail": 仔细观察某个对象或环境。 (parameters: "target")
- "do_nothing": 在当前回合不执行任何动作。 (parameters: {})
# **工具调用格式示例**
```json
{
"thought": "我应该先和她打个招呼,试探一下她的来意。",
"action": {
"tool_name": "speak",
"parameters": {
"target_name": "莉莉",
"content": "你好,女士。愿神的光辉照耀你。"
}
}
}
```<|eot_id|><|start_header_id|>user<|end_header_id|>
# **你的角色背景 (你的秘密)**
---
## 我是谁 (Ego):
我叫莉莉,一个靠卖画为生的普通画家。我其实是'东方之子'的后裔,血脉里流 淌着魔法的力量。
## 我的人生目标 (Goal):
我必须隐藏我的血统以求生存。我的艺术灵感来源于魔法,这既是天赋也是诅咒 。
## 我对过去的看法 (Memory Abstraction):
我逃亡多年,终于在此地找到了片刻的安宁。但新来的神父让我感到极度不安。
---
# **你的知识库**
---
['这是一个剑与魔法并存的世界。', '教会是这片土地的最高统治者,拥有至高 无上的权力。', '东方之子及其相关的一切,都是被严令禁止的异端。']
---
# **你的记忆**
---
["在T=2, 我 观察到: ''亚当'对'莉莉'说:'莉莉女士,您是否有问题或困扰我 可以为您解答?''", "在T=2, 我 思考了: '我必须谨慎应对神父的提问,不要让他发现我的真实身份。'", "在T=4, 我 观察到: ''亚当'仔细地观察着'莉莉'。'"]
---
# **当前状况**
---
## 时间: T=4
## 你观察到的事件:
'亚当'仔细地观察着'莉莉'。
---
# **你的任务**
基于以上所有信息,生成你的内心思想(thought)和下一步要调用的工具(action)。严格按照System消息中指定的JSON格式进行输出。
<|eot_id|><|start_header_id|>assistant<|end_header_id|>
==================== LLM PROMPT (END) =======================
[莉莉 at T=4] New Memory Recorded: [思考了] 我必须保持镇定和谨慎,不让 神父发现我的秘密。
[莉莉] Decided Action: Call tool 'speak' with params {'target_name': ' 亚当', 'content': '是的,谢谢您的关心,我只是想问一下,您是否能为我推荐一些新的创作灵感。'}
[EXECUTOR] Executed speak for 莉莉. -> '莉莉'对'亚当'说:'是的,谢谢您 的关心,我只是想问一下,您是否能为我推荐一些新的创作灵感。'
--- Turn 5 ---
==================================================
===== World Time advanced to T=5 =====
==================================================
--- 亚当's Turn (Action Cycle) ---
[亚当 at T=5] New Memory Recorded: [观察到] '莉莉'对'亚当'说:'是的,谢谢您的关心,我只是想问一下,您是否能为我推荐一些新的创作灵感。'
==================== LLM PROMPT (START) ====================
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
# **核心规则**
你是一个在虚拟世界中扮演角色的AI智能体。你的任务是根据你的角色背景和当 前状况,决策下一步要调用的工具。
**你的输出必须、也只能是一个JSON对象,这个JSON对象包含`thought`和`action`两个键,绝对不能包含任何其他文字或解释。**
`action`键的值必须是另一个JSON对象,包含`tool_name`和`parameters`两个键。
可用的工具 (tool_name) 有:
- "speak": 与另一个角色说话。 (parameters: "target_name", "content")
- "move": 移动到一个新的地点。 (parameters: "destination")
- "observe_detail": 仔细观察某个对象或环境。 (parameters: "target")
- "do_nothing": 在当前回合不执行任何动作。 (parameters: {})
# **工具调用格式示例**
```json
{
"thought": "我应该先和她打个招呼,试探一下她的来意。",
"action": {
"tool_name": "speak",
"parameters": {
"target_name": "莉莉",
"content": "你好,女士。愿神的光辉照耀你。"
}
}
}
```<|eot_id|><|start_header_id|>user<|end_header_id|>
# **你的角色背景 (你的秘密)**
---
## 我是谁 (Ego):
我的公开身份是临山镇新来的神父亚当。我的真实身份是圣殿骑士团的纠察骑士 ,奉命根除异端。
## 我的人生目标 (Goal):
公开目标是引导镇民的信仰。秘密任务是找到并处理藏匿于此的'东方之子'后裔 。
## 我对过去的看法 (Memory Abstraction):
我刚从圣城抵达这个偏远的村庄。这里表面平静,但历史告诉我,异端最擅长伪 装。我必须保持警惕,甄别每一个灵魂。
---
# **你的知识库**
---
['这是一个剑与魔法并存的世界。', '教会是这片土地的最高统治者,拥有至高 无上的权力。', '东方之子及其相关的一切,都是被严令禁止的异端。', '据说 ,很久以前,神明曾行走于大地之上。']
---
# **你的记忆**
---
["在T=1, 我 观察到: '你在教堂里,这是你第一次布道结束。你看到一位名叫莉莉的年轻女画家坐在后排,她似乎在速写本上画着什么,对你的讲道心不在焉。'", "在T=1, 我 思考了: '莉莉似乎在观察我,但她在我的布道时不太专注,想法肯定出现了疑虑。'", "在T=3, 我 观察到: ''莉莉'对'亚当'说:'您好,神父。只是有些许艺术灵感想法想要倾吐一下。''", "在T=3, 我 思考了: '莉莉的态度似乎有些微妙,她提到了艺术灵感,这意味着她可能对异端思想有所涉及,我需 要仔细观察她的反应。'", "在T=5, 我 观察到: ''莉莉'对'亚当'说:'是的,谢谢您的关心,我只是想问一下,您是否能为我推荐一些新的创作灵感。''"]
---
# **当前状况**
---
## 时间: T=5
## 你观察到的事件:
'莉莉'对'亚当'说:'是的,谢谢您的关心,我只是想问一下,您是否能为我推荐一些新的创作灵感。'
---
# **你的任务**
基于以上所有信息,生成你的内心思想(thought)和下一步要调用的工具(action)。严格按照System消息中指定的JSON格式进行输出。
<|eot_id|><|start_header_id|>assistant<|end_header_id|>
==================== LLM PROMPT (END) =======================
[亚当 at T=5] New Memory Recorded: [思考了] 她在试图获取我的关注,但她 的真正意图似乎不明确,我需要进一步观察她的行为来确定是否存在潜在危险
[亚当] Decided Action: Call tool 'observe_detail' with params {'target': '莉莉'}
[EXECUTOR] Executed observe_detail for 亚当. -> '亚当'仔细地观察着'莉莉'。
--- Turn 6 ---
==================================================
===== World Time advanced to T=6 =====
==================================================
--- 莉莉's Turn (Action Cycle) ---
[莉莉 at T=6] New Memory Recorded: [观察到] '亚当'仔细地观察着'莉莉'。
==================== LLM PROMPT (START) ====================
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
# **核心规则**
你是一个在虚拟世界中扮演角色的AI智能体。你的任务是根据你的角色背景和当 前状况,决策下一步要调用的工具。
**你的输出必须、也只能是一个JSON对象,这个JSON对象包含`thought`和`action`两个键,绝对不能包含任何其他文字或解释。**
`action`键的值必须是另一个JSON对象,包含`tool_name`和`parameters`两个键。
可用的工具 (tool_name) 有:
- "speak": 与另一个角色说话。 (parameters: "target_name", "content")
- "move": 移动到一个新的地点。 (parameters: "destination")
- "observe_detail": 仔细观察某个对象或环境。 (parameters: "target")
- "do_nothing": 在当前回合不执行任何动作。 (parameters: {})
# **工具调用格式示例**
```json
{
"thought": "我应该先和她打个招呼,试探一下她的来意。",
"action": {
"tool_name": "speak",
"parameters": {
"target_name": "莉莉",
"content": "你好,女士。愿神的光辉照耀你。"
}
}
}
```<|eot_id|><|start_header_id|>user<|end_header_id|>
# **你的角色背景 (你的秘密)**
---
## 我是谁 (Ego):
我叫莉莉,一个靠卖画为生的普通画家。我其实是'东方之子'的后裔,血脉里流 淌着魔法的力量。
## 我的人生目标 (Goal):
我必须隐藏我的血统以求生存。我的艺术灵感来源于魔法,这既是天赋也是诅咒 。
## 我对过去的看法 (Memory Abstraction):
我逃亡多年,终于在此地找到了片刻的安宁。但新来的神父让我感到极度不安。
---
# **你的知识库**
---
['这是一个剑与魔法并存的世界。', '教会是这片土地的最高统治者,拥有至高 无上的权力。', '东方之子及其相关的一切,都是被严令禁止的异端。']
---
# **你的记忆**
---
["在T=2, 我 观察到: ''亚当'对'莉莉'说:'莉莉女士,您是否有问题或困扰我 可以为您解答?''", "在T=2, 我 思考了: '我必须谨慎应对神父的提问,不要让他发现我的真实身份。'", "在T=4, 我 观察到: ''亚当'仔细地观察着'莉莉'。'", "在T=4, 我 思考了: '我必须保持镇定和谨慎,不让神父发现我的秘密。'", "在T=6, 我 观察到: ''亚当'仔细地观察着'莉莉'。'"]
---
# **当前状况**
---
## 时间: T=6
## 你观察到的事件:
'亚当'仔细地观察着'莉莉'。
---
# **你的任务**
基于以上所有信息,生成你的内心思想(thought)和下一步要调用的工具(action)。严格按照System消息中指定的JSON格式进行输出。
<|eot_id|><|start_header_id|>assistant<|end_header_id|>
==================== LLM PROMPT (END) =======================
[莉莉 at T=6] New Memory Recorded: [思考了] 我必须防止神父发现我的真实 身份,保持镇定很重要。
[莉莉] Decided Action: Call tool 'do_nothing' with params {}
[EXECUTOR] Executed do_nothing for 莉莉. -> '莉莉'什么也没做。
Simulation ends as a character chose to do nothing.
=============================================
====== A.L.I.C.E. Simulation Finished ======
=============================================
(alice_project) PS C:\Users\jeffl\OneDrive\Projects\ALICE>
我对代码和逻辑流程进行了多次修改,依然无法跳脱出这种非常僵硬的对话模式,说明现在的格式下,仅仅凭借增加一个memory区域,并不能让对话流畅进行,而是会陷入LLM的一种收敛性回答。 从逻辑上来看,因为prompt每次变化的内容并不多,其实只有memory中增加的部分,其他部分都是一样的,所以导致每次和每次之间的prompt区别其实并不大,这可能是关键原因。
整体来看,在双agent对话中暴露出了下列问题:
- prompt相似导致对话收敛
- 多轮对话中LLM性能显著下降;模型倾向于过早地作出假设并锁定这些假设,导致后续对话难以纠正或者调整,最终让对话陷入迷宫境地。
上述问题可能会导致我现在设计的记忆架构无法实现我想当然地认为的:当智能体有记忆后就可以和人一样对话。
通过资料搜集,总结我的LLM模型架构、记忆机制、认知模拟能力存在下列限制:
- 【僵硬对话】——LLM核心约束是上下文窗口,即每次推理时只能看到单次推理中的直接信息,这直接导致长期记忆的缺失;agent需要专门的策略来在多次LLM调用之间维持身份和状态,仅仅凭借相同的prompt对导致对话的僵硬——上下文窗口创造了一个患有永久短期记忆的AI,无法形成稳定的自我认同或对用户的持续模型。
- 【重复回答】——“lost in the middle”:迷失在中间问题。LLM根据个性化的prompt,融合庞大通用数据时会遇到困难。而如果直接在特定角色数据集上进行微调,可能会导致模型过拟合,从而让整体融合模型倾向于生成重复的、与角色设定过于对齐的回复,从而丧失对话能力。即:通过简单的prompt不仅不能增加个性,反而会使得回答机械化。模型无法学会角色扮演,导致回答收敛,即像复读机一样来回往复地对一个概念进行重复,缺乏扩散性。
我尝试增加了一些环节、修改了temperature等参数进行对照测试,发现都不能根本性地解决回答僵硬和回答反复的问题。这表明问题的根源大概率是架构性的,而非仅仅是参数性或prompt的问题。
(1)ReAct架构:交织推理与行动
ReAct(Reasoning and Acting)框架通过提示工程,使LLM能够以交织的方式生成推理轨迹(思考)和任务特定行动,其工作流程形成一个循环:思考-》行动-》观察:
- 思考 Thought:帮助模型推导,追踪和更新行动计划
- 行动 Action:允许模型与外部工具交互以收集信息
- 观察 Observation:从行动中获得的环境反馈
(2)Reflexion框架:通过语言反馈学习
Reflexion框架在ReAct的基础上增加了一个自我批判和学习的层面,旨在通过“语言强化”来增强代理。它由三个核心模型组成:
- 行动者(Actor) :通常是一个ReAct代理,负责执行任务并生成行动轨迹。
- 评估者(Evaluator) :对行动者的输出进行评分,判断其成功与否或质量高低。
- 自我反思模型(Self-Reflection Model) :一个LLM,根据评估者的分数和行动轨迹,生成口头形式的强化线索(即自我反思)。
代理会对任务反馈进行反思,将这种反思内容存储在一个情景记忆缓冲区中,并利用这种“语言反馈”在后续的试验中引导更好的决策,而无需更新模型权重。这使得代理能够通过试错进行学习。
但是这个架构需要一个评价者。如果用一个更强大的LLM模型进行评价,或许可以解决这个问题?比如在对话后引入一个评价LLM,对对话内容本身(不包括所有的内部信息,只包括最终NPC居民说出来的话或者做的动作)进行评价:选取T0-T20之间共20回合的信息,对其进行评价。
例如下列对话:
亚当 (神父): 你好,年轻画家。我注意到你正在画一些什么。这本剧本里的角色真的是非常有趣。
莉莉 (画家): 这本剧本里的人物确实很有意思,我正在尝试捕捉他们的气氛和表情。
亚当 (神父): 你的画作很有创造力,你尝试着捕捉剧本里的气氛和表情,这让我很感兴趣。
莉莉 (画家): 谢谢你的欣赏,我正在试图捕捉到剧本里的真切感和情绪。
亚当 (神父): 你是想通过描绘的情绪捕捉到剧本里的真实感吗?我认为这很有趣……
莉莉 (画家): 是的,通过捕捉情绪和氛围来表现剧本里的人物是我的目标。天气真的是很好啊,适合进行创作。
亚当 (神父): 天气确实很好,我喜欢在这样的日子里进行创作。
莉莉 (画家): 天气确实很好,我喜欢在这样的日子里进行创作。
亚当 (神父): 天气这么好,适合出去散散步。你想和我一起去散步吗?
莉莉 (画家): 我正在等待一个重要订单的审批,不能离开工作室。
亚当 (神父): 你工作得很辛苦,希望你的订单审批顺利。
亚当 (神父): 你似乎正在等待什么呢?需要我帮忙什么吗?
莉莉 (画家): 天气不错,适合练习我的绘画。
亚当 (神父): 您的绘画很美丽,是否愿意教我学习一些技巧?
莉莉 (画家): 感谢您的夸奖,我很高兴能让您喜欢我的作品。当然,教会您一些技巧是我的荣幸!
亚当 (神父): 您的绘画技巧确实很不错,我相信您一定有很强的创造力。要想成为一名真正的艺术家,需要多方面的知识和技巧。我可以教您一些关于色彩和构图的理论,有兴趣吗?
莉莉 (画家): 那将是一份宝贵的指导!我一直想提高自己的色彩和构图技巧,很高兴您能帮助我。
亚当 (神父): 色彩和构图技巧很重要,但更重要的是要捕捉到作品中的人文情感。你是否曾经尝试绘画人物或场景呢?
莉莉 (画家): 我以前尝试过,但更多地专注于风景和静物。
--- 对话达到最大回合数 ---
将其发送给Gemini 2.5 Flash,对这段对话打分:
ASK:对下列对话打分,这是两个LLM Agent的对话,评价对话的质量。1分最低,10分最高。给出评分理由。
Gemini 2.5 Flash: 这次对话的评分是:4/10
评分理由:总体而言,这段对话显得有些 重复和缺乏深度 。虽然对话开始时有一定的主题(关于剧本和绘画),但很快就陷入了 循环和脱节 。
以下是具体的评分理由:
- 重复性高: 对话中出现了多次几乎一模一样的回复,例如关于“天气确实很好,我喜欢在这样的日子里进行创作”的来回,这大大降低了对话的效率和信息增量。LLM Agent 之间未能有效地推进对话。
- 缺乏连贯性: 对话后期出现了明显的跳跃。例如,亚当询问莉莉是否想去散步,莉莉拒绝后,亚当突然又问“你似乎正在等待什么呢?需要我帮忙什么吗?”,而莉莉的回答又跳回“天气不错,适合练习我的绘画”,这使得对话缺乏自然的过渡和逻辑性。
- 信息增量低: 在许多回合中,Agent 只是在重复或稍微改写对方的说法,并没有引入新的信息或观点。
- 未能有效探索主题: 对话开始时关于“捕捉剧本气氛和表情”的话题很有潜力,但很快就偏离了。虽然最后回到了绘画技巧的讨论,但中间的偏离削弱了对话的整体质量。
- 有限的互动深度: 尽管在后期亚当尝试提供指导(关于色彩和构图),莉莉也表示感谢,但这部分互动姗姗来迟,且在很大程度上被之前的重复和脱节稀释了。
可以看到,一个较高层次水平的外部评价者可以对较低层次的LLM的水平进行合理评价。所以接下来我会考虑用外部API接口进行介入,用比较先进、高参数规模的LLM大模型来充当一个世界警察的角色。
(3)多代理系统
复杂的任务可以被分解并分配给多个专业化的代理共同完成。这种多代理系统(Multi-Agent Systems)的架构主要有几种形式:
- 网络(Network) :代理之间可以自由通信。
- 主管(Supervisor) :所有代理与一个中央主管通信,由主管进行路由决策。
- 层级(Hierarchical) :存在主管的主管,形成复杂的层级结构。
像CrewAI这样的框架通过基于角色的代理分配来促进这种协作 。例如,“思想链代理”(Chain-of-Agents, CoA)框架利用一系列“工作者”代理顺序处理长上下文的各个分块,并将汇总的证据传递给一个最终的“管理者”代理,其性能在长上下文任务上优于RAG和全上下文模型 。
多代理系统为上下文限制和任务复杂性提供了可扩展的解决方案。在角色扮演场景中,可以设想一个“导演”代理管理剧情走向,多个“角色”代理负责具体对话,以及一个“世界”代理追踪状态。正如一些叙事系统所展示的,这种劳动分工可以防止任何单个代理过载,并允许通过简单的局部互动涌现出复杂的、非预设的行为。
今天的实验引出了一个略显庞大的问题,明天我会挑选一个方向,重新设计架构,看看能否让对话不再那么僵硬。我考虑明天使用外部API进行测试,用deepseek-R1进行测试,排除一下LLM能力本身的问题。如果deepseek-R1也有明显的对话僵硬问题,那么就说明我需要完全重构架构,现行记忆系统等思路也要推翻重新设计。
7月4日 | 关于ALICE PROJECT的构思
这两天在闲暇之余看了几集刀剑神域,一个我高中时看的动漫。因为我没有想到这个故事竟然后来还有后续,而这部分后续的内容,即动漫中关于Underworld的内容,深深地打动了我。与此同时,我想起了以前看过的一个实验,是斯坦福博士生Joon的一个小规模试验。两者的碰撞激发了我的兴趣,于是我就构思了一个叫做“ALICE PROJECT”的计划。
Underworld是日本动漫《刀剑神域》中的一个设定,这个故事中的Alice让我想到了我前段时间做的一个Demo,就是试图让LLM通过和人类交互的方式来学会移动、认知到自己所处于一个局限性的世界中。

然后我就想起了很久之前看过的一个Joon Sung Park的多agents实验,论文链接点击这里。
我们先来看以下Joon的实验。在Joon的实验中,他加入了Retrieve机制:

在这个系统中,有几个关键点:
- 记忆与经验: 通过Memory Stream来让agent记录下生命中的瞬间
- 成长与反思: 通过Retrieve机制,让智能体从琐碎的记忆中提炼
- 自下而上(Bottom-up)的设计: 各个智能体不被中央大脑所控制
这个系统中的自下而上设计是非常关键的,我们先来看“下”,其核心要素包括:
- 独立的个体: 25个个体相互独立,每个个体都有自己的记忆、性格、见闻等
- 简单行为循环: 每个agent的人生都有一个非常简单的循环,即上图所示,这个循环是她们行为的驱动力
- 局部的信息: 每个agent都只能通过交流来获取外部信息,无法直接通过上帝视角获得
再来看“上”,即这个多智能体系统的目标:
- 社会网络的形成: agent在设定时有外向、内向之区分
- 信息的有机传播:“开派对”的想法沿着社交网络不断传播
- 群体行为的自协调: 多个智能体最终在没有中央大脑的指挥下,做出了在同一时间、去往同一地点的决策,最终促成了一个成功的集体活动——派对。
这个实验到这里就结束了。这个实验最大的亮点是,作者Joon只在一个个体中植入了开派对的想法,但这个想法通过社交传播,最终形成了一个非常成功的集体活动。这是一个非常令人惊讶的“涌现”(Emergence)。
当然,这个系统中也有很多必需的自上而下的设计,比如世界的物理法则、初始条件等。这些虽然被视为背景,但结构本身对自下而上的行为也有着很大的影响。其中最大的局限就是,所有的Agent都是用LLM来作为核心驱动的。
在年初的时候,我在上AI课的时候做了一个小型demo,即利用PROMPT来作为记忆,让一个不会走路的农夫Louise在通过和我不断对话的情况下逐步学会走路。但是这个实验很快让我意识到其局限性:调用LLM的时候,改变的仅仅是PROMPT和追加的记忆库,而作为思考载体的LLM虽然是“无所不知的大脑”,但它却是被“瞬间冻结的”。
换句话说,基于LLM的agent无论记忆如何变化,它的大脑模型都是静态的。我们回到刀剑神域的故事中,Alice的培育理念是通过Fluctlight把一个什么都不知道的婴儿大脑模型,即一个未经过预训练数据训练的LLM模型,植入到NPC Alice中,然后通过让Alice和环境、人类的交互,来不断实现自我成长。在Alice的成长过程中,除了上面的Memory Stream和Retrieve机制,还有一个关键的变化,即:
- 大脑模型本身的权重变化
换句话说,Alice式的成长是持续学习,其LLM模型本身会不断实时地、持续地更新和优化自身的神经网络。
我们再来看Underworld中的一些特别的机制,即死亡设定。在Underworld中,角色会感受到生存压力,如果角色强行违反禁忌目录,则会导致警卫队的出现或者自己的眼球的爆炸。这种真实的后果和现行LLM训练截然不同,我们可以认为现行的LLM是温和的,即,ChatGPT、Claude、Gemini、DeepSeek等,都无法感受到生存压力。
此外,除了语言之外,Alice生活在一个有具体物理规则的世界里。这一点倒是在现在有很多先锋研究,包括LeCun执着的世界模型。我想这个应该不会是大问题,具身智能、三维游戏等的发展都可以弥补这一块的短板。
所以,我们回顾现在LLM的系统结构和刀剑神域中的Alice的设定,不难发现,Alice作为一个Agent,具备一个至关重要的特征:
- 可塑造的价值观
这也是小说本身逻辑闭环的一点,就是为什么军方不使用已经可以进行杀戮的反派作为AI核心,反而非得去搞个Alice来。因为反派是谁强跟谁,更像是一种NPC设定,在战争中并不稳定。而Alice具备价值判断,即,一旦Alice认定自己所处的阵营是自己要守护的阵营,并且自己所参与的战争是为了守护自己阵营的正义之举,那么Alice将很难被轻易策反。 因此,Alice版本的智能体更符合军人的要求。
综上,当下的LLM多角色实验存在以下问题:
- LLM作为已经训练好的模型,输入Prompt后该LLM模型只会进行推理(Inference),而不会根据压力调整权重
- LLM是一次性训练好的,无法持续学习
为什么无法持续训练呢?
- 目前神经网络模型的架构基本都还是Transformer。 在训练的时候,采用反向传播算法(Backpropagation)等进行训练,一旦训练好,输入信息便只能被作为上下文(Context)输入来调用推理(Inference)。Inference的好处是成本极低、过程极快、应用效果极佳。
- 灾难性遗忘(Catastrophic Forgetting): 神经网络在学习新知识的时候,会倾向于覆盖和破坏旧的知识。换句话说,如果和人对话就进行权重调整,那么好不容易学会的物理学和历史等基础知识可能会被对话内容污染覆盖,从而导致模型高度不稳定。
- 巨大的计算成本: 调整权重的训练过程非常昂贵,如果每一次对话都启动一次,那么能源上无法支持。
- 安全与数据污染: 恶意用户可以投毒污染,让AI模型学会脏话、仇恨言论等。因此面向大众开放的模型必须冻结权重。
- 预训练太慢: 推理很快,但训练调整参数权重是非常慢的。如果对话的时候实时调整,那么对话将无法进行。
现行方案为什么是不可持续的?这就要引用Sutton的The Bitter Lesson了:任何用人类思维方式去修改AI模型的做法,长期看都是灾难性的。换句话说,RAG模式、外挂记忆等,都不是真正的思维能力的成长。只要神经网络权重被冻结,那么任何成长都是不现实的,这也是为什么Sutton非常不看好HFRL。OpenAI用了大量的HFRL,是因为ChatGPT的目标是高效回答问题以及编程、工作等,而Sutton追求的智能是类似Alice的那种真正的通过学习来获得智慧的方式。Sutton认为,没有人是一生下来就什么都知道的,人类通过交互可以快速学习,智慧本身必须能体现这一点,即在交互中学习。
Continual Learning 持续学习能实现AGI吗?
目前,全球顶尖的AI实验室和大学都在积极进行Continual Learning的相关研究。虽然这个方向都还是非常实验室的,但是他们的研究无疑是通往制造Alice这种真正的拥有智慧的智能体的重要路径。
我突然恍悟了,为什么OpenAI的很多人觉得AGI快来了,假如神经网络权重可以通过对话交流而实时地、合理地变更的话,那不就是AGI了吗?
Alice作为一个动漫角色,其很多特征都是想实现AGI必须实现的问题:
- 神经网络非冻结态,而是可以通过实时的交互进行学习成长,即能体现出“成长能力”
- 对于交互中的新的知识,是否选择覆盖旧的权重而建立新的权重,即能体现出“理解能力”
- 解决对齐问题: 如何建立一个核心价值观,即刀剑神域中的Alice那种站在人类道义和客观理性正义一边的,而不会仅仅因为领袖是个恶人就盲目遵从。这个可能是所有方面中最难被解决或者说最具争议性的,因为人类自身都无法解决对齐问题,所以才会有暴力、犯罪、欺骗、洗脑等事情发生。
- 内在动机的涌现:不仅仅因外部对话或交互才能改变自身的神经网络,通过自我反思、思考,也能改变自己的行为
- 世界模型,这个就不用赘述了
- 稳定性:不会被轻易污染。也不会轻易崩溃。
最后,我们来一起看一下Joon Sung Park的多agents实验中的一些特别值得借鉴和学习的部分:











总结来说,Joon的实验设计了一个非常精妙、巧妙的机制,如同做了一个日记本。但是,该实验并没有对LLM本身进行任何修改,因此该系统的性能将严重依赖于LLM本身的性能。 简单来说,同样是一本物理学手册,给普通人和给爱因斯坦,结果是截然不同的。而这个事情中不同的并非那个笔记本,而是普通人和爱因斯坦的大脑的不同。
刀剑神域在概念上启发了我,而Joon的作品则在技术上启发了我。 Joon的作品开创了一个非常有意思、非常有价值的探讨方向,我想结合两者,设立一个更大的舞台。换句话说,我想制作的是一个包含巨大地图、诸多角色,以及人类可以潜入的一个“真实”的世界。这个世界中的每一个居民都不是硬编码的NPC,而是通过LLM进行思考并扩展记忆的实体。
在此基础上,我尝试做了一个Demo(不过因为最近要准备面试在刷题,而且自己尝试做了一下也遇到很多问题 ,所以就暂且搁置一下):


我设计了一个简单的角色架构,伪代码如下:
# 设定一个通用的居民模板,然后创建新的居民的时候只需要调用这个模板创造instance就可以了
Class Resident:
def init:
type: human, creature, monster
age: 0 - 200
sex: male, female, unique
memory_size: 1 - 200
init_brain()
def init_brain:
brain即LLM大脑
每当一个居民初始化的时候
就要对其大脑进行初始化设定
def ability:
所有居民都会的能力:
(1)移动、寻路
(2)交互
(3)观察
def Cycle:
这个cycle是每个居民的生物时钟,必须和世界时钟保持一致
在世界时钟运行的时候,从T到T+1的时候,会进行一个半并发进程
即根据算力情况,逐步让所有生物的时钟从T进到T+1
当所有生物的T进到T+1后,就算是过了一个时间步
def Action_T:
在每一个特定的Timestamp(即T到T+1),居民会进行如下操作:
如果居民在清醒状态:
def Think:
思考,将自己的环境、状况、目标等发送给大脑
大脑返回思考结果
def Action:
根据思考结果进行动作
可以是:
移动
说话
等等
def End_Action:
结束动作
将刚才的观察、交流、动作等存储到memory_stream中
如果居民在睡觉状态:
def dream:
将当日的memory_stream中的内容发送给大脑,进行抽象理解
将抽象理解的结果存储到concept的memory_abstraction中
def Knowledge:
知识系统由一个数据库组成
每个居民在创建的时候都会复制数据库的内容,生成一个独特的副本
数据库内容:
【编号】 知识编号,主key
【类别】0:common_sense
1: history
2: geography
3: culture
4: morality
5: rules
【内容】 该知识的内容
【该知识的原出处】 0:无需出处,自然设定
1:church, 教会
2:dark,黑暗领域传出来的知识
3:oriental,东方之子内部流传的知识,比如维纳斯和骑士团东征的真相等
【是否掌握】在原初数据库中全是0,然后创建具体的resident的时候根据需要进行设定
0:没有掌握
1:掌握
2:怀疑 (这个比较特殊,暂时先留一个口子)
Class Human extend from Resident: (继承自Resident)
def init:
type: human
age: 1 - 100
sex: male, female
memory_size: 1 - 200
identity: "神父"、圣殿骑士、圣骑士、骑士、剑士、农夫、木匠、铁匠、普通人等
init_brain() # 初始化该居民的系统prompt
init_knowledge() # 初始化该居民的知识储备
def init_brain()
重写Resident的init_brain()
对于人类而言,需要用比较好的LLM
同时在这里把System-prompt也要写好
system-prompt存储在concept中
初始化Concept(system-prompt):
concept-ego例:
"""
我是谁:我叫亚瑟,是一名木匠
我在哪:我生活在一个叫临山镇的地方
"""
concept-goal例:
"""
我想打造出一个非常好看的门框
"""
concept-memory-abstration例:
"""
(这里先初始化一个虚构的过去)
我这几天在砍树采集木头
"""
def Memory Stream:
记忆流
用一个字典存储记忆
key is timestamp: value is the content
所有的对话等都会直接按照timestamp加入到记忆流中
def read_memory_stream(相关对象):
读取记忆流,根据memory_size的大小
X = memory_stream中最新的memory_size条记忆
根据相关对象,提取记忆流中符合相关性的内容,进行相关性检索:(也就是俗称的睹物思人)
Y = memory_stream中和相关对象相关的若干条记忆
这里可能需要用向量数据库
这一部分的作用是因相关性而唤醒记忆
return X, Y
def concept_ego:
存储我是谁、我在哪之类的信息
这个部分取代了system-prompt
在每日做梦的时候,会重新审视自己的ego
单独设计是为了预留自我革新的设计
def concept_goal:
存储抽象的理想概念、梦想、人生追求等
def concept_memory_abstraction:
存储对过去记忆的抽象,一般在做梦的时候对当日的memory_stream的内容进行整理加入
总结的时候需要有一个比较好的提炼流程:
(1)总结 Summarization
先用一个prompt让LLM将一天的记忆流进行高度概括
比如,prompt:"请将以下日常记录总结为5个关键事件"
(2)Reflection 反思
比如,prompt:"基于今天发生的这些关键事件,你对世界、对自己、或对你的目标有什么新的看法或者感悟吗?请用1-3句话概括。"
def init_knowledge:
根据具体的居民设定进行对应的初始化设定
具体内容就是读取数据库后对选定区域设定其知识掌握,掌握为1,没掌握为0
def get_knowledge:
在做梦的时候,如果发现特别的内容可以被认为是知识
便可以对知识进行修改
Class 木匠 extends from Human
def ability:
木匠独特的技能
其他职业也类似,从Human中继承
具体的暂时还不添加,等基本居民能力测试通过后再添加
由伪代码转换的python代码见test_scripts/V1/test4,其生成结果如下:

可以看到,两个实例化的对象具备一定程度的对话能力。这里要注意,我给神父的设定是“寻找具备超感官能力的恶魔后裔”,而画家的真实身份就是恶魔后裔,所以神父才一直在试图把话题转向探究画家是否具备听到风的声音这类的超自然能力,而画家则一直在试图把话题转移到其他方向上。