酒馆 SillyTavern 简单使用

SillyTavern 介绍

SillyTavern 酒馆,可以简单理解为一个可以和 AI 说话的平台。在导入对应的 AI 提供商的 API 后,可以通过导入角色卡,让 AI 扮演角色卡所设定的人物,实现和角色聊天。

SillyTavern 安装

安装前的简单说明

SillyTavern 的 Github 链接:https://github.com/SillyTavern/SillyTavern

SillyTavern 有两个分支版本

  • release:推荐大多数用户使用。这是最稳定的分支,只有在推出重大版本时才会更新,适合大多数用户。通常每月更新一次。
  • staging:不推荐普通用户使用。此分支包含最新的功能,但请小心,它可能随时出现问题。仅适合高级用户和爱好者使用。每天更新多次。

不过本人使用 staging 以来,没遇见什么问题。而且 staging 版本会有很多新的特性,如果有一定动手能力的,推荐直接用 staging 版本。

如果过程中遇到网络问题,请进行科学上网

Windows 安装

安装好了后,我们打开终端,在终端内输入命令

  • release 分支:git clone https://github.com/SillyTavern/SillyTavern -b release
  • staging 分支:git clone https://github.com/SillyTavern/SillyTavern -b staging

这里以 staging 分支为例,

在文件夹内有如下的启动文件

  • Start.bat:一个普通的启动脚本
  • UpdataAndStrt.bat:运行更新并且启动
  • UpdataForkAndStrt.bat:更新某个分支,并且启动

直接运行 UpdataForkAndStrt.bat 就行了。

然后等待片刻,它会自动下载依赖。之后会自动在浏览器中访问 127.0.0.1:8000,同时终端上也会显示

这样就安装成功了

Linux 安装

请自行在 Linux 上安装 Git 和 NodeJS。这里以 Ubuntu 为例

命令如下

1
2
3
4
apt update
apt install git -y
apt install nodejs -y
apt install npm -y

安装好了后,在终端内输入命令

  • release 分支:git clone https://github.com/SillyTavern/SillyTavern -b release
  • staging 分支:git clone https://github.com/SillyTavern/SillyTavern -b staging

使用 cd SillyTavern 进入安装文件夹。

运行  ./start.sh  命令

SillyTavern 云服务器部署

云服务器部署

关于 SillyTavern 云服务器部署其实和上面讲的一样。

  • 自己准备一个国外的云服务器(台湾也算国内!),一般都是 Linux 的云服务器
  • 然后根据自己服务器的操作系统,选安装过程

下面我们以 Ubuntu 为例。

forever 后台持久化

在安装后,并且能够成功启动 start.sh ,并且访问到酒馆后,接下来就是持久化的问题。

这里采用 forever 方案

安装命令

1
npm install forever -g

我们来到 SillyTavern 的文件夹下,运行命令

1
forever start server.js

查看一下

1
forever list

成功。

想要更新时,需要把这个后台关掉,使用命令

1
forever stop 13628

其中 13628 是你的 PID

成功关闭

SillyTavern 更新

对于 Windows 来说,直接双击 .bat 就行了。

对于 Linux 来说,我们已经是 staging 分支了,所以直接运行 git pull 即可。不过云服务器更新前,记得把后台退出一下

SillyTavern 配置文件说明

在文件夹里的 config.yaml 是酒馆的配置文件

整体配置文件说明

如果不想看,可以直接往下跳到”关键配置说明”

配置文件说明如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
# -- 数据配置 --
# 用户数据存储的根目录
dataRoot: ./data
# 解析后的角色卡片可以使用的最大内存量(MB)
cardsCacheCapacity: 100

# -- 服务器配置 --
# 是否监听传入连接。如果设置为 false,服务器将只能通过 localhost 访问。
listen: false
# 监听的特定地址,支持 IPv4 和 IPv6
listenAddress:
ipv4: 0.0.0.0 # 监听所有 IPv4 地址
ipv6: "[::]" # 监听所有 IPv6 地址
# 启用 IPv6 和/或 IPv4 协议。至少需要启用一个!
# - 使用 "auto" 选项自动检测支持情况
# - 使用 true 或 false(不带引号)启用或禁用每个协议
protocol:
ipv4: true # 启用 IPv4
ipv6: false # 禁用 IPv6
# 优先使用 IPv6 进行 DNS 解析。在对 IPv6 没有问题的 ISP 上启用此选项
dnsPreferIPv6: false
# 自动运行打开的主机名。
# - 使用 "auto" 让服务器决定
# - 使用 'localhost'、'st.example.com' 等选项
autorunHostname: "auto"
# 服务器端口
port: 8000
# 覆盖浏览器中自动运行的端口。
# - 使用 -1 使用服务器端口。
# - 指定一个端口以覆盖默认值。
autorunPortOverride: -1

# -- SSL 选项 --
ssl:
enabled: false # 是否启用 SSL 加密
certPath: "./certs/cert.pem" # SSL 证书路径
keyPath: "./certs/privkey.pem" # SSL 私钥路径

# -- 安全配置 --
# 切换白名单模式。启用后,只有白名单中的 IP 地址才能访问服务器。
whitelistMode: true
# 白名单还将验证 X-Forwarded-For / X-Real-IP 标头中的 IP
enableForwardedWhitelist: true
# 允许的 IP 地址白名单
whitelist:
- ::1 # IPv6 本地回环地址
- 127.0.0.1 # IPv4 本地回环地址
# 自动将 Docker 主机和网关 IP 加入白名单
whitelistDockerHosts: true
# 切换端点的基本身份验证模式
basicAuthMode: false
# 基本身份验证凭据
basicAuthUser:
username: "user" # 基本身份验证用户名
password: "password" # 基本身份验证密码
# 启用 CORS 代理中间件
enableCorsProxy: false

# -- 请求代理配置 --
requestProxy:
# 如果启用了代理,所有传出的 HTTP/HTTPS 请求都将通过它路由。
enabled: false
# 代理 URL。可能的协议:http、https、socks、socks5、socks4、pac
url: "socks5://username:password@example.com:1080"
# 代理绕过列表。对这些主机的请求将不会通过代理路由。
bypass:
- localhost
- 127.0.0.1

# 启用多用户模式
enableUserAccounts: false
# 启用隐蔽登录模式:隐藏登录屏幕上的用户列表
enableDiscreetLogin: false
# 启用基于 Authlia 的自动登录。仅当您已设置并安装 Authelia 作为反向代理上的中间件时才启用此选项
# https://www.authelia.com/
# 这将使用自动登录到与用于 Authlia 的用户名相同的帐户。(确保 Authlia 中的用户名与 SillyTavern 中的用户名完全匹配)
autheliaAuth: false
# 如果启用了 `basicAuthMode` 和此选项,则基本身份验证的用户名和密码与各个帐户的用户名和密码相同
perUserBasicAuth: false

# 用户会话超时时间(秒)(默认为 24 小时)。
## 设置为正数以在一段时间不活动后使会话过期
## 设置为 0 以在浏览器关闭时使会话过期
## 设置为负数以禁用会话过期
sessionTimeout: -1
# 禁用 CSRF 保护 - 不推荐
disableCsrfProtection: false
# 禁用启动安全检查 - 不推荐
securityOverride: false

# -- 日志配置 --
logging:
# 启用对 access.log 文件的访问日志记录
# 记录带有时间戳、IP 地址和用户代理的新连接
enableAccessLog: true
# 在终端中显示的最低日志级别(DEBUG = 0,INFO = 1,WARN = 2,ERROR = 3)
minLogLevel: 0

# -- 速率限制配置 --
rateLimiting:
# 使用 X-Real-IP 标头而不是套接字 IP 进行速率限制
# 仅当您使用正确配置的反向代理(如 Nginx/traefik/Caddy)时才启用此选项
preferRealIpHeader: false

# -- 高级配置 --
# 自动打开浏览器
autorun: true
# 避免在自动模式下使用 'localhost'。
# 如果您的 hosts 文件中没有 'localhost',请使用此选项
avoidLocalhost: false

# 备份配置
backups:
# 所有备份类型的通用设置
common:
# 为每个聊天和设置文件保留的备份数量
numberOfBackups: 50
chat:
# 启用自动聊天备份
enabled: true
# 每个用户要保留的最大聊天备份数(从最近的开始)。设置为 -1 以保留所有备份。
maxTotalBackups: -1
# 限制每个用户的聊天备份的间隔(毫秒)
throttleInterval: 10000

# 缩略图配置
thumbnails:
# 启用缩略图生成
enabled: true
# 头像缩略图的图像格式:
# * "jpg": 最佳压缩,可调节质量,无透明度
# * "png": 保留透明度,但文件大小增加约 100%
# 更改此设置仅影响新的缩略图。要重新创建旧的缩略图,请清除用户数据中的 /thumbnails 文件夹。
format: "jpg"
# JPG 缩略图质量 (0-100)
quality: 95
# 每种类型的最大缩略图尺寸 [宽度, 高度]
dimensions: { "bg": [160, 90], "avatar": [96, 144] }

# 允许通过 API 公开密钥
allowKeysExposure: false
# 跳过新的默认内容检查
skipContentCheck: false
# 允许卡片下载的主机
whitelistImportDomains:
- localhost
- cdn.discordapp.com
- files.catbox.moe
- raw.githubusercontent.com
# API 请求覆盖(适用于 KoboldAI 和文本完成 API)
## 注意:主机包括端口号,如果它不是默认值(80 或 443)
## 格式是一个对象数组:
## - hosts:
## - example.com
## headers:
## Content-Type: application/json
## - 127.0.0.1:5001
## headers:
## User-Agent: "Googlebot/2.1 (+http://www.google.com/bot.html)"
requestOverrides: []

# 扩展配置
extensions:
# 启用 UI 扩展
enabled: true
# 当发布版本更改时自动更新扩展
autoUpdate: true
models:
# 启用从 HuggingFace 自动下载模型
autoDownload: true
# 扩展的其他模型。期望来自 HuggingFace 模型中心的 ONNX 格式的模型 ID
classification: Cohee/distilbert-base-uncased-go-emotions-onnx
captioning: Xenova/vit-gpt2-image-captioning
embedding: Cohee/jina-embeddings-v2-base-en
speechToText: Xenova/whisper-small
textToSpeech: Xenova/speecht5_tts

# 可以按需下载其他模型分词器。
# 禁用将回退到另一个本地可用的分词器。
enableDownloadableTokenizers: true

# -- OPENAI 配置 --
# 在严格提示后处理模式下使用的占位符消息,当提示不以用户消息开头时
promptPlaceholder: "[Start a new chat]"
openai:
# 将向 OpenAI 完成 API 发送一个随机用户 ID
randomizeUserId: false
# 如果不为空,将作为系统消息添加到每个标题完成提示的开头
# 示例:"Perform the instructions to the best of your ability.\n"(对于 LLaVA)
# 在图像内联模式下不使用
captionSystemPrompt: ""

# -- DEEPL 翻译配置 --
deepl:
# 可用选项:default, more, less, prefer_more, prefer_less
formality: default

# -- MISTRAL API 配置 --
mistral:
# 启用在提示中预填充最后一条助手消息的回复
# 注意:前缀会回显到完成中。您可能需要使用正则表达式将其删除。
enablePrefix: false

# -- OLLAMA API 配置 --
ollama:
# 控制模型在请求后保持加载到内存中的时间
# * -1:无限期保持模型加载
# * 0:在请求后立即卸载模型
# * N(任何正数):在请求后保持模型加载 N 秒。
keepAlive: -1
# 控制生成请求的 "num_batch"(批大小)参数
# * -1:使用模型的默认值
# * N(正数):使用指定的值。必须是 2 的幂,例如 128、256、512 等。
batchSize: -1
# -- ANTHROPIC CLAUDE API 配置 --
claude:
#启用系统提示缓存 (如果支持)
# https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
# -- 重要提示! --
# 仅当聊天记录之前的提示是静态的,并且在请求之间不更改时使用
# (例如,{{random}} 宏或知识库,而不是聊天内的注入)。
# 否则只会浪费金钱在缓存未命中。
enableSystemPromptCache: false
# 在深度上启用消息历史缓存(如果支持)。
# https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
# -- 重要提示! --
#谨慎使用,行为可能无法预测,无法或将不会做出任何保证。
# 设置为整数以指定所需深度, 0(不包含预填充)
# 对于多数使用情况应该是最理想的。
# 除 非负整数外的任何值都将忽略并且不会启用按深度缓存.
cachingAtDepth: -1

# -- 服务器插件配置 --
#启用服务器插件
enableServerPlugins: false
# 尝试在启动时自动更新服务器插件
enableServerPluginsAutoUpdate: true

关键配置说明

监听

1
listen: true # 这里设置为true,如果设置为 false,服务器将只能通过 localhost 访问。

云服务器上的必须开启

监听端口

1
port: 1234 # 端口自行设置

请修改成别的端口,尽量不要用默认端口

白名单(不建议打开)

1
2
3
4
5
whitelistMode: false # 白名单启用后,只有白名单中的 IP 地址才能访问服务器。
enableForwardedWhitelist: false # 如果开启白名单,还将验证 X-Forwarded-For / X-Real-IP 标头中的 IP
whitelist: # 白名单设置
- ::1
- 127.0.0.1

不建议打开,除非你对你的出口 IP 十分了解

单用户的基本身份认证

1
2
3
4
basicAuthMode: false
basicAuthUser:
username: "trtyr" # 基本身份验证用户名
password: "123456" # 基本身份验证密码

如果开启了的话,效果如下

没啥用,一般用的是下面的多用户认证

多用户认证

注意,多用户认证单用户的基本身份认证只能开一个。

1
2
3
4
5
6
# 关闭单用户的基本身份认证
basicAuthMode: false
# 启用多用户模式
enableUserAccounts: true
# 启用隐蔽登录模式:隐藏登录屏幕上的用户列表
enableDiscreetLogin: true

初次运行会有提示

默认的管理员用户名是 default-user,需要我们用 recover.js 设置一个密码,命令如下

1
2
3
4
5
# 命令格式
node recover.js [account] (password)

# 命令示例
node recover.js default-user 123456

我们再次运行即可正常访问,效果如下

该页面可以美化,在下面会提到。

多用户认证页面美化

在酒馆文件夹下,有一个 public 文件夹

这里就是多用户认证的前端项目,可以在修改源码。

或者直接网上找个现成的。一般都会有使用教程

效果如下

其他

其他的就不用动。

SillyTavern 功能介绍

功能栏介绍

功能栏主要有如下功能

这些功能先不用了解,下面会介绍

修改 UI 界面

SillyTavern 可以通过导入不同的 JSON 文件修改界面样式。在用户设置里,可以通过导入预设修改 UI 界面

点击“导入”即可导入 JSON 格式的 UI 主题,导入后需要选择刚才导入的主题使其生效

可以配置背景图片使用

API Key 配置

配置 API Key

在这里可以配置 AIAPI Key

这里是选择想要使用的 API 功能,这里选择的是”聊天补全”

下面可以选择补全的来源,此处选择 Google 的来源

下面填写对应的 API Key

填写后,点击”连接”,即可测试 API 的连通性。如果连接成功,会变成绿色

连接成功后,可选择对应的模型。这里选择的是 Gemini exp 1206

接着点击”发送测试消息”,即可测试模型的可用性

自定义服务

自定义就是用非官方的第三方厂商,通过他们提供的接口去访问服务。一般 API 端点的地址会写在服务商的通告或者文档里。

操作差不多,填写 API 端点端点,再填写 API Key ,连接成功后即可选择模型

反向代理

我们在使用官方渠道时,会发现有一个反向代理的功能

就是个反向代理,没啥东西。

角色聊天

现在酒馆里有了一个 AI,我们现在要导入角色卡。角色卡有 PNGJSON 格式,不过我一般见的都是 PNG,还没见过 JSON 格式的。角色卡可以在 Discord 类脑频道 里找。

导入成功后点击角色即可开始聊天。如果点击后出现一个提示块,让你 Import 什么,直接点击 import 进行导入就行了。

点击人物头像可以进行放大查看

用户设置

在如下地方可以对用户进行管理

可以设置用户名,设置用户头像,设置用户角色描述等操作。

扩展功能

酒馆提供了一下扩展功能

这里可以进行一些扩展操作,比如接入 TTS 实现语音输出、接入本地 SD 实现图片生成、使用聊天输出翻译实现输入输出的翻译等等。

可以寻找扩展进行安装。

聊天翻译

我们现在设置为”翻译回复”

翻译回复,就是自动翻译 Char 的消息。

这里 Char 输出的是一段英文。

点击这里即可翻译

正则

正则功能是来进行匹配替换的。举个例子。

一般预设里,都会设置一个 cot(思考链),用 <think></think> 进行包裹

但是我们观感会很不好,我们要的是结果,不是 AI 的思考过程。所以得想办法把 <think></think> 里的内容去掉。

这时候就可以用正则了

使用正则表达式 /(^[\s\S]*?<\/think>.*)/g,去匹配 AI输出 的内容,并替换成空。试试效果,把它开启

成功替换

这个正则配合 HTML,可以进行一些离谱的操作,比如说状态栏,人物卡片等等。

快速回复

快速回复是一些代码功能,下面是我的快速回复,实现总结功能

它在会话框上出现功能点

这样点击就能触发功能了。

世界书

参考文档:世界书 - 飞书云文档

世界书基本概念

什么是世界书?

世界书 (Lorebooks) 旨在为你的角色卡提供更为完整的背景信息。

下面是《天涯明月刀》中的一段

1
秋水清又推开一块巨石,石壁里还藏着个铁柜,难道孔雀翎就在这铁柜里?

这段话给 AI 看,秋水清是谁?孔雀翎是啥?此时就可以添加世界书

1
2
秋水清:“孔雀山庄”庄主的幼弟。
孔雀翎:天下的暗器最成功但最可怕的就是孔雀翎。孔雀翎是个由纯金铸成的圆筒,上面有两个枢纽,一按筒里的暗器便飞射而出,暗器发出来就美丽得像孔雀开屏一样,灿烂辉煌。然而,就在你看得目瞪口呆时,它已经要了你的性命。

这样 AI 就知道秋水清是谁,孔雀翎是什么了。

关于世界书的 导入导出重命名删除设置全局世界书设置角色世界书 等基础操作,请到参考文档中自行查看

世界书简单设置

Strategy

世界书的 Strategy,一般只用两个:

  • 常量:不需要输入关键词,每次对话都会触发该条目内容,插入上下文。AI 永远都能读到世界书设定。
  • 正常:正常地以关键词触发内容。AI 最新的回复消息,包含某个关键字 A ;或者用户发的消息里,包含关键字 A。此时世界书就会触发,AI 就会读到世界书的内容。

位置

世界书的位置,只需要知道两个即可:

  • 角色定义后:将条目内容插入角色描述下方。
  • @D:按插入深度插入。

首先是 角色定义后,举个例子。现在存在如下角色描述

1
2
3
4
here's a description of {{char}}:
name: 林婉儿
gender: female
personality: 邻家温柔大姐姐

有一个世界书,介绍 {{char}} 的癖好:

1
{{char}}'s idiocrasy: 喜欢摸{{user}}的头

我们将世界书位置选择为 角色定义后,那么效果就是在角色描述下添加世界书内容。

1
2
3
4
5
6
here's a description of {{char}}:
name: 林婉儿
gender: female
personality: 邻家温柔大姐姐

{{char}}'s idiocrasy: 喜欢摸{{user}}的头

然后是 @D,这个是和 AI 的注意力有关。比如说 AI 似乎没注意到 idiocrasy 特性,此时需要让 AI 增加对其的注意力,使用 @D

@D 后有一个深度,深度是指在第 X 条消息下。比如 {{user}} 发给 AI 的消息是

1
{{user}}: “姐姐,你身上好香啊”

深度 0 的世界书就是在 {{user}} 消息的下方加世界书

1
2
{{user}}: “姐姐,你身上好香啊”
{{char}}'s idiocrasy: 喜欢摸{{user}}的头

深度 1 就是在上一条消息前加上世界书

1
2
3
4
{{char}}: {{char}}从后面悄悄靠近,从后面抱住{{user}}
{{char}}'s idiocrasy: 喜欢摸{{user}}的头

user: “姐姐,你身上好香啊”

深度 2,深度 3 同理。因此,深度值越小,注意力越大。深度为 0 时,AI 会集中注意力去看你这条设定。

Order

在介绍 Order 之前,简单说一下顺序问题。一般来说,Prompt 的上下文顺序是这样的(由于这里只关注 角色描述聊天记录,其他的就不管了)

1
2
3
4
5
角色描述
上一条聊天记录

角色描述
当前的聊天记录

AI 先看 当前的聊天记录 再看 角色描述,然后是 上一条聊天记录 这样从下往上读,注意力从高到低。而我们加入世界书后,会在这些位置里穿插着世界书内容。那么如果是如下的情况呢?

再使用相同 Strategy 和相同 深度 时,这两条是怎么排序的呢?因为 order 相同,按照时间排序。癖好 先创建的,Life Story 是后面创建,所以顺序如下:

1
2
3
4
5
6
7
角色描述
上一条聊天记录

角色描述
当前的聊天记录
Life Story
癖好

此时 AI 会优先注意 癖好。如果需要对其进行注意力修改,但是还不想更改 Strategy深度 时,就需要用到 order 了。在使用 order 时,可以把其理解为一个注意力的的象征值,order 越大,注意力越来,也就是越靠下。

结果就是

1
2
3
4
5
6
7
角色描述
上一条聊天记录

角色描述
当前的聊天记录
癖好
Life Story