フロントエンドでの処理

Last-modified: 2023-02-05 (日) 14:43:41

※ここに書かれている情報はユーザーがAIのべりすとを利用する中で、作者さんの発言やJavaScriptの動作、サーバーとの通信ログなどから推測した動作です。
これは公式の仕様書ではなく、このページを編集したユーザー(たち)が動作確認した以降もここにある通りの動作をしている保証はありません。
その点を十分に注意ください。

基本的な動作

フロントエンドサーバーでは、編集画面で作成した各データをAIモデルに渡すための前処理を行う。
具体的には、コメントの除去、トークン節約のための重複した記述の削除、最大トークン数に収まらない本文の足切りと本文へのメモリ・脚注・キャラクターブックの挿入、「入力文の置換」「入力文の置換(正規表現)」「単語の言い換え」「単語の言い換え(正規表現)」の適用、(セリフモードの場合)末尾へのかぎ括弧の追加が順番に行われる。
テキスト関係以外では、詳細パラメータをチェックし、ブラウザ上の表現から、AIモデルで利用できる形への変換も行われる。この時にコースごとのパラメータの制限(最大トークン数など)もチェックしていると思われる。

コメントの除去

本文における「@/* ~ @*/」「@break」「@startpoint」、メモリ・脚注・キャラクターブックにおける「@_」で示される範囲のコメントを削除する。
本文中の「@_」「@endpoint」については、フロントエンドサーバーに送られる前にブラウザ上で削除される。

トークン節約のための重複した記述の削除

https://discord.com/channels/256999268039000064/896696503794532352/916638846064660570

Discordでの作者さんの発言によると、トークン節約のために重複した記述は自動的に削除(省略)する処理が入っている。
判明している限りでは、下の条件で重複の削除が行われる。

  • 重複記述の判定は行単位で行われる。
  • 本文の最下行より2行上から(つまり下から2行は読み飛ばす)、上方向へと各行を読み込んでいく。
  • 全く同一の行があればそれをカウントする。
  • 全く同一の行が4回出現したならば、その行より上にある4回出現した行と同一の行を削除する。

例えば次のような入力は

12345
a
12345
b
12345
c
12345
d
12345
e
12345
f

このようになる。

a
12345
b
12345
c
12345
d
12345
e
12345
f

これを次のように最後に1行足して、読み飛ばされる範囲から「12345」を外すと、

12345
a
12345
b
12345
c
12345
d
12345
e
12345
f
g

このように、「a」と「b」の間の「12345」も削除される。

a
b
12345
c
12345
d
12345
e
12345
f
g

最大トークン数に収まらない本文の足切りと、本文へのメモリ・脚注・キャラクターブックの挿入

トークン一覧にある通り、AIのべりすとはトークンという単位で文を認識する。
認識できるトークン数には制限(コースによる。最大2048トークン。)があり、それに合わせて本文の最初の方が詰められる。
メモリや脚注、キャラクターブックがあると、それらを本文に追加し、それによってトークン数が制限を超える場合は、本文を削る。
本文を可能な限り(脚注を挿入する行より上の部分をすべて)削り、それでも制限を超える場合は、メモリ・脚注・キャラクターブックを追加した状態のテキストを上から削っていく。
つまりメモリ、(詳細オプションが初期値なら)キャラクターブック、脚注の順に削られる。
もっとも、そのような状態になるのはメモリ・脚注・キャラクターブックに文字数制限ぎりぎりまで文を入力した場合だけだろう。

なお、キャラクターブックはメモリと脚注の合計トークン数、総認識トークン数の約60%を超えるとそれ以上読み込まれなくなるが、キャラクターブックを上から順番にチェックしていき、最初にタグがヒットしたキャラクターブックだけは制限にかかわらず必ず読み込まれる。

「入力文の置換」「入力文の置換(正規表現)」「単語の言い換え」「単語の言い換え(正規表現)」の適用

メモリなどを組み込んで、トークン数の制限を掛けたテキストに、スクリプトによる置換を適用する。
スクリプトの適用は上から順に行われる。

末尾へのかぎ括弧の追加

出力モードがセリフの場合、テキストの末尾に改行とかぎ括弧(「)を追加する。
すでに末尾に開いた状態のかぎ括弧があるなら、追加は行わない。
ただし、末尾が『「~~「」』のようにかぎ括弧の入れ子になっている場合は、追加が行われる。

パラメータのチェック

ブラウザ上の内部データはそのままではAIモデルに渡せないため、モデルで扱える形式への変換を行う。
おおむね、整数値で持っている値の実数値への変換である。

おそらくこの処理の一環として、禁止ワードの追加が行われる。
例えば、禁止ワードリスト入力欄に

禁止ワード1
禁止ワード2

とあった場合、パラメータチェック後の禁止ワードは次のようになる。

禁止ワード1<<|>>禁止ワード2<<|>><unk><<|>><s><<|>></s><<|>>[<<|>>▁[

後半の「<unk><<|>><s><<|>></s><<|>>[<<|>>▁[」はデフォルトで追加される禁止ワードで、禁止ワードリスト入力欄に何も入力しない場合でも追加される。
禁止ワードが何も入力していないのに「ユーザー指定の禁止ワードで~」というエラーが出る場合は、この自動追加ワードに引っかかっている可能性がある。
さらに出力モードがナラティブになっている場合は次のようになる。

「<<|>>\n「<<|>>『<<|>>\n『<<|>>」「<<|>>』『<<|>>「\"<<|>>『\"<<|>>、「<<|>>、『<<|>>」(『<<|>>『\"<<|>>『\"』<<|>>『』<<|>>禁止ワード1<<|>>禁止ワード2<<|>><unk><<|>><s><<|>></s><<|>>[<<|>>▁[

「禁止ワード1」より前に追加された部分は、かぎ括弧により会話が始まらないようにするために追加される。
禁止ワードの特性として、トークンに一致するワードはそもそもAIの推論出力対象から外されるため、これらのトークンが存在しないことを前提とした文、つまり会話のない文章を生成してくれる。
ただ残念なことに、かぎ括弧を使わない発言*1は完全に無くすことはできない。*2
さらにかぎ括弧を含むトークンが、使われる可能性は少ないとは言え、他にも存在するため、そのトークンが使われると生成した文章をかぎ括弧までで打ち切るため、かぎ括弧が文章の先頭だと「ユーザー指定の禁止ワードで~」というエラーが出る。


*1 例えば、○○:~~のような形式での会話や、地の文を書きその直後に「○○はそう言った。」とするような間接的な表現。
*2 とりんさまの性能向上により、以前よりは目にする機会は少なくなった。