# 数据银行 (RAG)

检索增强生成(RAG)是一种为 LLM 提供外部知识源的技术。它通过访问模型训练数据之外的信息来帮助提高 AI 答案的准确性。

SillyTavern 提供了一套工具,用于从多种来源构建多用途知识库,以及在 LLM 提示中使用收集的数据。

# 访问数据银行

内置的聊天附件扩展(在 >= 1.12.0 的发布版本中默认包含)在"魔杖"菜单中添加了一个新选项 - 数据银行。这是您管理 SillyTavern 中可用于 RAG 的文档的中心。

# 关于文档

数据银行存储文件附件,也称为文档。文档分为三个可用范围。

  1. 全局附件 - 在每个聊天中都可用,无论是单人还是群组。
  2. 角色附件 - 仅对当前选择的角色可用,包括他们在群组中回复时。附件保存在本地,不会与角色卡一起导出!
  3. 聊天附件 - 仅在当前打开的聊天中可用。聊天中的每个角色都可以从中获取。

什么可以是文档?实际上任何可以以纯文本形式表示的东西!

示例包括但不限于:

  • 本地文件(书籍、科学论文等)
  • 网页(维基百科、文章、新闻)
  • 视频转录

各种扩展和插件也可以提供收集和处理数据的新方法,更多内容见下文。

# 数据源

要将文档添加到任何范围,请点击"添加"并选择可用的来源之一。

# 记事本

从头开始创建文本文件,或编辑现有附件。

# 文件

从您计算机的硬盘驱动器上传文件。SillyTavern 为流行的文件格式提供内置转换器:

  • PDF(仅文本)
  • HTML
  • Markdown
  • ePUB
  • TXT

您还可以附加任何具有非标准扩展名的文本文件,如 JSON、YAML、源代码等。如果所选文件类型没有已知的转换,并且文件无法解析为纯文本文档,文件上传将被拒绝,这意味着不允许原始二进制文件。

# 网络

通过其 URL 从网页抓取文本。然后 HTML 文档通过 Readability 库处理,仅提取可用的文本。

一些 Web 服务器可能会拒绝获取请求,受到 Cloudflare 保护,或严重依赖 JavaScript 来运行。如果您在任何特定站点上遇到问题,请通过 Web 浏览器手动下载页面并使用文件上传器附加它。

# YouTube

通过其 ID 或 URL 下载 YouTube 视频的转录,无论是创作者上传的还是 Google 自动生成的。一些视频可能禁用了转录,也无法解析年龄限制的视频,因为这需要登录。

脚本以视频的默认语言加载。可选地,您可以指定两个字母的语言代码来尝试获取特定语言的转录。此功能并不总是可用,可能会失败,因此请谨慎使用。

# 网络搜索

执行网络搜索并从搜索结果页面下载文本。这类似于网络源,但完全自动化。所选搜索引擎将从扩展设置继承,因此请提前设置。

要开始,请指定搜索查询、要访问的最大链接数和输出类型:一个组合文件(根据扩展规则格式化)或每个页面的单个文件。您可以选择保存页面片段。

# Fandom

通过其 ID 或 URL 从 Fandom wiki 抓取文章。由于一些 wiki 非常大,使用过滤器正则表达式限制范围可能是有益的,它将针对文章标题进行测试。如果未提供过滤器,则所有页面都将被导出。您可以将它们保存为每个页面的单个文件,或合并为一个文档。

# Bronie 解析器扩展(第三方)

Bronya Rand 的 Bronie Parser Extension 允许在 SillyTavern 中使用第三方抓取器,如 miHoYo/HoYoverse 的 HoYoLab,类似于其他数据源。

目前,Bronya Rand 的 Bronie Parser Extension 支持以下内容:

要开始,请按照其安装指南安装 Bronya Rand 的 Bronie Parser Extension,并将支持的服务器插件安装到 SillyTavern 中。重新启动 SillyTavern 并转到 _数据银行_菜单。点击 + 添加,您应该看到您最近安装的抓取器已添加到可能的信息来源列表中。

# 向量存储

所以,您已经为自己在特定主题上建立了一个 nice 和全面的信息库。下一步是什么?

要将文档用于 RAG,您需要使用兼容的扩展,将相关数据插入到 LLM 提示中。

向量存储,与 SillyTavern 捆绑在一起,是这种扩展的参考实现。它使用嵌入(也称为向量)来搜索与您正在进行的聊天相关的文档。

由于向量功能默认禁用,您需要打开扩展面板(顶部栏上的"堆叠立方体"图标),然后导航到"向量存储"部分,并勾选"文件向量化设置"下的"为文件启用"复选框。

向量存储本身不产生任何向量,您需要使用兼容的嵌入提供商。

# 向量提供商

# 本地

这些源是免费且无限制的,并使用您的 CPU/GPU 计算嵌入。

  1. 本地(Transformers)- 在 Node 服务器上运行。SillyTavern 将自动从 HuggingFace 下载 ONNX 格式的兼容模型。默认模型:jina-embeddings-v2-base-en
  2. WebLLM - 需要安装扩展和支持 WebGPU 的 Web 浏览器。直接在您的浏览器中运行,可以使用硬件加速。自动从 HuggingFace 下载支持的模型。从此处安装扩展:https://github.com/SillyTavern/Extension-WebLLM
  3. Ollama - 从 https://ollama.com/ 获取。在 API 连接菜单中设置 API URL(在文本完成下,默认:http://localhost:11434)。必须先下载兼容模型,然后在扩展设置中设置其名称。示例模型:mxbai-embed-large。可选地,选中将模型保留在内存中的选项。
  4. llama.cpp 服务器 - 从 ggerganov/llama.cpp 获取并使用 --embedding 标志运行服务器可执行文件。从 HuggingFace 加载兼容的 GGUF 嵌入模型,例如,nomic-ai/nomic-embed-text-v1.5-GGUF
  5. vLLM - 从 vllm-project/vllm 获取。首先在 API 连接菜单中设置 API URL 和 API 密钥。
  6. Extras(已弃用)- 在 Extras API 下使用 SentenceTransformers 加载器运行。默认模型:all-mpnet-base-v2。此源不再维护,将来最终会被移除。

# API 源

所有这些源都需要各自服务的 API 密钥,通常有使用成本,但通常计算嵌入相当便宜。

  1. OpenAI
  2. Cohere
  3. Google AI Studio
  4. Google Vertex AI
  5. TogetherAI
  6. MistralAI
  7. NomicAI

# 向量化设置

选择嵌入提供商后,不要忘记配置其他将定义处理和检索文档规则的设置。

# 消息附件

这些设置控制直接附加到消息的文件。

以下规则适用:

  1. 只有适合 LLM 上下文窗口的消息才能检索其附件。
  2. 当向量存储扩展禁用时,文件附件及其伴随的消息将完全插入到提示中。
  3. 当启用文件向量化时,文件将被分成块,只有最相关的部分将被插入,节省上下文空间并允许模型保持专注。
  • 大小阈值(KB)- 设置块拆分阈值。只有大于指定大小的文件才会被拆分。
  • 块大小(字符)- 设置单个块的目标大小(以文本字符为单位,不是模型令牌!)。
  • 块重叠(%)- 设置将在相邻块之间共享的块大小的百分比。这允许块之间的更平滑过渡,但也可能引入一些冗余。
  • 检索块 - 设置要检索的最相关文件块的最大数量。它们将按其原始顺序插入。

# 数据银行文件

这些设置控制如何处理数据银行文档。

以下规则适用:

  1. 当禁用文件向量化时,数据银行不被使用。
  2. 否则,当前范围(见上文)中的所有可用文档都将被考虑用于查询。只有所有文件中最相关的块才会被检索。同一文件的多个块将按其原始顺序插入。
  3. 插入的块将在适合聊天消息之前保留一部分上下文。
  • 大小阈值(KB)- 设置块拆分阈值。只有大于指定大小的文件才会被拆分。
  • 块大小(字符)- 设置单个块的目标大小(以文本字符为单位,不是模型令牌!)。
  • 块重叠(%)- 设置将在相邻块之间共享的块大小的百分比。这允许块之间的更平滑过渡,但也可能引入一些冗余。
  • 检索块 - 设置要检索的文件块的最大数量。此配额在所有文件之间共享。
  • 注入模板 - 定义检索的信息将如何插入到提示中。您可以使用特殊的 {{text}} 宏来指定检索文本的位置,以及任何其他宏。
  • 注入位置 - 设置在哪里插入提示注入。与作者笔记和世界信息相同的规则适用。

# 共享设置

  • 查询消息 - 多少最新的聊天消息将用于查询文档块。
  • 分数阈值 - 调整以允许根据其相关性分数剔除块的检索(0 - 完全不匹配,1 - 完全匹配)。较高的值允许更准确的检索,并防止完全随机的信息进入上下文。合理的值在 0.2(更宽松)和 0.5(更专注)之间。
  • 块边界 - 在将文件拆分为块时将优先考虑的自定义字符串。如果未指定,默认是按(按顺序)双换行符、单换行符和单词之间的空格拆分。
  • 仅在自定义边界上分块 - 如果启用,分块只会在指定的块边界上发生。否则,分块也会在默认边界上发生。
  • 在处理前将文件翻译为英语 - 如果启用,将使用聊天翻译扩展中配置的翻译 API 在处理文件之前将文件翻译为英语。当使用仅支持英语文本的嵌入模型时,这很有用。
  • 包含在世界信息扫描中 - 如果您希望注入的内容激活传说书条目,请选中此项。
  • 向量化所有 - 强制摄取所有未处理文件的嵌入。
  • 清除向量 - 清除文件嵌入,允许重新计算其向量。

# 结论

恭喜!您的聊天体验现在通过 RAG 的力量得到增强。其能力仅受您的想象力限制。一如既往,不要害怕实验!