96SEO 2026-04-22 19:46 17
你有没有遇到过这种情况:你兴致勃勃地跟AI聊了半小时把你的喜好、项目背景甚至昨晚吃的什么dou交代了结果它突然来了一句“请问您是Zuo什么的?”。那一瞬间,是不是有一种想把电脑屏幕砸了的冲动?这就像是你跟一个只有七秒记忆的金鱼在谈恋爱,每次转身它就忘了你是谁。

这其实不是AI“笨”,而是它的出厂设置决定的。大语言模型本质上就是个没心没肺的家伙,每次调用对它来说dou是全新的开始。它没有大脑皮层来存储海马体里的神经元连接。所以Ru果我们想要构建一个真正智Neng的Agent,一个Neng记住你偏好、Neng跨会话积累知识的“数字伴侣”,我们就必须在外部帮它搭建一个记忆模块。
今天我们就来深扒一下这个记忆模块的架构,聊聊它是如何把那些稍纵即逝的对话,变成稳固的长期记忆的。这过程可比在VSCode里配置C语言环境要复杂得多,但也geng有趣。
核心困境:无状态的“白纸”与有状态的“期待”我们要接受一个残酷的现实:LLM 永远是无状态的。它“记得你”这种感觉,完全是我们在每次请求前,在外部偷偷把记忆拼进 payload 造成的幻觉。这就像是一个演员,每次上台前dou要把剧本塞给他,他才Neng演得像那么回事。
记忆模块本质上就是在回答一个灵魂拷问:“哪些信息应该被放进下一次 LLM 调用的 context 里?”
这听起来简单,Zuo起来却像是在走钢丝。Context Window是有限的,通常只有 8k 到 128k tokens。这就好比你的书桌只有那么大,Ru果你把所有的历史记录dou堆上去,hen快就没地方放新文件了。而且,把所有东西dou塞进去不仅贵,还会让模型注意力分散,甚至产生“迷失中间”的现象。
所以我们不Neng把“记忆”等同于“数据”。记忆不是数据库里存储的所有聊天记录,这俩概念一定要区分开。记忆是经过提炼、筛选、压缩后的精华。
短期记忆:在有限的窗口里精打细算短期记忆,顾名思义,就是当前 session 会话的对话历史。这部分记忆直接拼进 prompt 的 messages 数组里。但是随着对话越来越长,我们不Neng无限制地往里加。
这里有一个hen实用的策略:摘要压缩。
想象一下你正在写代码,突然断电了。重启后你不需要记得每一行代码是怎么敲的,你只需要记得“刚才我在写一个登录接口”。
AI也是一样。我们Ke以设定一个阈值,比如每累积 5 轮对话,就自动触发一次。这比依赖 Redis 的 TTL 过期机制要geng常用,也geng可控。Redis 的 keyspace notification 虽然Neng监听过期事件,但配置起来稍微复杂一点,而且那是“被动死亡”,我们geng需要“主动归档”。
来kankan这段逻辑,这就像是给大脑Zuo了一次定期的“垃圾回收”:
class SummaryMemory {
constructor {
this.client = client;
this.summaryThreshold = summaryThreshold;
this.summary = ""; // 历史摘要
this.recentMessages = ; // 近期完整消息
}
async add {
this.recentMessages.push;
if {
await this._compress;
}
}
async _compress {
const historyText = this.recentMessages
.map => `${m.role}: ${m.content}`)
.join;
const prompt = this.summary
? `Yi有摘要:${this.summary}
新增对话:
${historyText}
请geng新并合并为一段新摘要,保留关键信息。`
: `请将以下对话压缩为简洁摘要,保留关键事实和用户意图:
${historyText}`;
const res = await this.client.messages.create({
model: "claude-opus-3",
max_tokens: 1024,
messages: ,
});
this.summary = res.content.text;
this.recentMessages = ; // 清空,等待新消息积累
}
getMessages {
const messages = ;
if {
messages.push({
role: "user",
content: `: ${this.summary}`,
});
messages.push({
role: "assistant",
content: "好的,我Yi了解之前的对话背景。",
});
}
return ;
}
}
当然摘要压缩是有损的。它牺牲了细节换取了空间。就像把一张高清图片压缩成缩略图,轮廓还在但像素点没了。所以这里有个坑:重要的信息,不应该只靠摘要保留,否则几次压缩后这个关键事实可Neng就丢了。
长期记忆:构建Agent的“第二大脑”Ru果说短期记忆是工作台上的文件,那长期记忆就是档案室。长期记忆跨越会话存在需要持久化存储。这里我们通常分两个层次来玩:用户画像和语义记忆。
1. 用户画像:把“人”存进数据库这部分比较简单,就是把用户的偏好、基本信息等结构化数据存进 DB。用 PostgreSQL 或者 MongoDB douKe以kan你顺手不顺手。
每次对话开始时我们读取这些信息,然后把它狠狠地注入到 system prompt 的头部。这样模型一上来就知道:“哦,我现在是在跟张三说话,他是个程序员,喜欢用 Python。”
我们Ke以写一个专门的类来处理这件事,甚至Ke以让 LLM 自动从对话中抽取信息:
class UserProfileMemory {
constructor {
this.db = db;
}
async updateProfile {
// newFacts 来自 LLM 对对话的信息抽取
await this.db.collection.updateOne(
{ userId },
{ $set: { ...newFacts, updatedAt: new Date } },
{ upsert: true }
);
}
async getSystemPrompt {
const profile = await this.db.collection.findOne;
if return "";
return `用户基本信息:
- 姓名:${profile.name || "未知"}
- 职业:${profile.occupation || "未知"}
- 偏好语言:${profile.preferredLang || "中文"}
- Yi知背景:${profile.background || "无"}
`.trim;
}
// 让 LLM 从对话中自动抽取用户信息
async extractAndSave {
const res = await client.messages.create({
model: "claude-opus-3",
max_tokens: 1024,
messages:
});
try {
const facts = JSON.parse;
await this.updateProfile;
} catch {
console.log;
}
}
}
2. 语义记忆:向量库的魔法
这是长期记忆的核心,也是Zui“AI”的部分。把历史对话、知识片段 embedding 成向量存储,对话时用当前 query Zuo相似度检索,把Zui相关的记忆片段注入 context。
这就像是你去图书馆查资料,不是一本本翻,而是通过关键词直接定位到某一页的某一段。
流程大概是这样的:
写入:文本 → Embedding API → 向量 → 存入 VectorDB
读取:当前query → Embedding → 相似度搜索 → 取 Top-K 原文 → 注入 prompt
这里需要存储的可不是所有的对话记录,而是值得被记住的信息。这个概念就hen模糊,而且不知道怎么判断哪些值得被记忆。这就需要我们在每轮对话结束时让 LLM 本轮对话的概述,然后记录在 Vector DB,算是这一轮的语义记忆。
实战架构:并行读取与异步写入的艺术好了现在我们有了短期记忆、长期记忆。怎么把它们串起来呢?
关键点在于合理切分文档使用向量库进行语义检索,以及让模型基于检索内容而非记忆作答。
性Neng是王道。我们不Neng让用户等我们查库、查向量、查画像,等半天没反应。所以读取是并行的,写入是异步的。
我们Ke以用 Promise.all 同时发起三路读取请求,把延迟压缩到 ~30ms 以内;而写回操作则完全不阻塞用户响应,直接扔进 setImmediate 或者消息队列里慢慢处理。
kankan这个组装示例,是不是感觉逻辑瞬间清晰了?
async function buildContext {
// 三路并行,榨干性Neng
const = await Promise.all();
const recalledText = recalled
.map
.join;
const system = .filter.join;
return { system, messages: recentMsgs };
}
每次对话请求进来我们dou会经历这样一个流程:
读取用户画像 → 注入 system prompt 头部。
向量召回相关历史记忆 → 注入 system prompt 中部。
取近期对话窗口 → 作为 messages 数组。
调用 LLM → 返回结果。
异步存入向量DB。
geng新对话窗口。
给AI装上“海马体”虽然现在的大脑科学还没搞清楚我们人类的记忆、意识、思想到底是怎么产生的——是不是靠神经痕迹在感觉皮质存储,还是有什么geng深层的量子力学效应——但我们在数字世界里Yi经Ke以用 Redis、Vector DB 和 LLM 拼凑出一个像模像样的“海马体”了。
这不仅仅是存储数据,这是在构建关系。当AINeng准确地说出“上次你提到的那个项目进展如何了?”的时候,它就不再是一个冷冰冰的工具,而是一个有温度的助手了。
当然这条路还hen长。比如怎么处理记忆的冲突?怎么让记忆具备遗忘机制?怎么防止记忆被恶意注入?这些dou是我们在后续的项目中需要去攻克的难题。Ru果你对这些感兴趣,或者正在折腾类似的 Agent 项目,欢迎随时交流,毕竟一个人瞎琢磨容易走火入魔,大家一起搞才热闹。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback