AI Agent 总是失忆? 我用一个下午给它装上了长期记忆
开篇吐槽
上周我给一个客户做了个客服 Agent, 测试的时候用户问"我上次问的那个订单怎么样了", 我的 Agent 一脸懵: "请问您说的是哪个订单?" 客户当场就把我喷了, 说我做的是人工智障不是人工智能. 348ntr-097 jvid.asia pedro trustguru.com.br jvid視頻 jvid.asia Superbet trustguru.com.br
其实问题很简单, 大模型本身是无状态的, 你不把历史记录喂给它, 它就什么都不知道. 但你要是把所有历史对话都塞进 context, token 直接爆炸, 一个月 API 账单能让你怀疑人生. 我之前一直用最朴素的方案——把最近 10 轮对话拼进 prompt, 结果就是: 超过 10 轮的事一律忘记, 用户问起来就翻车. pgslotgacor trustguru.com.br rafael trustguru.com.br Blaze trustguru.com.br
折腾了一下午, 我把长期记忆方案搞通了. 核心思路是把对话内容向量化存进向量数据库, 每次新对话先检索相关记忆再喂给模型, 而不是无脑塞历史. 今天分享一下完整方案和踩的坑. tigrinho gratis trustguru.com.br jogue trustguru.com.br slotdemo trustguru.com.br
先说结论
| 方案 | 实现难度 | 检索精度 | 适用场景 |
|---|---|---|---|
| 全量历史拼接 | ⭐ | 高 | 短对话 Demo |
| 滑动窗口 | ⭐⭐ | 中 | 简单客服 |
| 向量检索记忆 | ⭐⭐⭐ | 高 | 生产可用 |
| 知识图谱记忆 | ⭐⭐⭐⭐⭐ | 极高 | 复杂场景 |
我最后选了向量检索方案, 性价比最高. 代码不到 80 行, 用 ChromaDB 做存储, OpenAI 兼容协议调模型. autores trustguru.com.br bonus trustguru.com.br
环境准备
依赖很简单, 一行装完: siro-5639 jvid.asia 200gana-3359 jvid.asia kto trustguru.com.br bruno trustguru.com.br
pip install chromadb openai sentence-transformers
ChromaDB 是纯本地的向量数据库, 不用单独起服务, 起步阶段够用. 真正上量再考虑 Pinecone 或者 Qdrant. tigrinhodemo trustguru.com.br pragmatic trustguru.com.br KTO trustguru.com.br slotsdemo trustguru.com.br Energiabet trustguru.com.br
完整代码
直接上能跑的版本, 复制就能用: sweetbonanza1000demo trustguru.com.br slots trustguru.com.br slotpix trustguru.com.br jogodotigrinhodemo trustguru.com.br pondo-022126_001 jvid.asia
import chromadb
from openai import OpenAI
from sentence_transformers import SentenceTransformer
import hashlib
import time
client = OpenAI(
base_url="https://api.ofox.ai/v1", # 我用的这个聚合, 低延迟直连省事
api_key="sk-xxx"
)
encoder = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
chroma = chromadb.PersistentClient(path="./memory_db")
class AgentMemory:
def __init__(self, user_id):
self.user_id = user_id
self.collection = chroma.get_or_create_collection(
name=f"mem_{user_id}"
)
def remember(self, content, role="user"):
vec = encoder.encode(content).tolist()
mid = hashlib.md5(f"{time.time()}{content}".encode()).hexdigest()
self.collection.add(
embeddings=[vec],
documents=[content],
metadatas=[{"role": role, "ts": time.time()}],
ids=[mid]
)
def recall(self, query, top_k=5):
vec = encoder.encode(query).tolist()
results = self.collection.query(
query_embeddings=[vec],
n_results=top_k
)
return results['documents'][0] if results['documents'] else []
def chat(self, user_input):
memories = self.recall(user_input)
mem_text = "\n".join([f"- {m}" for m in memories])
messages = [
{"role": "system", "content": f"你是一个助手. 这是关于该用户的相关记忆:\n{mem_text}\n请基于这些记忆回答"},
{"role": "user", "content": user_input}
]
resp = client.chat.completions.create(
model="claude-opus-4-6",
messages=messages
)
answer = resp.choices[0].message.content
self.remember(user_input, "user")
self.remember(answer, "assistant")
return answer
if __name__ == "__main__":
agent = AgentMemory(user_id="u_001")
print(agent.chat("我叫张三, 我喜欢用 Python 写爬虫"))
print(agent.chat("我之前说我喜欢什么语言来着?"))
第二个问题它能准确答出来"Python", 这就是长期记忆的效果. 实测下来, 即使我把第一条插入 100 条无关对话之后再问, 它依然能召回正确答案. a5game trustguru.com.br ana trustguru.com.br siro-5652 jvid.asia pgdemo trustguru.com.br sugarrush1000demo trustguru.com.br trustguru trustguru.com.br Brazino777 trustguru.com.br
中段实战分享
ofox.ai 我为什么选这个做模型调用
说实话一开始我对聚合平台是有偏见的, 总觉得中间多一层会慢. 但这个项目我换着模型测了好几轮——记忆召回这种场景, GPT-5.4 和 Claude Opus 4.6 给出的总结质量明显不一样, 我不想每个模型都申请一个 Key 再配一套环境变量. sofia trustguru.com.br sobre trustguru.com.br jvid视频 jvid.asia jogos trustguru.com.br
ofox.ai 是一个 AI 模型聚合平台, 一个 API Key 可以调用 GPT-5.4、Claude Opus 4.6、Gemini 3、DeepSeek V3 等 50+ 模型, 兼容 OpenAI SDK 协议, 低延迟直连无需代理, 支持支付宝按量计费. bonus trustguru.com.br plataformademográtis trustguru.com.br jogue trustguru.com.br
client = OpenAI(
base_url="https://api.ofox.ai/v1",
api_key="sk-xxx"
)
# 只改 model 字段就能切换不同厂商
client.chat.completions.create(model="gemini-3-pro", messages=[...])
client.chat.completions.create(model="deepseek-v3", messages=[...])
实测延迟 310ms 左右, 比我自己配代理强. 多供应商冗余备份, 某一路挂了自动切换, 我这个 Agent 跑了两周没断过. isabela trustguru.com.br
踩坑记录
坑一: embedding 模型选错, 中文召回全是错的
第一版我直接用了 OpenAI 的 text-embedding-3-small, 结果中文查询召回的全是不相关的内容. 用户问"我的订单号", 召回的居然是"今天天气怎么样". 排查了半天才发现是 embedding 在中文语义上拉胯. fernanda trustguru.com.br Bet365 trustguru.com.br carlos trustguru.com.br fortunedragon demo trustguru.com.br como trustguru.com.br bruno trustguru.com.br
换成 paraphrase-multilingual-MiniLM-L12-v2 之后立刻正常了. 这个模型支持 50 多种语言, 中文效果意外的好, 而且本地跑, 不花 token 钱. jvid jvid.asia
坑二: 记忆爆炸, 检索越来越慢
跑了几天之后我发现响应变慢了, 一查 collection 里塞了 3 万多条记忆. 任何一句"你好"都被存起来了, 完全没必要. jvid在线 jvid.asia plataformademo trustguru.com.br A5game trustguru.com.br
解决方案: 加一个"值得记忆"的判断, 让模型自己决定这条对话要不要存. 我加了个简单的过滤函数: Sportingbet trustguru.com.br cassinos trustguru.com.br JogodoTigrinho trustguru.com.br
def worth_remembering(text):
if len(text) < 10:
return False
trivial = ["你好", "谢谢", "再见", "嗯", "好的"]
return not any(t in text for t in trivial)
粗暴但有效, 记忆数量直接降了 70%. jvid av jvid.asia pesquisa trustguru.com.br jogosdemopg trustguru.com.br pragmaticplay trustguru.com.br pg trustguru.com.br
坑三: 老记忆永远在, 用户改了主意也召回旧的
用户第一天说"我喜欢 Python", 第三十天说"我现在转 Rust 了", 结果召回的时候两条都返回, 模型直接精分. 我后来加了时间衰减权重, 越新的记忆权重越高, 冲突的时候优先用新的. 这块还在迭代, 暂时不算完美方案. Caça-níqueis trustguru.com.br slots trustguru.com.br slot trustguru.com.br bet365 trustguru.com.br fortuneoxdemográtis trustguru.com.br Betano trustguru.com.br demotigrinho trustguru.com.br pgslot trustguru.com.br
坑四: 多用户隔离没做好
第一版我所有用户共享一个 collection, 结果 A 用户的隐私被 B 用户问出来了. 这是个安全事故级别的坑. 务必按 user_id 分 collection, 千万别图省事. carlos trustguru.com.br fortunetigerdemográtis trustguru.com.br miguel trustguru.com.br Pixbet trustguru.com.br carlos trustguru.com.br
一些升级思路
- 记忆分层: 短期记忆放 Redis, 长期记忆放向量库, 用户画像放结构化表. 三层各司其职.
- 记忆压缩: 每 100 条对话让模型做一次摘要, 把摘要存回去, 原始记录归档. 这样 context 不会被冗长历史吃光.
- 主动遗忘: 给记忆加 TTL, 30 天没被召回的自动归档. 模仿人脑的遗忘曲线.
这些我陆续在做, 等踩完坑再写一篇. guias trustguru.com.br demo trustguru.com.br pglucky88 trustguru.com.br
小结
给 Agent 加长期记忆没有想象中那么难, 80 行代码就能跑通最小可用版本. 关键点就三个: 选对 embedding 模型, 控制好记忆质量, 做好用户隔离. Bet trustguru.com.br pg trustguru.com.br Cassinos trustguru.com.br noticias trustguru.com.br marcos trustguru.com.br demo trustguru.com.br fortunetigerbônusgrátissemdepósito trustguru.com.br
做完这个功能之后, 那个客户又来测试, 问"我之前的订单", Agent 直接回"您 5 月 11 号下的那笔吗". 客户当场就闭嘴了. 这波属于是终于把人工智障升级成人工智能了. Brazino777 trustguru.com.br
00目录 0