2026-09-29 · 原文发布日
n8n给AI Agent加持久记忆:Redis短期+pgvector长期+Claude提炼
面向自己搭建AI对话应用的人:聊天webhook收到消息后校验用户与会话ID,从Redis取近期对话,用Voyage AI生成查询向量(带缓存),在PostgreSQL+pgvector里做相似度检索并按相似度/重要性/新近度重排出长期记忆,连同对话一起交给Claude生成回复。后台再把本轮对话让Claude提炼出可持久记忆、嵌入去重后写回数据库;另有每日任务衰减不常用记忆的重要性并清理过期条目,以及一个「遗忘」webhook可按ID或按用户删除记忆并清空会话。需要自建Postgres和Redis,门槛高于一般模板。
原文要点
原模板是免费n8n工作流:聊天webhook或手动触发后校验userId、sessionId、message;Redis存会话历史和查询向量缓存;Voyage AI生成embedding;PostgreSQL加pgvector做相似度检索并按相似度、重要性、新近度重排;Claude生成回复并后台提炼可持久记忆,去重upsert;每日任务衰减重要性并清理过期记忆;forget webhook按UUID或用户删除并清会话。原文只给结构,不给可导入JSON。
这次做成什么
在本站练成一个可自测的最小记忆闭环:聊天入口校验输入,短期上下文走Redis,长期记忆走向量库,Claude只负责回复与提炼,后台任务做衰减和遗忘;所有界面参数以原模板为准,本站提供独立练习数据与配置。
准备什么
- 可登录的自建或云端n8n,并能创建webhook、schedule、HTTP Request、Postgres、Redis节点
- 已启用pgvector的PostgreSQL,且有建表、插入、更新、删除权限
- 可写TTL的Redis实例,练习时使用隔离前缀aiplay:demo:*
- Anthropic的x-api-key与Voyage AI的Authorization Bearer测试凭据,分开保管
- 可信调用方会提供userId,禁止把浏览器匿名输入直接当可信身份
具体怎么做
建库与配置
在Postgres执行本站练习SQL建agent_memories,维度先填你的embedding模型维度;在n8n新建Set节点保存model、embed_model、embed_dim、session_ttl_sec、embed_cache_ttl_sec、top_k、sim_threshold、dedupe_threshold、decay_rate,字段名与原模板不一致时以原模板为准。
聊天入口校验
创建Webhook节点POST /aiplay/chat,接JSON;用IF节点要求body.userId、body.sessionId、body.message均非空且userId匹配受信调用方头;不合格直接Respond 400,合格写入Set字段user_id、session_id、message、ts。
取短期与向量缓存
Redis GET aiplay:demo:sess:{{$json.user_id}}:{{$json.session_id}}得到recent_turns;再对message做哈希(用Crypto节点的Hash操作或Code节点生成)得到缓存键aiplay:demo:emb:<哈希值>并GET。分支:命中缓存跳过;未命中用HTTP Request调嵌入提供方,Header选Authorization Bearer凭据,成功后SETEX写回缓存并保留vector。
检索并重排长期记忆
Postgres节点用参数化查询:SELECT id,content,importance,last_accessed_at,1-(embedding<=>{{vector}}::vector) AS sim FROM agent_memories WHERE user_id={{user_id}} AND (embedding<=>{{vector}}::vector)<(1-{{sim_threshold}}) ORDER BY embedding<=>{{vector}}::vector LIMIT {{top_k}};Code节点按score=0.55*sim+0.30*importance+0.15*recency重排,并UPDATE命中的last_accessed_at与access_count。
回复与后台写回
把recent_turns、memories、message拼进Claude提示词生成reply并Respond;后台分支不阻塞响应:SETEX保存追加后的会话,调用提炼提示词得到memory_candidates,逐条embed后用embedding<=>阈值查近重复,近重复则更新原记忆,否则INSERT。
维护与遗忘
Schedule每日执行UPDATE importance=importance*decay_rate,再DELETE expires_at<now()或importance低于下限且久未访问;forget Webhook按mode=one删UUID、mode=all删user_id全部行,并DEL对应Redis sess键,返回删除计数。
可直接复制的材料
练习配置样例
本站独立示例;模型名、维度、阈值需按提供方与原模板核对,不代表原工作流文件。
{"model":"请替换为你的Claude模型名","embed_model":"请替换为你的Voyage模型名","embed_dim":1024,"session_ttl_sec":86400,"embed_cache_ttl_sec":604800,"top_k":8,"sim_threshold":0.72,"dedupe_threshold":0.92,"decay_rate":0.98,"stale_days":30,"redis_prefix":"aiplay:demo"}记忆提炼提示词
本站编写,用于Claude后台提炼;输出必须先JSON校验再embed。
你是长期记忆提炼器。输入是最近对话和本轮用户消息。只输出JSON数组,不要解释。每条记忆对象字段:content为可在未来对话复用的事实、偏好或约束,不超过60字;importance为0到1;expires_in_days为null或7到365的整数;memory_type只能取profile、preference、project、constraint、episode。丢弃寒暄、一次性指令、敏感凭据和无法核实的猜测。若无可持久内容输出[]。练习建表SQL
本站练习方案,维度1024必须改成你的embed_dim;ivfflat需足够数据或改用hnsw,是否可用按PostgreSQL版本核对。
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE IF NOT EXISTS agent_memories (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
user_id text NOT NULL,
content text NOT NULL,
memory_type text NOT NULL,
embedding vector(1024) NOT NULL,
importance real NOT NULL DEFAULT 0.5,
access_count integer NOT NULL DEFAULT 0,
last_accessed_at timestamptz NOT NULL DEFAULT now(),
created_at timestamptz NOT NULL DEFAULT now(),
expires_at timestamptz NULL
);
CREATE INDEX IF NOT EXISTS agent_memories_user_idx ON agent_memories(user_id);
CREATE INDEX IF NOT EXISTS agent_memories_emb_idx ON agent_memories USING ivfflat (embedding vector_cosine_ops);一条测试数据
合成测试数据,不包含真实个人信息;webhook需加独立测试头鉴权。
{"userId":"u_demo_001","sessionId":"s_alpha_9","message":"以后给我推荐耳机时,优先考虑降噪,预算不超过1500元。","clientTraceId":"trace-demo-20260929-01"}输入与输出示例
本站虚构演示,未调用真实Claude、Voyage、Redis或Postgres;数字与字段与上方测试输入对应。
输入
POST /aiplay/chat 正文:{"userId":"u_demo_001","sessionId":"s_alpha_9","message":"以后给我推荐耳机时,优先考虑降噪,预算不超过1500元。"}对应输出
webhook响应示意:{"reply":"已记住:推荐耳机优先降噪,预算上限1500元。","memory_debug":[{"content":"推荐耳机优先降噪且预算不超过1500元","importance":0.86,"memory_type":"preference","dedupe":"inserted"}]};Redis键aiplay:demo:sess:u_demo_001:s_alpha_9追加本轮,agent_memories新增1行且access_count=0。做完检查这些
- 无效payload缺少sessionId时必须返回400,且不写Redis、不查向量库、不调Claude
- 同一message第二次进入时embedding应命中Redis缓存,HTTP嵌入节点执行次数不增加
- 检索结果不足sim_threshold时回复不得假装记起长期偏好,只能使用recent_turns
- 提炼输出非JSON或含敏感凭据时必须丢弃并记录,不进入embedding与upsert
- forget按UUID删除后,同一会话再问该偏好不得从长期记忆复现
容易卡住的地方
- userId若由前端任意填写,会把别人的记忆串到当前用户,需服务端签发或头鉴权
- embed_dim与表vector维度不一致会直接插入失败,改模型后必须重建或迁移列
- 重排公式是本站练习权重,不是原模板承诺,调参前备份阈值并做小样本回放
- 后台写回若同步阻塞webhook,聊天延迟会上升,应响应后再提炼
- Redis TTL过短会让短期上下文断层,过长又会混入旧会话,需按会话生命周期设置
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Store persistent AI agent memory with Claude, Voyage AI, Postgres, and Redis
- 原作者
- Oneclick AI Squad
- 原始发布日期
- 2026-09-29T05:44:51.162Z
- 来源
- https://n8n.io/workflows/20119