Views
No views yet
<|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 | コードブロックの囲み |
<|a|>今日ひま?<|a|>あ、やっぱいいや)<話者><|re|><返信先>本文 の順。自分への返信には付けません<|conv|> の前。学習データは 100% がこれで始まるので、省くと分布の外になります<|c2|><|conv|><|a|>日本の首都どこ<|s0|>model.py と tok.model がこのリポジトリに入っています。1import json
2import torch
3import sentencepiece as spm
4from safetensors.torch import load_file
5from model import Config, MicroLM # このリポジトリの model.py
6
7cfg = Config(**{k: v for k, v in json.load(open('config.json')).items()
8 if k in Config.__dataclass_fields__})
9model = MicroLM(cfg)
10state = load_file('model.safetensors')
11state['head.weight'] = state['embed.weight'] # weight tying。head は保存していない
12model.load_state_dict(state)
13model.eval()
14
15sp = spm.SentencePieceProcessor(model_file='tok.model')
16prompt = '<|c2|><|conv|><|a|>日本の首都どこ<|s0|>'
17ids = torch.tensor([sp.encode(prompt, out_type=int)])
18got = model.generate(ids, max_new_tokens=80, temperature=0.9, top_k=40,
19 stop_id=sp.piece_to_id('<|end|>'))
20print(sp.decode(got[0].tolist())[len(prompt):])<|end|> か、次の話者トークンが出たところで切ってください。
切らずに流すと、他の人の発言まで作り続けます。| 段 | 中身 | 量 |
|---|---|---|
| 段1 | 外部の会話 + このサーバーの素の会話 | 403,711,060 字 |
| 段2 | このサーバーだけ (窓の水増しと切り出し込み) | 90,949,883 字 |
| 段3 | リアクションの付いた発言の切り出しだけ | 2,118,256 字 |
| データ | ライセンス |
|---|---|
| OmniAICreator/Japanese-Roleplay-Dialogues | Apache-2.0 |
| nntsuzu/JESC | CC-BY-4.0 |
| p1atdev/open2ch (元: 1never/open2ch-dialogue-corpus) | Apache-2.0 |
<|sN|> は匿名の順位で、userId は含まれていません。**ただし発言の癖は重みに入っているので、特定の順位で生成した文がその人の書き方に似ることはありますtok.model はこのサーバーのログから学習しているので、会話の中でよく呼ばれる名前はBPE が 1 トークンにまとめます。実測で 147 人中 16 人 (上位20人では 7 人) の表示名がそのまま語彙にあり、列挙すれば読めます。<|sN|> の番号と名前の対応は含まれていませんが、「このサーバーによく居る人の呼び名」は分かります