记忆图
记忆图(Memory Graph)是 Luker 最核心的独有功能之一,专门解决角色扮演中最常见的痛点——角色失忆。
LLM 的上下文窗口是有限的,当对话超过几百轮后,早期的重要信息(角色关系、关键事件、世界设定)会被截断丢失,导致角色「忘记」之前发生过的事情。记忆图通过将对话中的关键信息自动提取为结构化的知识节点,并在需要时智能召回注入到提示词中,让角色能够跨越数百轮对话持续记住重要的人物关系、事件经过和世界设定。
与简单的关键词搜索或向量检索不同,记忆图通过图结构和多层算法,确保召回的记忆既语义相关又覆盖全面,避免只想起「最像」的内容而遗漏其他重要信息。
工作原理
记忆图的工作流程可以概括为三个阶段:自动提取 → 智能召回 → 层级压缩。
自动提取
每当 AI 生成回复后,记忆图会自动分析最新的对话内容,从中提取值得记忆的信息。提取过程由 LLM 完成,输出结构化的知识节点。
提取的信息分为两大层级和四种默认类型:
语义层节点(持久化的结构化知识,会被合并更新):
| 类型 | 说明 | 示例 |
|---|---|---|
| 角色状态 | 角色的名字、身份、目标、关系、当前状态 | 「艾琳是一名治愈师,目前受伤」 |
| 地点状态 | 地点的名称、控制者、危险程度、资源 | 「黑暗森林由精灵族控制,危险等级高」 |
| 规则约束 | 世界观中的规则和限制 | 「魔法在圣域中无法使用」 |
事件层节点(剧情记录,每次提取都创建新节点,不会合并):
| 类型 | 说明 | 示例 |
|---|---|---|
| 事件摘要 | 剧情中发生的重要事件 | 「主角在森林中遭遇了伏击」 |
事件节点的特殊性
事件节点与其他类型有本质区别:
- 每次提取都创建新节点:标题自动递增,不会像角色状态那样合并到已有节点,因为事件是时间线上的独立记录
- 始终注入最高层时间线:事件节点被视为核心故事线上下文,最高层级的时间线摘要会始终注入到提示词中,确保 AI 对整体剧情走向有感知
- 压缩后的底层事件被隐藏:当事件积累过多时,旧事件会被压缩为更高层级的摘要。被压缩的底层事件节点不再常驻注入,但仍然保留在图中,可以通过召回机制在需要时被重新发现
简单来说:AI 始终能看到「大事记」(最高层摘要),但具体的细节事件只有在对话涉及到时才会被召回补充。
你可以通过「提取间隔」设置项控制提取频率——例如设为 2 表示每隔 2 轮 AI 回复才触发一次提取,减少 LLM 调用开销。
智能召回
当你发送新消息触发 AI 生成时,记忆图会根据当前对话上下文,从已积累的记忆中召回最相关的内容,并注入到提示词中供 AI 参考。
记忆图支持多种召回方式:
| 召回方式 | 说明 |
|---|---|
| LLM 召回 | 让 LLM 直接从记忆库中选择相关节点,支持多轮深挖 |
| 混合召回 | 结合向量检索、图扩散、词汇匹配等多种信号综合评分 |
| 混合 + 重排序 | 在混合召回基础上使用重排序模型进一步优化结果 |
| 混合 + LLM | 在混合召回基础上让 LLM 对候选节点进行二次筛选 |
默认使用 LLM 召回方式,你可以在记忆图设置面板中切换召回方式。
层级压缩
随着对话推进,事件记忆会不断积累。记忆图会自动将旧的事件节点进行层级压缩——将多个相关事件合并为一个更高层级的摘要节点,保留核心信息的同时控制记忆总量。
压缩是递归进行的:当某一层级的摘要节点数量也超过阈值时,它们会被进一步压缩为更高层级的摘要,如此向上递归,直到节点数量降到阈值以下。例如,多个战斗事件先被压缩为「森林战役」,多个战役又可能被压缩为「北方远征」。压缩后的摘要节点仍然可以展开查看原始的子事件。
开启与配置
基本开启
- 在 Luker 扩展设置中找到「记忆图」
- 打开「启用记忆图」开关
- 开始对话,记忆图会自动工作
配置 LLM 预设
记忆图的提取和召回需要调用 LLM,但可以使用与主对话不同的模型和预设。这意味着你可以:
- 主对话使用高质量模型(如 Claude Opus),记忆图使用更经济的模型(如 Claude Haiku)
- 为提取和召回分别指定不同的 API 连接和 Chat Completion 预设
相关配置项:
| 设置项 | 说明 |
|---|---|
| 提取 API 预设 | 提取使用的 API 连接预设(空 = 使用主连接) |
| 提取预设 | 提取使用的 Chat Completion 预设 |
| 召回 API 预设 | 召回使用的 API 连接预设 |
| 召回预设 | 召回使用的 Chat Completion 预设 |
调整召回行为
| 设置项 | 默认值 | 说明 |
|---|---|---|
| 启用召回 | true | 是否启用召回 |
| 召回方式 | llm | 召回方式:llm / hybrid / hybrid_rerank / hybrid_llm |
| LLM 召回最大迭代轮次 | 3 | LLM 召回的最大迭代轮数 |
| 召回查询消息数 | 2 | 召回时参考的最近消息数 |
| 混合召回最大结果数 | 15 | 混合召回返回的最大结果数 |
提取配置
| 设置项 | 默认值 | 说明 |
|---|---|---|
| 提取间隔 | 1 | 每隔多少轮 AI 回复触发一次提取 |
| 每批提取轮数 | 1 | 每批提取处理的回复轮数 |
| 提取上下文轮数 | 2 | 提取时包含的上下文轮数 |
| 排除最近轮数 | 0 | 排除最近 N 轮不参与提取 |
注入方式
记忆图支持两种注入方式,你可以根据需要选择:
常驻注入
你可以将某些类型的记忆设为常驻注入,使其始终出现在提示词中,不依赖召回触发。例如,「规则约束」类型的节点默认常驻注入,确保世界观规则永远不会被遗忘。
常驻注入通过将节点写入世界书条目实现,随世界书系统一起生效。
召回注入
其他类型的记忆(如角色状态、事件摘要等)默认通过召回机制动态注入——只有与当前对话相关的记忆才会被注入,避免占用过多上下文空间。
INFO
常驻和召回并不互斥。同一种节点类型可以同时开启常驻注入和召回注入——常驻确保基础信息始终可用,召回则补充与当前上下文相关的更多细节。
召回注入的位置和角色可以配置:
| 设置项 | 默认值 | 说明 |
|---|---|---|
| 召回注入位置 | atDepth | 注入位置 |
| 召回注入深度 | 9999 | 注入深度 |
| 召回注入角色 | SYSTEM | 注入角色(system / user / assistant) |
配置注入方式
你可以在记忆图设置面板中,为每种节点类型分别配置是否常驻注入、是否启用召回。两者可以同时开启——常驻确保基础信息始终可用,召回则补充与当前上下文相关的细节。
如何选择
- 规则约束等不随对话变化的信息适合常驻注入(默认已启用)
- 角色状态、事件摘要等动态信息适合召回注入(默认行为)
- 如果你发现某些重要信息经常被遗漏,可以在记忆图设置面板中将对应节点类型设为常驻注入
结果复用
当你对同一轮对话进行 swipe(滑动切换)或重新生成时,记忆图会自动复用上一次的召回结果,不会重复执行召回流程。这既节省了 LLM 调用成本,也保证了同一轮对话中记忆上下文的一致性。
查看记忆
你可以通过记忆图的 UI 面板查看当前的记忆状态:
- 图可视化:以图形方式查看所有记忆节点和它们之间的关系
- 表格视图:按类型查看所有节点的结构化字段
- 搜索功能:按关键词搜索记忆节点,支持按类型过滤
- 查看最近注入:查看最近一次注入到提示词中的记忆内容
自定义记忆结构
角色卡可以自定义记忆图的节点类型定义,为特定角色定制记忆结构。在记忆图设置面板中,你可以添加、编辑或删除节点类型,覆盖默认的类型定义。例如,奇幻世界的角色卡可以定义「魔法」「阵营」等专属节点类型,让记忆图更贴合角色的世界观。自定义的节点类型会随角色卡一起保存和导出。
世界书投影
记忆图可以将记忆节点投影为世界书条目,通过世界书的关键词匹配和扫描深度机制参与提示词构建。投影分为两种:
- 持久化投影:将常驻注入的节点写入持久化世界书条目
- 运行时投影:将召回结果写入临时世界书条目,生成结束后自动清理
导入导出
记忆图数据支持导入导出为 JSON 文件。导出数据包含所有节点、边和元数据。
导入时提供三种绑定模式:
| 模式 | 说明 |
|---|---|
| 恢复 | 保留导出时的楼层编号,用于同一聊天的数据恢复 |
| 绑定到最新楼层 | 将所有导入节点绑定到当前最新的 AI 回复楼层 |
| 绑定到指定楼层 | 手动输入目标楼层编号 |
变更回滚
记忆图内置了完整的变更回滚机制。当你编辑、删除消息或进行 swipe 时,记忆图会自动回滚到受影响消息之前的状态,确保记忆与对话历史保持一致。
完整配置参考
点击展开完整配置项列表
基础配置
| 设置项 | 默认值 | 说明 |
|---|---|---|
| 启用记忆图 | false | 插件总开关 |
| 提取间隔 | 1 | 每隔多少轮 AI 回复触发一次提取 |
| 最大处理轮数 | 900 | 最大处理轮数上限 |
向量与扩散配置
| 设置项 | 默认值 | 说明 |
|---|---|---|
| 嵌入向量来源 | transformers | 来自 Vector Storage 扩展设置(vectors.source) |
| 嵌入模型 | (空) | 来自 Vector Storage 扩展设置(按来源使用对应模型字段) |
| 向量检索 Top-K | 20 | 向量检索返回的 Top-K 数量 |
| 图扩散步数 | 2 | 图扩散步数 |
| 图扩散衰减系数 | 0.6 | 图扩散衰减系数 |
| 图扩散 Top-K | 100 | 图扩散 Top-K |
| 图扩散传送概率 | 0.0 | 图扩散传送概率 |
重排序配置
| 设置项 | 默认值 | 说明 |
|---|---|---|
| 启用重排序 | false | 是否启用重排序 |
| 重排序服务来源 | cohere | 重排序服务来源 |
| 重排序模型 | (空) | 重排序模型名称 |
其他配置
| 设置项 | 默认值 | 说明 |
|---|---|---|
| 每分钟请求限制 | 0 | 每分钟请求限制(0 = 不限制) |
| LLM 可见最近消息数 | 5 | LLM 生成时可见的最近消息数 |
| 使用预设时包含世界书 | true | 使用预设时是否包含世界书 |
| 覆盖世界书名称 | (空) | 覆盖世界书名称 |
| 世界书条目排序基数 | 9800 | 世界书条目排序基数 |
| 工具调用最大重试次数 | 2 | 工具调用失败最大重试次数 |
| 排除最近轮数的节点 | 2 | 召回时排除最近 N 轮的节点 |
技术深入
点击展开技术细节
多阶段混合召回管线
混合召回模式下,记忆图执行一个包含 8 个阶段的召回管线:
- 向量预过滤:从向量数据库中检索语义最相似的 Top-K 节点
- 实体锚点:从查询文本中匹配已知实体名称和别名
- 构建种子:合并向量命中和实体锚点作为扩散起点
- 构建邻接表:构建图的双层邻接表
- PEDSA 图扩散:从种子节点出发,通过图结构传播能量,发现间接相关的记忆
- 混合评分:合并向量分数、扩散能量、词汇匹配、锚点分数、时效性加成等多维信号
- 认知管线(NMF / FISTA / DPP):三个算法确保召回结果覆盖全面且多样
- 可选重排序:使用外部重排序模型进一步优化结果
认知层算法
- NMF 话题再平衡:使用非负矩阵分解识别被低估的话题方向,提升其代表节点的分数
- FISTA 残差发现:通过快速迭代收缩阈值算法发现查询中未被候选集覆盖的语义方向,并进行补充搜索
- DPP 多样性采样:使用行列式点过程从候选集中选出质量高且彼此多样的子集,避免召回结果过于集中
PEDSA 图扩散
PEDSA(Personalized Efficient Diffusion with Sparse Approximation)算法使记忆图能够发现与查询没有直接语义关联、但通过图结构间接相关的重要记忆。它从种子节点出发,沿图的边关系多轮传播能量,支持传送概率(类 PageRank)和稀疏近似控制。
向量索引
记忆图使用增量更新策略管理向量嵌入——通过哈希比对检测节点内容变化,只有内容实际改变时才重新生成嵌入向量。 在混合召回中,嵌入来源和模型读取自 Vector Storage 扩展设置,因此可用来源跟随 Vector Storage 的能力(包括 Jina)。 当 Vector Storage 设置不可用时,记忆图会回退到自身的旧版本地来源/模型字段。
如需了解更多技术实现细节,请参阅源代码。