Jevを(ひどい)チャットボットに変えてみた
I turned Jev into a (lousy) chatbot (github.com)
要約
このプロジェクト「jevchat」は、大規模言語モデル(LLM)であるJevを使用して、テキスト生成をシンボルレベルで行う実験的なチャットボットです。ユーザーの質問とこれまでの返答に基づき、次にどのシンボル(文字や単語)が来るかの確率をJevに予測させ、その確率分布から次のシンボルをサンプリングします。この方法はコストがかかるものの、ユーモラスで予測不能な結果を生み出すことが特徴です。
全文翻訳
jevchat
私たちはJevを知っています。
jevchatはそれをチャットモデルに変換します。各ステップでJevに1つの質問をします。
ユーザーの質問と、これまでに書かれた返答が与えられたとき、次にどのシンボルが来るか?
選択肢はアルファベットと、出力を停止するオプションです。Jevはそれぞれの確率を返し、サンプラーはその正規化された分布から次のシンボルを描画します。追加し、繰り返し、STOPが描画されたら停止します。
いくつかのアルファベット(切り捨てられたトークンリストを含む)とサンプリング戦略が利用可能です。
アイデアは楽しみのためであり、コストはやや非現実的で、結果は面白いものです。
これはClaudeによる加速実験でした。サンプリングアルゴリズムや戦略などを説明すると、それらを実装してくれました。
セットアップ
poetry install
pyproject.tomlの隣にある.envファイルにJevキーを配置してください(gitで無視されます)。
api_key="..."
JEV_API_KEYとTYPESAFE_API_KEYも受け付けます。.envの値はエクスポートされた値よりも優先されるため、ファイルを編集するだけでキーを切り替えることができます。
使用方法
poetry run jevchat # インタラクティブチャット
poetry run jevchat ask "do people need water?"
poetry run jevchat alphabets # サンプルできるもの一覧
poetry run jevchat bench # 全モードを比較(下の表)
返答はサンプリングされると同時に表示され、生成レート(シンボル/秒、文字/秒、APIコールあたりのミリ秒、経過時間)のライブ表示と、Jevが前回のステップでスコアリングした上位数シンボルが表示されるパネルで確認できます。これにより、サンプラーがどの分布から描画しているかを見ることができます。
Ctrl-Cでキャンセル。最初のプレスは、インフライトリクエストが返ってきたら生成を停止し、部分的な返答を保持します。2回目のプレスで即座に中止します。チャットでは、部分的な返答は会話履歴に残ります。askはキャンセル時に130で終了します。
チャットコマンド: /help, /alphabet [name], /temp <v>, /stop-bias <v>, /reset, /stats, /exit。
モード
次のシンボルに対する分布がどのように取得されるか(-s/--strategy)と、それが何に対する分布か(-a/--alphabet)という2つの要素を切り替えることができます。以下のすべての組み合わせは実行可能なコマンドです。
戦略 (Strategies)
choiceはアルファベット全体に対して1つの質問をします。bisectはアルファベットをソートし、グループが小さくなるまで早い/遅いの質問を繰り返してから、そのグループ内で1つの選択質問をします。
# choice — アルファベット全体に対する1つの質問(デフォルト)
poetry run jevchat -s choice ask "how many eyes do people have?"
# ... Jevの位置バイアスをキャンセルする再並べ替えなし(最悪のモード)
poetry run jevchat -s choice --no-shuffle-criteria ask "how many eyes do people have?"
# ... 4回の再並べ替えを平均化し、4つの並列質問として1つのリクエストで送信
poetry run jevchat -s choice --ensemble 4 ask "how many eyes do people have?"
# bisect — 20個のグループまで早い/遅いで分割し、各分割は両方質問される
poetry run jevchat -s bisect ask "how many eyes do people have?"
# ...より安価: より大きなグループ、各分割は一度だけ質問される
poetry run jevchat -s bisect --bisect-cutoff 32 --no-bisect-swap ask "how many eyes do people have?"
# buckets — アルファベットが多くの質問に分割され、各質問にはOTHERのエスケープがあります。
# 255シンボルを超えることができる唯一の戦略です。
poetry run jevchat -a words1k -s buckets ask "what colour is snow?"
poetry run jevchat -a bpe5k -s buckets --bucket-size 127 ask "what is the capital of france?"
# refine — buckets、次に勝者に対する質問、次にリスコアされた核。
# 右のシンボルに対する確率が2倍になり、約19倍の語彙が解決されます。
poetry run jevchat -a words1k -s refine ask "where do fish live?"
poetry run jevchat -a words1k -s refine --refine-nucleus 6 --refine-rounds 2 ask "…"
表示形式 (Presentations)
# hypothesis — オプションは結果のテキストです(デフォルト)
poetry run jevchat -p hypothesis --window 40 ask "what colour is snow?"
# symbol — オプションは生のシンボルです。この最初のバージョンがそうでした。
poetry run jevchat -p symbol ask "what colour is snow?"
ビームサーチ (Beam search)
# シンボルごとにコミットするのではなく、3つの候補となる返答を維持します。
poetry run jevchat -b 3 ask "what is the opposite of hot?"
コストは、ライブビームごとにステップごとに1つのスコアがかかります。幅1を超えると、temperature、top_p、top_kは適用されなくなります。ビームは確率によってランク付けされ、描画されません。
アルファベット (Alphabets)
poetry run jevchat -a lower26 -t 0 ask "what is 2+2?" # a-zとスペースのみ
poetry run jevchat -a ascii -t 0 ask "what is 2+2?" # 何でも綴れる
poetry run jevchat -a tokens -t 0 ask "do people need water?" # 単語全体
# これら3つは255オプションを超えるため、--strategy buckets が必要です。
poetry run jevchat -a words1k -s buckets -t 0 ask "what colour is grass?"
poetry run jevchat -a bpe2k -s buckets -t 0 ask "where do fish live?"
poetry run jevchat -a bpe5k -s buckets -t 0 ask "what do bees make?"
組み合わせ (Combining them)
poetry run jevchat -a tokens -s bisect --bisect-cutoff 20 ask "do people need water?"
poetry run jevchat -a ascii -s choice --ensemble 12 -t 0.2 --repetition-penalty 1.0 \
ask "what colour is grass?"
仮説オプション (Hypothesis options)
Jevに同じ質問を投げかける方法は2つあります。--presentation symbolの下では、オプションはシンボル自体('a', 'i', ' the')であり、Jevはそれを頭の中で返答に追加してから評価する必要があります。指示には正確に次のように書かれていました。「オプション自体ではなく、連結されたものに対して文法とスペルを評価してください。」
--presentation hypothesisの下では、オプションは結果のテキストです。
answer_so_far = "The capital of France is Par"
symbol options: 'a' 'i' 's' … STOP
hypothesis options: '…he capital of France is Para'
'…he capital of France is Pari'
'…he capital of France is Pars'
'…he capital of France is Par' <- 変更なし: これはSTOPです
追加は既に行われているため、Jevは完成した文字列のみをランク付けします。これは決定モデルが構築されるべきものです。これはプロジェクトにおける最大の改善点です。文字アルファベットでは、トップ1の精度が約3倍になり、正しいシンボルに着地する確率質量が2倍になり、シンボルオプションとそのオプションごとの説明よりも少ない入力トークンで済みます。
テスト (Tests)
poetry run pytest
158個のテストはすべてオフラインです。生成ループ用のスクリプト化された偽クライアントと、HTTPレイヤー用のhttpx.MockTransportを使用します。APIキーもネットワークも不要です。jevchat benchはAPIにアクセスする部分です。