SillyTavernを使ってみた
LLMのインターフェースである SillyTavern を使ってみた。良かった。
SillyTavernは、LLMのためのチャットインターフェースを提供するオープンソースのソフトウェア。これ自体にはLLMが付属していないので、API連携することになる。
ユースケース
SillyTavernは、LLMにキャラクターを演じさせるRPチャットが向いているとされている。 しかし、この用途に留まらない高いポテンシャルがある。 私が今回構築した環境は、業務用途ではなく完全にホビー用途。ゲームマスターをさせてテキストベースのRPGを作って遊んでみたり、StableDiffusionと組み合わせて画像生成で遊んでいる。また、小説執筆のインスピレーションを得るために、文章を書かせたり、キャラクターを演じさせたりもしている。 Webアプリケーションの形態なので、LAN内のモシモシからアクセスすることもできる。
同じようなLLMフロントエンドの LibreChat と比べて、より上級者向けだなと感じる。細かくパラメータ調整できるし、豊富な拡張機能がある。 パラメーターは、プリセット管理機能が行き届いている。これにより、複数の用途を使い分けたり、モデルを使い分けたりすることが簡単にできる。特筆すべきはキャラクター管理機能。文字通り、キャラクターの性格を定義して保存しておけるし、英語圏ではキャラクター設定を共有するコミュニティがある(ただしNSFW用途が多いので検索してはいけない)。キャラクター設定だけでなく、ワールドやロアなどを定義できるので、独自のファンタジー世界のキャラクターとRPチャットができる。
LibreChat や ChatGPT でも、命令プロンプトを地道に書いてゆけば、同じことはできるが、SillyTavernはそれがとても簡単にできる。ブランチ機能や、メッセージの編集などを使いながら、プロンプトやパラメータを効果的にチューニングできるし、基本となる命令プロンプトやパラメータのプリセットが多数用意されているので、プリセットを元に作業を始めれば良い。
設定によっては、ビジュアルノベルっぽいUIにすることができるので、キャラクターと話している感じが得られる。メッセージから感情を推論し、画像を出し分ける機能もある。画像だけでなく、MMDモデルや、Live2D も使えるので、とってもイマーシブ。
画像生成
画像生成AIとの組み合わせも楽しい。 自分で画像生成のプロンプトを書くのは限界がある。LLMと組み合わせて使うのが楽しい。キャラクターの服装、シーン、ポーズを良い感じに提案させることができる。プロンプトを作るための命令プロンプトを管理する機能も備わっている。
ChatGPT や LibreChat にももちろん画像生成機能はあるが、STでは、ベースとなるプロンプト(クオリティタグやネガティブ)をプリセットで管理できるほか、キャラクター固有タグも保持できる。 プロンプトの作成方法も複数の手法から選べる。直接画像生成APIに投げることもできるし、例えば、「今のキャラクターの姿をプロンプトにして」のような命令プロンプトを1回挟ませることもできる。
作りたい画像の性質にもよるが、私はローカルのStableDiffusionのSDXL系モデルをよく使う。SDXLの豊富な語彙と相性ぴったり。ollamaとVRAMを奪い合うので、システムリソースはパツパツだが。あ〜強いビデオカードがもう一台ほしいなあ。2枚差しのマシンを組むのも面白そうだけど、ネットワーク経由でクラスタリングさせるほうが私は趣味だな。
想像力や語彙が必要なワークロードでは gpt4o が良い結果になる。 もっと単純なやり取りならば、gpt4o-mini がとてもコスパが良い。 例えば、服装コーディネートの提案をさせるとき、 mini でも”それらしい”結果が得られるものの、gpt4o のほうがアウトプットの質が高い。つまり、色使いや組み合わせのセンスが良い。知識の差が現れるんだなと感じる。 12B程度のローカルLLMを動かすのも楽しい。 小さいモデルほど、チューニングが肝心となる。指示プロンプトをしっかり書くことで良い結果が得られる。ローカルLLMは、プロンプトに加えて、しっかり数値をいじらないと、たちまち動作不良を起こすが、その面倒なところがまた面白い。
STscript
STの魅力のひとつが、強力なスクリプトシステム STscript 。 STscriptは、チャット欄に入力できるスラッシュコマンド。しかも、IO, 変数, 条件分岐, 計算, 外部連携など、めちゃくちゃ豊富な機能がある。
例えば、公式から引用するなら、以下のようなコマンドを実行すると・・・
/input What do you want to generate? |
/setvar key=SDinput |
/echo Requesting an image of {{getvar::SDinput}} |
/getvar SDinput |
/imagine
テキストボックスが現れ、ユーザーが入力した内容を変数に格納。メッセージをチャットに出力したうえで、テキストを画像生成プラグインに渡す、という内容になっている。 プラグインのような本格的な機構を使わなくても、ほしい機能を自分で作れちゃうってわけ。 作ったスクリプトは、QuickReply機能に登録しておけばボタン化したり自動実行することができる。例えば、特定のメッセージを自動的にStableDiffusionに投げる、といったことも可能になる。
他の便利なもの
VectorStorage と呼ばれるRAGが組み込まれている。メッセージのベクトルをあらかじめ計算しておき、関連性が高い過去のメッセージを、プロンプトの特定の位置に挿入する仕組みがある。これによって、AIはより文脈に合った応答をできる。
サマリー機能は、所定のトリガーで、メッセージの全体の要約を作成する機能。作成された要約は、同じく、プロンプトの特定の位置に挿入される。
ワールド情報/Lorebook では、キャラクターから独立したかたちで、ロア情報を記述できる。そのまま、ファンタジー世界のロアを管理するのに役立つ。世界、地政、アイテムや魔法などを書いておける。所定のトリガーによって、プロンプトに挿入される。
CFGスケールも設定できる。このテキスト生成におけるCFGスケールは、StableDiffusionのそれとは全く別物。プロンプト全体に対して前処理をかける仕組みです。ポジティブ・プロンプトの成分を強調させ、逆に、ネガティブ・プロンプトの成分をプロンプトから除外する、その後、通常のテキスト生成にかける、とのこと。ollamaには対応していないらしく、使っていない。
このように、プロンプトを効果的に組み立てるための機能がいくつも盛り込まれていて、ユーザーは好きに有効化できるし、それぞれの指示プロンプトやフォーマットも調整できる。 AIキャラが記憶を保持しているかのように振る舞うので、よりイマーシブな体験になるってわけだ。
システム
システム面では、Node.js 環境でダイレクトに動かすか、Dockerを使うことになる。 /docker/ ディレクトリに docker-compose.yml があるので、サービスとして常駐させることができる。私は docker で起動することにした。
技術的には、かなりシンプルだと思う。 ST自体はひとつのNode.jsアプリケーションで完結する。
世の中のいくつかのLLMフロントは、簡単セットアップをうりにするので、LLM実行環境も同梱しがちだが、SillyTavernはその点が疎結合になっているので、容易に保守できる。トラブルが起きたときは、外部サービスの問題か、ST自体の問題かの切り分けが肝心となる。
データベースは、RDBMSではなく、ファイルシステムを使い込んでいるように見受けられる。設定値も、出力テキストも、すべて、ファイルというかたちで現れる。RDBMSの強力な機能は得られないが、代わりに、データの透明性が確保される。
接続できるLLMは多い。私は、Ollama, OpenAI, Claude をよく使う。ネット上では oobabooga/text-generation-webui を使う人が多い印象。最近、Ollamaは HuggingFace 上のGGUFファイルを直接扱えるようになったので、ますます便利。シンプルで安定している。 画像生成プロバイダも同様に、有料からローカルまで、様々なサービスに接続できる。私はローカルの stable-diffusion-web-ui (reforge) に繋いでいる。例えば、RPチャットの一連の流れを要約して、いまのシーンを画像で説明する、といったこともできる。そのための指示プロンプトもSTには組み込まれてるってわけ。
OpenAIなどの外部APIの接続先には、プロキシを設定することもできるようになっている。 前述した STscript でも欲しい機能がまだ足りないって思ったら、自分で軽いプロキシを書いてデータを加工すれば良い、っていう書き込みも見かけた。なるほど・・・。
以上。