当前位置: 首页 > article >正文

Agent记忆系统工程:让AI真正记住重要的事

无状态的 AI 助手每次对话都从零开始这是当前应用体验差的核心原因之一。本文系统性地拆解 Agent 记忆系统的工程实现从短期工作记忆到长期知识库构建有真实记忆的 AI Agent。记忆系统的四个层次人类记忆是分层的有即时工作记忆当前任务有情景记忆具体事件有语义记忆通用知识有程序记忆技能习惯。AI Agent 的记忆系统同样需要分层设计。四层记忆架构┌─────────────────────────────────────┐│ 工作记忆In-Context Memory │ 当前对话 任务上下文├─────────────────────────────────────┤│ 情景记忆Episodic Memory │ 历史交互摘要├─────────────────────────────────────┤│ 语义记忆Semantic Memory │ 用户偏好 领域知识├─────────────────────────────────────┤│ 程序记忆Procedural Memory │ 工具使用经验 错误教训└─────────────────────────────────────┘大多数 Agent 应用只实现了工作记忆即对话历史缺少后三层才是用户体验差距的根本原因。## 工作记忆管理工作记忆就是 LLM 的 Context Window。管理的核心挑战是如何在有限的上下文窗口内保留最重要的信息。### 滑动窗口策略最简单的方案只保留最近 N 轮对话pythonclass SlidingWindowMemory: def __init__(self, max_turns: int 20): self.max_turns max_turns self.messages [] def add_message(self, role: str, content: str): self.messages.append({role: role, content: content}) # 超出窗口时删除最旧的用户-助手对保留system prompt while len(self.messages) self.max_turns * 2: # 找到第一个非system消息对并删除 for i, msg in enumerate(self.messages): if msg[role] user: self.messages.pop(i) # 删除用户消息 self.messages.pop(i) # 删除对应的助手消息 break def get_context(self) - list: return self.messages.copy()### 摘要压缩策略当对话历史超出限制时对旧内容进行摘要压缩pythonfrom openai import OpenAIclient OpenAI()class SummarizingMemory: def __init__(self, max_tokens: int 4000, compression_threshold: int 3000): self.messages [] self.summary self.max_tokens max_tokens self.compression_threshold compression_threshold def estimate_tokens(self, messages: list) - int: # 粗略估算每个字符约0.5个token total_chars sum(len(m[content]) for m in messages) return int(total_chars * 0.5) def compress_if_needed(self): if self.estimate_tokens(self.messages) self.compression_threshold: # 压缩较旧的一半消息 old_messages self.messages[:len(self.messages)//2] old_text \n.join([f{m[role]}: {m[content]} for m in old_messages]) response client.chat.completions.create( modelgpt-4o-mini, messages[{ role: user, content: f请将以下对话历史压缩为简洁摘要200字以内保留关键信息\n\n{old_text} }] ) self.summary response.choices[0].message.content self.messages self.messages[len(self.messages)//2:] def get_context(self) - list: context [] if self.summary: context.append({ role: system, content: f对话历史摘要{self.summary} }) context.extend(self.messages) return context## 情景记忆记住发生过什么情景记忆存储的是具体事件的记录。对于 Agent 来说这意味着记住用户做过什么、说过什么、达成过什么结论。### 情景记忆的数据结构pythonfrom dataclasses import dataclassfrom datetime import datetimefrom typing import Optional, Listdataclassclass Episode: episode_id: str timestamp: datetime summary: str # 本次交互的简要描述 key_facts: List[str] # 提取的关键事实 user_intent: str # 用户意图标签 outcome: str # 结果成功/失败/进行中 tags: List[str] # 主题标签便于检索 def to_searchable_text(self) - str: return f{self.summary} { .join(self.key_facts)} { .join(self.tags)}### 情景记忆的写入每次对话结束后自动提取并存储情景pythonasync def extract_and_store_episode(conversation: list, user_id: str): 从对话中提取情景记忆 conversation_text \n.join([ f{m[role]}: {m[content]} for m in conversation ]) extraction_prompt f 分析以下对话提取情景记忆。以JSON格式返回 {{ summary: 一句话描述这次交互, key_facts: [事实1, 事实2], user_intent: 用户意图分类, outcome: 成功/失败/进行中, tags: [主题标签] }} 对话内容 {conversation_text} response await llm.complete(extraction_prompt) episode_data json.loads(response) episode Episode( episode_idgenerate_id(), timestampdatetime.now(), **episode_data ) # 存入向量数据库用于语义检索 await vector_store.upsert( idepisode.episode_id, vectorawait embed(episode.to_searchable_text()), metadataepisode.__dict__ )## 语义记忆用户画像与知识积累语义记忆存储的是结构化的用户偏好和领域知识它是 AI 个性化体验的核心。### 用户画像系统pythonclass UserProfile: def __init__(self, user_id: str): self.user_id user_id self.preferences {} # 偏好设置 self.expertise {} # 专业领域和水平 self.communication_style {} # 沟通风格偏好 self.context {} # 工作/生活背景 def update_preference(self, key: str, value, confidence: float 1.0): 更新用户偏好带置信度权重 if key not in self.preferences: self.preferences[key] {value: value, confidence: confidence, count: 1} else: # 增量更新置信度 current self.preferences[key] new_count current[count] 1 if current[value] value: new_confidence min(1.0, current[confidence] 0.1) else: new_confidence max(0.1, current[confidence] - 0.2) if new_confidence 0.3: current[value] value # 偏好已改变 self.preferences[key] { value: current[value], confidence: new_confidence, count: new_count } def to_system_prompt(self) - str: 生成个性化 System Prompt 片段 lines [关于用户的了解] for key, pref in self.preferences.items(): if pref[confidence] 0.7: lines.append(f- {key}: {pref[value]}) if self.communication_style: style self.communication_style lines.append(f- 偏好的沟通风格: {style.get(tone, 专业)}, {style.get(detail_level, 适中)}) return \n.join(lines)### 知识库更新当 Agent 从用户处获得新知识时应将其存入语义记忆pythonasync def update_knowledge_base(user_id: str, conversation: list): 从对话中提取并更新知识库 extraction_prompt 从以下对话中提取值得记住的用户信息 1. 用户的明确偏好如我喜欢/不喜欢... 2. 用户的背景信息工作、项目、技术栈 3. 用户提到的重要约束或要求 4. 用户的沟通风格偏好 只提取明确表达的信息不要推断。以JSON数组返回每项包含{type, key, value}。 knowledge_items await extract_from_conversation(conversation, extraction_prompt) profile await load_user_profile(user_id) for item in knowledge_items: profile.update_preference(item[key], item[value]) await save_user_profile(user_id, profile)## 程序记忆学习工具使用经验程序记忆存储 Agent 在工具调用和任务执行中积累的经验——哪些方法有效哪些方法失败过。pythondataclassclass ToolExperience: tool_name: str use_case: str # 使用场景描述 parameters_pattern: dict # 成功的参数模式 success_rate: float common_errors: list # 常见错误及解决方案 best_practices: list # 最佳实践class ProceduralMemory: def __init__(self): self.tool_experiences {} def record_success(self, tool_name: str, params: dict, context: str): 记录成功的工具调用 key f{tool_name}:{context} if key not in self.tool_experiences: self.tool_experiences[key] ToolExperience( tool_nametool_name, use_casecontext, parameters_patternparams, success_rate1.0, common_errors[], best_practices[] ) else: exp self.tool_experiences[key] exp.success_rate exp.success_rate * 0.9 1.0 * 0.1 # EMA def record_failure(self, tool_name: str, params: dict, error: str, context: str): 记录失败的工具调用及错误信息 key f{tool_name}:{context} if key in self.tool_experiences: exp self.tool_experiences[key] exp.success_rate exp.success_rate * 0.9 0.0 * 0.1 if error not in exp.common_errors: exp.common_errors.append(error) def get_advice(self, tool_name: str, context: str) - str: 获取工具使用建议 key f{tool_name}:{context} if key not in self.tool_experiences: return exp self.tool_experiences[key] advice [] if exp.success_rate 0.8: advice.append(f参考历史成功模式: {exp.parameters_pattern}) if exp.common_errors: advice.append(f注意避免: {, .join(exp.common_errors[:3])}) return \n.join(advice)## 记忆检索找到最相关的记忆存储是基础检索才是关键。Agent 在响应时需要快速找到最相关的历史记忆。pythonclass MemoryRetriever: def __init__(self, vector_store, user_profile_store): self.vector_store vector_store self.user_profile user_profile_store async def retrieve_relevant_memories( self, current_query: str, user_id: str, top_k: int 5 ) - dict: 检索与当前查询最相关的记忆 # 1. 情景记忆检索向量相似度 query_embedding await embed(current_query) episodes await self.vector_store.search( vectorquery_embedding, filter{user_id: user_id}, limittop_k ) # 2. 用户画像全量加载较小 profile await self.user_profile.load(user_id) # 3. 组合为上下文 context_parts [] if profile: context_parts.append(f用户背景\n{profile.to_system_prompt()}) if episodes: episode_texts [] for ep in episodes: episode_texts.append( f[{ep.timestamp.strftime(%Y-%m-%d)}] {ep.summary} ) context_parts.append( f相关历史记录\n \n.join(episode_texts) ) return { context: \n\n.join(context_parts), episodes: episodes, profile: profile }## 记忆遗忘机制无限累积的记忆会降低检索质量。合理的遗忘机制必不可少pythonclass MemoryDecay: 基于艾宾浩斯遗忘曲线的记忆衰减 staticmethod def calculate_retention(days_since_created: float, initial_importance: float 1.0) - float: 计算记忆保留率 import math # 艾宾浩斯公式R e^(-t/S)S为稳定性 stability initial_importance * 10 # 重要性越高遗忘越慢 retention math.exp(-days_since_created / stability) return retention async def cleanup_old_memories(self, user_id: str, threshold: float 0.1): 清理保留率低于阈值的记忆 all_episodes await self.load_all_episodes(user_id) now datetime.now() to_delete [] for episode in all_episodes: days_old (now - episode.timestamp).days retention self.calculate_retention(days_old, episode.importance) if retention threshold: to_delete.append(episode.episode_id) if to_delete: await self.vector_store.delete(to_delete) print(f清理了 {len(to_delete)} 条过期记忆)## 生产部署考量存储选择- 向量数据库Qdrant/Pinecone/Weaviate存储情景记忆的嵌入向量- PostgreSQL/MongoDB存储结构化用户画像- Redis工作记忆缓存TTL 控制自动过期隐私与安全- 记忆内容应加密存储- 为用户提供查看和删除自己记忆的接口- 明确告知用户哪些信息被记忆扩展性- 用户量大时记忆检索需要按用户 ID 分片- 考虑记忆冷热分层近期热数据 vs 历史冷数据## 总结Agent 记忆系统是从工具到伙伴的关键进化。四层记忆架构工作记忆 情景记忆 语义记忆 程序记忆缺一不可但工程落地可以分阶段推进1.Phase 1实现工作记忆管理摘要压缩2.Phase 2构建用户画像语义记忆核心3.Phase 3引入情景记忆历史对话检索4.Phase 4加入程序记忆工具经验积累每个 Phase 都能带来可感知的用户体验提升是值得持续投入的工程方向。

相关文章:

Agent记忆系统工程:让AI真正记住重要的事

无状态的 AI 助手每次对话都从零开始,这是当前应用体验差的核心原因之一。本文系统性地拆解 Agent 记忆系统的工程实现,从短期工作记忆到长期知识库,构建有"真实记忆"的 AI Agent。 记忆系统的四个层次人类记忆是分层的&#xff1a…...

Source Sans 3:让数字界面阅读体验焕然一新的开源字体解决方案

Source Sans 3:让数字界面阅读体验焕然一新的开源字体解决方案 【免费下载链接】source-sans Sans serif font family for user interface environments 项目地址: https://gitcode.com/gh_mirrors/so/source-sans 你是否曾经在设计网页或应用时,…...

如何用Autolabel在5分钟内完成数据标注:面向新手的终极实战指南

如何用Autolabel在5分钟内完成数据标注:面向新手的终极实战指南 【免费下载链接】autolabel Label, clean and enrich text datasets with LLMs. 项目地址: https://gitcode.com/gh_mirrors/au/autolabel 还在为数据标注发愁吗?🤔 传统…...

今日算法(二叉搜索树)

题目描述给定一棵二叉搜索树(BST)的根节点 root,树中节点值各不相同。要求将其转换为累加树(Greater Sum Tree),规则如下:每个节点的新值 原节点值 所有比它大的节点值的总和二叉搜索树的性质…...

后端工程师知识库

后端工程师深度课程 中文知识库 一套面向中级到高级后端工程师的系统进阶课程,共 9 大专题、146 篇万字长文,每篇含底层原理、代码示例、生产实践、陷阱清单与练习题。 📅 内容基准:2026 年 5 月 —— HTTP/3 主流、TLS 1.3 pos…...

全栈开发的核心技能:掌握这4个技术,成为全栈工程师

对于很多深耕测试领域多年的软件测试从业者来说,“转全栈开发”早已不是一个陌生的方向——无论是为了突破职业瓶颈,还是为了打通测试到开发的链路,提升自己的端到端交付能力,抑或是拓展职业选择的边界,全栈工程师都是…...

通达信缠论量化插件:自动化技术分析新体验

通达信缠论量化插件:自动化技术分析新体验 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 通达信缠论量化插件是一款基于缠论理论的智能分析工具,通过算法自动化识别K线走势中的关…...

后端开发必知的数据库优化技巧:这5个方法让你的系统性能提升10倍

对于软件测试从业者来说,理解数据库优化逻辑不仅能帮我们更快定位性能瓶颈,还能让我们在测试阶段就提前发现潜在的数据库设计问题,避免上线后出现大规模性能故障。很多测试同学往往把注意力放在接口逻辑、功能正确性上,却忽略了数…...

免费高效的窗口放大神器:Magpie让Windows显示效果翻倍提升

免费高效的窗口放大神器:Magpie让Windows显示效果翻倍提升 【免费下载链接】Magpie A general-purpose window upscaler for Windows 10/11. 项目地址: https://gitcode.com/gh_mirrors/mag/Magpie 还在为老旧游戏或软件在4K显示器上显示模糊而烦恼吗&#x…...

免费编辑《上古卷轴》和《辐射》游戏3D模型的终极指南:NifSkope完整教程

免费编辑《上古卷轴》和《辐射》游戏3D模型的终极指南:NifSkope完整教程 【免费下载链接】nifskope A git repository for nifskope. 项目地址: https://gitcode.com/gh_mirrors/ni/nifskope 想要为你的《上古卷轴:天际》角色设计一套独特的盔甲吗…...

JMeter分布式压测原理与高可用集群搭建实战

1. 为什么单台JMeter跑不出真实流量——分布式压测不是“加机器”那么简单 你有没有试过用Jmeter对一个新上线的订单服务做压测,本地配了200个线程,结果TPS卡在80就上不去了,CPU才用了35%,网络IO几乎为零?我第一次遇到…...

Translumo:实时屏幕翻译工具的完整实战指南

Translumo:实时屏幕翻译工具的完整实战指南 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 你是否在玩外语游戏…...

qData 数据中台开源版 v1.5.2 发布:建模资产双升级,全方位提升企业数据治理效率

qData 数据中台开源版 v1.5.2 发布:建模标准化、资产精细化,全方位提升企业数据治理效率在企业数字化建设不断深化的今天,数据中台已演变为支撑企业经营决策、业务创新与数据治理落地的核心基础设施。qData 数据中台开源版 v1.5.2 正式发布&a…...

平均 CPU 利用率指标为何该摒弃?多个案例揭示真相!

1. 作者信息与文章背景Jeremy Theocharis 是《平凡即卓越》作者、UMH 联合创始人兼首席技术官。文章基于其在 2026 年 4 月云原生亚琛聚会上的演讲,探讨为何应摒弃平均 CPU 利用率指标。2. 应用程序问题引出我们应用程序中的一个 Go 函数在生产环境总是被取消执行。…...

Godot开源RPG框架选型与状态契约构建指南

1. 这不是又一个“Godot入门教程”,而是一套可落地的RPG世界构建方法论 你有没有试过打开Godot,新建一个项目,拖进几个精灵,写两行 move_and_slide() ,然后卡在“接下来该做什么”上?我做过——整整三年前…...

Lovable主题定制深度教程:不改一行PHP代码,实现品牌专属UI/UX升级(仅限当前版本v4.8.3私有补丁包)

更多请点击: https://codechina.net 第一章:Lovable主题定制深度教程:不改一行PHP代码,实现品牌专属UI/UX升级(仅限当前版本v4.8.3私有补丁包) Lovable v4.8.3 通过其增强型 CSS 变量体系与声明式主题注入…...

Unity UGUI Mask与3D对象Stencil裁剪失效的根因解析

1. 这不是“Stencil失效”,而是 Unity 渲染管线里一场被忽略的层级静默冲突 你有没有试过在 UGUI ScrollView 里放一个带 Mask 的滚动区域,再把一个 3D 模型(比如一个带透明材质的粒子特效、或者一个半透的 UI 面板)叠在它上面&am…...

ElevenLabs广西话语音定制全链路指南(含南宁/柳州/玉林三方言音色对比数据)

更多请点击: https://codechina.net 第一章:ElevenLabs广西话语音定制的背景与技术定位 随着语音合成技术从通用语种向方言及小众语言纵深演进,区域性语音能力成为人机交互本地化落地的关键瓶颈。广西话(以南宁白话为代表&#x…...

Unity Stencil属性丢失根因与Property ID注册机制解析

1. 这个报错不是材质丢了,是Unity在“认人”时看错了身份证你在Unity编辑器里猛敲CtrlS保存场景,突然控制台炸出一行红字:Material xxx doesnt have _Stencil property。你第一反应可能是——“我明明在Shader里写了_Stencil,也加…...

Unity URP中_Material Stencil属性报错的四层根因与修复

1. 这个报错不是材质没写对,而是渲染管线在“敲门问权限” 刚在Unity 2021.3 LTS项目里切完URP(Universal Render Pipeline)后打包iOS,突然弹出一行红字: Material xxx doesnt have _Stencil property 。我第一反应是…...

数据结构 —— 链表

在数据结构体系中,顺序表与链表是两大最基础的线性存储结构。顺序表依靠连续内存实现随机访问,但插入、删除中间元素效率低下;而链表用离散内存 指针连接的方式,完美解决了顺序表的痛点,是 Linux 内核、操作系统、网络…...

讲讲IO复用三个函数的底层逻辑

在 Linux 网络编程中,IO 复用是高并发服务的核心基石。我们熟知的 Nginx、Redis、日志服务、后端网关,全部都是基于 IO 复用实现高并发。很多同学只会用 select / poll / epoll 这三个函数,但完全不懂内核底层到底发生了什么,遇到…...

2026亲测:专业降AI率工具选这款就对了3秒改写无痕迹

2026 年降 AIGC 工具已从“基础语义替换”进化为多维度智能优化系统,核心评估指标涵盖 AI 痕迹清除效率、专业表达准确性、格式结构完整性、长段落逻辑稳定性、内容重合度降低效果及高校检测平台兼容性。本次测评深入分析 5 款主流工具,测试范围包括中英…...

2026这6款宝藏降AIGC平台大起底,一键把AI检测率精准控到安全区!

步入 2026 年,学术圈的风向早已不是过去那个简单的“降重”时代。随着 AI 技术的迅猛发展,论文查重系统不断升级,高校对 AI 生成内容的审查标准也愈发严苛。曾经只需关注重复率的你,现在却要面对更复杂、更隐蔽的 AIGC 检测压力。…...

效率直接起飞 2026 最新!降AIGC工具测评与推荐

2026年真正好用的AI论文降重与改写工具,核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...

如何快速掌握ElegantBook:面向初学者的LaTeX书籍排版终极指南

如何快速掌握ElegantBook:面向初学者的LaTeX书籍排版终极指南 【免费下载链接】ElegantBook Elegant LaTeX Template for Books 项目地址: https://gitcode.com/gh_mirrors/el/ElegantBook ElegantBook是一款专为学术书籍排版设计的优雅LaTeX模板&#xff0c…...

从CRUD到AI:普通程序员转型大模型应用开发指南(收藏版)

本文针对有3-5年Java、前端或PHP开发经验的程序员,探讨了如何转型AI大模型应用开发。文章指出,虽然表面看起来与现有工作不同,但CRUD经验反而是转型优势,如API调用、业务流程理解、数据库知识和调试能力等。转型只需掌握Python基础…...

通信对抗新利器:HWG1在铁路高速领域的卓越应用

在现代化交通体系中,铁路、高速等关键领域的通信安全至关重要。为了应对复杂多变的电磁环境,确保通信系统的稳定运行,成都鼎讯信通科技有限公司推出了通信信号干扰模拟器HWG1,为交通领域的通信对抗训练提供了强有力的支持。HWG1通…...

2026 年 AI 毕业论文工具横评:okbiye 领衔,9 款工具实测对比,帮你避开 90% 的写作坑

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT毕业论文 - Okbiye智能写作https://www.okbiye.com/ai/bylw 一、前言:AI 写论文,别只盯着 “一键生成” 毕业论文写作,是每个大学生都绕不开的关卡。从选题定方向、…...

taotoken多模型聚合平台为matlab开发者提供稳定ai能力

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 taotoken多模型聚合平台为matlab开发者提供稳定ai能力 对于使用MATLAB进行数据分析、仿真建模或算法开发的工程师和研究人员而言&a…...