上篇python连连看与记忆翻牌游戏(1)讲了连连看的核心判断实现。(最后的remove边界判断有点问题,没有先判断两者是否相等。 感谢@井老师提醒) 原来的: def remove(p1,p2): # p1 和 p2 都在边界,可以直接删除 if (p1[0] == p2[0]) and (p1[0]==0 or (array[0])-1): print('上下边界可以直接删除') 这里直接前面加一句判断是否是同一个点: def remove(p1,p2): if p1[0]==p2[0] and p1[1]==p2[1]: return False # p1 和 p2 都在边界,可以直接删除 if (p1[0] == p2[0]) and (p1[0]= self.on_update() if __name__ == '__main__': game = MyGame() game.run() 上面的代码改改,可以变成记忆翻牌的游戏
我看了答案还是有些不能完全理解,于是又去b站翻了翻教程基础DP,其中提到记忆化的递归(也称记忆化搜索),相当于结合了dp和递归的优点(这时我又觉得比DP还厉害),然后就准备写写记忆化递归。 ---- 目录 1.记忆化递归的解释与分析 2.记忆化递归的应用 ---- 一、记忆化递归的解释与分析 前面说道它结合了dp和递归的优点,分别是记忆化和逻辑清晰易懂。 下面还是结合斐波那契数列的来理解: F(0)=F(1)=1; F(n)=F(n-1)+F(n-2) (n≥2,n∈N*); 这里直接给出函数代码,再进行解释: int F(int n){ if(n<2)f[n]=1; //这里f[]是储存数据的数组 else if(f[n]==0) //这里是重点 f[n]=F(n-1)+F(n-2); return f[n]; } 代码解释 打个比方,dp就相当于计算了一个方阵上所有的点(无论有没有利用价值),而记忆化递归相当于计算了方阵上有价值的点,因此记忆化递归的运行时间可能比dp还要短。
今天扫了收藏夹里一个TED视频,所以也借此总结一下上半辈子学到的点滴技巧吧~ 关于记忆技巧, 我印象最深的是小时候电视里有个老师在讲如何记忆英语单词,比如同样的词根,只要变换一个字母就可以记住一大批单词这样的技巧 第二个印象,是一个女的演讲者提到的记忆技巧, 她的记忆技巧可以归纳为一个词: “标新立异”, 也就是给每一个你要记忆的事物都打上一个不同寻常的标签,突出强烈的反差感, 比如在脑海里描绘一幅“隔壁老王蹲在一个十米的茅坑里 第三个印象是一个TED演讲者, 他的方法是是图像记忆法, 给每一个词语或者生硬的字面都配合上一幅图, 这种记忆法其实很好的阐述了那句英语谚语:"one picture is better than a 第四个印象是某人发明了个记忆宫殿(Memory Palace)这样的记忆技巧或者说术语,总结下来就是上下文关联(Context),将你要记忆的信息放到一个上下文中,这个上下文是任何你熟悉的场景,比如你的房子 关联性,将要记忆的信息通过某种故事线或者物理场景(上下文Context) 串联起来,可以帮助我们批量记忆一组信息,配合强烈反差的故事线更好。
在人工智能领域,尤其是基于大语言模型(LLM)的智能体(Agent)系统中,记忆机制是实现持续、连贯和个性化交互的核心基石。记忆系统模拟了人类的认知结构,通常划分为短期记忆和长期记忆。 第一章:短期记忆——智能体的工作记忆与意识流1.1定义与本质短期记忆是智能体用于处理当前任务或单次会话的临时信息存储区。 检索当新的会话开始时,Agent不会加载整个长期记忆库(那样会瞬间爆满短期记忆)。相反,它会根据当前的用户查询和短期记忆的上下文,去长期记忆库中寻找最相关的信息。 记忆冲突与更新:当新信息与旧记忆矛盾时,如何更新或版本化管理记忆(例如,用户之前喜欢咖啡,现在改喝茶了)。 检索长期记忆:系统将当前查询与短期记忆的上下文结合,作为“检索键”,在长期记忆库中进行向量相似性搜索,找出相关记忆。
图2:向量检索流程图向量检索流程向量检索流程包括以下步骤:数据预处理:对原始数据进行清洗和格式化,提取出有用的信息。 图3:知识图谱构建与更新流程图Neo4j构建示例以下是使用Neo4j构建知识图谱的Python代码示例:from py2neo import Graph, Node, Relationshipimport "创建实体间的关系""" # 获取实体节点 node1 = self.graph.nodes.match(name=entity1).first() node2 = self.graph.nodes.match(name=entity2).first() if node1 and node2: # 创建关系 "支持", "深度学习")]for triple in triples: analyzer.add_knowledge_triple(triple[0], triple[1], triple[2]
特别是在竞技记忆和应用记忆领域,我们看到了记忆力如何被推向极限,以及如何在日常生活中得到实际应用。本文旨在深入探讨这两个领域,分析其原理,探索它们的实际应用,并讨论如何通过刻意训练提高我们的记忆力。 一、竞技记忆:大脑的极限挑战 竞技记忆,顾名思义,是一种将记忆力竞赛化的活动。参与者需要在短时间内记忆尽可能多的信息,如一副洗乱的扑克牌、长串数字或复杂的图形等。 这不仅是一场对记忆力的挑战,更是对心智控制、专注力和心理素质的全面考验。 竞技记忆的技巧: 联想记忆:通过将抽象信息与熟悉事物关联,形成更容易记忆的图像。 二、应用记忆:日常生活的智慧 与竞技记忆相比,应用记忆更贴近日常生活,它关注如何将记忆技巧应用于学习、工作和生活中。 竞技记忆强调技巧和速度,而应用记忆强调实用性和长期记忆。两者之间的技巧和策略有交集,也有各自的特点。
作者重点研究了基于 GPT2、LlaMA、Mistral 的语言模型架构,其中 GPT2 采用了更新的 Rotary Position Embedding (RoPE) 技术。 如果训练时间充足,作者发现,不论使用何种模型架构,GPT2 或 LlaMA/Mistral,模型的存储效率均可以达到 2bit/param—— 即平均每个模型参数可以存储 2 比特的信息。 图 2:训练时间不足情况下的 scaling laws 然而,当我们观察训练时间不足的情况时,模型间的差异就显现出来了。 如上图 2 所示,在这种情况下,GPT2 模型能比 LlaMA/Mistral 存储超过 30% 的知识,这意味着几年前的模型在某些方面超越了今天的模型。为什么会这样? 这意味着,LLM 可以达到「信息论极限」的 1/4—— 因为 int8 参数只有 8 比特,但平均每个参数可以存储 2 比特的知识。
记忆架构的结合,构建高效的多模态记忆系统。 通过这种多模态记忆架构,显著提升AI系统的知识管理和推理能力。 目录 1. 本节为你提供的核心技术价值 2. 传统记忆系统的局限性 3. Multimodal Memory系统的核心优势 4. 2. 结构化记忆 结构化组织知识 提高知识的可访问性 Graph记忆 基于图结构存储知识 捕捉知识间的关系 记忆管理 管理不同记忆组件 协调记忆的存储和检索 记忆检索 从不同记忆组件中检索信息 快速找到相关信息 reply = handle_query(query) print(f"用户: {query}") print(f"客服: {reply}") 效果: 响应时间从传统系统的2秒降至0.5秒 准确率从传统系统的
什么是LSTM 2. 输⼊⻔、遗忘⻔和输出⻔ 3. 候选记忆细胞 4. 记忆细胞 5. 隐藏状态 6. LSTM与GRU的区别 7. LSTM可以使用别的激活函数吗? 8. 代码实现 9. 这篇将介绍另⼀种常⽤的⻔控循环神经⽹络:**⻓短期记忆(long short-term memory,LSTM)[1]。 (某些⽂献把记忆细胞当成⼀种特殊的隐藏状态),从而记录额外的信息。 2. 输⼊⻔、遗忘⻔和输出⻔ 与⻔控循环单元中的重置⻔和更新⻔⼀样,⻓短期记忆的⻔的输⼊均为当前时间步输⼊Xt与上⼀时间步隐藏状态Ht−1,输出由激活函数为sigmoid函数的全连接层计算得到。 关于激活函数的选取,在LSTM中,遗忘门、输入门和输出门使用Sigmoid函数作为激活函数;在生成候选记忆时,使用双曲正切函数Tanh作为激活函数。
有些同学问:智能体的 Memory 中 短期记忆(Short-term memory)与长期记忆(Long-term memory)是什么意思?有什么区别? 其中记忆包括短期记忆和长期记忆。 短期记忆是智能体在单一会话中维护即时上下文的能力。 工作机制: 它完全依赖于大模型(LLM)的上下文窗口。 拿 Cherry Studio 为例,长期记忆是通过“全局记忆”实现的。 你可以手动添加记忆,也可以在智能体里开启记忆。它就会把自己需要记忆的信息做判断,然后自动存储。 我们可以在整体设置这里打开全局记忆。 我们在和他们聊天的时候,它会先检索相关的记忆,然后再回答我们的问题。 如果它认为有些信息需要记住,也会自动保存到记忆中。 听着很完美,实际上还是会存在很多问题。 有时候记忆是 AI 自动决策的,没有和用户确认,那么这些记忆可能是错误的。 有了记忆之后,有些模型不够聪明,它有时会强行和相关记忆上靠,导致回答并不是我们想要的信息。
三、【案例】实现Agent 记忆持久化 3.1 核心开发流程 step 1:引入依赖:添加 Spring AI JDBC 记忆存储和 MySQL 驱动依赖; step 2:配置数据库:在application.properties 、MySQL 驱动、Lombok 2. 2:PromptChatMemoryAdvisor(Prompt 封装模式) * 适用于不支持角色对话的大模型(记忆封装到 System Prompt) */ @Bean 优先从 MySQL 存储的历史记忆中提取用户偏好(景点类型、饮食禁忌、交通方式、出行人数); 2. , "memoryType": "message", "userId": "1001" } } 查询 spring_ai_chat_memory 表,可见聊天记录已存储 测试 2:重启服务后复用记忆
长期记忆、短期记忆、遗忘机制及门控机制智能问答系统实现长期记忆、短期记忆、遗忘机制以及门控机制的方法如下: 长期记忆的实现- **使用数据库存储**:将大量的知识、信息和历史交互数据存储在数据库中。 这样系统可以通过遍历知识图谱来获取更全面和深入的知识,实现长期记忆。短期记忆的实现:滑动窗口- **使用缓存技术**:在系统内存中设置缓存,用于临时存储近期使用过的信息。 它可以根据不同的条件和策略,决定哪些信息可以进入系统的不同记忆模块,哪些信息可以被保留或遗忘。 遗忘门决定了从过去的记忆中丢弃多少信息;输入门控制新的信息有多少可以进入记忆单元;输出门决定了当前的记忆状态有多少可以作为输出。 - **示例**:假设用户询问“人工智能的发展历程”,系统通过输入门将相关的历史数据输入到记忆单元中,同时遗忘门会根据之前的记忆和当前的输入决定丢弃一些不相关的旧信息。
整个ABPCore 虽然版本变化 大,但使用流程基本不变吧, 我看官网上文档基本完毕了,官网文档有一个外国人视频,当时版本尚是0.18,总共有2小时吧。记录个学习笔记吧! 课程内容主要步骤记录: 【】所包含的是对应项目名 1、生成项目 abp new ,并编译全部 2、修改连接字符串: 【DbMigrator】修改连接字符串,并执行这个项目,就实现数据库的创建和写入种子数据
文章目录 离散无记忆信源的序列熵 信源的序列熵 离散有记忆信源的序列熵 平稳有记忆N次扩展源的熵 离散无记忆信源的序列熵 马尔可夫信源的特点:无后效性。 当信源无记忆时: \begin{aligned} p(\bar{X}&\left. _{2} 4=2 bit/序列 即用2比特才能表示该事件。 H(X)=2 \times 1.5=3 \mathrm{bit} / \text { 序列 } \end{array} 离散有记忆信源的序列熵 对于有记忆信源,就不像无记忆信源那样简单, 它必须引入条件熵的概念 为离散平稳有记忆信源, X 的 N 次扩展源记为 X^N, X^{N}=\left[X_{1} X_{2} \cdots X_{N}\right] 根据熵的可加性,得 H\left(X^
什么是UML类图 Class Diagram:用于表示类、接口、实例等之间相互的静态关系 虽然名字叫类图,但类图中并不只有类 记忆技巧 UML箭头方向: 从子类指向父类 我相信 很多同学都会有和我一样的想法 ,认为子类是以父类为基础的,箭头应该父类指向子类 那么我们改如何去记忆呢? 线的含义 实线 -->继承 虚线-->实现 可以看到 大雁是一个类 实现的某个接口 是由它指向接口 因为接口不知道有大雁的定义 鸭是的父类 唐老鸭只是其中的一个子类 所以是由它指向父类鸭 如何记忆呢
瑞士洛桑联邦理工学院的科学家们研究了大脑是如何通过突触形成记忆的。突触具有很高的可塑性,因此神经元可以改变信息传递速度和密度,从而改变记忆。 当人试图唤起某段回忆时,这些特定的记忆碎片就会组合在一起,形成完整的记忆。该研究团队的模拟过程显示,记忆形成和唤起的过程“就像交响乐队一样协调”。 根据其得出的结果,科学家们得到了一组复杂的算法,并称这是目前为止能够最精确地描述记忆形成过程的表示方法。 这一算法通过改良,可以用于研发新的科技,在大脑中激发新的记忆,或是完全抹去以前的记忆。 这说明科学家已经在它们脑中创造了新的记忆。 参考资料 1)记忆形成背后的数学方程:或可消除改变记忆(http://tech.sina.com.cn/d/f/2015-05-20/doc-icpkqeaz4838072.shtml) 2)Modeling
Agent 记忆遵循相同的逻辑。 Agent 记忆的四种类型 Agent 记忆并非单一概念,它是一个四层体系,各层服务于不同目的。 四种记忆类型映射到技术栈的不同组件上。工作记忆对应上下文窗口;情景记忆和语义记忆对应外部数据库(向量存储、关系型数据库、键值存储);程序记忆对应模型权重和系统提示词。 API 设计简洁:保存记忆、搜索记忆,剩下的交给它。 与 MCP 和 A2A 的关联 MCP(Model Context Protocol)解决的是 agent 与工具和数据源之间的通信问题;A2A(Agent to Agent)解决的是 agent 之间的相互通信问题 记忆是第三块:agent 如何在时间维度上维持自身的连续性。 换个角度理解MCP 处理当下,此刻能访问什么;A2A 处理协作,多个 agent 如何协调;记忆处理过去,从前次交互中留下了什么。
什么是记忆化搜索呢?搜索的低效在于没有能够很好地处理重叠子问题;动态规划虽然比较好地处理了重叠子问题,但是在有些拓扑关系比较复杂的题目面前,又显得无奈。 用一个公式简单地说:记忆化搜索=搜索的形式+动态规划的思想。 ,所以又称为记忆化搜索。 记忆化搜索递归式动态规划 1.记忆化搜索的思想 记忆化搜索的思想是,在搜索过程中,会有很多重复计算,如果我们能记录一些状态的答案,就可以减少重复搜索量 2、记忆化搜索的适用范围 根据记忆化搜索的思想 到此,就能明白,此题就是求出所有点与终点的最短距离,然后再从起点进行记忆化搜索。
一、记忆化搜索vs动态规划 . - 力扣(LeetCode) class Solution { public: //记忆化搜索 //1、设置一个备忘录,要确保备忘录初始化的结果不能跟我们实际计算的结果相同 //2、添加备忘录,计算的时候,如果备忘录的位置是初始值,进行修改 //3、每次计算的时候,去备忘录瞅一瞅,找到的话,就可以不算了 int memory[31]; int return memory[n]; } else { memory[n]=dfs(n-1)+dfs(n-2) vector<vector<int>> memo(m+1,vector<int>(n+1,-1));//建立一个记忆数组 return dfs(m,n,memo);// //不用记忆化搜索的话会超时,因为本身就是一个多叉树 int lengthOfLIS(vector<int>& nums) { vector<int> memo
论记忆化搜索 什么是记忆化搜索呢?搜索的低效在于没有能够很好地处理重叠子问题;动态规划虽然比较好地处理了重叠子问题,但是在有些拓扑关系比较复杂的题目面前,又显得无奈。 只不过略微优雅一点,把算过的,有可能发生重复的部分进行记忆,不要发生重复计算即可。这就是所谓的记忆化搜索,这是我的理解。 在学习它的过程中,人们总要讲到什么是动态规划,讲到普通的搜索。 */ #include<stdio.h> #include<string.h> char s1[1000],s2[1000],s3[1000]; int a[201][201];//记忆化搜索, s1[i]==s3[k]) return a[i][j]= dp(i+1,j,k+1); elseif(j<len2&&s2[j]==s3[k]) return s3); len1 =strlen(s1); len2 =strlen(s2); len3 =strlen(s3);