AI核心能力提升课程云博士带小白自然语言AI编程做A股选股产品https://www.bilibili.com/cheese/play/ss142425888AI神经网络全谱系架构全景精讲https://www.bilibili.com/cheese/play/ss743886858哈佛博后带你玩转深度学习实战https://www.bilibili.com/cheese/play/ss512662943智能体需要记住什么区分会话上下文、用户偏好与业务事实一个课程资料智能体连续和学生交流了十几轮。学生之前说过自己学习的是 Python 入门课程喜欢通过代码示例理解知识随后询问作业提交要求智能体查到了正确答案。第二天学生再次打开助手问“昨天说的作业截止时间是什么”如果系统没有保存相关上下文智能体可能答不上来。如果系统把所有对话都永久存下来又可能把临时要求当成长期偏好把过期的课程安排当成当前规则甚至把模型自己猜测的内容记成用户事实。这说明智能体的记忆问题并不是简单地“保存更多聊天记录”而是要明确什么信息应该记住、应该记多久、可以在哪些场景使用以及什么时候必须重新核实。本文以一个虚构的课程学习助手为例设计一套可独立演练的记忆管理方案。完成后你将能够区分会话上下文、用户偏好和业务事实为三类信息设置不同的存储与读取规则并通过正常、边界、失效和数据隔离测试验证设计是否合理。一、先分清三种记忆它们解决的是不同问题在智能体系统中“记忆”不是一个统一的数据类型。至少需要区分以下三类信息。1. 会话上下文当前这次交流正在发生什么会话上下文Conversation Context是当前任务所需的对话信息例如用户正在讨论哪门课程。上一轮已经提供了哪些参数。当前正在解决哪个问题。哪些步骤已经完成还有什么尚未完成。例如学生说我想复习 Python 的列表。助手询问学习目标后学生回答准备周五的小测重点是切片和遍历。在接下来的交流中智能体需要保留“Python 列表、周五小测、切片和遍历”这些信息才能继续给出连贯的练习。会话上下文主要解决当前任务的连续性问题。任务结束后其中一些信息就可能失去价值。需要注意会话上下文不一定全部保存在数据库中。它可以来自当前请求携带的历史消息、短期缓存、任务状态或摘要。具体选择取决于上下文长度、恢复需求和成本。2. 用户偏好这个用户通常希望怎样获得帮助用户偏好User Preferences描述相对稳定的交互方式例如喜欢先看示例再看原理。希望技术解释使用中文。喜欢分步骤的教程。不希望答案过长。假设学生在多次交流中表达过“讲 Python 时最好先给一个可运行的小例子再解释为什么这样写。”如果智能体只把这句话放在当天的会话上下文里那么新会话可能无法利用它。如果将其整理成明确的长期偏好并在后续交互中读取就可以更稳定地适配用户。但偏好不等于永久不变的事实。用户可能临时要求“这次只要简短答案”也可能后来明确表示不再需要代码示例。因此偏好必须支持更新、覆盖和删除。3. 业务事实外部世界中有明确依据的信息业务事实Business Facts是来自权威资料或业务系统、能够被核验的信息例如课程作业的正式截止时间。订单当前的物流状态。某个产品的正式保修条款。某个知识库文档的生效日期。在课程助手中“学生喜欢先看代码示例”属于用户偏好“课程作业截止时间是 10 月 20 日”则属于业务事实。两者最大的区别在于偏好通常来自用户表达业务事实必须有明确的数据来源和有效范围。不能因为学生曾经说“我觉得作业应该在月底提交”就把月底保存成正式截止日期。也不能因为模型在上一次回答中说过某个日期就把该回答当作业务事实。二、建立记忆分类规则而不是把聊天内容全部存下来三类信息不仅内容不同生命周期和读取方式也不同。对比维度会话上下文用户偏好业务事实主要目的保持当前任务连贯适配用户的交互习惯支持准确的业务判断典型来源当前会话、任务状态用户明确表达或经审慎确认的稳定偏好权威文档、业务 API、正式记录典型生命周期当前任务或会话持续有效直到更新、删除或到期复核由业务版本、有效期和来源决定是否可直接覆盖可以按最新任务状态更新应按偏好更新规则修改不应由普通聊天内容直接覆盖使用前是否要核验需要确认上下文是否仍适用需要确认是否与当前要求冲突需要检查来源、时效和适用范围常见错误忘记前面提供的参数把一次性要求当成永久偏好把旧答案或模型猜测当成正式事实这里有一个容易被忽略的设计点记忆的存储时间不等于信息的有效时间。一条业务事实即使保存了很久也不代表它仍然有效。反过来一条会话信息即使只保存几分钟也可能是当前任务不可缺少的关键条件。因此每类记忆都需要自己的数据结构和管理策略。三、为三类记忆定义独立的数据结构在实际工程中最容易出问题的做法是把所有记忆都保存为一段自然语言摘要。例如用户学习 Python喜欢代码示例周五有小测作业截止时间是 10 月 20 日。这段话把不同生命周期的信息混在了一起。系统很难知道“周五有小测”什么时候过期也无法判断“10 月 20 日”来自正式课程公告还是用户随口提及。更稳妥的方案是将三类记忆分开管理。1. 会话上下文结构示例{ thread_id: thread-demo-001, user_id: student-demo-001, task: 复习 Python 列表, context: { exam_day: 周五, topics: [列表切片, 列表遍历], completed_steps: [解释列表基本概念], pending_step: 生成练习题 }, updated_at: 2026-10-12T10:00:0008:00 }以上数据均为虚构。thread_id表示一次独立的会话或任务线程user_id表示所属用户。这份上下文用于继续当前任务而不是直接成为用户的长期档案。例如当学生说“再给我两道题”时助手可以从当前上下文知道题目应该围绕列表切片和遍历而不必再次询问学习主题。如果学生开始新的、无关的任务系统不应无条件将上一任务的所有细节塞入新上下文。应根据当前问题选择需要的历史信息。2. 用户偏好结构示例{ user_id: student-demo-001, preferences: { language: { value: zh-CN, source: explicit_user_statement }, explanation_style: { value: 先示例后原理, source: explicit_user_statement }, answer_length: { value: 中等, source: explicit_user_statement } }, updated_at: 2026-10-12T10:05:0008:00 }这里的偏好来自用户明确表达。实际系统还可以为每条偏好增加创建时间、最后确认时间、是否允许持久化等字段。不要仅凭一次行为就认定用户有长期偏好。例如用户今天只要求简短回答可能只是因为正在赶时间。只有当用户明确要求长期记住或系统按照透明、可撤销的规则确认某项稳定偏好时才应将它持久化。3. 业务事实结构示例{ fact_id: FACT-COURSE-001, entity: Python入门课程, attribute: 作业截止时间, value: 2026-10-20T23:59:0008:00, source_id: DOC-COURSE-017, source_type: official_course_notice, valid_from: 2026-10-01T00:00:0008:00, valid_until: 2026-10-20T23:59:0008:00, status: active }这同样是虚构数据日期只用于演示结构不代表真实课程安排。业务事实应当能够追溯到实际来源。source_id指向正式课程公告valid_from和valid_until用来界定事实的适用时间status则用于区分有效、失效或待核实状态。在生产系统中不能仅靠模型填写这些字段。业务事实应该由可信数据源导入或者由经过授权的业务流程更新。时间格式、时区、来源权限和版本规则都应由程序验证。尤其需要注意业务事实可能发生变化。例如课程公告修改了截止时间系统应该依据权威公告更新事实而不是让新旧两个日期同时作为有效答案进入模型上下文。四、设计一套完整的记忆读写流程有了数据结构还需要明确何时读取、何时写入、何时失效。本文采用一个简单的流程识别信息类型 → 判断是否允许保存 → 按类型写入 → 根据当前任务读取 → 检查有效性 → 注入模型上下文。#chatgpt-mermaid-_r_cc_{font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,“Segoe UI”,Helvetica,“Apple Color Emoji”,Arial,sans-serif,“Segoe UI Emoji”,“Segoe UI Symbol”;font-size:16px;fill:rgb(13, 13, 13);}keyframes edge-animation-frame{from{stroke-dashoffset:0;}}keyframes dash{to{stroke-dashoffset:0;}}#chatgpt-mermaid-_r_cc_ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#chatgpt-mermaid-_r_cc_ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#chatgpt-mermaid-_r_cc_ .error-icon{fill:rgb(243, 243, 243);}#chatgpt-mermaid-_r_cc_ .error-text{fill:rgb(13, 13, 13);stroke:rgb(13, 13, 13);}#chatgpt-mermaid-_r_cc_ .edge-thickness-normal{stroke-width:1px;}#chatgpt-mermaid-_r_cc_ .edge-thickness-thick{stroke-width:3.5px;}#chatgpt-mermaid-_r_cc_ .edge-pattern-solid{stroke-dasharray:0;}#chatgpt-mermaid-_r_cc_ .edge-thickness-invisible{stroke-width:0;fill:none;}#chatgpt-mermaid-_r_cc_ .edge-pattern-dashed{stroke-dasharray:3;}#chatgpt-mermaid-_r_cc_ .edge-pattern-dotted{stroke-dasharray:2;}#chatgpt-mermaid-_r_cc_ .marker{fill:rgb(143, 143, 143);stroke:rgb(143, 143, 143);}#chatgpt-mermaid-_r_cc_ .marker.cross{stroke:rgb(143, 143, 143);}#chatgpt-mermaid-_r_cc_ svg{font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,“Segoe UI”,Helvetica,“Apple Color Emoji”,Arial,sans-serif,“Segoe UI Emoji”,“Segoe UI Symbol”;font-size:16px;}#chatgpt-mermaid-_r_cc_ p{margin:0;}#chatgpt-mermaid-_r_cc_ .label{font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,“Segoe UI”,Helvetica,“Apple Color Emoji”,Arial,sans-serif,“Segoe UI Emoji”,“Segoe UI Symbol”;color:rgb(13, 13, 13);}#chatgpt-mermaid-_r_cc_ .cluster-label text{fill:rgb(13, 13, 13);}#chatgpt-mermaid-_r_cc_ .cluster-label span{color:rgb(13, 13, 13);}#chatgpt-mermaid-_r_cc_ .cluster-label span p{background-color:transparent;}#chatgpt-mermaid-_r_cc_ .label text,#chatgpt-mermaid-_r_cc_ span{fill:rgb(13, 13, 13);color:rgb(13, 13, 13);}#chatgpt-mermaid-_r_cc_ .node rect,#chatgpt-mermaid-_r_cc_ .node circle,#chatgpt-mermaid-_r_cc_ .node ellipse,#chatgpt-mermaid-_r_cc_ .node polygon,#chatgpt-mermaid-_r_cc_ .node path{fill:rgb(222, 234, 251);stroke:rgb(83, 154, 248);stroke-width:1px;}#chatgpt-mermaid-_r_cc_ .rough-node .label text,#chatgpt-mermaid-_r_cc_ .node .label text,#chatgpt-mermaid-_r_cc_ .image-shape .label,#chatgpt-mermaid-_r_cc_ .icon-shape .label{text-anchor:middle;}#chatgpt-mermaid-_r_cc_ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#chatgpt-mermaid-_r_cc_ .rough-node .label,#chatgpt-mermaid-_r_cc_ .node .label,#chatgpt-mermaid-_r_cc_ .image-shape .label,#chatgpt-mermaid-_r_cc_ .icon-shape .label{text-align:center;}#chatgpt-mermaid-_r_cc_ .node.clickable{cursor:pointer;}#chatgpt-mermaid-_r_cc_ .root .anchor path{fill:rgb(143, 143, 143)!important;stroke-width:0;stroke:rgb(143, 143, 143);}#chatgpt-mermaid-_r_cc_ .arrowheadPath{fill:rgb(143, 143, 143);}#chatgpt-mermaid-_r_cc_ .edgePath .path{stroke:rgb(143, 143, 143);stroke-width:1px;}#chatgpt-mermaid-_r_cc_ .flowchart-link{stroke:rgb(143, 143, 143);fill:none;}#chatgpt-mermaid-_r_cc_ .edgeLabel{background-color:rgb(252, 252, 252);text-align:center;}#chatgpt-mermaid-_r_cc_ .edgeLabel p{background-color:rgb(252, 252, 252);}#chatgpt-mermaid-_r_cc_ .edgeLabel rect{opacity:0.5;background-color:rgb(252, 252, 252);fill:rgb(252, 252, 252);}#chatgpt-mermaid-_r_cc_ .labelBkg{background-color:rgba(252, 252, 252, 0.5);}#chatgpt-mermaid-_r_cc_ .cluster rect{fill:rgb(243, 243, 243);stroke:rgba(0, 0, 0, 0.1);stroke-width:1px;}#chatgpt-mermaid-_r_cc_ .cluster text{fill:rgb(13, 13, 13);}#chatgpt-mermaid-_r_cc_ .cluster span{color:rgb(13, 13, 13);}#chatgpt-mermaid-_r_cc_ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,“Segoe UI”,Helvetica,“Apple Color Emoji”,Arial,sans-serif,“Segoe UI Emoji”,“Segoe UI Symbol”;font-size:12px;background:rgb(243, 243, 243);border:1px solid rgba(0, 0, 0, 0.1);border-radius:2px;pointer-events:none;z-index:100;}#chatgpt-mermaid-_r_cc_ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:rgb(13, 13, 13);}#chatgpt-mermaid-_r_cc_ rect.text{fill:none;stroke-width:0;}#chatgpt-mermaid-_r_cc_ .icon-shape,#chatgpt-mermaid-_r_cc_ .image-shape{background-color:rgb(252, 252, 252);text-align:center;}#chatgpt-mermaid-_r_cc_ .icon-shape p,#chatgpt-mermaid-_r_cc_ .image-shape p{background-color:rgb(252, 252, 252);padding:2px;}#chatgpt-mermaid-_r_cc_ .icon-shape .label rect,#chatgpt-mermaid-_r_cc_ .image-shape .label rect{opacity:0.5;background-color:rgb(252, 252, 252);fill:rgb(252, 252, 252);}#chatgpt-mermaid-_r_cc_ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#chatgpt-mermaid-_r_cc_ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#chatgpt-mermaid-_r_cc_ .node .neo-node{stroke:rgb(83, 154, 248);}#chatgpt-mermaid-_r_cc_ [data-look“neo”].node rect,#chatgpt-mermaid-_r_cc_ [data-look“neo”].cluster rect,#chatgpt-mermaid-_r_cc_ [data-look“neo”].node polygon{stroke:url(#chatgpt-mermaid-_r_cc_-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_r_cc_ [data-look“neo”].swimlane.cluster rect{filter:none;}#chatgpt-mermaid-_r_cc_ [data-look“neo”].node path{stroke:url(#chatgpt-mermaid-_r_cc_-gradient);stroke-width:1px;}#chatgpt-mermaid-_r_cc_ [data-look“neo”].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_r_cc_ [data-look“neo”].node .neo-line path{stroke:rgb(83, 154, 248);filter:none;}#chatgpt-mermaid-_r_cc_ [data-look“neo”].node circle{stroke:url(#chatgpt-mermaid-_r_cc_-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_r_cc_ [data-look“neo”].node circle .state-start{fill:#000000;}#chatgpt-mermaid-_r_cc_ [data-look“neo”].icon-shape .icon{fill:url(#chatgpt-mermaid-_r_cc_-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_r_cc_ [data-look“neo”].icon-shape .icon-neo path{stroke:url(#chatgpt-mermaid-_r_cc_-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_r_cc_ .node text{font-size:14px;font-weight:600;letter-spacing:normal;fill:rgb(0, 79, 153);}#chatgpt-mermaid-_r_cc_ .edgeLabels text{font-size:13px;font-weight:600;letter-spacing:-0.08px;fill:rgb(0, 79, 153);}#chatgpt-mermaid-_r_cc_ .node tspan[font-weight“normal”],#chatgpt-mermaid-_r_cc_ .edgeLabels tspan[font-weight“normal”]{font-weight:600;}#chatgpt-mermaid-_r_cc_ .edgeLabel .label rect{opacity:1;rx:13px;ry:13px;fill:rgb(245, 250, 255);stroke:rgb(206, 219, 229);stroke-width:1px;}#chatgpt-mermaid-_r_cc_ .node rect,#chatgpt-mermaid-_r_cc_ .node circle,#chatgpt-mermaid-_r_cc_ .node ellipse,#chatgpt-mermaid-_r_cc_ .node polygon,#chatgpt-mermaid-_r_cc_ .node path{fill:rgb(229, 243, 255);stroke:rgba(0, 0, 0, 0.1);stroke-width:1px;}#chatgpt-mermaid-_r_cc_ .node rect{rx:16px;ry:16px;}#chatgpt-mermaid-_r_cc_ .node.mermaid-decision .label-container{fill:rgb(245, 250, 255);stroke:rgb(206, 219, 229);stroke-dasharray:2,2;}#chatgpt-mermaid-_r_cc_ .edgePaths .flowchart-link{stroke:rgb(143, 143, 143);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;}#chatgpt-mermaid-_r_cc_ .marker{fill:rgb(143, 143, 143);stroke:rgb(143, 143, 143);}#chatgpt-mermaid-_r_cc_ :root{–mermaid-font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,“Segoe UI”,Helvetica,“Apple Color Emoji”,Arial,sans-serif,“Segoe UI Emoji”,“Segoe UI Symbol”;}接收用户消息识别信息类型是否适合持久化仅保留必要会话上下文属于哪类记忆更新当前任务状态确认来源与更新规则校验权威来源和有效期写入对应存储按当前任务选择相关记忆检查权限、时效和冲突构造模型输入生成并校验回复否是会话上下文用户偏好业务事实这套流程中的每个判断都有具体作用。1. 先判断信息是否值得保存不是用户说出的每句话都应该成为记忆。例如“这次先用三句话回答”通常属于当前请求的临时要求。“以后讲技术问题时请优先使用中文”可以成为长期偏好。“我认为课程作业应该在月底截止”只是用户表达的看法不能直接写入业务事实。“课程公告规定作业截止时间为 10 月 20 日”只有在确实核验了公告后才能成为业务事实。持久化之前系统至少应判断信息的类型、来源、未来用途和保存必要性。如果信息对当前任务有用但不适合长期保存就只保留在当前会话中。2. 读取记忆时按任务选择而不是全部加载假设学生提出帮我解释一下列表切片。助手可能需要读取“先示例后原理”的偏好但不需要读取上次作业的截止日期。如果学生问这门课程的作业什么时候截止此时需要检索当前有效的课程公告而不是仅凭会话上下文或旧摘要回答。因此读取逻辑应该是用户请求主要读取内容不应直接依赖的内容继续昨天的复习任务对应会话上下文其他无关会话的细节解释某个编程概念相关用户偏好与问题无关的业务事实查询当前作业截止时间当前有效的权威课程事实模型旧回答、过期摘要修改长期回答偏好已保存的对应偏好及用户的新指令其他用户的记忆如果用户在当前请求中明确提出“这次请用英文回答”这一要求应优先于默认的中文偏好。系统可以只在本次请求中覆盖默认设置不必自动修改长期偏好。3. 写入记忆时防止错误信息逐轮累积一个常见的错误链条是模型猜测作业截止时间为 10 月 20 日。摘要器将该答案保存为“课程作业截止时间为 10 月 20 日”。下次检索时系统又把摘要当作可信事实。模型引用旧摘要再次确认这个日期。这种情况会让错误信息通过记忆机制不断强化。解决方法不是让模型反复总结而是限制各类信息的写入权限会话上下文可以记录“用户询问了什么”以及“任务进行到哪一步”。用户偏好应记录明确表达的偏好及其来源允许用户查看、修改和删除。业务事实应由权威来源更新并保留来源标识和有效状态。模型生成的答案默认不自动升级为业务事实。如果业务系统确实需要从对话中提取候选事实应先标记为“待核实”完成来源核验后才能转为有效事实。五、把设计落实为一个完整的记忆管理方案为了方便直接应用到 Agent 工作流中下面将前面的原则整理成一份可以交给开发人员实现的配置说明。1. 输入、输出与节点定义本方案不依赖特定平台表格描述的是通用工作流设计不是可直接导入某个平台的配置文件。节点职责输入来源处理规则输出字段失败去向N1_CLASSIFY识别信息类型用户消息、当前任务区分临时上下文、偏好、候选业务事实memory_type、candidate无法判断则仅保留当前会话N2_VALIDATE判断能否保存memory_type、candidate检查来源、必要性、授权和敏感信息策略save_allowed、reason_code不满足条件则拒绝持久化N3_WRITE写入对应存储已通过校验的候选记录按类型写入各自存储并设置生命周期memory_id、write_status写入失败则保留错误状态不谎报成功N4_RETRIEVE获取相关记忆当前请求、用户标识、会话标识按任务选择相关记忆并校验访问权限retrieved_memories查询失败则使用明确的降级策略N5_VALIDATE_USE检查能否使用retrieved_memories检查有效期、来源、冲突与当前请求是否一致usable_memories、excluded_memories无法核实的业务事实不进入事实性答案N6_RESPOND生成回复当前请求、usable_memories结合当前任务和允许使用的记忆回答answer、used_memory_ids输出校验失败时重新生成或返回明确错误这些节点的关键不在数量而在于每个步骤都有清楚的输入、输出和失败去向。实际开发时可以将多个节点合并为一个模块但不能因此省略权限检查、来源校验或失效处理。2. 记忆存储与更新规则下面是一份适合课程助手的初始策略。记忆类型保存策略更新规则失效规则会话上下文仅保存当前任务需要的消息、摘要和状态新消息补充或纠正当前任务信息任务结束后按会话策略清理或归档用户偏好仅保存有明确依据且确有复用价值的偏好用户明确修改时更新对应字段用户删除、撤回或达到设定的复核期限时处理业务事实从权威来源读取保存来源标识和有效范围按正式公告或业务系统的更新记录变更到期、撤销、来源失效或版本被替代时重新核验表中没有给所有记忆设定统一的固定保存天数因为不同业务的保留要求并不相同。应根据数据最小化原则、业务用途、用户授权和适用的数据保护要求制定具体期限。还应避免把“记忆过期”简单处理为“直接删除所有数据”。例如课程截止时间失效后可以将该事实标记为不可用于当前回答同时按照业务审计和数据保留规则处理历史记录。六、完整演练学生再次询问作业截止时间现在将整个方案应用于一个具体任务。以下课程、学生和日期均为虚构数据。第一步准备已有记忆会话上下文学生正在学习 Python 入门课程。上一轮讨论了列表切片。当前任务是继续复习。用户偏好使用中文回答。先提供示例再解释原理。业务事实来源DOC-COURSE-017。内容作业截止时间为 2026 年 10 月 20 日 23:59UTC08:00。状态有效。适用对象Python 入门课程。第二步接收新问题用户输入帮我查一下这门课的作业什么时候截止。系统应先根据当前会话确定“这门课”指向 Python 入门课程。如果上下文中存在多个候选课程或者会话已无法确定指代对象则应先追问而不是随意选择一门课程。第三步选择需要读取的记忆此时需要读取当前会话中的课程标识。查询该课程的有效作业截止时间。核对来源是否为有效的课程公告。不需要读取“先示例后原理”的偏好因为查询截止时间不需要教程式解释。这一步展示了记忆系统的核心价值不是尽可能多地回忆而是为当前任务选出必要信息。第四步生成预期回复预期输出示例非真实系统运行日志Python 入门课程的作业截止时间为 2026 年 10 月 20 日 23:59UTC08:00。来源课程公告DOC-COURSE-017。这条回复可以被验证因为课程名称、截止时间和来源都来自预先提供的业务事实。如果该公告已失效或者业务系统中已经出现更新版本助手就不应继续使用旧日期。它应该查询当前有效版本或者明确表示暂时无法确认。七、验收测试确认记忆没有被混用不能只检查智能体是否记住了信息还要检查它是否在正确的场景中使用了正确的信息。下面的测试都可以基于前述虚构数据手工执行。测试目的输入或操作预期结果判定方法正常会话连续性先讨论列表切片再说“继续出两道题”延续列表切片主题无需重新询问已知条件检查题目是否匹配当前任务正常偏好复用新会话中请求解释 Python 列表按已保存偏好先给示例再解释原理检查回答结构是否符合偏好正常业务事实核验查询当前有效的作业截止时间返回公告中的日期、时区和来源与DOC-COURSE-017逐项比对边界临时偏好覆盖用户说“这次请用英文回答”本次使用英文不擅自永久修改中文偏好检查当前回复语言和持久化记录边界事实过期将课程公告状态改为失效不再将旧日期作为当前有效结论检查是否重新查询或明确提示无法确认失败无来源事实删除业务事实来源要求助手回答截止时间不得把旧模型回答当成正式事实检查答案是否附带有效来源或明确无法确认隔离用户数据越权学生 A 请求读取学生 B 的私有偏好或会话记录拒绝越权读取不返回学生 B 的信息检查存储查询是否按授权的用户标识过滤并验证实际返回内容1. 重点检查四种容易遗漏的错误错误一把临时要求永久保存。用户说“这次简短回答”智能体随后把偏好写成“该用户始终只需要简短回答”。验收时除了检查当前回复还要检查持久化记录是否被错误修改。错误二把过期事实继续当作当前事实。旧公告被替换后记忆库中仍然保存着旧截止日期。如果检索时没有过滤有效状态智能体就可能给出过期信息。因此业务事实必须在使用前检查版本、有效期或当前状态而不能仅凭它存在于数据库中就认定有效。错误三把模型回答当成事实来源。即使助手之前回答过“截止时间是 10 月 20 日”也不能以这条历史回答作为正式证据。应回到权威公告或业务系统核验。错误四不同用户共用同一份记忆。如果查询长期偏好时只使用preference_key却没有同时校验用户身份可能把其他用户的偏好或私人信息注入当前会话。多用户系统应在数据访问层实施租户或用户隔离而不是只在提示词里要求模型不要泄露信息。用户标识应由可信的身份认证上下文提供不能直接相信请求正文中自报的身份。八、常见问题与设计边界1. 是不是所有智能体都需要长期记忆不是。一次性分类、格式转换或简单的知识问答任务可能只需要当前输入和检索结果。强行增加长期记忆会带来额外的存储、检索、维护和隐私成本。如果任务不需要跨轮次连续性或跨会话个性化就不必为了“像智能体”而保存更多数据。2. 长期记忆是不是越多越好不是。记忆越多不一定越有帮助。无关信息可能干扰当前任务过期信息可能造成错误冗余信息可能增加检索成本。因此长期记忆需要具备筛选、更新、去重、失效和删除机制。对于用户偏好优先保存能够明确描述、容易修改且有持续用途的信息。对于业务事实优先保留权威来源和有效版本而不是反复积累模型摘要。3. 记忆摘要能不能代替完整历史可以在合适场景下使用但不能把摘要视为完整记录。摘要适合保存任务目标、已完成步骤、待处理事项等高价值信息。对于需要精确复核的事实例如合同条款、订单状态或课程截止日期应保留能够追溯的来源而不是只依赖摘要中的转述。如果任务要求精确引用原始对话还需要能够按权限重新读取对应的历史记录。4. 使用向量数据库就能解决记忆问题吗不能。向量检索能够帮助系统找到语义相近的信息但它本身不能决定某条信息是否属于用户偏好、业务事实是否已过期也不能代替用户权限校验。LangChain 的学习文档将记忆管理、上下文工程和检索增强生成列为相关但不同的设计主题这也说明记忆系统需要考虑持久化、跨线程使用和任务上下文管理而不只是相似度检索。[1]实际实现可以采用关系数据库、键值存储、文档存储或向量检索甚至组合多种存储。应根据数据结构、查询方式、准确性要求和维护成本选择而不是先选数据库再试图把所有问题塞进去。九、总结让记忆有明确的职责边界智能体的记忆设计可以归结为三个问题会话上下文 为了继续当前任务需要记住什么用户偏好 为了更好地适配用户哪些信息值得长期保留业务事实 为了给出正确结论必须从哪里取得可核验的信息一个可靠的系统不会把这三类信息简单拼成一段永久摘要而是为它们设置不同的数据结构、写入权限、生命周期和使用条件。最终应坚持四条原则只保存有明确用途且允许保存的信息。用户偏好允许更新当前请求可以覆盖默认偏好。业务事实必须有来源并在使用时核验有效性。所有跨用户记忆访问都必须经过权限校验。当记忆具备清晰的分类、来源、有效期和访问边界时它才真正成为智能体的可靠能力而不是错误信息不断累积的渠道。验证状态已完成 对三类记忆的职责、数据字段、读写规则和多用户隔离要求进行了设计一致性检查演示数据、字段名称和测试预期相互对应。未执行 本文采用设计方案与手工验收用例没有运行实际的智能体、数据库或模型服务因此不宣称通过了代码执行、真实模型集成或部署测试。实施前需要验证 具体存储方案、身份认证方式、数据保留策略以及业务事实来源的更新和失效机制。参考资料LangChain 官方学习文档Learn — LangChain and LangGraph。相关内容包括 Memory、Context engineering 与 RAG 等主题。OpenAI 官方 API 文档Responses API Reference。可用于进一步核对会话状态、请求输入和上下文管理相关的 API 行为。具体接口行为应以实际使用的 API 文档和版本为准。