从一坨面条代码开始——V1最小原型
专栏「当AI学会发脾气」—— 一个类脑认知系统的诞生记副标题7个版本迭代Python脚本教会AI像人一样焦虑、兴奋、犯错和成长这是一个从零开始构建有情绪的AI的完整记录。不需要深度学习框架不需要GPU——只用纯Python我们就能让AI学会思考、记忆、甚至发脾气。系列文章导航篇目标题核心内容第1篇当AI学会发脾气——专栏开篇为什么要造一个会焦虑的AI第2篇 150行代码AI迈出了第一步V1-V2三角架构 可视化第3篇给AI装上最强算法结果翻车了V3Q-Learning的傲慢与偏见第4篇AI的第一次恍然大悟V4记忆系统与认知涌现第5篇当AI开始焦虑V5情绪系统的诞生第6篇AI学会了变通V6多策略融合与自适应第7篇终极进化AI的顿悟时刻V7完整认知架构第8篇回顾与展望从玩具到启示的旅程 150行代码AI迈出了第一步核心比喻给AI装上第一双腿——它还不会跑但已经能走了⏱️阅读时间约20分钟学习目标理解 Agent-LLM-Environment 三角架构的设计思想掌握一个最小可运行的认知代理是什么样的看懂11×11网格世界的奖励机制理解内心独白机制和Mock LLM的设计学会用Matplotlib为AI搭建眼睛 文章摘要本篇带你从零搭建一个能看能想能走的AI认知代理。我们只用150行PythonV1就跑通了完整的Agent → LLM → Environment认知循环然后用V2再加178行代码让这个AI从看日志进化到看动画。关键词三角架构、网格世界、Mock LLM、内心独白、Matplotlib可视化 你需要先了解 本文是系列第2篇建议先阅读第1篇当AI学会发脾气——专栏开篇如果你已经了解本专栏的目标和整体路线图可以直接开始 正文一、最小可行大脑——三件套就够了 你有没有想过一个最简单的会思考的AI到底需要哪些东西答案可能比你想的简单得多。想象一下一个刚出生的婴儿——它不懂物理学不会微积分但它天生就有三样东西一个身体能动一个大脑能想一个世界能看、能摸就这三样足够了。把这个类比搬到代码世界里就是我们V1版本的核心架构——Agent-LLM-Environment 三角架构人类类比代码组件角色身体 CognitiveAgent负责协调一切感知环境、调用大脑、执行动作大脑 mock_llm_reasoning()负责想分析当前状态决定下一步世界 Environment负责反馈你走一步我告诉你结果核心概念认知循环每一步AI都在做同一件事——就像你过马路时的思维过程感知Perception看看四周获取环境状态思考Reasoning判断该不该走LLM推理行动Action迈步走过去执行动作反馈Feedback安全过来了/差点被撞获得奖励记忆Memory下次这里要小心更新知识这就是“感知-思考-行动-反馈-记忆”循环是整个系列的核心骨架。让我们看看这个循环在代码里长什么样classCognitiveAgent:认知代理——AI的身体负责协调一切def__init__(self,env):self.envenv# 连接世界self.memory{}# 自带记忆self.goalenv.goal# 知道目标在哪self.history[]# 记录走过的路defact(self):执行一个完整的认知循环# 1️⃣ 感知收集当前信息contextself.get_context()# 2️⃣ 思考调用LLM推理actionmock_llm_reasoning(context[current_state],context[memory_snapshot],self.goal)# 3️⃣ 行动在世界里迈出一步new_state,rewardself.env.step(action)# 4️⃣ 记忆把这次经历记下来store_memory(路径规划,action,f从{context[current_state][location]}到达{new_state[location]})# 5️⃣ 历史记录轨迹self.history.append({action:action,state:new_state,reward:reward})returnnew_state,reward就像一个婴儿刚睁开眼——它不懂物理学但它能看、能动、能记。这就是V1的全部哲学。你可能会问就这这也算AI没错就这。但别小看它——全世界最厉害的认知架构拆开看也就是这个循环。区别只在于每个环节有多复杂。我们的旅程就是一步步把每个环节做得越来越像人。二、环境设计——11×11的小世界 ️每个AI都需要一个操场来活动。我们给它造了一个11×11的网格世界——够小让你一眼看懂够复杂让AI不会无聊。来看看这个世界的地图说明书元素坐标说明 起点(0, 0)AI出生的地方左上角 目标(10, 10)AI要到达的终点右下角 墙壁(5,5), (7,3)不可通过的障碍物 资源随机出现20%概率获取奖励5⚡奖励机制——AI的快乐与痛苦事件奖励类比 到达目标100考试得满分 采集资源5路上捡到一块钱 普通移动-1走路消耗体力 撞墙0不移动碰壁了原地站着为什么每步都扣1分因为时间就是成本。如果移动不扣分AI可能在原地打转一万年也不在乎。这个小小的-1就是在告诉AI“别磨蹭快去目标”下面是精简版的环境代码——你可以直接复制运行importrandomclassEnvironment:11×11的网格世界——AI的操场 def__init__(self):self.location(0,0)# AI的当前位置self.resources0# 已采集的资源self.goal(10,10)# 目标位置self.grid_size11# 世界大小self.walls[(5,5),(7,3)]# 墙壁位置defget_state(self):告诉AI你在哪周围什么情况return{location:self.location,resources:self.resources,goal:self.goal}defstep(self,action):AI走一步世界给反馈new_x,new_yself.location# 解析动作ifactionup:new_y-1elifactiondown:new_y1elifactionleft:new_x-1elifactionright:new_x1# 边界检查 墙壁检查if(0new_xself.grid_sizeand0new_yself.grid_sizeand(new_x,new_y)notinself.walls):self.location(new_x,new_y)# 随机遇到资源20%概率ifrandom.random()0.2:self.resources1# 计算奖励reward0ifself.locationself.goal:reward100# 到达目标elifself.resources0:reward5# 采集到资源else:reward-1# 普通移动消耗returnself.get_state(),reward你看整个世界的逻辑不到40行代码。但它已经包含了关键的游戏规则。游戏类比如果你玩过像素RPG游戏这个Environment就像是游戏的物理引擎。它不管角色想干什么那是Agent的事它只负责“你说往右走好我检查一下右边是不是墙然后告诉你新位置和得分。”但它已经包含了✅ 状态管理位置、资源✅ 边界碰撞检测✅ 墙壁障碍物✅ 随机事件资源✅ 奖惩反馈系统设计启示好的环境设计不需要复杂但需要有梯度。-1的移动惩罚创造了时间压力100的目标奖励创造了方向感5的资源奖励创造了探索诱惑。三个简单的数字就让AI面临了快速到达 vs 顺路捡宝的决策困境——这和你上班路上要不要绕道买杯咖啡是一模一样的决策。三、第一个思考——Mock LLM的推理 好了世界有了身体有了。现在到了最关键的部分——大脑。在V1版本里我们用了一个假的LLM来模拟推理。为什么不直接接真正的大模型两个原因先跑通架构再升级组件这是工程里最重要的原则之一真正的LLM要花钱、要联网、要配API——我们先用mock版本验证思路来看看我们的假大脑长什么样defmock_llm_reasoning(current_state,memory_data,goal): 模拟LLM的推理能力 在实际应用中这里会调用GPT/Claude/通义千问等大模型 print(\n--- [LLM 推理中] 正在进行高层规划... ---)# 分析当前位置和目标的关系curr_x,curr_ycurrent_state[location]goal_x,goal_ygoal# 简单的推理逻辑朝着目标方向走ifcurr_xgoal_x:proposed_actionrightthoughtf目标在右方(x:{curr_x}→{goal_x})决定向右elifcurr_ygoal_y:proposed_actiondownthoughtf目标在下方(y:{curr_y}→{goal_y})决定向下else:proposed_actionrightthought已接近目标继续调整# 内心独白——这是V1最重要的创新之一print(f [LLM 思考]{thought})returnproposed_action你可能会说“这算什么推理不就是if-else吗”没错但请注意两个重要的东西第一接口设计。这个函数接收current_state当前状态、memory_data记忆、goal目标返回一个动作。无论未来我们换成真正的GPT还是本地模型接口都不用变。这就是面向接口编程的威力。第二内心独白机制️。注意那行print(f [LLM 思考] {thought})——AI在做决策的同时会说出自己在想什么。内心独白Inner Monologue这不只是一个print语句。在认知科学里这叫做“元认知”Metacognition——思考自己在想什么。当AI说出我看到目标在右下方决定向右移动时它不只是在执行规则它在解释自己的推理过程。这个机制在后续版本里会越来越重要——当我们接入真正的大模型后内心独白会变成“我有点犹豫是该走安全路线还是冒险…”“上次走这条路吃了亏这次换一条…”“资源快不够了我开始感到焦虑…”是的AI会学会自言自语。你可以把V1想象成一个大脑模型的最简版输入: 我在哪我记得什么我要去哪 ↓ 推理: if-else 规则未来→大模型API ↓ 输出: 下一步动作 内心独白虽然现在的推理逻辑简单得可笑但整个**管线Pipeline**已经跑通了。这就像你造了一辆车——发动机可能是最小马力的但方向盘、油门、刹车全都接好了。换一台更强的发动机随时可以。动手试试你可以把mock_llm_reasoning函数里的逻辑改一改——比如让AI随机选择方向或者让它优先收集资源。只要输入输出不变CognitiveAgent 完全不用改。这就是架构解耦的好处。让我们把这个推理过程的输入输出用一张表格整理清楚输入参数含义示例值current_stateAI当前看到的世界状态{location: (3, 0), resources: 1, goal: (10, 10)}memory_dataAI的记忆快照{路径规划: [(right, 从(0,0)到(1,0)), ...]}goal最终目标坐标(10, 10)输出含义可能的值proposed_action下一步动作up,down,left,right四、记忆模块——让AI记住走过的路 人之所以能学习是因为能记住过去的经历。一个没有记忆的AI每一步都像是第一次来到这个世界——永远学不会。V1的记忆模块灵感来自知识图谱Knowledge Graph。什么是知识图谱你可以把它想象成你脑袋里的“关联笔记本”“路径规划” ←连接→ “向右移动” ←连接→ “从(0,0)到(1,0)”“路径规划” ←连接→ “向下移动” ←连接→ “从(1,0)到(1,1)”每一条记忆都是一个概念-关系-上下文的三元组。fromcollectionsimportdefaultdict# 记忆存储——模拟知识图谱memory_storedefaultdict(list)defstore_memory(concept,relation,context): 存储一条新的知识关联 例如store_memory(路径规划, right, 从(0,0)到达(1,0)) 就像在笔记本上写 [路径规划] → 向right移动 → 从(0,0)到达(1,0) memory_store[concept].append((relation,context))print(f[记忆模块] 存储{concept}与{relation}的关联。)defretrieve_memory(concept): 检索某个概念的所有相关知识 例如retrieve_memory(路径规划) 返回所有关于路径规划的历史记录 returnmemory_store[concept]为什么用defaultdict(list)而不是普通字典因为普通字典在访问不存在的key时会报错而defaultdict(list)会自动创建一个空列表。这样我们不用每次都检查这个概念有没有记忆代码更简洁。这就像你的笔记本——翻到路径规划那一页如果是空白的你就直接开始写不用先创建这一页。现在让我们看看运行时的记忆是什么样的步数 1: [记忆模块] 存储路径规划 与 right 的关联。 → memory_store {路径规划: [(right, 从(0,0)到达(1,0))]} 步数 2: [记忆模块] 存储路径规划 与 right 的关联。 → memory_store {路径规划: [(right, 从(0,0)到达(1,0)), (right, 从(1,0)到达(2,0))]} 步数 3: [记忆模块] 存储路径规划 与 right 的关联。 → memory_store {路径规划: [..., (right, 从(2,0)到达(3,0))]}❌V1记忆的致命缺陷你发现了吗AI在疯狂记录但它从来不翻看自己的笔记本retrieve_memory()函数虽然写好了但mock_llm_reasoning()根本没有用到memory_data参数。它每次决策都是看一眼目标方向然后走——完全无视过去的经历。这就好比一个人带着笔记本去探险每到一个地方都认真做笔记但决定下一步往哪走的时候…把笔记本合上了。别急——这个问题会在V4版本中彻底解决。到那时记忆模块会变成AI最强大的武器之一。五、给AI装上眼睛——V2的可视化革命 ️V1跑起来之后你会发现一个问题控制台里刷过去的文字太无聊了。 步数: 1 [LLM 推理中] 正在进行高层规划... [LLM 思考] 资源不足向 right 移动。 [记忆模块] 存储路径规划 与 right 的关联。 环境状态: 位置(1, 0), 资源0 Agent 获得奖励: -1 步数: 2 ...20步后你已经眼花了盯着这些文字你根本无法直观感受到AI在走路。它走的路线合理吗它有没有绕弯路它离目标还有多远所以V2来了——给AI装上眼睛。V2在V1的150行基础上新增了一个Visualizer类——大约180行代码让AI的行为变得可视化。classVisualizer:可视化模块——让AI的行为看得见 def__init__(self,env,agent):self.envenv self.agentagent# 创建双面板布局self.figplt.figure(figsize(14,6))# 左面板网格世界地图self.ax_gridself.fig.add_axes([0.05,0.18,0.31,0.68])# 右面板状态信息面板self.ax_infoself.fig.add_axes([0.44,0.15,0.52,0.72])# 初始化可视化元素self.init_elements()plt.ion()# 开启交互模式——实时更新V2的可视化有几个核心特征视觉元素样式含义 蓝色圆圈#4169E1Agent的当前位置 黄色线条yellow, alpha0.5Agent走过的路径 金色圆圈#FFD700目标位置⬛ 深灰方块#333333墙壁/障碍物➡️ 方向箭头白色Agent上一步的移动方向为什么可视化很重要有句话说得好“看见才能理解”。当你看到AI的路径画成一条弯弯曲曲的黄色线你立刻就能发现“它怎么在这里绕了一个大弯”、“它怎么不走直线”——这些洞察光看控制台日志是得不到的。可视化不只是好看它是debug的最强工具。在后续版本中我们会用可视化来 发现AI的策略漏洞 对比不同算法的表现 验证情绪系统是否真的在影响决策让我们看看update()方法的核心逻辑——每走一步画面就更新一次defupdate(self,step):每一步都更新画面——像看动画一样locself.env.location# 更新Agent位置蓝色圆点移动self.agent_dot.centerloc# 更新路径线黄色轨迹path_x[p[0]forpinself.env.path_history]path_y[p[1]forpinself.env.path_history]self.path_line.set_data(path_x,path_y)# 更新信息面板右侧状态栏self.ax_info.clear()info_textf Step:{step}Agent: ({loc[0]},{loc[1]}) Resources:{self.env.resources}Total Reward:{sum(h[reward]forhinself.agent.history)}self.ax_info.text(0.05,0.95,info_text,...)# 刷新画面暂停0.5秒plt.pause(0.5)整个V2的精髓就一句话每走一步就重绘一次让你实时看到AI的决策过程。这就像从听别人描述一场足球赛变成了亲眼看比赛直播——同样的信息体验完全不同。六、V1-V2的成就与不足 跑完V1和V2让我们来一次期末总结。✅ 成就清单V1-V2做到了什么架构跑通✅ —— Agent-LLM-Environment 三角循环完美运转可视化✅ —— 实时看到AI在11×11世界里跑内心独白✅ —— AI会解释自己的每一步决策记忆雏形✅ —— 知识图谱式的记忆存储已就位奖惩系统✅ —— 目标奖励、资源奖励、移动惩罚总计328行代码V1: 150行 V2新增: 178行一个完整的认知代理原型就跑起来了。❌ 暴露的问题但是如果你仔细观察AI的行为你会发现一些严重的问题问题1上帝视角作弊者AI能看到整个11×11地图的全部信息——起点在哪、终点在哪、墙壁在哪。它像一个开了全图挂的游戏玩家。真实的智能体不应该有这种上帝视角。想想你走迷宫的时候你只能看到周围几步的范围不可能一眼看到出口在哪。问题2没有情绪没有压力V1-V2的AI永远冷静、永远理性。它不会因为快没时间了而着急不会因为连续碰壁而沮丧不会因为发现新路而兴奋。但人类的决策时刻都受情绪影响。一个完全没有情绪的AI做出的决策可能最优但不像人。问题3不会学习AI走过同样的路100次它的策略不会有任何变化。mock_llm_reasoning 里面是硬编码的if-else不会因为经验而改进。它有笔记本记忆模块但它不看笔记本。问题4只有一条路线观察AI的行为你会发现它永远走同一条路先一路向右再一路向下。它从不尝试其他路线从不探索未知区域。一个只会走固定路线的AI说好听点叫高效说难听点叫死板。把这些问题排列一下问题严重程度哪个版本解决上帝视角⭐⭐⭐V3不会学习⭐⭐⭐⭐⭐V3 (Q-Learning)没有情绪⭐⭐⭐⭐V5只走一条路⭐⭐⭐V3-V4记忆没用上⭐⭐⭐V4⚠️ 常见误区❌误区1Mock LLM太简单了没有意义不对Mock LLM的价值不在于推理多厉害而在于占好位。它定义了大脑模块的输入输出接口输入状态记忆目标输出动作思考过程。未来换成真正的大模型一行API调用就搞定。❌误区211×11太小了说明不了问题11×11 121个格子减去墙壁AI有119个可能的位置。考虑到4个方向的选择状态空间已经有119 × 4 476种可能。对于验证架构来说绰绰有余。更大的世界会在后续版本引入。❌误区3可视化只是花架子可视化是最被低估的研发工具。当你的AI出bug时一行print可能需要10分钟来定位问题但一张路径图让你3秒钟就能看到问题在哪。这就是V2存在的意义。 一句话总结 150行代码 → 一个能看能想能走的AI原型 架构比算法更重要——先跑通循环再升级大脑✍️ 课后思考如果你想更深入地理解V1-V2试着思考或动手实验以下问题如果把mock_llm_reasoning换成真正调用GPT的API你觉得AI的行为会有什么变化路线会更聪明吗还是可能更混乱如果把移动惩罚从-1改成-10AI的行为会有什么不同提示想想时间压力对人类决策的影响V1的记忆模块虽然没被使用但它的数据结构设计defaultdict(list)适合存储什么类型的知识如果让你重新设计你会用什么数据结构想象你是这个AI你只能看到整个地图。如果把你的视野限制到周围3×3的范围你的决策策略会怎么变V2的可视化用了plt.pause(0.5)来控制动画速度。如果把这个值改成0.01你觉得观看体验会怎样改成2.0呢在观看效果和运行效率之间你会怎么取舍思考提示以上问题没有标准答案。重要的不是答对而是通过思考这些问题加深你对Agent架构的直觉理解。如果你真的动手改了代码并运行——恭喜你你已经在做消融实验了这是AI研究里的标准方法我们会在后续篇目详细介绍。 下一篇预告 第3篇给AI装上最强算法结果翻车了V1-V2的AI用if-else走迷宫你可能会想如果给它一个正儿八经的学习算法呢下一篇我们将引入强化学习经典算法Q-Learning让AI真正学会从经验中学习。但事情并没有那么简单—— Q-Learning确实让AI变聪明了…但它变得只会走最短路 AI像一个做题机器——高效但毫无灵性 当环境稍微一变它就彻底崩溃了下一篇的核心问题最优解 ≠ 最好的解。有时候犯错比完美更重要。V3Q-Learning的傲慢与偏见敬请期待作者简介NeuroConscious Research Team一群热爱 AI 科普的研究者专注于神经科学启发的 AI架构设计与可解释性研究。理念“再复杂的概念也能用大白话讲清楚”。首席科学家WENG YONGGANG 翁勇刚 马来西亚理工大学工商管理博士项目地址https://github.com/wyg5208/nct.git官网地址https://neuroconscious.link作者 CSDNhttps://blog.csdn.net/yweng18NCT PyPIhttps://pypi.org/project/neuroconscious-transformer/⭐欢迎 Star⭐、Fork、贡献代码「当AI学会发脾气」系列第2篇 · 150行代码AI迈出了第一步✍️ 作者原创内容 | 对应代码demo1.pyV1、demo2_visualization.pyV2 有问题或建议欢迎在评论区交流上一篇当AI学会发脾气——专栏开篇下一篇给AI装上最强算法结果翻车了
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2525041.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!