数据银行 (RAG)

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

SillyTavern 提供了一组工具,可以从多种来源构建多用途的知识库,并将收集到的数据用于 LLM 提示词。

访问数据银行

内置的 Chat Attachments 扩展(在 >= 1.12.0 的发布版本中默认包含)在“魔法棒”菜单中新增了一个选项——数据银行(Data Bank)。这是你管理 SillyTavern 中可用于 RAG 的文档的枢纽。

关于文档

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

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

什么可以作为文档?几乎任何能用纯文本形式表示的内容都可以!

示例包括但不限于:

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

各种扩展和插件还可以提供新的方式来收集和处理数据,详见下文。

数据来源

要向任一范围添加文档,请点击“添加”并从可用的来源中选择一个。

记事本

从零开始创建一个文本文件,或编辑现有的附件。

文件

从你的计算机硬盘上传文件。SillyTavern 为常用文件格式提供了内置转换器:

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

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

网页

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

某些 Web 服务器可能会拒绝抓取请求、受 Cloudflare 保护,或严重依赖 JavaScript 才能正常运行。如果你在访问某个特定网站时遇到问题,请通过浏览器手动下载该页面,并使用文件上传器将其附加。

YouTube

通过 YouTube 视频的 ID 或 URL 下载视频字幕,字幕可以是创作者上传的,也可以是 Google 自动生成的。部分视频可能禁用了字幕,此外,受限年龄视频也无法解析,因为那需要登录。

字幕会以视频的默认语言加载。你也可以选择指定两个字母的语言代码,以尝试获取特定语言的字幕。此功能并不总是可用,可能会失败,请谨慎使用。

网页搜索

执行网页搜索并从搜索结果页面下载文本。这与“网页”来源类似,但完全自动化。所选的搜索引擎会从扩展设置中继承,因此请提前配置好。

开始之前,请指定搜索查询、要访问的链接最大数量以及输出类型:一个合并的文件(根据扩展规则格式化)或每个页面一个单独的文件。你还可以选择同时保存页面摘要。

Fandom

通过 Fandom wiki 的 ID 或 URL 抓取文章。由于某些 wiki 非常庞大,使用过滤器正则表达式来限制范围可能很有帮助,该正则会与文章标题进行匹配测试。如果未提供过滤器,则所有页面都将被导出。你可以将它们保存为每个页面一个单独的文件,也可以合并为一个文档。

Bronie Parser Extension(第三方)

Bronya Rand 的 Bronie Parser Extension 允许将第三方抓取器接入 SillyTavern,例如 miHoYo/HoYoverse 的 HoYoLab,其用法与其他数据来源类似。

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

  • 通过 HoYoWiki-Scraper-TS 抓取 miHoYo/HoYoverse 的 HoYoLab(《原神》/《崩坏:星穹铁道》)

开始之前,请按照安装指南安装 Bronya Rand 的 Bronie Parser Extension,并将受支持的服务器插件安装到 SillyTavern 中。重启 SillyTavern,然后进入 数据银行(Data Bank) 菜单。点击 + Add,你应该就能看到新安装的抓取器已被添加到可获取信息的来源列表中。

向量存储

至此,你已经为自己的特定主题构建了一个内容丰富且全面的信息库。接下来做什么?

要将文档用于 RAG,你需要使用一个兼容的扩展,它会将相关数据插入到 LLM 提示词中。

SillyTavern 自带的向量存储就是此类扩展的一个参考实现。它使用嵌入(也称为向量)来搜索与你正在进行的对话相关的文档。

由于向量功能默认处于禁用状态,你需要打开扩展面板(顶部栏上的“堆叠方块”图标),然后导航到“Vector Storage”部分,并在“File vectorization settings”下勾选“Enabled for files”复选框。

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

向量提供商

本地

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

  1. Local (Transformers)——运行在 Node 服务器上。SillyTavern 会自动从 HuggingFace 下载兼容的 ONNX 格式模型。默认模型:jina-embeddings-v2-base-en
  2. WebLLM——需要安装一个扩展,并且需要支持 WebGPU 的浏览器。直接在浏览器中运行,可使用硬件加速。会自动从 HuggingFace 下载受支持的模型。从此处安装扩展:https://github.com/SillyTavern/Extension-WebLLM
  3. Ollama——从 https://ollama.com/ 获取。在 API 连接菜单中设置 API URL(在文本补全下,默认为 http://localhost:11434)。必须先下载一个兼容的模型,然后在扩展设置中设置其名称。示例模型:mxbai-embed-large。可以选择是否勾选将模型保留在内存中的选项。
  4. llama.cpp server——从 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
  8. OpenRouter
  9. Electron Hub
  10. Chutes
  11. NanoGPT
  12. SiliconFlow
  13. Cloudflare Workers AI

向量化设置

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

消息附件

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

适用以下规则:

  1. 只有能放入 LLM 上下文窗口的消息,其附件才能被检索。
  2. 当向量存储扩展被禁用时,文件附件及其附带的消息会被完整地插入到提示词中。
  3. 当启用文件向量化时,文件将被拆分为多个块,并且仅插入最相关的部分,从而节省上下文空间并让模型保持专注。
  • 大小阈值(KB)——设置分块拆分阈值。只有大于指定大小的文件才会被拆分。
  • 分块大小(字符)——设置单个块的目标大小(以文本字符数计,而非模型 token!)。
  • 块重叠(%)——设置相邻块之间共享的块大小百分比。这可以在块之间实现更平滑的过渡,但也可能引入一些冗余。
  • 检索块数——设置要检索的最相关文件块的最大数量。它们将按原始顺序插入。

数据银行文件

这些设置控制数据银行文档的处理方式。

适用以下规则:

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

共享设置

  • 查询消息数——有多少最新的聊天消息将用于查询文档块。
  • 分数阈值——进行调整,以便根据相关度分数剔除块(0——完全不匹配,1——完美匹配)。较高的值允许更准确的检索,并防止完全无关的信息进入上下文。合理的取值范围在 0.2(更宽松)到 0.5(更聚焦)之间。
  • 分块边界——将文件拆分为块时会优先使用的自定义字符串。如果未指定,则默认按以下顺序拆分(依次为):双换行、单换行、单词之间的空格。
  • 仅按自定义边界分块——如果启用,则仅在指定的分块边界处进行拆分。否则,也会在默认边界处进行拆分。
  • 处理前将文件翻译为英文——如果启用,将在处理文件之前使用 Chat Translation 扩展中配置的翻译 API 将文件翻译为英文。当使用仅支持英文文本的嵌入模型时,此选项很有用。
  • 纳入世界书扫描——如果你希望注入的内容能够激活世界书条目,请勾选此项。
  • 全部向量化——强制为所有未处理的文件摄取嵌入。
  • 清除向量——清除文件嵌入,允许重新计算其向量。

结语

恭喜!你的聊天体验现在已经借助 RAG 的强大能力得到了增强。它的能力只受你的想象力限制。一如既往,不要害怕尝试!