想象你走进一家熟悉的咖啡馆,还没开口,店员就笑着说:“还是老样子,一杯拿铁,少糖,靠窗座位?”你心头一暖——明明换了新的门店、换了新的班次,店员怎么会知道你的习惯?答案藏在吧台背后的“熟客档案”里:每个常客有一个专属卡片,上面记着姓名、口味偏好、上次聊的话题。当你说“你好”时,店员已经麻利地抽出你的卡片,把关键信息扫了一遍,然后才开口服务。 AI Agent要做到这种“跨会话还记得你”,靠的正是同款机制——跨会话状态存储(那个熟客档案柜)与上下文注入(把档案信息临时贴到今日点单本上)。但这里面藏着一连串手艺活:档案要存多久?哪些该进长期档案柜、哪些只配写在小黑板上?点单本太厚会不会看不清重点?遗忘旧信息时怎么不误伤重要内容?本文就用这家“深夜咖啡馆”的故事,带你一次看懂Agent跨会话状态与上下文注入的完整链路——从状态存储、记忆分层、上下文窗口管控,到检索召回与遗忘淘汰,逐个击破。

岗位关联

学完本文,你将掌握Agent会话记忆系统的核心设计思路,能在实际项目中搭建“跨会话不丢记忆、上下文不爆token”的Context Engineering方案——这是打造有记忆、有温度的AI产品的基础功。

目录
  1. 可视化演示
  2. 会话状态存储
  3. 上下文动态注入
  4. 记忆分层管理
  5. 上下文窗口管控
  6. 记忆检索召回
  7. 遗忘淘汰机制
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示TCP连接建立的三次握手过程,逐步演示客户端与服务端之间的SYN和ACK报文交换,理解可靠连接的建立机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

'+caps[0]+'

会话状态存储

咖啡馆老板老王有个祖传抽屉柜,每个熟客占一个抽屉。抽屉外面贴着编号(比如“张女士-021”),里面是一张卡片,写着上次聊到哪、口味偏好、有没有没结的账。老王说:“只要抽屉在,客人三个月不来我也不慌——来了翻卡片,就全都想起来了。”

在AI Agent的世界里,这个“抽屉柜”叫会话状态存储。每一次对话结束,Agent不会真的“忘记”一切——只要它把关键信息写进了状态空间,下一次会话开始时就能重新取回。状态空间的数学本质是一个“键-值-时间戳”的集合:键是记忆的名字(如“user_name“),值是记忆的内容(如”小明”),时间戳记录这条记忆是何时写入的。

实际工程中,“抽屉编号”就是会话唯一标识(Session ID),它可以是一个UUID,随首次对话创建,此后每次请求都带着它。而“卡片归档”则依赖状态存取接口与持久化存储选型——轻量场景用Redis,复杂场景用数据库,再配合快照恢复机制,即使服务重启也能从磁盘把状态捞回。

老王关上抽屉时总习惯拍一拍柜门——那是确认“记忆已归档”。Agent也一样,每个会话结束时的显式save调用,就是那个“拍柜门”的动作。抽屉在,记忆就在;抽屉丢了,一切归零。所以状态存储的可靠性,决定了一个Agent能不能“记得住”用户。

St={(k1,v1,t1),(k2,v2,t2),…,(kn,vn,tn)}\displaystyle S_t = \{(k_1, v_1, t_1), (k_2, v_2, t_2), \ldots, (k_n, v_n, t_n)\}
一句话理解:会话状态就是一堆“键→值”卡片,每张卡片盖上时间戳,整整齐齐码在抽屉里。
  1. S_t 表示 t 时刻的状态集合整个抽屉柜在某个时刻的全部内容快照,会话进行中它会不断变化。
    St\displaystyle S_t
  2. (k_i, v_i, t_i) 表示一条状态记录第 i 条记忆 = 键(名字)+ 值(内容)+ 时间戳(写入时刻),三者缺一不可。
    (ki,vi,ti)\displaystyle (k_i, v_i, t_i)
  3. 花括号 { } 表示集合结构状态是“多张卡片的集合”,无序但可增删,新增记忆只需向集合里加入新三元组。
    {…}\displaystyle \{ \ldots \}

上下文动态注入

早上十点,张女士推门进来。老王没有去翻抽屉——他早上已经提前把她的卡片从抽屉里抽出来,用回形针夹在了今天的点单本第一页。这样他一边冲咖啡一边瞄一眼卡片,就能自然地接上话:“您上次说的那款低因豆子,我进了货。”

这个“把档案提前夹到点单本上”的动作,在AI Agent里叫上下文动态注入。大语言模型本身没有记忆,它的“点单本”就是上下文窗口——你往里面写什么,它就“记得”什么。因此,Agent需要在合适的注入时机,把从状态存储里取出的历史记忆,拼装成模板格式塞进上下文。

注入不是无脑追加,而是有手艺的。先定义提示模板(Template),留下记忆插槽;再把检索出的TopK条记忆填入插槽;最后做动态替换与内容裁剪——只保留对当前用户问题有帮助的片段,把无关紧要的旧寒暄扔掉。整个过程可以看作一次模板与记忆的拼接运算。

老王深谙“注入不在多,而在准”。有一次他图省事,把张女士三年前的点单全夹进本子,结果自己看花了眼,连她最讨厌肉桂都忘了。Agent也一样——注入的内容若不裁剪、不排序,模型就会被噪音淹没,回答质量不升反降。

Cnew=T⊕Mtopk\displaystyle C_{\text{new}} = T \oplus M_{\text{top}k}
一句话理解:新上下文 = 固定模板 + 最相关的 k 条历史记忆,像做三明治一样叠好。
  1. C_new 是拼接完成的新上下文最终被送进语言模型的完整“点单本”,模型只能看到这一页。
    Cnew\displaystyle C_{\text{new}}
  2. T 是提示模板预先写好的结构骨架,含角色设定、任务说明和“记忆插槽”,好比点单本上印好的格式。
    T\displaystyle T
  3. M_topk 是抽取出来的 TopK 条记忆从档案柜里挑出的最相关 k 条记忆卡片,直接决定“桌子聊得顺不顺”。
    Mtopk\displaystyle M_{\text{top}k}
  4. ⊕ 是拼接操作把记忆按模板格式填入插槽,不是简单相加,而是结构化组装。
    ⊕\displaystyle \oplus

记忆分层管理

老王店里有两套记忆系统。吧台后面挂着一块小黑板,上面写着“靠窗2号客人要美式、加急”“3号桌在等结账”——这些是今天的临时信息,打烊就擦掉。而抽屉柜里的熟客档案,则是要留几个月的长期信息。两者的区别,老王闭着眼都说得清:小黑板管当下,抽屉柜管长期。

这就是记忆分层管理的直觉。AI Agent把记忆分成短期记忆缓冲与长期记忆归档两层:短期记忆存放在上下文窗口里,随会话结束而消失;长期记忆则写入持久化状态存储,跨会话幸存。另外还有个隐性层次——工作记忆,即“当前这一轮正在处理的信息”,它从短期记忆而来,经模型思考后产生新结论,再决定是丢弃还是沉淀为长期记忆。

分层的核心是重要度分级:每条记忆写入时赋予一个重要度分数(比如用户明确说“我喜欢喝手冲”的分数,远高于闲聊时随口提的“我今天在家”),再据此决定分层读写策略——重要度高的进长期档案,低的留在短期小黑板。读写时也遵循这条策略:读时先查短期、再查长期,写时按重要度决定落盘位置。

打烊前老王会做一件事:把小黑板上还值得留的信息抄进档案柜,然后擦掉整块黑板。Agent里的“睡前例行公事”同样如此——每轮对话结束,评估哪些短期信息值得提升为长期记忆,其余随窗口滚动自然淘汰。分层管理让“记什么、忘什么”有了章法。

Pt=shortt⊕retrieve(longt,q)\displaystyle P_t = \text{short}_t \oplus \text{retrieve}(\text{long}_t, q)
一句话理解:当前上下文 = 本轮短期记忆 + 从长期档案中按需取回的相关记忆。
  1. P_t 是 t 时刻的完整上下文内容模型“眼前”看到的所有信息,由两部分叠加而成。
    Pt\displaystyle P_t
  2. short_t 是短期记忆缓冲当前会话里刚发生的内容,好比小黑板上的即时记录,会话结束后即失效。
    shortt\displaystyle \text{short}_t
  3. retrieve(long_t, q) 是长期记忆的检索结果根据当前问题 q,从长期档案中取回的相关记忆子集。
    retrieve(longt,q)\displaystyle \text{retrieve}(\text{long}_t, q)
  4. ⊕ 表示合并短期与取回的长期记忆合并为模型的完整上下文。
    ⊕\displaystyle \oplus

上下文窗口管控

有一次,老王心血来潮把开业八年的所有顾客事件都写进同一本点单本,结果本子厚得像字典。结果那天他找“张女士要的低因豆”翻了五分钟,后面排队的客人全急眼了。老王恍然大悟:点单本的容量有限,塞太多旧账,反而看不清眼前的需求。

上下文窗口管控解决的就是这个“点单本太厚”的问题。大模型每次调用都有固定的Token预算——好比点单本的页数上限。Agent需要量化当前上下文的窗口占用量:已用的Token数占总窗口的百分比。占用率过高时,就必须启动摘要压缩技术:把几轮前的完整对话浓缩成几句摘要,腾出空间给新的对话。

成本优化是另一个隐藏动机。Token是按量计费的,塞入的无关内容越多,单次调用的成本越高。因此成熟Agent会把窗口预算拆分为几个固定分区:系统提示词占一块、历史摘要占一块、检索记忆占一块、当前问题占一块——各自限额,超了就裁剪或压缩。

老王后来定了一条规矩:点单本超过一半就主动做“摘要页”,把旧账浓缩成三行。Agent的工程实践也是同理——与其让长对话撑爆窗口,不如定期“滚动摘要”,让模型永远只看得到浓缩版的过去和完整的现在。

U=LctxLwindow×100%\displaystyle U = \frac{L_{\text{ctx}}}{L_{\text{window}}} \times 100\%
一句话理解:窗口占用率 = 已用Token ÷ 总窗口大小,是判断“点单本要不要换页”的仪表盘。
  1. U 是窗口占用率一个百分比数字,超过阈值(如80%)就应当触发压缩。
    U\displaystyle U
  2. L_ctx 是当前上下文的Token总量目前点单本上所有内容的字数总和,包含模板、记忆、历史对话。
    Lctx\displaystyle L_{\text{ctx}}
  3. L_window 是模型窗口上限模型一次能处理的Token总数,好比点单本的物理页数。
    Lwindow\displaystyle L_{\text{window}}
  4. × 100% 是转换为百分比方便直观判断剩余容量。
    ×100%\displaystyle \times 100\%

记忆检索召回

抽屉柜用了十年,档案越来越多。老王翻卡片的方式也升级了:每张卡片右上角贴着标签(“低因”“靠窗”“投诉过”),找“低因豆”相关记忆时,他先扫标签再抽卡片;要是标签模糊,他就粗略扫一眼内容,挑最像的几张。这个“先缩小范围、再精挑细选”的过程,就是记忆检索召回。

检索召回的本质是相关性打分:为记忆库中的每条候选记忆计算与当前问题的相关程度。最经典的打分方式是向量相似检索——把问题文本和记忆文本都转成向量(一串数字),再算它们的余弦相似度,值越接近1表示越相关。关键词匹配则更朴素:问题里出现的词,在记忆里命中越多,分数越高。两者常结合使用。

打分完成后进入TopK候选重排:把所有候选按分数从高到低排列,只取前K条注入上下文。这个K值很有讲究——K太小可能漏掉重要信息,K太大则挤占窗口预算。一般的经验是3到5条,配合重要度加权来重排。

老王说,翻档案最高级的技巧不是“翻得仔细”,而是“知道该翻哪个抽屉”。检索召回做得好,Agent就能在浩瀚记忆里精准捞出那一条“用户上次说最讨厌肉桂”的卡片——既提升了回答质量,又省下了撑爆窗口的Token成本。

score(q,d)=∑i=1nqidi∑i=1nqi2⋅∑i=1ndi2\displaystyle \text{score}(q, d) = \frac{\sum_{i=1}^{n} q_i d_i}{\sqrt{\sum_{i=1}^{n} q_i^2} \cdot \sqrt{\sum_{i=1}^{n} d_i^2}}
一句话理解:两个向量夹角的余弦值,衡量“问题”和“记忆”方向的接近程度,值越大越相关。
  1. score(q, d) 是相关度分数越高表示记忆 d 与问题 q 越匹配,越值得召回到上下文。
    score(q,d)\displaystyle \text{score}(q, d)
  2. ∑ q_i d_i 是逐位相乘再求和把问题向量和记忆向量的每一位对应相乘后累加,捕捉两者的重叠强度。
    ∑i=1nqidi\displaystyle \sum_{i=1}^{n} q_i d_i
  3. √∑ q_i² 与 √∑ d_i² 是向量的模长分别除以模长做归一化,消除文本长度带来的偏差,避免长文本天然高分。
    ∑i=1nqi2⋅∑i=1ndi2\displaystyle \sqrt{\sum_{i=1}^{n} q_i^2} \cdot \sqrt{\sum_{i=1}^{n} d_i^2}
  4. 分式表示余弦相似度整个式子等于两向量夹角的余弦值,取值在 -1 到 1 之间,越接近 1 越相关。
    分子分母\displaystyle \frac{\text{分子}}{\text{分母}}

遗忘淘汰机制

档案柜不是无限大的。老王每月做一次大扫除:三个月没来的客人,档案保留;一年没来的,卡片移到阁楼;一旦发现两条卡片冲突(比如张女士三月说喜欢低因、六月又说不喜欢咖啡因),就以最新一条为准,划掉旧的。老王管这叫“给记忆做减法”。

遗忘淘汰机制正是为了给记忆库“减负”。最核心的思路是时间衰减权重:一条记忆被写入后,它的“权重”随时间指数式下降,久远的记忆自然变得难以被检索到,主动让位给新鲜信息。

其次是过期清理策略:为每条记忆设置最大保存时长(TTL),定期扫描删除过期条目,就像老王月度的“迁阁楼”大扫除。冲突覆盖规则则处理信息矛盾——当新记忆与旧记忆的键相同而值不同时,以时间戳更新者为准,保证状态的一致性。最后还有遗忘合理性评估:删之前先判断这条记忆是否仍具长期价值,防止误删用户核心偏好。

老王的大扫除从没让客人失望过——该记得的全记得,该忘的全忘了。Agent的遗忘机制同样是一门平衡艺术:忘得太快,用户会觉得“你根本不记得我”;忘得太慢,认知负荷与存储成本都会失控。好的遗忘策略,让系统在“记住”与“放下”之间找到优雅的平衡点。

---

wi=si⋅e−λ(tnow−ti)\displaystyle w_i = s_i \cdot e^{-\lambda (t_{\text{now}} - t_i)}
一句话理解:记忆权重 = 初始重要度 × 指数衰减因子,时间越久权重越低,最终被系统自然遗忘。
  1. w_i 是第 i 条记忆的当前权重这个权重参与检索打分,权重越高越容易被召回。
    wi\displaystyle w_i
  2. s_i 是初始重要度写入时赋予的固有价值分,好比卡片上标记的“重要/普通”等级。
    si\displaystyle s_i
  3. e^(-λ(t_now - t_i)) 是指数衰减因子t_now 是当前时间,t_i 是写入时间,两者差越大,指数越接近 0,权重衰减得越厉害。
    e−λ(tnow−ti)\displaystyle e^{-\lambda (t_{\text{now}} - t_i)}
  4. λ 是衰减速率参数控制遗忘的“快慢”——λ 越大,记忆凉得越快,好比档案的保鲜期越短。
    λ\displaystyle \lambda

AI 应用场景

电商客服机器人:会话中断后的无缝接力

阶段:上下文注入 + 跨会话状态恢复

解决的问题:用户本来在咨询退换货,中途离开两小时再回来,传统客服需要用户复述一遍前因后果。AI Agent通过将会话状态(订单号、售后诉求、已核实信息)持久化存储,在新会话开始时自动注入上下文,无缝接续服务。

具体案例:某电商平台客服机器人,用户第一轮说“我要退掉昨天买的电饭煲”,并提供了订单号。两小时后用户重新打开对话窗口说“继续”,Agent自动检索到订单状态与退换货诉求,直接回复:“您昨天申请的退款还在处理中,预计今天18点前到账。”整个过程中用户没有复述任何信息。

个人AI学习助理:基于长期记忆的个性化辅导

阶段:记忆分层 + 检索召回 + 遗忘管理

解决的问题:学习助理需要记住用户的知识薄弱点、学习进度与偏好,但又不被陈旧信息干扰。通过长期记忆归档存储用户画像,短期记忆记录本次练习表现,再结合检索召回调取“该用户常犯的错题类型”,实现真正的因材施教。

具体案例:某英语学习App的AI助教,第一周记录到用户“时态填空题错误率40%”,并将此条记忆标记为高重要度。三周后的新会话中,用户提到“我最近在练写作”,Agent召回了这条记忆,主动在写作练习里增加了时态校准环节。

企业知识库问答Agent:Token成本与回答质量的双重优化

阶段:上下文窗口管控 + 向量检索

解决的问题:企业知识库文档繁多,直接全量塞入上下文既不现实也浪费Token。Agent通过向量检索召回Top3最相关文档片段,配合摘要压缩历史对话,在有限的窗口预算内实现精准问答。

具体案例:某制造企业的运维知识库Agent,当工程师询问“3号产线报警代码E42怎么处理”时,系统从5000+份技术文档中召回对应的3段维修手册,拼装模板后只消耗不到2000 Token完成回答,而传统方案需要调用多次或塞入完整手册。

Python 演示

python64 行
class MemoryAgent:    """一个极简的Agent跨会话记忆管理器(演示用途)。"""     def __init__(self, window_limit=4, forget_threshold=3):        self.long_term = {}        self.short_term = []        self.window_limit = window_limit        self.forget_threshold = forget_threshold        self.gc_count = 0     def save(self, key, value, importance=1.0):        self.long_term[key] = {            "value": value,            "importance": importance,            "time": self.gc_count,        }     def recall(self, query, top_k=2):        scored = []        for key, info in self.long_term.items():            score = info["importance"]            if query in key or query in info["value"]:                score += 1.0            scored.append((score, key, info["value"]))        scored.sort(reverse=True)        return [(k, v) for _, k, v in scored[:top_k]]     def inject(self, user_input):        memories = self.recall(user_input)        injected = ["[mem] " + v for _, v in memories]        self.short_term = injected + ["[cur] " + user_input]        return self.short_term[:self.window_limit]     def forget_expired(self):        self.gc_count += 1        expired = []        for key, info in self.long_term.items():            if self.gc_count - info["time"] > self.forget_threshold:                expired.append(key)        for key in expired:            del self.long_term[key]        return len(expired)  def main():    agent = MemoryAgent(window_limit=4, forget_threshold=3)    agent.save("user_name", "Xiaoming", importance=2.0)    agent.save("product", "laptop", importance=1.5)     print("round1:", agent.inject("recommend laptop"))    print("forget1:", agent.forget_expired())     print("round2:", agent.inject("I am Xiaoming"))    print("forget2:", agent.forget_expired())     print("forget3:", agent.forget_expired())    print("forget4:", agent.forget_expired())     print("round3:", agent.inject("hello"))    print("long term left:", list(agent.long_term.keys()))  if __name__ == "__main__":    main()
目的:演示一个带长期记忆、上下文注入、检索召回和遗忘淘汰的极简Agent,模拟三个轮次的跨会话对话。
  1. self.long_term[key] = {...}把一条记忆写入长期记忆库,记录重要度与写入时间,像往熟客档案里放卡片。
  2. score = info["importance"]打分起点是记忆的重要度,重要信息天然占优。
  3. if query in key or query in info["value"]关键词命中则加分,模拟关键词匹配检索。
  4. scored.sort(reverse=True)按分数从高到低排序,这就是召回阶段的“排名”。
  5. memories = self.recall(user_input)根据当前用户输入,从长期记忆中检索最相关的TopK条。
  6. self.short_term = injected + [...]把检索到的记忆注入短期上下文,与当前提问拼装在一起。
  7. self.gc_count += 1每次清理调用代表“过去一个时间周期”,用于计算记忆的年龄。
  8. if self.gc_count - info["time"] > self.forget_threshold判断记忆是否超过保鲜期,是决定是否遗忘的核心逻辑。

常见误区

误区“要让Agent记得全面,就应该把之前所有的对话记录都原样塞进上下文窗口,这样信息量最大。”我以前就这么干,结果模型经常答非所问,Token费用还暴涨。

正解上下文窗口不是仓库,而是“工作台”。工作台上堆满几年前的旧账,反而盖住了今天要用的订单。正确的做法是分层管理:对话细节存在长期记忆库,只把检索出的最相关TopK条注入上下文,必要时用摘要压缩替换完整历史。这像老王只在点单本上夹今天需要的卡片,而不是把整个档案柜搬到吧台上。

为何常见:很多人直觉地认为“模型看到越多就越聪明”,忽略了窗口容量的物理限制和无关噪音对注意力机制的干扰。

误区“记忆就是记忆,为什么要分短期长期?统一存到一个地方不就行了?”我以为分层只是学术概念,实际开发中用一个全局字典搞定一切。

正解短期与长期的生命周期、读写频率、存储介质完全不同。短期记忆活在上下文窗口里,几秒到几分钟就滚动消失;长期记忆落在持久化存储中,跨越会话存活数月。混淆两者就会导致:要么把窗口撑爆,要么把临时信息永久固化——小黑板和档案柜不能是一个东西。

为何常见:刚接触Agent开发时,大家从单次对话的“无状态”模型起步,天然缺乏“生命周期”视角,容易把记忆当作单一概念。

误区“用户的信息多存一点总没错,存100条肯定比存10条更了解用户。”于是我在长期记忆库里无差别记录所有对话。

正解记忆越多,检索时噪音越多,注入时挤占的Token越多,还可能包含大量过期甚至错误信息。记忆质量比数量更重要——存储时要分级,注入时要筛选,定期要遗忘。老王不会把客人某天“今天赶时间”也写进档案,只有稳定的偏好和关键事件才值得归档。

为何常见:人们对“记忆”的自然理解是“记得多=记性好”,忽视了AI场景中记忆的检索成本、存储成本和质量衰减。

误区“遗忘机制把记忆删掉后,用户再问起来就完全没辙了,所以删除操作要非常谨慎,最好别删。”

正解工程上的“遗忘”往往不是物理删除,而是逻辑降权——把记忆标记为过期、移到冷存储或降低检索权重。真正意义上的删除通常只用于敏感数据(用户要求删除个人信息)。状态存储的“快照恢复机制”也会定期备份,误删后可以从快照恢复。这就好比老王的档案迁到阁楼,不是烧掉,是“眼不见但可寻”。

为何常见:将“遗忘”理解为数据库的DELETE操作,而忽略了几种更常见的弱化遗忘形式——衰减、归档、覆盖。

误区“拿用户登录ID当会话ID不就行了?反正一个用户一个会话。”结果用户中途换设备,历史状态全丢了。

正解会话ID标识的是“一段连续对话”,用户ID标识的是“一个用户”。一个用户可以有多个会话,一个会话也可能跨设备(同一账号)。正确的设计是:用户ID用于定位长期记忆归属,会话ID用于组织短期对话结构,两者通过映射关系关联。好比老王知道张女士的档案在02号抽屉,但今天上午她坐吧台的对话、下午坐靠窗的对话是两件独立的事。

为何常见:初学时容易混淆“身份”与“交互上下文”两个维度,把状态存储的粒度定错,导致跨设备的连续服务失败。

面试题

Q1. 跨会话状态存储中,最核心的前提条件是什么?

单选题 · easy

  • A.上下文窗口足够大
  • B.稳定的会话唯一标识← 正确答案
  • C.模型参数足够多
  • D.训练数据足够丰富

答案:B。会话状态要能在多次对话间存取,必须先有一个稳定的“抽屉编号”来定位记忆归属——这就是会话唯一标识。上下文窗口、模型参数、训练数据都与状态存储的“能存能取”无关。好比老王要归档熟客档案,首先得给每位客人编个号。

Q2. “上下文注入”解决的核心问题是什么?

单选题 · easy

  • A.让模型更擅长推理
  • B.扩展模型的训练数据
  • C.把历史记忆带给新会话← 正确答案
  • D.提升模型生成速度

答案:C。大模型本身没有跨会话记忆,上下文注入就是把长期记忆库中检索到的历史信息,拼装到新会话的上下文中,让模型“看起来记得”。模型推理能力、训练数据、生成速度都与注入机制没有直接关系。

Q3. 长期记忆与短期记忆的本质区别在于?

单选题 · mid

  • A.存储内容类型不同
  • B.存储介质与生命周期不同← 正确答案
  • C.模型参数量不同
  • D.对话语言种类不同

答案:B。长期记忆写入持久化存储,跨会话存活;短期记忆存活于上下文窗口,随会话结束而消失。两者在生命周期和存储介质上完全不同。内容类型、模型参数、语言种类都不是区分维度。

Q4. 上下文窗口占用率超过阈值时,最推荐的处理策略是?

单选题 · mid

  • A.扩大窗口参数
  • B.忽略继续对话
  • C.摘要压缩旧内容← 正确答案
  • D.清空所有历史

答案:C。摘要压缩能在保留核心语义的前提下大幅降低Token占用,是工程上最常用的手段。扩大窗口受模型限制,忽略会导致信息缺失,清空历史则丢失全部记忆——这些都不可取。

Q5. 记忆检索中,余弦相似度衡量的是什么?

单选题 · mid

  • A.两条文本的长度差
  • B.两个向量的方向接近度← 正确答案
  • C.两段对话的时间间隔
  • D.两个模型的结构差异

答案:B。余弦相似度计算的是问题向量与记忆向量之间的夹角余弦值,衡量“方向”上的接近程度,与文本长度、时间间隔、模型结构无关。方向越一致,语义越相关。

Q6. 时间衰减机制中,λ 参数的作用是什么?

单选题 · hard

  • A.控制遗忘的速度快慢← 正确答案
  • B.决定记忆的存储位置
  • C.调节模型的输出长度
  • D.计算上下文的Token数

答案:A。在权重公式 w = s·e^(-λΔt) 中,λ 是衰减速率参数,λ 越大记忆权重下降越快,遗忘越快;λ 越小记忆保持越久。存储位置、输出长度、Token数都与 λ 无关。

Q7. 以下哪些属于需要持久化的会话状态?

多选题 · easy

  • A.用户姓名与偏好← 正确答案
  • B.历史问答记录摘要← 正确答案
  • C.临时页面滚动位置
  • D.用户的购物车内容← 正确答案

答案:ABD。用户姓名偏好、历史问答摘要、购物车内容都是跨会话有价值的状态,应持久化存储。临时页面滚动位置是无关紧要的瞬时UI状态,不需要写入长期记忆库。

Q8. 上下文注入的内容通常来自哪些环节?

多选题 · mid

  • A.检索召回的长期记忆← 正确答案
  • B.固定的提示词模板← 正确答案
  • C.模型初始化的随机参数
  • D.当前用户的实时输入← 正确答案

答案:ABD。注入上下文的内容包括检索出的历史记忆、预定义的提示模板结构、以及用户当前正在输入的问题。模型随机参数是训练阶段的产物,与上下文注入无关。

Q9. 记忆检索召回阶段可以采用哪些打分信号?

多选题 · mid

  • A.关键词匹配命中数← 正确答案
  • B.向量语义相似度← 正确答案
  • C.记忆的重要度分数← 正确答案
  • D.服务器CPU核心数量

答案:ABC。关键词匹配、向量语义相似度、重要度加权都是召回阶段常见的打分信号。CPU核心数是硬件资源指标,与记忆相关性打分毫无关系。

Q10. 设计遗忘淘汰机制时,需要兼顾哪些因素?

多选题 · hard

  • A.记忆的年龄与衰减权重← 正确答案
  • B.新记忆与旧记忆的冲突← 正确答案
  • C.用户数据的隐私合规← 正确答案
  • D.模型参数量与层数

答案:ABC。年龄衰减决定权重,冲突覆盖规则处理信息矛盾,隐私合规要求支持用户删除数据——三者都是遗忘机制的设计维度。模型参数量与层数是模型架构问题,与遗忘机制无关。