# 智能上下文

## **此扩展已不再维护，不建议使用。请考虑使用 [聊天向量化](/extensions/Chat-vectorization.md) 作为可能的替代方案。**

!!! warning 免责声明
使用此扩展不能保证更好的聊天体验或任何形式的记忆改进。仅在您完全理解向量数据库使用的所有影响时才使用。
!!!

### 这是什么？

智能上下文是一个 SillyTavern 扩展，它使用 [ChromaDB 库](https://www.trychroma.com) 让您的 AI 角色能够访问正常聊天历史上下文限制之外的信息。

### 这有什么用？

如果您有一个很长的聊天记录，大部分内容都在通常的上下文窗口之外，因此在 AI 写回复时无法访问这些内容。

智能上下文会自动将整个聊天文件的历史记录放入向量数据库中。每当您在聊天中输入新内容时，系统就会搜索这个数据库，如果找到包含匹配关键词的消息，这些聊天消息就会被放入上下文中，这样 AI 在写下一个回复时就能看到它们。

***

### 设置说明

1. 将 SillyTavern 更新到至少 1.10.6 版本。
2. 从扩展面板（堆叠块图标）中的"下载扩展和资源"菜单安装"智能上下文"扩展。
3. 安装或更新 [Extras](https://github.com/SillyTavern/SillyTavern-extras) 到最新版本。或者，使用 [Colab notebook](https://colab.research.google.com/github/SillyTavern/SillyTavern/blob/release/colab/GPU.ipynb)。
4. *仅限本地安装：* 为 Extras 安装 requirements-complete.txt（即使您在之前的安装中已经安装过）。
5. 启用 chromadb 模块运行 Extras：`python server.py --enable-modules=chromadb`

#### 安装 ChromaDB 时遇到错误？

```
ERROR: Could not build wheels for hnswlib, which is required to install pyproject.toml-based projects
```

安装 chromadb 包需要以下条件之一：

- 安装 Visual C++ build tools：<https://visualstudio.microsoft.com/visual-cpp-build-tools/>
- 从 conda 安装 hnswlib：`conda install -c conda-forge hnswlib`

***

### 配置

一旦启用了智能上下文，您应该在 SillyTavern UI 中对其进行配置。
可以从扩展菜单中进行智能上下文配置 ![STExtensionMenuIcon](/static/extensions/menu-icon.png)

![智能上下文配置面板](/static/extensions/smart-context.png)

需要了解 4 个主要概念：

- 聊天历史保留
- 记忆注入数量
- 单条记忆长度
- 注入策略

***

#### 智能上下文仅在聊天历史达到 10 条消息后开始工作

- 在新聊天开始时，ChromaDB 处于非活动状态。
- 一旦聊天累积了 10 条消息，它就会开始将所有消息记录到数据库中，并根据需要回忆消息。

#### 聊天历史保留（'保留的消息'）

默认情况下，ChromaDB 将保留滑块中指定数量的最近自然聊天历史消息。
超出此数量的任何消息都将从您发送的提示中删除，如果数据库中存在"记忆"，它们将替代较旧的聊天历史消息（参见下面的策略）。

***

#### 记忆注入数量

智能上下文将插入上下文的"记忆"的最大数量。
并非每次注入尝试都会达到这个完整数量。
如果您发送一个与"狗"相关的输入，而数据库中只有一条其他与狗相关的消息，那么只会插入 1 条项目。

***

#### 单条记忆长度

这是每条注入的"记忆"允许的最大长度。
这是以**字符**为单位（不是标记）。
如果设置得太小，记忆可能会被中途截断。

示例：

`Ross：我喜欢长毛蓬松尾巴的狗。我不喜欢短毛短尾巴的狗。`

这条数据库"记忆"有 103 个字符长，所以您需要将滑块设置为至少 `103` 才能完整地将其拉入上下文中。

如果滑块小于 103，消息就会被截断并以那种形式注入。

***

### 注入策略

#### 替换最旧历史

这个策略保留 X 条最近的消息，删除之前的所有消息，并用"记忆"替换它们。

优点

- 不太可能超出您的上下文限制
- 存在于上下文顶部附近的记忆对响应的直接影响较小，同时仍然提供"背景信息"。

缺点

- 旧消息直接插入到聊天历史中，没有特殊标记，通常与保留的自然聊天历史消息没有直接的自然关联。这可能会让智能较低的 AI 模型感到困惑。

#### 添加到底部

这个策略保持聊天历史的自然状态，并在其**之后**的格式化[方括号标题]内添加"记忆"。
这意味着"保留的消息"滑块实际上被禁用。

优点

- 不缩短或改变当前的自然聊天历史
- "记忆"存在于聊天之后，对下一个 AI 响应有更强的影响

缺点

- 因为没有删除/替换任何聊天项目，所以更有可能超出您的上下文限制。
- 因为记忆存在于提示的末尾附近，它们可能对 AI 的响应产生太大的影响。

#### 自定义深度

这个策略保持聊天历史的自然状态，并在您在指定模板中确定的深度添加"记忆"。
这意味着"保留的消息"滑块实际上被禁用。
自定义注入消息应包含 `` 模板词，所有查询到的记忆都将放在这里。

优点

- 灵活地实验记忆放置
- 可以自定义上下文中的记忆介绍

缺点

- 因为没有删除/替换任何聊天项目，所以更有可能超出您的上下文限制。

#### 使用百分比策略

注意：这与"添加到底部"策略不兼容，因为后者根本不删除任何消息。

在使用"替换最旧历史"策略时，勾选此框将启用滑块，用于选择要用智能上下文记忆替换的上下文内聊天历史的百分比。它还会禁用用于手动选择消息数量的两个滑块。

这个策略自动计算要用智能上下文记忆替换的聊天历史的百分比，而不是固定的消息数量。

优点

- 比手动计算消息数量更容易
- 随可用上下文大小调整，对小型和大型提示空间应用相同的百分比

缺点

- 要删除的历史记录计算可能略有不准确，因为它们基于每条消息的估计标记
- 它将要删除的消息数量四舍五入到最接近的 5 的倍数（0、5、10、15、20 等），所以不如手动数字选择那么精细。

***

### 记忆回忆策略

#### 仅从此聊天回忆

这是智能上下文的默认行为，仅从此特定聊天的 ChromaDB 集合中提取"记忆"。

#### 从所有角色聊天中回忆

这是智能上下文的实验性行为，从所选角色的所有 ChromaDB 集合中提取"记忆"。
理论上，这应该允许跨越多次互动发展出更健壮的记忆集。
建议与"添加到底部"或"自定义深度"策略一起使用，并将"保留的消息"设置为较低的数字，这样 ChromaDB 会更快地从记忆中提取。

### 使用智能上下文

一旦启用并配置，智能上下文会自动运行。

ChromaDB 为 SillyTavern 中打开的每个聊天创建一个新数据库。
这个数据库会自动填充整个聊天历史。

您也可以手动将文本文件插入数据库。

这些文本文件不必是聊天记录。它们可以是任何内容（维基百科条目、同人小说等）。

#### 清除数据库

您可以使用"清除数据库"按钮来清除当前聊天的数据库。

如果您发现存储了不准确的记忆（比如您已经删除或编辑的聊天消息），这会很有帮助。

***

### 常见问题

#### 聊天结束后数据库会怎样？我可以保存它们吗？

对于本地安装的 Extras 服务器，智能上下文会保存数据库。在通常的使用情况下无需手动保存。

对于 colab 用户，当 extras 服务器关闭时，数据库会被清除。使用导出按钮将数据库保存为 JSON 文件，下次要使用时再导入。

**通常不需要保存智能上下文数据库。**

目前我们有导入/导出功能，允许您保存聊天的数据库并在以后再次使用。

#### 我可以为所有聊天创建一个大数据库供参考吗？

这不是智能上下文功能的好用法。
我们建议为此目的使用世界信息。
