让AI拥有记忆:从\"金鱼脑\"到能记住你的智能体"

admin 2026-10-16 13:14:07 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

让 AI 拥有记忆:从\"金鱼脑\"到能记住你的智能体

原创

渊渟鹤峙
渊渟鹤峙

AI+网络安全笔记

2026年10月14日 19:03
北京

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

让 AI 拥有记忆:从\"金鱼脑\"到能记住你的智能体

你有没有过这种体验——和 AI 聊了半小时,它突然问你\"请问你想了解什么?\",仿佛前面所有的对话都被一键清空。你告诉它你叫张三、是 Python 开发者、正在学机器学习,结果重开一个窗口,它又变回了那个客套的陌生人。

这不是 AI 在装傻,而是它天生就没有记忆。

今天这篇文章,我们就来聊聊怎么给智能体装上\"记忆\"和\"知识库\"这两块关键拼图。内容来自 Datawhale 的开源框架 Hello-Agents 第八章,我会尽量把原理讲透,同时保留几段核心代码,让你既能看懂思路,也能上手实践。

一、AI 为什么会\"失忆\"

要理解记忆系统为什么重要,得先搞清楚大语言模型(LLM)的一个根本特性:它是无状态的。

所谓无状态,就是说每一次你向模型发起请求,对模型而言都是一次全新的、孤立的计算。它不会自动\"记得\"上一句话你说了什么。我们平时感觉 AI 能连续对话,其实是程序在背后偷偷把历史记录一起塞了进去——一旦这个机制缺席,AI 就立刻\"断片\"。

看一段代码你就明白了:

from hello_agents import SimpleAgent, HelloAgentsLLM

agent = SimpleAgent(name=\"学习助手\", llm=HelloAgentsLLM())

# 第一次对话
response1 = agent.run(\"我叫张三,正在学习Python,目前掌握了基础语法\")
# \"很好!Python基础语法是编程的重要基础...\"

# 重启程序后,重新创建 Agent
agent = SimpleAgent(name=\"学习助手\", llm=HelloAgentsLLM())
response2 = agent.run(\"你还记得我的学习进度吗?\")
# \"抱歉,我不知道您的学习进度...\"

同一进程内的连续对话,框架会用一个临时的消息列表暂存上下文,所以短期内看起来\"记得住\"。但这种历史只是过眼云烟——它不会跨会话持久化,也无法被长期检索、整合或遗忘。程序一重启,一切归零。

由此带来了四个现实问题:长对话里早期的重要信息会被挤掉;AI 记不住你的偏好和习惯;它无法从过去的成功失败中吸取教训;多轮对话里甚至可能自相矛盾。

除了\"记不住对话\",LLM 还有第二个硬伤:它的知识是静态的、有限的。所有知识都来自训练数据,训练一结束,它对世界的认知就被\"冻结\"在了那个时间点。这导致它不知道最新发生的事,在专业领域深度不够,还容易一本正经地胡说八道(也就是所谓的\"幻觉\")。

一个没有记忆、知识又停留在过去的 AI,就像一个每天醒来都失忆的人——聪明,却无法积累。

针对第一个问题,我们需要记忆系统(Memory);针对第二个问题,我们需要检索增强生成(RAG)。这两块,正是本章要给 Hello-Agents 补上的核心能力。

二、向人脑借智慧:记忆是怎么形成的

有意思的是,工程师在设计 AI 记忆系统时,回头看的是人类自己的大脑。

认知心理学早在上世纪就把人类记忆拆解成了一套多层级系统。它不只是\"存东西\",还会根据重要性、时间和上下文,对信息进行分类和整理。

图 1 人类记忆系统的层次结构

按照经典理论,人类记忆大致分三层:

感觉记忆,持续时间极短(0.5–3 秒),容量却极大,负责暂存感官接收到的一切信息。你扫一眼房间就能\"看到\"全貌,靠的就是它。

工作记忆,持续 15–30 秒,容量有限(大约 7±2 个信息块),负责当前任务的处理。它就像你脑子里的\"临时工作台\"。

长期记忆,可以持续终生,容量几乎无限。它又进一步分成:管技能和习惯的程序性记忆(比如骑车,学会了就忘不掉),以及能用语言表达的陈述性记忆。后者再细分为存放通用知识的语义记忆(\"巴黎是法国首都\")和记录个人经历的情景记忆(\"昨天开会说了啥\")。

这套分类看着眼熟吗?后面的 AI 记忆设计,几乎就是照着它抄的作业。

不仅如此,认知科学还总结了记忆形成的五个阶段:

图 2 记忆形成的认知过程

分别是编码(把感知到的信息转换成可存储的形式)、存储(保存下来)、检索(需要时提取出来)、整合(把短期记忆沉淀为长期记忆)和遗忘(清理掉不重要或过时的信息)。

请记住\"整合\"和\"遗忘\"这两个词——它们是人类记忆最精妙的地方,也是后面 AI 记忆系统里最出彩的设计。一个只进不出的记忆系统,迟早会被垃圾信息淹没。

三、HelloAgents 的记忆系统:四种记忆各司其职

借鉴人脑的层次结构,Hello-Agents 设计了一套分层的记忆与 RAG 架构。

图 3 HelloAgents 记忆与 RAG 系统整体架构

这里有个关键的工程决策:记忆和 RAG 被设计成两个独立的工具。memory_tool 负责存储和维护对话过程中的交互信息,rag_tool 负责从外部知识库检索信息,并把重要的检索结果自动沉淀到记忆里。两者分工明确,又能协同工作。

整个记忆系统的运转流程,同样对应了认知科学的那几个阶段:

图 4 HelloAgents 记忆系统的完整工作流程

系统由四种记忆模块构成,每一种都针对特定场景和生命周期做了优化:

工作记忆(Working Memory)扮演\"短期记忆\"的角色,存当前对话的上下文。为了快,它干脆用纯内存存储,容量被有意限制(默认 50 条),还配了 TTL(存活时间)机制自动清理。会话一结束,它就自动清空——毕竟临时信息不值得长期占用资源。

情景记忆(Episodic Memory)负责长期存储具体的交互事件和经历。它带丰富的上下文,支持按时间线或主题回顾,是智能体\"复盘\"和学习过往经验的基础。

语义记忆(Semantic Memory)存的是更抽象的知识、概念和规则,比如通过对话了解到的用户偏好、需要长期遵守的指令。它是智能体构建\"知识体系\"、进行关联推理的核心。

感知记忆(Perceptual Memory)专门处理图像、音频等多模态信息,还支持跨模态检索——用文字去搜图片,也不是不行。

3.1 一个统一入口,八种操作

对开发者来说,这套复杂的系统被封装成了一个极简的接口 MemoryTool。它遵循\"统一入口,分发处理\"的设计模式:

def execute(self, action: str, **kwargs) -> str:
    \"\"\"执行记忆操作,支持:
    - add: 添加记忆(working/episodic/semantic/perceptual 四种类型)
    - search: 搜索记忆
    - summary: 获取记忆摘要
    - forget: 遗忘记忆(多种策略)
    - consolidate: 整合记忆(短期→长期)
    ...
    \"\"\"
    if action == \"add\":
        return self._add_memory(**kwargs)
    elif action == \"search\":
        return self._search_memory(**kwargs)
    # ... 其他操作

一个 action 参数指定要干什么,**kwargs 让每种操作都能有自己灵活的参数。这种设计把复杂度藏在了接口背后。

其中最值得一说的,是 forget(遗忘)和 consolidate(整合)这两个最有\"认知科学味\"的操作。

遗忘支持三种策略:基于重要性(删掉不重要的)、基于时间(删掉过时的)、基于容量(快装满了就删最次要的)。

# 删除重要性低于 0.2 的记忆
memory_tool.execute(\"forget\", strategy=\"importance_based\", threshold=0.2)
# 删除超过 30 天的记忆
memory_tool.execute(\"forget\", strategy=\"time_based\", max_age_days=30)

整合则模拟了大脑把短期记忆固化为长期记忆的过程。默认设置是:把重要性超过 0.7 的工作记忆,升级为情景记忆。整个过程全自动,系统会自己挑出符合条件的记忆做类型转换。

记忆系统真正的智能,不在于记住多少,而在于知道该记住什么、该忘掉什么。

3.2 藏在评分公式里的心思

四种记忆在检索时,各自有一套评分公式,用来决定\"哪条记忆最该被想起来\"。这些公式特别能体现设计者的巧思,我们挑两个对比一下。

情景记忆的评分是:

(向量相似度 × 0.8 + 时间近因性 × 0.2) × (0.8 + 重要性 × 0.4)

注意它给\"时间近因性\"留了 0.2 的权重——因为具体事件越近发生的越相关,昨天的会议显然比去年的更值得优先想起。

语义记忆的评分则是:

(向量相似度 × 0.7 + 图相似度 × 0.3) × (0.8 + 重要性 × 0.4)

它没有\"时间\"这一项,却多了\"图相似度\"。因为抽象知识不怕旧(\"巴黎是法国首都\"放一百年也对),但它需要关系推理——语义记忆底层用了 Neo4j 知识图谱,能顺着实体之间的关系,挖出概念间隐含的关联。

两个公式里都有一项 (0.8 + 重要性 × 0.4),把重要性的影响严格限制在 [0.8, 1.2] 这个窄区间内。这是一个很克制的做法:重要性只是微调,绝不能喧宾夺主地压过语义相关性,否则检索准确性就崩了。

3.3 30 秒上手体验

讲了这么多原理,其实用起来非常简单。装好框架后,几行代码就能让 Agent 拥有记忆:

from hello_agents import SimpleAgent, HelloAgentsLLM, ToolRegistry
from hello_agents.tools import MemoryTool

llm = HelloAgentsLLM()
memory_tool = MemoryTool(user_id=\"user123\")

tool_registry = ToolRegistry()
tool_registry.register_tool(memory_tool)

agent = SimpleAgent(name=\"记忆助手\", llm=llm, tool_registry=tool_registry)

# 存一条语义记忆
memory_tool.run(\"add\",
    content=\"用户张三是一名Python开发者,专注于机器学习\",
    memory_type=\"semantic\", importance=0.8)

# 之后随时搜出来
print(memory_tool.run(\"search\", query=\"Python开发者\", limit=3))

这里遵循了框架一贯的设计原则:把能力封装成标准工具,而不是造一个新的 Agent 类。你现有的 Agent 只要挂上工具,立刻就能获得新技能。

四、RAG:给 AI 挂一个\"外挂知识库\"

记忆解决的是\"记住对话\",RAG 解决的则是\"知识不够\"。

RAG 全称检索增强生成(Retrieval-Augmented Generation)。名字听着唬人,拆开就三个词:检索是从知识库里查相关内容,增强是把查到的结果塞进提示词里辅助模型,生成是输出一个既准确又有出处的答案。

一句话概括它的核心思想:在模型开口回答之前,先带它去查资料。

图 5 RAG 系统的核心工作原理

整个流程分两大阶段。数据准备阶段,系统把外部知识经过提取、分割、向量化,建成一个可检索的数据库;应用阶段,用户一提问,系统就从库里检索相关信息,注入 Prompt,再驱动大模型生成答案。

4.1 RAG 的三次进化

RAG 技术这几年经历了三个明显的阶段:

朴素 RAG(2020–2021),流程简单粗暴,就是\"检索-读取\"。检索靠 TF-IDF、BM25 这类关键词匹配,字面匹配还行,但完全不懂语义——你搜\"电脑\",它匹配不到只写了\"计算机\"的文档。查到的内容也不加处理,直接拼进提示词。

高级 RAG(2022–2023),随着向量数据库和文本嵌入技术成熟,检索转向了稠密嵌入的语义检索。文本被转成高维向量,模型开始能理解\"语义相似\"而不只是\"字面相同\"。同时引入了查询重写、文档分块、重排序等一堆优化。

模块化 RAG(2023 至今),系统各部分被拆成可插拔、可组合的独立模块,检索上有了混合检索、多查询扩展、假设文档嵌入,生成上有了思维链推理、自我反思修正。Hello-Agents 的 RAG 就属于这一代。

4.2 一切文档,先变成 Markdown

RAG 系统一个很聪明的设计,是用微软开源的 MarkItDown 作为统一的文档转换引擎。

不管你的输入是 PDF、Word、Excel、PPT,还是图片(走 OCR)、音频(走转录),系统都先把它统一转换成 Markdown 格式。这样做的好处是——后续的分块、向量化、存储流程只需要面对一种格式,大大简化了工程复杂度。

任意格式文档 → MarkItDown 转换 → Markdown 文本 → 智能分块 → 向量化 → 存储检索

转成 Markdown 后,系统就能利用它的标题结构(#、##、###)做语义感知的智能分块——按标题层次切分,保证每个块既大小合适、又语义完整,不会把一句话拦腰截断。分块时还专门处理了中英文混合的 Token 估算,中文按字算、英文按词算,控制得更精准。

4.3 两个高级检索技巧:MQE 与 HyDE

这是全章我觉得最有意思的部分。实际用的时候,用户的提问和文档里的原文经常\"对不上暗号\",导致明明有相关内容却搜不到。为此 Hello-Agents 用了两个互补的策略。

多查询扩展(MQE)的洞察是:同一个问题有很多种问法。它用 LLM 把\"如何学习 Python\"自动扩展成\"Python 入门教程\"\"Python 学习方法\"\"Python 编程指南\"等多个查询,并行检索后合并结果。这样一来,不管文档里用的是哪种说法,都能被捞出来,召回率能提升 30%–50%。

def _prompt_mqe(query: str, n: int) -> List[str]:
    \"\"\"用 LLM 生成多样化的查询扩展\"\"\"
    prompt = [
        {\"role\": \"system\", \"content\": \"你是检索查询扩展助手。生成语义等价或互补的多样化查询。\"},
        {\"role\": \"user\", \"content\": f\"原始查询:{query}\
请给出{n}个不同表述的查询。\"}
    ]
    # ...

假设文档嵌入(HyDE)就更巧妙了,它的核心思想是\"用答案找答案\"。

传统检索是拿\"问题\"去匹配\"文档\",但问题是疑问句、文档是陈述句,两者在语义空间里天然有隔阂。HyDE 的做法是:先让 LLM 根据问题编一段假设性的答案,再拿这段假答案去检索真实文档。哪怕这段假答案内容不完全对,它包含的关键术语、概念和表述风格,也能精准地把系统引向正确的文档。

def _prompt_hyde(query: str) -> Optional[str]:
    \"\"\"生成假设性文档用于改善检索\"\"\"
    prompt = [
        {\"role\": \"system\", \"content\": \"根据用户问题,先写一段可能的答案性段落,用于向量检索。\"},
        {\"role\": \"user\", \"content\": f\"问题:{query}\
请直接写一段包含关键术语的段落。\"}
    ]
    # ...

MQE 解决\"用词多样\"的问题,HyDE 解决\"语义鸿沟\"的问题。一个把问题问出花来,一个干脆先猜个答案——工程上的巧思,往往就藏在换个角度想问题里。

实践中,一般查询开 MQE 就够;专业领域查询建议 MQE + HyDE 双开;性能敏感场景则只用基础检索。

五、实战:做一个会记忆的文档问答助手

原理讲完,来看一个把记忆和 RAG 捏在一起的完整案例——智能文档问答助手。

场景很实际:我们经常要啃大量技术文档、论文、产品手册,一页页翻效率极低,还没法建立知识间的关联。这个案例以 Datawhale 另一门教程 Happy-LLM 的 PDF 文档为例,用 Gradio 搭一个 Web 应用,让你能对着 PDF 直接提问、记笔记、看学习报告。

整个系统的运转分五步,形成一个闭环:

图 6 智能问答助手的五步执行流程

处理 PDF 的信息会记进记忆系统,检索结果也会记进去,记忆系统负责添加/检索/整合/遗忘,再由智能路由整合 RAG 和 Memory,最后汇总统计生成学习报告。

应用的核心是一个 PDFLearningAssistant 类,它把 RAGTool 和 MemoryTool 的调用逻辑封装了起来。看它的\"提问\"方法,就能明白两个工具是怎么协作的:

def ask(self, question: str, use_advanced_search: bool = True) -> str:
    \"\"\"向文档提问\"\"\"
    ifnot self.current_document:
        return\"⚠️ 请先加载文档!\"

    # 【MemoryTool】先把问题记进工作记忆
    self.memory_tool.execute(\"add\", content=f\"提问: {question}\",
        memory_type=\"working\", importance=0.6, session_id=self.session_id)

    # 【RAGTool】用高级检索(MQE + HyDE)获取答案
    answer = self.rag_tool.execute(\"ask\", question=question, limit=5,
        enable_mqe=use_advanced_search, enable_hyde=use_advanced_search)

    # 【MemoryTool】再把这次学习记进情景记忆
    self.memory_tool.execute(\"add\", content=f\"关于'{question}'的学习\",
        memory_type=\"episodic\", importance=0.7,
        event_type=\"qa_interaction\", session_id=self.session_id)

    return answer

一次提问,背后是三次协作:先记录问题(工作记忆),再检索答案(RAG),最后记录这次学习行为(情景记忆)。RAG 负责\"从文档找答案\",Memory 负责\"记住你的学习历程\"——两者一结合,助手就既有知识、又有了对你的了解。

来看实际运行效果。进入主页面,先初始化助手(加载数据库、模型、API),再传入 PDF 并点击加载:

图 7 问答助手主页面

第一个功能是智能问答,基于上传的文档检索,还会返回参考来源和相似度——这正是 RAG 能力的体现,答案有据可查,不再是凭空编造:

图 8 智能问答:返回答案的同时给出参考来源

第二个功能是学习笔记,可以勾选相关概念、撰写笔记内容。这部分用的是 Memory 工具,你的笔记会存进数据库(语义记忆),方便后续统计和生成学习报告:

图 9 学习笔记:概念勾选与笔记撰写

最后是学习进度统计与报告生成,能看到本次加载的文档数、提问次数、笔记数量,并把问答结果和笔记整理成一份 JSON 报告导出:

图 10 学习进度统计与报告生成

完整代码在框架的 code/chapter8/11_Q&A_Assistant.py,启动后访问 http://localhost:7860 就能用。强烈建议亲手跑一遍,那种\"AI 终于记住我了\"的感觉,比看十篇文章都直观。

六、写在最后:跨学科的思维方式

这一章表面上是讲怎么给 AI 加记忆和知识库,但更值得琢磨的,是它背后的思路——把认知科学的理论,翻译成可落地的工程方案。

人类记忆的层次结构,变成了四种记忆模块;大脑的\"编码-存储-检索-整合-遗忘\",变成了 MemoryTool 的几个 action;连\"遗忘\"这种看似消极的机制,都被设计成了保持系统健康的必要手段。

图 11 Hello-Agents 第八章知识总结

如果你想继续深入,这里有三个方向值得尝试:从零手写一个基础记忆模块,再逐步加特性;在自己的项目里对比不同嵌入模型和检索策略的效果;以及把这套记忆+RAG 架构,真正用到一个个人项目里去。

记忆和检索这套架构,绝不止适用于学习助手。客户服务、技术支持、个人助理……任何需要 AI \"记住上下文\"并\"查得到资料\"的场景,都是它的用武之地。

最后留个问题和你聊聊: 如果让你给自己常用的 AI 助手设计记忆功能,你最希望它记住你的什么?是工作习惯、知识水平,还是那些反复要交代一遍的偏好?欢迎在评论区分享你的想法,说不定下一个爆款 AI 功能的灵感,就藏在你的吐槽里。


本文基于 Datawhale 开源项目 Hello-Agents 第八章《记忆与检索》整理,想动手实践的读者可前往项目仓库获取完整代码。

Docker修复DockerHub存续两年高危漏洞,可冒用他人身份推送镜像" 网络安全文章

Docker修复DockerHub存续两年高危漏洞,可冒用他人身份推送镜像"

Docker修复了一处存续两年多的高危漏洞CVE-2026-105445,攻击者可利用个人访问令牌在账号转组织过程中冒用他人身份操作镜像仓库,CVSS评分9.4。Docker已完成修复并全面排查约30.4万次推送操作,未发现实际利用证据。建议用户轮换访问令牌,检查异常令牌及组织账号,组织应优先使用组织访问令牌。
让AI拥有记忆:从\"金鱼脑\"到能记住你的智能体" 网络安全文章

让AI拥有记忆:从\"金鱼脑\"到能记住你的智能体"

本文介绍如何为AI智能体构建记忆系统与知识库,借鉴人脑记忆层次设计了工作记忆、情景记忆、语义记忆和感知记忆四种模块,通过统一接口MemoryTool实现添加、搜索、遗忘和整合等操作,并设计了基于重要性、时间近因性和图相似度的评分公式。RAG部分介绍了从朴素到模块化的演进,采用MarkItDown统一文档转换、语义感知分块、MQE和HyDE等高级检索技巧,提升召回率30%-50%。
渗透测试|账号密码泄露导致获取到数据库" 网络安全文章

渗透测试|账号密码泄露导致获取到数据库"

本文记录一次渗透测试实战:通过前端JS文件发现硬编码账号密码登录后台,进而发现SQL注入与未授权访问漏洞。文章详细介绍了SQL注入判断方法、数据库类型识别技巧(如通过报错信息、特定函数判断),并推荐了findsomething、瞎越等辅助工具。后半部分含大量付费圈子推广内容,技术价值有限。
评论:0   参与:  0