记忆与世界书
LLM 默认是完全失忆的:每次新会话都从零开始,不知道你叫什么、做什么工作、有什么偏好。这一页讲 ETOS 怎么解决这个问题——通过两套机制互补:
| 机制 | 解决什么 |
|---|---|
| 记忆(Memory) | 让 AI 跨所有会话记住"用户偏好""项目背景""长期事实",用向量检索按需召回 |
| 世界书(Worldbook) | 让 AI 在特定会话 / 特定关键词出现时"背景知识就位",按规则注入到提示词里 |
它们听起来像,但完全是两种东西。下文先把概念讲清,再讲怎么配。
如果想看代码层的设计,去 记忆、摘要与画像 和 世界书与工具治理。
概念先讲清
记忆是什么
把"用户喜欢用 Swift""我女朋友叫小明""我的工作是产品经理"这种长期为真的事实,存到一个数据库里。每次发新消息时,ETOS 用向量检索找出几条最相关的记忆,自动塞进提示词。
关键点:
- 是全局的,所有会话共用
- 是按相关度召回的,不是每次都全塞(避免上下文爆炸)
- 是永久的,除非你手动删除或归档
世界书是什么
来源是 SillyTavern / TavernAI 角色扮演圈子的 "Lorebook" 概念,但用法已经远远超出角色扮演。
世界书是一本条目集,每个条目有:
- 关键词:触发条件,比如
["黛玉", "林黛玉"] - 内容:触发后注入到提示词里的文本,比如「林黛玉:贾府四美之一,多愁善感,咳嗽病…」
- 触发逻辑:什么位置注入、扫描多深、最多注入几条
会话里的最近几条消息会被扫描,匹配到关键词的条目就被注入。
关键点:
- 通常绑定到特定会话(每个角色扮演会话用自己的世界书)
- 是关键词触发的,不会无脑全塞
- 注入位置可以精确控制(系统提示词前 / 后、最新消息前 / 后)
怎么选
| 你的需求 | 用谁 |
|---|---|
| AI 跨会话记住你的项目背景 | 记忆 |
| AI 跨会话记住你的写作风格 | 记忆 |
| 你的小说角色「李三」每次出现自动注入设定 | 世界书 |
| 这个会话是 RPG 跑团,特定 NPC 出现注入设定 | 世界书 |
| 你公司内部术语表(每次提到时背景应该就位) | 世界书 |
| AI 知道你昨天问过 X 这件事 | 记忆 |
最容易出错的混用
- 把角色扮演设定塞到「记忆」里 → 每次新会话都被无关召回,污染上下文
- 把长期事实塞到「世界书」里 → 关键词不出现就召不回,AI 还是失忆
新手必读:记忆系统
在哪管
设置 → 拓展能力 → 记忆系统先配嵌入模型
记忆系统依赖嵌入模型做向量检索。第一次进来必看顶部的「嵌入模型」一栏:
- 「这里只列出主用途为嵌入的模型」——你必须先在 [提供商与模型管理] 里加好一个嵌入模型(
text-embedding-3-large/text-embedding-3-small/ Cohere embed / Gemini embedding 等) - 把模型勾选为"启用",并设它的能力类型为"嵌入"
也可以在「提供商与模型管理 → 专用模型」里统一指定全局嵌入模型。
检索设置
| 字段 | 说明 |
|---|---|
| 检索数量 Top K | 每次召回多少条最相关的记忆。默认 3。填 0 表示完全关闭检索(记忆只保存不召回)。 |
| 主动检索 | 关闭时只有用户消息触发检索;开启时 AI 也可以主动请求检索 |
Top K 不是越大越好
设大(>10)虽然 AI 知道更多事实,但:
- 上下文 Token 增加,请求贵
- 缓存命中率掉到几乎为 0(每次召回的不一样)
- 召回的相关性下降,反而污染上下文
3-5 是合理区间。
给 AI 加记忆的两种方式
方式 1:让 AI 主动写
打开 设置 → 工具中心 → 拓展工具 → 「写入记忆」工具。
之后聊天时,AI 觉得用户说了重要信息(比如"我下周要去东京"),它会主动调"写入记忆"工具把这条事实存进去。
第一次会弹审批气泡,你按"允许"即可。
方式 2:手动添加
记忆库管理页右上角「+ 添加记忆」按钮,自己写一条。适合:
- 一次性导入你已知的长期事实("我叫 X""我用 macOS""偏好简洁回答")
- 修正 AI 写错的记忆
记忆管理
每条记忆可以:
- 左滑删除:彻底删除(不可恢复)
- 右滑归档:保留但不参与检索。日后想用可以"恢复"
- 编辑:改记忆原文
「激活的记忆」和「归档的记忆」分两个 Section 展示。
数据维护
页面有「重新生成全部嵌入」按钮(橙色,需要二次确认)。什么时候用:
- 你换了不同的嵌入模型(不同模型生成的向量不互通,必须重算)
- 你升级了主嵌入模型版本
- 索引损坏(极少见)
这是不可逆操作
点击后会清空旧 SQLite 向量数据库并重建。期间检索不可用。请在不需要立即使用 AI 时执行。
嵌入补偿
某些情况下少数记忆可能没成功生成嵌入(网络中断时)。系统会自动检测并提示「补偿嵌入」让你重跑。
新手必读:世界书
在哪管
设置 → 拓展能力 → 世界书导入第一本世界书
ETOS 兼容 SillyTavern / NAI 系世界书格式,导入方式:
| 方式 | 适合 |
|---|---|
| 导入酒馆世界书(JSON/PNG) | 从「文件」选本地 JSON 文件,或角色卡 PNG(带 naidata) |
| 从 URL 导入世界书 | 直接填一个可访问的 JSON 或 PNG URL,比如某个公开角色卡库 |
支持的格式:
- PNG naidata:角色卡 PNG,内嵌 chara base64 数据
- JSON 顶层数组:标准 SillyTavern v1
- character_book 格式:嵌套在角色卡里的 lorebook 字段
导入后会显示导入摘要:「新增条目 / 跳过条目 / 失败条目」三个数字。
编辑一本世界书
点击世界书条进入「世界书详情」:
基本信息
- 名称 / 描述 / 条目数量
默认设置
| 字段 | 说明 |
|---|---|
| 扫描深度 | 从聊天最新消息往前数几条参与关键词匹配。典型 4-10 |
| 最大递归层级 | 一条注入触发另一条注入的最大层数(防止循环) |
| 最大注入条目 | 一次最多注入几条。-1 不限 |
| 最大注入字符 | 一次最多注入多少字符。-1 不限 |
| 备用插入位置 | 没法精确插入时的回退位置(系统提示词前 / 后 / 最新消息前 / 后 / 等) |
条目
每个条目是一条"按关键词触发的注入内容",可以单独:
- 启用 / 停用
- 编辑:关键词、注释、内容、插入位置
- 删除
绑定世界书到当前会话
世界书默认是全局可用的资源,但只在你显式绑定给某会话时才会真的注入。
在世界书页面顶部「当前会话」Section 有「绑定世界书」按钮,把当前会话和一本(或多本)世界书绑定。绑定后聊天时这些世界书的条目会按规则参与匹配和注入。
隔离发送(关键功能)
绑定世界书时可以开启「已启用隔离发送」。隔离发送意味着:
- 这个会话只用绑定的世界书 + 角色设定,不参与全局工具、记忆等其他自动注入
- 工具中心里的工具在本会话全部禁用(提示「当前会话因世界书隔离发送而不会实际启用该工具」)
适合:角色扮演场景,你不希望 AI 突然调一个 SQL 查询工具破坏沉浸感。
进阶选项
记忆的"主动检索"
打开后 AI 可以自己决定要不要检索。机制:模型在回答前先看到「你可以调用 search_memory 工具」,需要时主动调。
适合:
- 长会话里某些话题需要回忆历史
- AI 怀疑用户的某句话和过去某条事实有关
不适合:
- 你不想 AI 频繁占用思考预算去回忆
- 大部分会话都是新主题、回忆没用
世界书条目的"插入位置"是怎么生效的
每条世界书条目可以指定精确的插入位置:
- 系统提示词前 / 后
- 最新用户消息前 / 后
- 助手最新回答前
- 自定义深度(往前数 N 条消息插入)
举例:「角色背景」适合插系统提示词后;「场景设定」适合插最新用户消息前。
世界书的导出
每本世界书可以「导出」回 JSON 格式,与 SillyTavern 互通。
适合:
- 你在 ETOS 里编辑好了,想拿到其他客户端用
- 备份你写的角色卡
记忆和会话摘要的关系
ETOS 还有一层「会话摘要」机制(详见 记忆、摘要与画像)。简单说:
- 记忆:手动 / AI 写入的具体事实
- 摘要:每个会话自动生成的内容概要
- 画像:从所有会话和记忆里自动总结出来的"用户特征"
普通用户只用关心记忆即可。摘要和画像在后台自动维护,不需要你做什么。