--- 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}, } ```