File size: 9,384 Bytes
3c3809c
 
718c60d
 
 
 
 
 
 
 
3c3809c
 
718c60d
3c3809c
718c60d
 
3c3809c
718c60d
3c3809c
718c60d
 
3c3809c
718c60d
3c3809c
718c60d
 
 
 
 
 
3c3809c
718c60d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3c3809c
718c60d
 
 
3c3809c
718c60d
3c3809c
718c60d
 
 
3c3809c
718c60d
3c3809c
718c60d
 
 
3c3809c
718c60d
 
 
 
3c3809c
718c60d
3c3809c
718c60d
 
 
 
3c3809c
718c60d
 
 
3c3809c
718c60d
 
 
3c3809c
718c60d
3c3809c
718c60d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3c3809c
718c60d
3c3809c
718c60d
 
 
 
 
3c3809c
718c60d
 
 
 
3c3809c
718c60d
3c3809c
718c60d
 
 
 
3c3809c
718c60d
3c3809c
718c60d
 
 
 
3c3809c
718c60d
3c3809c
718c60d
 
 
 
 
 
3c3809c
718c60d
3c3809c
718c60d
 
 
 
 
3c3809c
718c60d
3c3809c
718c60d
 
3c3809c
718c60d
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
---
library_name: transformers
license: apache-2.0
datasets:
- TeamDelta/bare-ja-v0.1
language:
- ja
base_model:
- llm-jp/llm-jp-3-13b
pipeline_tag: text-generation
---

# ArrowIdeative-13b-NeoBase-ZERO-llm-jp

## 概要
**ArrowIdeative-13b-NeoBase-ZERO-llm-jp** は、ベースモデルから **GRPO(RL)だけ**で事後学習を行うことを主軸に設計された、日本語向けLLMです。狙いとしては、典型的な「強い指示追従(Instruct)」に寄せ切らず、**ベースモデル寄りの“出力の自由度”**を残しつつ、**チャット運用に最低限必要な形式順守**と、**回答品質の底上げ**を同時に実現することです。

位置づけを一言でまとめると:

- **「ある程度プロンプトエンジニアリングが効くベースモデル」**
- ただし **完全なInstructモデルではない**(過剰な同調・過剰な定型化を狙っていない)

---

## モデルの要点
- **学習方式**:ベースモデルから **GRPOのみ**で直接作成(SFTを主軸にしない方針)
- **目的**  1. **チャットテンプレート順守**(例:終端トークンなど、形式崩れの抑制)
  2. **回答の品質向上**(報酬モデルによるスカラー報酬の導入)
- **特性**:ベースモデルに近い性格を維持しやすい設計(=指示追従の“均質化”を抑える意図)

---
## 推論コード

```python
import torch
from copy import deepcopy
from transformers import AutoTokenizer, AutoModelForCausalLM, StoppingCriteria, StoppingCriteriaList

# ===== モデル =====
model_path = "DataPilot/ArrowIdeative-13b-NeoBase-ZERO-llm-jp-v0.2"

tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    device_map="auto",
    torch_dtype=torch.bfloat16,
)
model.eval()

system_prompt = """あなたは有能なアシスタントです。日本語で丁寧に答えてください。"""
prompt = """CPUとGPUの違いについて教えてください。"""

# (元コードのChatML形式を維持)
text = f"""<|im_start|>system
{system_prompt}<|im_end|>
<|im_start|>user
{prompt}<|im_end|>
<|im_start|>assistant
"""

inputs = tokenizer(text, add_special_tokens=False, return_tensors="pt", return_token_type_ids=False).to(model.device)
prompt_len = inputs["input_ids"].shape[1]

# "<|im_end|>" のトークン列(1トークンとは限らないので列で扱う)
stop_ids = tokenizer.encode("<|im_end|>", add_special_tokens=False)
stop_ids = torch.tensor(stop_ids, device=model.device, dtype=inputs["input_ids"].dtype)

class StopOnImEnd(StoppingCriteria):
    def __init__(self, stop_ids_tensor: torch.Tensor):
        super().__init__()
        self.stop_ids = stop_ids_tensor

    def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:
        k = int(self.stop_ids.numel())
        if k == 0 or input_ids.shape[1] < k:
            return False
        return torch.equal(input_ids[0, -k:], self.stop_ids)

stopping_criteria = StoppingCriteriaList([StopOnImEnd(stop_ids)])

# 既定EOSで止まらないようにする(= "<|im_end|>" のみで停止させる)
gen_config = deepcopy(model.generation_config)
gen_config.eos_token_id = None
gen_config.pad_token_id = tokenizer.pad_token_id if tokenizer.pad_token_id is not None else model.config.eos_token_id

with torch.inference_mode():
    output = model.generate(
        **inputs,
        generation_config=gen_config,
        stopping_criteria=stopping_criteria,
        max_new_tokens=1024,
        do_sample=True,
        top_p=0.95,
        temperature=0.5,
        repetition_penalty=1.05,
    )

generated = tokenizer.decode(output[0, prompt_len:], skip_special_tokens=False)
print(generated.split("<|im_end|>", 1)[0])

```
---

## ベースモデル
- Base: **llm-jp-3-13b**  
  https://huggingface.co/llm-jp/llm-jp-3-13b

---

## 使用データ(概要)
- Dataset: **TeamDelta/bare-ja-v0.1****質問(プロンプト)部分のみ**を一部利用  
  https://huggingface.co/datasets/TeamDelta/bare-ja-v0.1

このデータは、以下の合成フローにより作成されたものです(要約):

1. **ベースモデル(Sarashina2-70b)**で質問/回答のたたき台を生成  
2. **Microsoft Phi-4-mini**で品質キュレーション(選別・整形)  
3. **Multilingual E5**で多様性フィルタリング(近似質問の除去、重複削減)

- 参照:Sarashina2-70b  
  https://www.sbintuitions.co.jp/blog/entry/2024/08/21/144254
- BARE用プロンプト:  
  https://github.com/foxn2000/sdg/blob/main/prompts/bare.txt

---

## 学習構成
### 学習・推論フレームワーク
- 学習:**Unsloth**
- 報酬推論:**SGLang**

### 使用デバイス
- **NVIDIA RTX 5090 (32GB)**:主学習
- **NVIDIA RTX 4060 Ti (16GB)**:報酬モデル推論

### 報酬モデル
- **cyberagent/ca-reward-3b-ja**  
  https://huggingface.co/cyberagent/ca-reward-3b-ja

---

## 報酬設計(概要)
報酬は以下の5つの報酬関数で構成され、多角的に学習を誘導します:

### 1. **チャットテンプレートの順守**
   - 終端トークン(`<|im_end|>`)の適切な出力とフォーマット準拠を評価
   - **準拠時**: +1.0 × 長さファクター(短すぎる回答を抑制)
   - **非準拠時**: -5.0(強いペナルティ)
   - **極端に短い回答**: -5.0(15文字未満でハード拒否)

### 2. **反復ペナルティ**
   - n-gram(デフォルト6文字)の反復率でループ出力を検出
   - ペナルティ: -0.5 × 反復率(最大 -2.0)
   - RM-hack(冗長な繰り返しで高スコア獲得)を防止

### 3. **オーバーロング抑制**
   - max_completion_length近傍(85%以降)で段階的にペナルティ
   - ソフトペナルティ: -0.8 × (進行率)^2.0(DAPO風)
   - ハードペナルティ: -1.5(100%以上で切断時)
   - 「最大長まで埋める」ドリフトを防止

### 4. **グループ内多様性**
   - 同一プロンプトに対する複数生成間の重複・類似を検出
   - **完全重複**: -0.3(2個目以降)
   - **高類似(Jaccard≥0.85)**: -0.2 × 類似度
   - エントロピー崩壊(mode collapse)対策

### 5. **回答品質(報酬モデル)**
   - テンプレート準拠の場合のみ評価(ゲート制御)
   - 外部RM(cyberagent/ca-reward-3b-ja)のスカラーを利用
   - スケール: 1.0 × RMスコア、クリップ範囲: ±10.0
   - **正値の場合のみ**長さファクター適用(短い回答への報酬を抑制)
   - RM失敗時は`None`(マスク)として無視され学習に影響しない

### 報酬の合成
- TRL GRPOが全報酬関数の出力を合算(オプションで重み付け可能)
- グループ内相対的優位性(advantage)を計算してポリシー勾配を算出
- 適応的KL制御(beta調整)で参照モデルからの乖離を制御

---

## 使い方(推奨)
### 想定ユースケース
- 0→1のアイデア出し、探索的思考、下書き生成
- 指示を強く固定しすぎない対話(プロンプト設計で誘導する用途)
- ベースモデルの“面白さ”や多様性を残しつつ、最低限チャット運用したい場面

### 注意点
- **強い安全アラインメントや厳密な指示追従**を最優先したモデルではありません  
- プロンプト設計次第で出力が大きく振れます(=長所でも短所でもある)
- チャットテンプレートを使う場合、**テンプレート仕様に合わせた入出力**を推奨します

---

## 生成品質・挙動の指針
- **ベース寄り**:過度に無難な“合意的テンプレ回答”へ収束させることを目的にしていません
- **プロンプト耐性**:命令の書き方で結果が変わりやすい設計(指示の粒度が重要)
- **出力の個性**:SFT偏重で起きやすい均質化を避け、探索性を残す狙い

---

## 既知の制限
- 形式順守は改善しても、**厳密な指示追従****安全性の自動担保**を保証しません  
- 報酬モデルのバイアス(価値観・スタイル)を受けます  
- 一般的なInstructモデルと同じ評価軸で単純比較すると、用途によっては不利になる場合があります

---

## ライセンス
- ベースモデルおよび関連データセットのライセンスに従います。  
  具体的には以下を参照してください:
  - llm-jp-3-13b: https://huggingface.co/llm-jp/llm-jp-3-13b  
  - TeamDelta/bare-ja-v0.1: https://huggingface.co/datasets/TeamDelta/bare-ja-v0.1  
  - ca-reward-3b-ja: https://huggingface.co/cyberagent/ca-reward-3b-ja

---

## 謝辞
- llm-jp プロジェクト
- TeamDelta / bare-ja-v0.1
- サイバーエージェント(ca-reward-3b-ja)
- Unsloth / SGLang および関連OSS

---

## 引用(必要に応じて)
このリポジトリやモデルカードを引用する場合は、以下をベースに調整してください:

```bibtex
@misc{arrowideative_13b_neobase_zero_llm_jp,
  title        = {ArrowIdeative-13b-NeoBase-ZERO-llm-jp},
  author       = {holy-fox},
  year         = {2026},
}
```