Text Generation
Safetensors
Japanese
japanese
discord
from-scratch

evex-4

ある Discord サーバーのログだけからゼロから学習した日本語の会話モデル。 既存の重みからの派生ではなく、tokenizer も含めて全部このサーバーのために作ってある。

  • パラメータ 18,880,896 (8 層 / d_model 384 / 6 head / context 1024)
  • 語彙 12,288 (sentencepiece BPE / byte_fallback)
  • decoder-only transformer (RoPE + RMSNorm + SwiGLU) / weight tying
  • val loss 5.0172 (epoch 8)

⚠ プロンプトの形が独特です

この節を読まずに使うと、まともな出力は出ません。普通の instruct モデルでも chat template でもなく、記号だけで会話の構造を表す独自の形です。 <|conv|> から始めて <|end|> で終わる 1 行が 1 会話になります。

<|c2|><|conv|><|s0|>これバグってる?<|s3|><|re|><|s0|>どこで止まってる?<|end|>

トークンの意味

トークン 個数 意味
`< conv >`
`< end >`
`< c0 >..<
`< cx >`
`< s0 >..<
`< a >..<
`< z >`
`< re >`
<nl> 1 発言の中の改行
<url> <file> <mention> <channel> <time> 5 正規化した中身。学習で損失から外してあるので、モデルは自分では書きません
<code> </code> 2 コードブロックの囲み

組み立ての規則

  1. 話者トークンと本文を交互に、区切り文字なしで繋げる。空白も改行も入れません
  2. 同じ人が続けて喋るときは、そのつどトークンを置きます (<|a|>今日ひま?<|a|>あ、やっぱいいや)
  3. 返信は <話者><|re|><返信先>本文 の順。自分への返信には付けません
  4. チャンネルは <|conv|>。学習データは 100% がこれで始まるので、省くと分布の外になります

続きを書かせたい人のトークンを末尾に置くと、その人の発言として続きます:

<|c2|><|conv|><|a|>日本の首都どこ<|s0|>

使い方

model.pytok.model がこのリポジトリに入っています。

import json
import torch
import sentencepiece as spm
from safetensors.torch import load_file
from model import Config, MicroLM      # このリポジトリの model.py

cfg = Config(**{k: v for k, v in json.load(open('config.json')).items()
             if k in Config.__dataclass_fields__})
model = MicroLM(cfg)
state = load_file('model.safetensors')
state['head.weight'] = state['embed.weight']   # weight tying。head は保存していない
model.load_state_dict(state)
model.eval()

sp = spm.SentencePieceProcessor(model_file='tok.model')
prompt = '<|c2|><|conv|><|a|>日本の首都どこ<|s0|>'
ids = torch.tensor([sp.encode(prompt, out_type=int)])
got = model.generate(ids, max_new_tokens=80, temperature=0.9, top_k=40,
                     stop_id=sp.piece_to_id('<|end|>'))
print(sp.decode(got[0].tolist())[len(prompt):])

生成は <|end|> か、次の話者トークンが出たところで切ってください。 切らずに流すと、他の人の発言まで作り続けます。

学習

多段で学習しています。外部データで日本語と会話の土台を作り、最後はこのサーバーのログだけで仕上げるという順序です。 混合比だけで比率を守ろうとすると、外部が数倍あるぶん永久に薄まります。

中身
段1 外部の会話 + このサーバーの素の会話 403,711,060 字
段2 このサーバーだけ (窓の水増しと切り出し込み) 90,949,883 字
段3 リアクションの付いた発言の切り出しだけ 2,118,256 字

話者トークンは発言数の多い順に 147 人ぶん (全発言の 96.6% を被覆)。 件数は 最多 55,964 / 最少 203 で、275 倍の開きがあります。 順位が小さいほどよく学習されています。

出典とライセンス

段1 に使った外部データ:

データ ライセンス
OmniAICreator/Japanese-Roleplay-Dialogues Apache-2.0
nntsuzu/JESC CC-BY-4.0
p1atdev/open2ch (元: 1never/open2ch-dialogue-corpus) Apache-2.0

注意

  • 話者トークン <|sN|> は匿名の順位で、userId は含まれていません。ただし発言の癖は重みに入っているので、特定の順位で生成した文がその人の書き方に似ることはあります
  • 表示名は tokenizer の語彙に残っています。tok.model はこのサーバーのログから学習しているので、会話の中でよく呼ばれる名前はBPE が 1 トークンにまとめます。実測で 147 人中 16 人 (上位20人では 7 人) の表示名がそのまま語彙にあり、列挙すれば読めます<|sN|> の番号と名前の対応は含まれていませんが、「このサーバーによく居る人の呼び名」は分かります
  • 学習元は特定のサーバーの雑談なので、俗語と内輪の話題に強く偏っています。汎用の日本語モデルではありません
  • 出力の正しさは保証しません。事実確認の用途には使えません
  • 有害表現の除去は学習データ側で機械的に掛けただけです。推論側の安全機構はありません
Downloads last month
-
Safetensors
Model size
18.9M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Datasets used to train tako080614/evex-4