# 数据库(RAG)

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

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

# 访问数据库

内置的聊天附件扩展(在 1.12.0 及更高版本中默认包含)在"魔法棒"菜单中添加了一个新选项 - 数据库。这是您管理 SillyTavern 中用于 RAG 的文档的中心。

# 关于文档

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

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

什么可以成为文档?实际上任何可以用纯文本形式表示的内容!

示例包括但不限于:

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

各种扩展和插件也可以提供新的方式来收集和处理数据,下面会详细介绍。

# 数据来源

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

# 记事本

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

# 文件

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

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

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

# 网页

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

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

# YouTube

通过 ID 或 URL 下载 YouTube 视频的转录文本,可以是创作者上传的或由 Google 自动生成的。某些视频可能已禁用转录,同时由于需要登录,无法解析年龄限制视频。

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

# 网页搜索

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

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

# Fandom

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

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

Bronya Rand 的 Bronie 解析器扩展允许使用第三方抓取器,如米哈游/HoYoverse 的 HoYoLab 到 SillyTavern,类似于其他数据来源。

目前,Bronya Rand 的 Bronie 解析器扩展支持以下内容:

  • 米哈游/HoYoverse 的 HoYoLab(用于原神/崩坏:星穹铁道)通过 HoYoWiki-Scraper-TS

首先,按照其安装指南安装 Bronya Rand 的 Bronie 解析器扩展,并在 SillyTavern 中安装支持的服务器插件。重启 SillyTavern 并进入_数据库_菜单。点击+ 添加,您应该会看到您最近安装的抓取器已添加到可能的信息来源列表中。

# 向量存储

好的,您已经为您的特定主题建立了一个不错且全面的信息库。接下来呢?

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

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

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

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

# 向量提供者

# 本地

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

  1. 本地(Transformers)- 在 Node 服务器上运行。SillyTavern 将自动从 HuggingFace 下载兼容的 ONNX 格式模型。默认模型:jina-embeddings-v2-base-en
  2. Extras - 使用 SentenceTransformers 加载器在 Extras API 下运行。默认模型:all-mpnet-base-v2
  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 密钥。

# API 来源

所有这些来源都需要相应服务的 API 密钥,通常有使用成本,但一般来说计算嵌入的成本相当低。

  1. OpenAI
  2. Cohere
  3. Google MakerSuite
  4. TogetherAI
  5. MistralAI
  6. NomicAI

# 向量化设置

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

# 消息附件

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

适用以下规则:

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

# 数据库文件

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

适用以下规则:

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

# 共享设置

  • 查询消息 - 用于查询文档块的最新聊天消息数量。
  • 分数阈值 - 调整以允许根据块的相关性分数(0 - 完全不匹配,1 - 完全匹配)筛选块的检索。较高的值允许更准确的检索并防止完全随机的信息进入上下文。合理的值范围在 0.2(更宽松)到 0.5(更专注)之间。
  • 包含在世界信息扫描中 - 如果您希望注入的内容激活知识库条目,请勾选。
  • 向量化全部 - 强制摄取所有未处理文件的嵌入。
  • 清除向量 - 清除文件嵌入,允许重新计算它们的向量。

# 结论

恭喜!借助 RAG 技术,您的聊天体验已得到显著提升。其潜力无限,全凭您的创意发挥。大胆尝试,勇于探索,让您的聊天体验更上一层楼!