记忆与上下文
配置跨会话记忆图谱、后台自动提取与长对话的单次上下文摘要压缩
Clouisle 用两层机制解决对话的连续性与成本问题:
- 对话内上下文(消息分支 + 单次上下文摘要):会话进行时的实时历史。当组装好的请求超过预算时,系统把较早的历史压缩成一条摘要,只保留最近一段原文,避免模型窗口溢出。
- 跨会话记忆图谱(Memory Graph):跨越不同会话的持久知识网络,以实体和有向关系沉淀用户偏好、项目背景与核心事实。
没有独立的“会话摘要”子系统,也没有三级(警告/选择性/阻塞)压缩策略:压缩只有一种产物——一条由模型生成的上下文摘要。记忆功能本身就是实体/关系图谱,不是逐条对话文本的堆积。
启用跨会话记忆
- 打开 Agent 编排 > 记忆。
- 开启启用记忆(
enable_memory,默认关闭)。 - 设置每次检索的最大记忆数,范围
1-50,默认10。 - 按需开启自动提取记忆(默认开启)。
- 保存并发布 Agent。用户在不同会话中对话时,Agent 会自动召回此前记录的事实。
Agent 的记忆配置(memory_config):
| 字段 | 默认值 | 范围 | 说明 |
|---|---|---|---|
max_memories_per_retrieval | 10 | 1-50 | 每次记忆检索注入模型的最大实体数 |
auto_extract | true | 布尔 | 是否自动从对话中提取并保存记忆;关闭后只保留读取工具 |
importance_threshold | medium | low / medium / high | 自动提取时最低的重要性门槛 |

记忆图谱(Memory Graph)
持久记忆不是扁平文本,而是由**实体(Entities)与关系(Relations)**构成的有向知识拓扑网络。
可在个人菜单 > 我的记忆(/app/memories)或管理后台(/memories)中可视化探索和管理。
图片待补充:记忆图谱画布
文件:/images/memory-graph-canvas.png。截图内容:记忆图谱的交互画布页面,展示实体节点、关系连线、布局切换按钮(网格、层次、径向)与实体详情侧栏。截图需裁剪到主画布区域,并用主题色框线标出选中的实体节点。未来图片的 alt 与 caption 均使用"记忆图谱画布"。
实体类型(Entity Types)
系统预定义了 10 种实体类型:
| 实体类型 | 说明 | 示例 |
|---|---|---|
preference | 用户的个人偏好或习惯 | "偏好简洁的代码风格"、"习惯使用 TypeScript" |
project | 正在进行或参与的项目 | "电商重构项目"、"内部知识库系统" |
person | 提到的人物或角色 | "张经理(产品负责人)" |
organization | 涉及的公司、部门或组织 | "研发部"、"供应商 A" |
skill | 掌握的技术或专长 | "Python"、"PostgreSQL 性能优化" |
goal | 阶段目标或意图 | "本季度完成文档站国际化上线" |
fact | 客观事实或特定信息 | "生产集群部署在东京机房" |
concept | 领域专业概念或术语 | "RAG 混合检索" |
location | 地点或物理方位 | "上海张江研发中心" |
custom | 其他无法归类的自定义实体 | 用户自定义事实标签 |
关系类型(Relation Types)
实体间可建立 9 种有向关系,用于图遍历(Subgraph Traversal):
| 关系类型 | 含义 |
|---|---|
prefers | 偏好某项事物 |
uses | 使用某项工具或技术 |
works_on | 从事或参与某项事务/项目 |
works_at | 工作于某机构/公司 |
knows | 了解或熟悉某人/某技术 |
part_of | 属于某个更高级别的实体 |
has_goal | 具有某种目标 |
located_in | 位于某地点 |
related_to | 具有关联性 |
图谱管理功能
- 多布局可视化:支持网格布局(Grid)、层次布局(Hierarchical)与径向布局(Radial),并支持放大、缩小与适应视图(Fit View)。
- 实体检索与过滤:可按关键词搜索实体名称与描述,或按实体类型进行单选/多选过滤。
- 关系详情抽屉:点击实体查看其出向关系(Outgoing Relations)与入向关系(Incoming Relations),可直接编辑属性字典(JSON Properties)或删除特定单向关系。
- 批量与安全删除:支持框选模式(Select Mode)批量删除废弃或敏感记忆实体;删除实体会自动级联清理其关联的所有出入向关系及向量嵌入。
记忆检索与时间衰减(Decay)
当 Agent 发起记忆检索时,系统综合向量语义相似度与时间衰减计算加权综合得分:
综合得分 = (1 - w) × 向量相似度 + w × 时间得分
- 时间衰减计算:采用半衰期指数衰减模型(
exp(-ln2 / 半衰期 × 天数)),默认半衰期为 30 天(30 天前更新且再未变动的记忆,其时间得分减半)。 - 权重配置:时间衰减权重
w默认为0.15,语义相似度占0.85,兼顾语义相关性与近期新鲜度。 - 时间窗口过滤:检索时支持指定
time_window_days,只召回近 $N$ 天内创建或更新的记忆事实。 - 子图拓展(Subgraph):在获得命中实体后,支持以实体为中心沿关系边向外拓展
1-3层子图(max_depth,默认1;种子实体最多5个;方向incoming/outgoing/both),为 LLM 提供结构化的网状背景信息。
管理后台自动提取
管理员可在站点设置 > 记忆(/site-settings/memory)配置待处理用户轮次的后台记忆提取:
| 设置 | 默认值 | 约束 | 说明 |
|---|---|---|---|
memory_async_extraction_enabled | false | 布尔值 | 后台异步提取全局总开关 |
memory_extraction_model_id | 空 | 文本 | 提取所用的语言模型(为空时使用默认回退模型链) |
memory_extraction_cooldown_seconds | 180 | 10-3600 秒 | 去抖冷却时间,防止单次对话高频触发提取 |
memory_extraction_max_pending_turns | 6 | 1-50 轮 | 待处理用户轮次达到此阈值时立即触发提取任务 |
Agent 必须在自身编排中勾选启用记忆与自动提取记忆,且站点设置的后台提取总开关处于开启状态,系统才会为该 Agent 的对话排队异步提取任务。
长对话如何压缩
上下文压缩默认开启(context_compression_config.enabled = true),只有一种动作:把较早的历史交给模型生成一条摘要(策略名 preflight_summary),用它替换掉那段历史,并保留最近一段原文轮次。
预算计算
压缩按模型上下文窗口计算可用输入预算:
输入预算 = 上下文窗口 − 输出预留 − 安全余量
- 上下文窗口:取模型自身配置;缺省时回退到
32000。 - 输出预留:默认
4000,并取min(4000, 模型最大输出, 上下文窗口 ÷ 3)。 - 安全余量:固定
1000。
触发条件
当组装好的请求 token 数超过触发预算时生成摘要:
触发预算 = min(上下文窗口 − max(窗口 × 15%, 输出预留), 输入预算)
以默认 32,000 窗口为例:输出预留 4,000、安全余量 1,000、输入预算 27,000,触发预算 min(32000 − 4800, 27000) = 27000,即约窗口的 84%。SSE 事件里上报的 trigger_ratio 常量固定为 0.9,但真正决定何时触发的是上面的触发预算。
保留与生成
- 保留最近原文:保留尾部最多
20000个 token 的原文;该上限还会被压到「系统提示 + 摘要 + 当前轮 + 输出预留」都能装下的范围。最新一轮永远保留;工具调用尚未闭合的轮次不会被切开。 - 摘要长度:默认
1000token(summary_max_tokens,范围128-8000),并会截断到预算允许的长度。 - 摘要生成失败重试:最多
3次尝试,每次间隔2秒,单次超时180秒;全部失败则返回context_summarization_failed。 - 摘要持久化:摘要文本与水印(已覆盖的最后一条消息)保存在会话上(
context_summary_text/context_summary_watermark_id),后续轮次复用同一条摘要并增量更新,不会无限叠加。 - 压缩后仍超预算:抛出
ContextLengthError(retryable: false,原因context_summary_did_not_fit),不会无限重试。
流式 API 在 emit_sse_events 为真(默认)时发送 compression_start 与 compression_end,用于解释本轮为何整理历史;compression_end 携带 before_tokens、after_tokens、input_budget、summary_saved_tokens 等字段。
API 端点
# 列出记忆实体(支持按 entity_type 过滤与分页)
GET /api/v1/memories/entities?page=1&page_size=20&entity_type=preference
# 创建 / 更新 / 删除实体
POST /api/v1/memories/entities
GET /api/v1/memories/entities/{entity_id}
PUT /api/v1/memories/entities/{entity_id}
DELETE /api/v1/memories/entities/{entity_id}
# 列出 / 创建 / 删除关系
GET /api/v1/memories/relations?entity_id={entity_id}&relation_type=uses
POST /api/v1/memories/relations
DELETE /api/v1/memories/relations/{relation_id}
# 获取完整或局部记忆图谱
GET /api/v1/memories/graph?entity_ids={id1}&entity_ids={id2}&max_depth=2排查
- 未记住偏好:确认 Agent 已启用记忆、信息达到重要性阈值,并使用同一已登录用户。
- 回复忽略很早的细节:长会话可能已把早期历史压缩成摘要;把关键约束重新陈述,或开启新会话。
- 压缩频繁:检查模型上下文长度、输出预留和工具结果体积;工具返回的大段内容会更快撑满预算。
- 记忆图谱存在错误事实:前往
/app/memories,通过搜索定位错误实体,点击编辑修正描述,或直接删除。
这篇文章对你有帮助吗?