酒馆SillyTavern 的本质 发送给AI的数据格式

前面我们已经动手搭起来了自己的酒馆SillyTavern, 用免费的Gemini API运转了起来, 与AI开始了第1个故事. 

我们的酒馆SillyTavern是在命令行运行的, 所以可以通过命令行日志看到底层的运行.

比如, 当我发送了一句"出发! 前往断魂山脉! 获得月影草的最后一关考验."

酒馆聊天界面输入测试语句:出发!前往断魂山脉!获得月影草

命令行的日志是这样的.

命令行日志底部红框箭头指向Streaming request finished

这个"Streaming request finished"显示之后, 酒馆页面就开始显示AI回复的内容.

所以我们在命令行日志中, 两个"Streaming request finished"之间就是酒馆发送给AI的内容.

* 注 在screen中查看日志, 想上下翻页是不能直接使用 pageup pagedown的. 
(当然你用鼠标拖动是可以的, 不过, 如果你是刚刚以 screen -r 恢复, xshell窗口里只会显示一屏信息, 鼠标拖动也没用)

Linux 在 screen 中查看日志 需要使用 Ctrl + A, [ 左方括号 

Linux 把 screen 中的日志保存出来也需要特别的办法


复制出来看看, 是个json结构, 大段的内容占空间, 我们放到json格式化工具中 

https://tool.chinaz.com/tools/jsoneditor.aspx (特意使用这个工具, 因为会自动给key添加"")

* 注意, 要把下图中所示的 "Streaming request finished" 删除, 再把 "Google AI Studio request:" 删除. 这样才是合格的JSON格式

Google AI Studio请求截图,需删掉Streaming request finished等行才是合格JSON


我们来看看, 酒馆SillyTavern 发给 Gemini API 的是什么东西

首先可以看到, 数据分为4大块.

JSON树展开object,显示contents、safetySettings、generationConfig、systemInstruction四块

我们一个个打开来看看.

contents 部分就是曾经发生过的对话. 

能看到, 还区分出哪些是AI"说"的, 哪些是用户"说"的.

contents的红框标出role为user与model的对话记录

contents 部分的最后一组数据, 就是用户最后"说"的那句话.

酒馆聊天消息与JSON里role为user的最后一条对应


接下来的部分是 safetySettings

看上去是一些开关配置项, 找点工具翻译一下. 可以看到是关闭 危险内容啊, 色情内容啊之类的限制.

safetySettings里五项安全阈值都设为OFF

再接着的部分是 generationConfig

generationConfig下显示candidateCount、maxOutputTokens、temperature、topP
不懂就先跳过, 哪天用得着的时候再来研究.


最后的部分是 systemInstruction

可以看到, 就是角色卡的角色描述部分.

角色卡的角色描述与JSON里systemInstruction内容一致


总结起来, 就是说, 每次用户"说"一次话 (哪怕只有一句话甚至只有几个字), 酒馆都会构造这么一大段发给AI, 包括

从用户刚刚"说"的话往前的相当大的一段历史对话记录,
角色描述,
要求AI解除色情内容等一些限制,
还有一些其它参数.

而AI就是在这么一大段的提示词下, 生成了一小段回复. 也就是最下面的, 最新的内容.

Seraphina角色聊天界面,输入框提示输入消息或 /? 获取帮助


当然了, 我上面这些只是非常浅显地讲解. 酒馆还有很多复杂的精细的功能我没用过, 也不了解.

但是, 这些分析足够我们知道, 酒馆的本质就是如此. AI侧不会保存针对每个使用者的记忆, 使用者每次都需要带上足够的信息作为 prompt 才能让AI生成看上去符合"记忆"的新的一段话.

prompt 上下文长度是有限的, 所以从原理上说, 用AI写小说的长度越来越长, AI就会忘记更早的时候的内容, 新写出来的东西有可能会和比较早的内容毫无关系. 就算有一样的名词/角色, 也有可能会前后矛盾.

如果你想提升生成的质量, 那么就一定会用到更长的 prompt, 这样带来的是更高的使用成本和生成时间.


========

未完待续

========
请看我和AI对话讲的故事 PDF

========
update
今天在网上逛, 看到一个很不错的视频.
有点长, 但值得耐心看.

评论