记忆功能与聊天摘要

每个 AI 模型一次能读的文字量都有上限,这个上限叫上下文窗口。聊天一长,最早的消息就会掉出窗口,AI 也就忘了它们。Marinara Engine(下文简称 Marinara) 有好几种办法把这段历史找回来。本指南介绍如何开启每一种功能,以及它不起作用时怎么处理。

我该用哪种记忆功能?

先从 Memory Recall(记忆功能) 开始。它不需要额外设置,因为 Marinara 可以使用你电脑上的内置嵌入模型。聊天变得很长时,再加上摘要。

功能作用适用模式
Memory Recall在较早的消息里找出和你刚说的话相关的部分,补进提示词。所有模式
Chat Summary(聊天摘要)用简短的回顾取代旧消息。Roleplay(角色扮演)
Automatic Summarization(自动摘要)每天做一份摘要,再按周汇总。始终开启。Conversation(对话模式)
Advanced Memory Recall(高级记忆功能)统一管理当前历史、场景摘要和召回的片段。可选。Roleplay 和 Game Mode(游戏模式)

Memory Recall 和摘要各管各的,可以同时运行。Game Mode 有 Memory Recall,也可以选择开启 Advanced Memory Recall,见在 Game Mode 中。它没有自己的摘要功能。

Memory Recall

Memory Recall 依靠嵌入。嵌入就是把一条消息的含义变成一串数字指纹。Marinara 把过去的消息分成一小组一小组存起来,每组叫一个记忆块。它拿你新消息的指纹去和已存的指纹比对,再把最接近的几个记忆块补进提示词。

开启 Memory Recall

  1. 打开一个聊天,点击 Chat Settings(聊天设置)。
  2. 找到 Memory Recall 一节。
  3. 开启 Enable Memory Recall。

这个设置按聊天分别保存。在 Conversation 聊天里,以及已经有活动场景的 Roleplay 或 Game 聊天里,它默认开启;其他聊天默认关闭。关闭它会停止回忆,但不会删除已存的记忆。

如果没有成功:Memory Recall 需要一个嵌入来源(见下一节)。如果你什么都没设,Marinara 会使用它的内置模型,所以多数人可以跳过那一节。另外确认 Memory Recall 一节确实出现了。有些容器构建版本叫 Marinara Lite,它们把这个功能完全关闭了。

设置嵌入来源(可选)

Memory Recall 需要一个生成指纹的模型。如果你什么都不设,Marinara 会使用内置嵌入模型(见下文),对多数人来说这是最简单的办法。想改用某个服务,就在账号上设置,而不是在聊天设置里。

开始之前:你需要一个提供嵌入的账号。见连接 AI 服务商。

  1. 打开 Connections(连接),编辑这个账号。
  2. 找到 Semantic search (embeddings)(语义搜索与嵌入) 一节。
  3. 填入嵌入模型名称,例如 text-embedding-3-small。
  4. 可选:设置 Embedding endpoint URL(嵌入端点 URL),更改地址。
  5. 可选:用 Embedding provider(嵌入服务商) 借用另一个账号的密钥和地址。Same as this provider(与此服务商相同) 则使用这个账号自己的密钥和地址。

有些服务不提供嵌入。这时 Marinara 会请你另选一个专门的嵌入账号,比如 OpenAI 兼容账号、Google 或内置模型。

想在所有地方都用同一个来源,就在 Connections → Defaults(连接 → 默认值) 的 Embeddings(嵌入) 里选它。没有自己的嵌入模型的账号会使用它。账号自己的设置仍然优先。

既没有嵌入账号、也没有 Embeddings 默认值时,Marinara 会退回内置嵌入模型。它只下载一次,在你的电脑上运行,不需要 API 密钥。见内置模型设置。

同一处设置也驱动世界书的语义搜索,所以设置一次就两边都能用。

查看和管理已存的记忆

  1. 打开 Chat Settings → Memory Recall。
  2. 点击 Access memories for this chat。Memories for This Chat 窗口会打开。开启 Advanced Memory 时,查看器会留在 Roleplay 抽屉里。

窗口里显示已存记忆块的数量和大致的 Token(模型切分文本的最小单位) 数。每张记忆块卡片显示它的日期范围、消息条数、创建时间和状态。

状态含义
Vectorized指纹已经生成,可以参与搜索。
Waiting for vector指纹还在生成中。
Embedding unavailable没有可用的嵌入来源,指纹生成不了。

工具栏上有导出、导入、重建和清空记忆的图标。

Memory Recall 的行为细节

Chat Summary (Roleplay)

Chat Summary 把较早的消息压缩成简短的回顾,也就是摘要条目。每个条目既可以让 AI 写,也可以自己写,还能单独开关。它只用于 Roleplay 聊天。

打开 Chat Settings,展开 Lorebooks(世界书) 下方的 Chat Summary。在电脑上可以把它弹出为独立窗口,见聊天设置总览。

新建摘要条目

  1. 在 Summary Scope 下选 Last 摘要最近的消息,或者选 Range 指定一段消息范围。
  2. 点击 Generate 让 AI 写一条条目,或者点击 Write 自己写。

每个条目显示标题、来源范围或消息条数,以及预估的 Token 数。条目可以启用或禁用、展开,也可以点 Edit 修改或点 Delete 删除。Show Inactive 和 Hide Inactive 决定列表显示哪些条目。Activate All 和 Deactivate All 一次切换所有条目。

要一次更改多个条目,就勾选它们(在电脑上,按住 Shift 点击可以选中一段范围),然后用 Enable selected(启用所选) 或 Disable selected(禁用所选)。

如果开启了 Review Agent Outputs(审核智能体输出),AI 写的摘要要等你批准。见智能体审批与 Agent Suite。

Automatic Summaries

Automatic Summaries 面板会在你聊天时让摘要保持最新。

  1. 开启 Enabled。
  2. 用 Every 设置两次摘要之间间隔多少条用户消息。默认 5,范围 1 到 200。
  3. 可选:点击 Backfill Summary,给从来没做过摘要的旧聊天补上摘要。运行时会显示进度条。想提前停下就点 Stop。

摘要提示词、服务商与输出长度

显示选项

最新消息尾部会限制已被摘要的消息。已被摘要、且比尾部更早的消息会立刻从提示词中去掉,哪怕下一次摘要还没有把它隐藏。还没有任何摘要覆盖的较早消息仍会发送,因为去掉它就会丢失这部分内容。出现这类消息时,Chat Summary 会在 Recent message tail 下显示有多少条。点击 Backfill Summary,为它们生成摘要。

合并回复的群聊

在合并回复的群聊里,一条回复替所有角色发言。条目中为特定角色撰写的部分,例如 {{#if char == "Kaito"}}…{{/if}},会为它适用的每个角色保留,并标明哪些角色知道,例如“known only to Kaito”。只有 Advanced Memory 的 Narrator(旁白) 才能看到的部分仍会排除在外。在角色逐个回复的群聊和单角色聊天里,每个角色照常读取这些条目,旁白则读取每个部分。

Automatic Summarization (Conversation)

Conversation 聊天会给每个自然日做一份摘要,再把已经结束的整周合并成一份周摘要。之后提示词里只有各周的周摘要、本周的日摘要和今天的消息。这个功能自动运行,无法关闭。

编辑摘要

  1. 打开一个 Conversation 聊天,点击 Chat Settings。
  2. 找到 Automatic Summarization。
  3. 点击 Edit Summaries。

窗口里先列出各周,再列出还没并入某一周的日期。展开一个条目,就能编辑它的 Summary 文本和 Key Details 各行。

设置一天何时结束

补上缺失的日期

有时某一天会缺少摘要,比如导入一个旧聊天之后。窗口里的 Missing Summaries 面板有一个 Backfill 按钮,一次最多重试最近 14 天。换掉摘要模型不会重写已有的日条目或周条目。

Advanced Memory Recall(Roleplay 和 Game Mode)

Advanced Memory Recall 是一个可选模式,会一起管理当前历史窗口、连续性摘要和旧片段。它把聊天分成一个个场景,为每个结束的场景写摘要,并在每次回复时召回相关的场景和原文消息。它不依赖 Agents 总开关,也不需要下载任何智能体。

开启它

  1. 打开 Chat Settings → Memory Recall。
  2. 开启 Advanced Memory Recall。也可以在 Roleplay 设置向导的 Agents 下方开启 Automatic context and memory handling(自动管理上下文和记忆)。
  3. 把 Maximum allowed context before compression (tokens)(压缩前允许的最大上下文) 设在模型的上下文窗口以内。
  4. 在这个上限以内设置 Summary and recall budget (tokens)(摘要与召回预算)。
  5. 可选:选择一个 Helper model(辅助模型)。

已经有历史的聊天,先点击 Prepare existing history(准备现有历史)(见下文)。桌面端和移动端都可以在向导和 Chat Settings 抽屉里查看设置与进度。档案查看器仍位于抽屉内。

设置

设置默认值作用
Maximum allowed context before compression (tokens)65,000发出的提示词达到这个大小时,较早的上下文会被截断并生成摘要,供以后召回。
Summary and recall budget (tokens)6,500上下文中有多少用于记忆。建议至少设为最大值的 10%。
Helper model智能体账号,其次是聊天账号负责场景判断、摘要和连续性。
Maximum recalled scenes(最多召回场景数)3每次回复最多召回的场景数。设为 0 会关闭可选的场景召回。
Moving context(移动上下文)3 到 5 条消息每个召回片段里的消息数。两项都设为 0,就只用摘要、不带片段。
Standalone scene check interval (messages)(独立场景检查间隔)5两次场景检查之间间隔多少条新消息。
Use Decision model(使用决策模型)关闭让 Decision 模型找出场景结束点并选择记忆。
Decide who sees new messages(决定谁能看到新消息)关闭仅限角色逐个回复的群聊。
Character recollections(角色回想)关闭让每个角色对场景留下自己的记忆。

默认预算是默认最大值的 10%。之后再改最大值不会改变它。这个上限计算预计发出的整个提示词:指令、消息、召回的上下文、工具和附件。回复 Token 和安全余量另算。它是估算值,不是精确的分词器计数或计费上限。

所有记忆摘要调用都使用 Chat Summary → Maximum output size,并至少预留 8,196 个输出 Token,为推理留出空间。

准备现有历史

  1. 点击 Prepare existing history。开始前会显示实际选用的模型。
  2. 等待。它会分批处理较早的历史,并显示当前阶段。
  3. 用 Cancel(取消) 停止,已完成的工作会保留。用 Resume(继续) 接着处理,即使你关闭了抽屉、重启了服务器或更新了应用也可以。

模型调用失败时,此前有效的记忆会保留,并显示一个可以重试的错误。失败后不要重置记忆:Resume 会复用已完成的摘要。最后一个进行中的场景保持开放,结束后才生成摘要。

如果恢复的历史改变了某个有手动修正的场景,就停用那条记忆以保留其文本供参考,或者删除它,然后重新准备。Fix(修复) 会跳过这个场景并把它列出来,而不会因此中止。

从已准备好的聊天创建的分支,例如用 Branch from here(从这里分支) 创建的分支,会保留它的 Advanced Memory。在某个场景中间创建的分支会重新打开这个场景:原来的摘要会被丢弃,场景结束时再写一份新的。作为新分支导入的聊天照常准备。

修复记忆问题

聊天记忆出了问题时,Chat Settings 按钮上会出现一个强调色的常亮圆点,同时弹出通知,说明有多少个场景存在问题。每组问题只通知一次;圆点会一直保留,直到这些问题解决。在 Chat Settings → Memory Recall 中,问题会列在设置上方。Access memories for this chat 中也会显示同样的圆点。

在通知或列表中点击 Fix,即可一次修复所有被标记的场景。它使用 Helper model。Pause processing(暂停处理) 会让它停下,Resume processing(继续处理) 会接着处理。Fix 会:

Fix 绝不会重写你手动编辑过的摘要。它会把这类摘要列在 need your review(需要你检查) 下,然后继续。它无法替你更改设置,例如角色的知识范围或可用的 Decision 连接。

Fix 完成后,会显示“Advanced Memory fixed N scenes”,以及需要检查的场景编号。选择一个编号,即可在 Access memories for this chat 中打开该场景。如果当时 Chat Settings 已关闭,一条带 Show(显示) 的通知会带你过去。Fix 无法判断的场景,下次 Fix 时不会再询问,所以请自己保存它的角色访问权限。

重新扫描场景

如果漏掉了场景变化,比如某个场景一直没有结束,就使用 Chat Settings → Memory Recall 中的 Re-scan scenes(重新扫描场景)。

  1. 输入要检查的起始和结束消息编号。初始范围是当前正在进行的场景。
  2. 点击 Re-scan(重新扫描)。

Advanced Memory 会在这些消息里重新查找场景变化,并为发生变化的场景生成摘要。开启 Use Decision model 时使用 Decision 模型,否则使用辅助模型。范围之外的场景保留原有的边界和摘要。如果某个你编辑过的摘要会因此改变,重新扫描会停下来并指出是哪个场景。

可选的 Decision 模型

Decision 模型是一种回答是非题的小模型。它默认关闭,按 Roleplay 聊天保存。

  1. 在 Advanced Memory 中开启 Use Decision model。
  2. 在 Memory Decision connection(记忆决策连接) 中选择一个模型。Built-in model(内置模型) 下列出的模型与全局 Decision model(判定模型) 中的相同。暂时无法回答的模型会以灰色显示并说明原因;已停止的模型会在被询问时启动。Connections 下列出你已保存的 Decision 账号。见 Decision 模型。

这里的选择独立于全局 Decision 默认值。

这个模型在准备历史和检查进行中的场景时识别场景边界。新回复之前,它分两轮挑选记忆。详情见决策回忆的工作方式。

托管账号会收到最近的对话文本,以及候选名单中待评分的场景回顾或消息,一次回复可能产生多次收费请求。回忆功能在发送候选内容前,会先按角色访问权限筛选。

决定谁能看到新消息

在角色逐个回复的 Roleplay 群聊里,Advanced Memory 可以决定每条新消息由哪些角色看到,这样就不必为离开场景的角色一条条隐藏消息。合并回复的群聊和单角色聊天没有这个选项。

  1. 在 Advanced Memory 中开启 Decide who sees new messages。

每条新消息,无论是你的还是角色的,都会对不在该场景中的角色隐藏。它使用的是和消息自身按钮相同的按角色 Hide from AI(对 AI 隐藏),所以划掉的眼睛标记会显示谁看不到这条消息。你的消息一发出就会立即决定。前面的消息会在下一个角色回复之前决定好。

开启 Advanced Memory 后,新的角色回复可以用 **、--- 或 这样的分隔行切换场景或视角。这时回复会被保存为同一个角色的多条独立消息,每部分一条。

角色回想

开启 Character recollections,每个角色就会对场景留下自己的记忆。它默认关闭。

回想如何保持准确:

回想出现在哪里,开销如何:

编辑与关闭:

在 Game Mode 中

Game Mode 聊天同样在 Chat Settings → Memory Recall 中开启 Advanced Memory Recall。不开启时,Game 会话每回合都会发送完整历史,直到上下文上限,因此长会话每回合消耗的输入 Token 会多得多。开启后,提示词会保持在 Maximum allowed context before compression 以内。当前场景以原文消息发送,较早的场景则以回顾加上召回选中的片段发送。

故障排查

问题解决办法
Memory Recall 什么都回忆不出来确认嵌入来源已经配好。如果记忆块显示 Embedding unavailable,就设置一个 Semantic search (embeddings) 模型,或者使用内置模型。见内置模型设置。
记忆块显示 Waiting for vector稍等一会儿。指纹是在回复之后生成的。
好像没有相关内容回忆只会补进密切相关的记忆。什么都不加是正常的。
换了嵌入模型后回忆变差了在 Memories for This Chat 中使用重建图标。
摘要生成不出来聊天需要一个可用的文本账号。Chat Summary 使用 Summary Provider。一个都不可用时,生成会被跳过。
AI 摘要一直不出现Review Agent Outputs 可能在等你批准。
某条摘要卡住了失败的摘要会在延迟后重试。运行 Backfill Summary(Roleplay) 或 Backfill(Conversation)。
某个场景被标记为 Check who was there点击 Fix,或在 Access memories for this chat 中打开它,然后使用 Edit character access(编辑角色访问权限)。

其他问题见 Marinara Engine 故障排查。

Advanced Memory 参考

这里是多数读者用不到的细节。不读这部分,上面的设置也能正常使用。

如何检测场景并生成摘要

当前窗口与预算

召回返回什么

Access memories for this chat

打开它,可以搜索编了号的场景摘要,查看它们的时间范围和受众,编辑 Summary text(摘要正文),或者用 Inspect source messages(查看源消息) 阅读原始消息。你可以停用记录、Reindex(重建索引)、导出和导入,也可以用 Delete all memories(删除所有记忆) 在保留聊天和设置的同时重新准备。对手动摘要的修正会保留,并使依赖它的连续性摘要失效。摘要底部的 Delete summary(删除摘要) 会在你确认摘要及受众后将其删除。它也适用于旧版 Continuity(连续性) 和 Ongoing scene(进行中场景) 条目。常规准备不会重新生成已删除的场景回顾。

要让某个场景不被召回,就停用它的记忆记录。按角色隐藏仍然控制谁能访问它。全局隐藏不会把它从档案中移除。

谁能读到一个场景

决策回忆的工作方式

预设中的位置

预设作者可以用常规的区块顺序、名称、角色和分组控件放置以下内容标记:

标记内容
chat_summaryChat Summaries 中符合条件的常驻条目。
current_scene_summary进行中场景较早部分的来源摘录。
recalled_scenes所有选中的场景摘要,每条后面紧跟其摘录。

每个组件遵循预设的 XML、Markdown 或 None 格式。空组件不输出任何内容。第一个启用的标记决定位置。没有启用标记的组件会在历史之前补入一次,因此旧预设也能用。预设选择器只提供 Recalled Scenes。旧的 recalled_messages 标记是别名,启用的 recalled_scenes 标记优先。关闭 Advanced Memory 时,这些标记为空。

限制

召回是有选择的,摘要可能遗漏细节。重要修正应保存在来源聊天记录或摘要编辑器中。嵌入失败时,仍有有限的文本召回和有效的连续性内容。档案绝不会整个插入。指令或附件放不进上限时,缩减它们或提高上限。回复预留放不进模型的总上下文时,减小输出大小或改用上下文更大的模型。Advanced Memory 会停止,而不是悄悄删除指令。

Advanced 模式开启期间会接管检索,因此 Standard Recall 不会再插入一份相同内容。它还会替代该聊天通常的 Roleplay 自动摘要计划。关闭它后,常规设置恢复生效。现有世界书和可下载的智能体仍遵循各自的范围规则。

相关指南