From 88124e1e145c3e5431874f9f3b36b846e6a96aa0 Mon Sep 17 00:00:00 2001 From: ModelHub XC Date: Fri, 7 Aug 2026 02:31:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=EF=BC=8C=E7=94=B1ModelHub=20XC=E7=A4=BE=E5=8C=BA=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Model: summerMC/matutake Source: Original Platform --- .gitattributes | 36 +++++ README.md | 310 +++++++++++++++++++++++++++++++++++++++++ chat_template.jinja | 54 +++++++ config.json | 61 ++++++++ generation_config.json | 9 ++ model.safetensors | 3 + optimizer.pt | 3 + rng_state.pth | 3 + scheduler.pt | 3 + tokenizer.json | 3 + tokenizer_config.json | 30 ++++ trainer_state.json | 124 +++++++++++++++++ training_args.bin | 3 + 13 files changed, 642 insertions(+) create mode 100644 .gitattributes create mode 100644 README.md create mode 100644 chat_template.jinja create mode 100644 config.json create mode 100644 generation_config.json create mode 100644 model.safetensors create mode 100644 optimizer.pt create mode 100644 rng_state.pth create mode 100644 scheduler.pt create mode 100644 tokenizer.json create mode 100644 tokenizer_config.json create mode 100644 trainer_state.json create mode 100644 training_args.bin diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..52373fe --- /dev/null +++ b/.gitattributes @@ -0,0 +1,36 @@ +*.7z filter=lfs diff=lfs merge=lfs -text +*.arrow filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.ftz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.joblib filter=lfs diff=lfs merge=lfs -text +*.lfs.* filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.model filter=lfs diff=lfs merge=lfs -text +*.msgpack filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.ot filter=lfs diff=lfs merge=lfs -text +*.parquet filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +saved_model/**/* filter=lfs diff=lfs merge=lfs -text +*.tar.* filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.tflite filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -text +tokenizer.json filter=lfs diff=lfs merge=lfs -text diff --git a/README.md b/README.md new file mode 100644 index 0000000..5a4989f --- /dev/null +++ b/README.md @@ -0,0 +1,310 @@ +--- +language: +- ja +- en +base_model: +- summerMC/Sakura +base_model_relation: finetune +pipeline_tag: text-generation +library_name: transformers +tags: +- japanese +- chat +- sft +- causal-lm +- conversational +- reasoning +- fable +datasets: +- summerMC/v-Fable +--- + +# matutake + +`matutake` は、[summerMC/Sakura](https://huggingface.co/summerMC/Sakura) をベースに、[summerMC/v-Fable](https://huggingface.co/datasets/summerMC/v-Fable) を用いて **Supervised Fine-Tuning (SFT)** した、日本語寄りの **Fable系対話・推論モデル** です。 + +このモデルは、coding専用モデルではなく、**会話・説明・推論・ロールプレイ・長めの応答生成** などを含む、Fable系のスタイルと応答傾向をSakura上で再現・適応することを目的に調整しています。 + +--- + +# 1. Model Overview + +## 概要 + +* **Model name**: `summerMC/matutake` +* **Base model**: `summerMC/Sakura` +* **Training type**: Full fine-tuning / SFT +* **Primary dataset**: `summerMC/v-Fable` + +## 主な目的 + +* 日本語での自然な会話応答 +* Fable系の応答スタイルへの適応 +* 長めの説明・推論応答の強化 +* instruction following の改善 +* 対話形式での安定した文章生成 + +`matutake` は、Fable系トレースデータをもとに、**対話の流れを保ちながら自然に返答する能力**、**ある程度まとまった推論や説明を返す能力**、**ロールや文脈に沿った返答を行う能力** を強めることを目的としています。 + +--- + +# 2. Intended Use + +## 想定ユースケース + +このモデルは、以下のような **一般的な対話・生成タスク** を想定しています。 + +### Chat / Conversation + +* 日本語での雑談・対話 +* 指示に従った応答生成 +* 長めの会話文・返答文の生成 +* キャラクターや口調を意識した会話 + +### Reasoning / Explanation + +* 質問に対する段階的な説明 +* 要点整理 +* 比較・整理・要約 +* ある程度長い推論を伴う返答 + +### Creative / Roleplay style generation + +* Fable系の会話スタイル再現 +* ロールプレイ風の返答 +* 雰囲気重視の会話生成 +* ストーリー寄りの応答や表現 + +### General instruction following + +* 日本語プロンプトに対する自然な応答 +* 情報整理 +* 文章生成 +* 口調や形式を指定した出力 + +--- + +# 3. Training Data + +本モデルは主に以下のデータセットで学習されています。 + +## Dataset + +* **`summerMC/v-Fable`** + +`v-Fable` は Fable系トレースをもとにした対話・推論・スタイル応答を含むデータセットであり、会話の流れ、応答形式、説明調の返答、Fable系の雰囲気を持つ出力を学習するために使用しています。 + +学習時には主に `context -> completion` 形式を用い、与えられた文脈に対する応答全体をSFTしています。 + +### 主な特徴 + +* 対話形式の応答 +* reasoning / explanation を含む返答 +* Fable系のスタイルや雰囲気を持つ出力 +* instruction-following と会話継続の両方を含む構成 + +--- + +# 4. Training Method + +## Fine-tuning + +* **方式**: Supervised Fine-Tuning (SFT) +* **学習対象**: base model の全パラメータ(full fine-tune) +* **目的**: + + * Fable系の応答傾向への適応 + * 会話の自然さの改善 + * 長めの返答や説明の安定化 + * 日本語での instruction following の向上 + +## 学習方針 + +本モデルでは、単純な短文応答よりも、以下のような性質を重視しています。 + +* 文脈を踏まえて返答する +* 長めの説明や会話を破綻しにくくする +* Fable系の話し方・返答傾向を反映する +* 日本語での自然な対話を強化する + +--- + +# 5. Prompting / Chat Format + +このモデルは **chat形式** の入力を想定しています。 +ベースモデル `Sakura` のテンプレートに依存するため、基本的には `tokenizer.apply_chat_template(...)` を使うことを推奨します。 + +## Transformers example + +```python +import torch +from transformers import AutoTokenizer, AutoModelForCausalLM + +model_id = "summerMC/matutake" + +tokenizer = AutoTokenizer.from_pretrained( + model_id, + trust_remote_code=True, +) + +model = AutoModelForCausalLM.from_pretrained( + model_id, + trust_remote_code=True, + torch_dtype=torch.bfloat16, + device_map="auto", +) + +messages = [ + { + "role": "system", + "content": "You are matutake, a helpful Japanese conversational assistant." + }, + { + "role": "user", + "content": "最近ちょっと疲れてるんだけど、少し気分が軽くなるように話して。" + } +] + +text = tokenizer.apply_chat_template( + messages, + tokenize=False, + add_generation_prompt=True, +) + +inputs = tokenizer(text, return_tensors="pt").to(model.device) + +with torch.no_grad(): + outputs = model.generate( + **inputs, + max_new_tokens=512, + do_sample=True, + temperature=0.7, + top_p=0.9, + repetition_penalty=1.05, + ) + +print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True)) +``` + +--- + +# 6. Recommended Generation Settings + +用途が会話・説明・Fable系の返答寄りなので、まずは以下を推奨します。 + +## 会話向け + +```python +max_new_tokens = 512 +do_sample = True +temperature = 0.7 +top_p = 0.9 +repetition_penalty = 1.05 +``` + +## 少し安定寄りにする場合 + +```python +max_new_tokens = 512 +do_sample = True +temperature = 0.5 +top_p = 0.9 +repetition_penalty = 1.05 +``` + +## 長めの応答を書かせる場合 + +```python +max_new_tokens = 1024 +temperature = 0.7 +top_p = 0.95 +``` + +--- + +# 7. Example Prompts + +## 日常会話 + +* `最近ちょっと気分が落ちてるから、少し優しく話してほしい。` +* `今日あったことを聞いてほしい。` + +## 説明・整理 + +* `量子コンピュータって何か、中学生にもわかるように説明して。` +* `この文章を3行で要約して。` + +## ロールプレイ / 雰囲気重視 + +* `落ち着いた口調で、夜に話しかけるような感じで返して。` +* `少し物語っぽい雰囲気で励まして。` + +## 推論・長文応答 + +* `A案とB案のメリット・デメリットを比較して整理して。` +* `この悩みに対して、考え方を段階的に整理してほしい。` + +--- + +# 8. Limitations + +このモデルは**研究・実験用途**です。以下の制約があります。 + +* 事実性は保証されません +* 説明がもっともらしくても誤っている場合があります +* 長い応答では一貫性が崩れることがあります +* Fable系のスタイルに寄ることで、必要以上に感情的・演出的な返答になる場合があります +* chain-of-thought風の出力や冗長な説明が出ることがあります + +**重要な判断に使う場合は、必ず人間が内容を確認してください。** + +--- + +# 9. Safety / Responsible Use + +以下の用途には適しません。 + +* 医療・法務・金融など高リスク分野の最終判断 +* 人の状態に関する重大な判断の自動化 +* 真偽確認なしでの事実情報の利用 +* セーフティ確認なしの本番自動応答 + +モデルの出力は参考情報として扱い、必要に応じて別ソースで確認してください。 + +--- + +# 10. License + +## Important + +このモデルの利用条件は、**ベースモデル `summerMC/Sakura` のライセンス** および **学習データ `summerMC/v-Fable` のライセンス** に依存します。 +利用前に必ずそれぞれの配布ページを確認してください。 + +* Base model: `summerMC/Sakura` +* Dataset: `summerMC/v-Fable` + +特に、学習データに由来するライセンス・利用条件・再配布条件には注意してください。 + +--- + +# 11. Citation + +もしこのモデルや派生物を研究・検証に利用した場合は、ベースモデルと学習データのクレジットも併記してください。 + +```bibtex +@misc{matutake2026, + title = {matutake}, + author = {summerMC}, + year = {2026}, + howpublished = {\url{https://huggingface.co/summerMC/matutake}} +} +``` + +必要に応じて、ベースモデル・データセットの引用も追加してください。 + +--- + +# 12. Notes + +`matutake` は、Sakura系列をベースに **Fable系の会話・推論・スタイル応答** を強化するための実験モデルです。 +ベンチマークスコアの最適化よりも、**会話としての自然さ、返答の雰囲気、長めの応答生成** を重視しています。 diff --git a/chat_template.jinja b/chat_template.jinja new file mode 100644 index 0000000..4732037 --- /dev/null +++ b/chat_template.jinja @@ -0,0 +1,54 @@ +{%- if tools %} + {{- '<|im_start|>system\n' }} + {%- if messages[0]['role'] == 'system' %} + {{- messages[0]['content'] }} + {%- else %} + {{- 'あなたは、Summer AIが開発したSakuraです。小型ながら、誠実で優秀なアシスタントです。' }} + {%- endif %} + {{- "\n\n# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within XML tags:\n" }} + {%- for tool in tools %} + {{- "\n" }} + {{- tool | tojson }} + {%- endfor %} + {{- "\n\n\nFor each function call, return a json object with function name and arguments within XML tags:\n\n{\"name\": , \"arguments\": }\n<|im_end|>\n" }} +{%- else %} + {%- if messages[0]['role'] == 'system' %} + {{- '<|im_start|>system\n' + messages[0]['content'] + '<|im_end|>\n' }} + {%- else %} + {{- '<|im_start|>system\nあなたは、Summer AIが開発したSakuraです。小型ながら、誠実で優秀なアシスタントです。<|im_end|>\n' }} + {%- endif %} +{%- endif %} +{%- for message in messages %} + {%- if (message.role == "user") or (message.role == "system" and not loop.first) or (message.role == "assistant" and not message.tool_calls) %} + {{- '<|im_start|>' + message.role + '\n' + message.content + '<|im_end|>' + '\n' }} + {%- elif message.role == "assistant" %} + {{- '<|im_start|>' + message.role }} + {%- if message.content %} + {{- '\n' + message.content }} + {%- endif %} + {%- for tool_call in message.tool_calls %} + {%- if tool_call.function is defined %} + {%- set tool_call = tool_call.function %} + {%- endif %} + {{- '\n\n{"name": "' }} + {{- tool_call.name }} + {{- '", "arguments": ' }} + {{- tool_call.arguments | tojson }} + {{- '}\n' }} + {%- endfor %} + {{- '<|im_end|>\n' }} + {%- elif message.role == "tool" %} + {%- if (loop.index0 == 0) or (messages[loop.index0 - 1].role != "tool") %} + {{- '<|im_start|>user' }} + {%- endif %} + {{- '\n\n' }} + {{- message.content }} + {{- '\n' }} + {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %} + {{- '<|im_end|>\n' }} + {%- endif %} + {%- endif %} +{%- endfor %} +{%- if add_generation_prompt %} + {{- '<|im_start|>assistant\n' }} +{%- endif %} \ No newline at end of file diff --git a/config.json b/config.json new file mode 100644 index 0000000..1a6744d --- /dev/null +++ b/config.json @@ -0,0 +1,61 @@ +{ + "architectures": [ + "Qwen2ForCausalLM" + ], + "attention_dropout": 0.0, + "bos_token_id": null, + "dtype": "bfloat16", + "eos_token_id": 151645, + "hidden_act": "silu", + "hidden_size": 1536, + "initializer_range": 0.02, + "intermediate_size": 8960, + "layer_types": [ + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention" + ], + "max_position_embeddings": 32768, + "max_window_layers": 21, + "model_type": "qwen2", + "num_attention_heads": 12, + "num_hidden_layers": 28, + "num_key_value_heads": 2, + "pad_token_id": 151643, + "rms_norm_eps": 1e-06, + "rope_parameters": { + "rope_theta": 1000000.0, + "rope_type": "default" + }, + "sliding_window": null, + "tie_word_embeddings": false, + "transformers_version": "5.12.0", + "use_cache": false, + "use_sliding_window": false, + "vocab_size": 151665 +} diff --git a/generation_config.json b/generation_config.json new file mode 100644 index 0000000..7d12a36 --- /dev/null +++ b/generation_config.json @@ -0,0 +1,9 @@ +{ + "_from_model_config": true, + "eos_token_id": [ + 151645 + ], + "pad_token_id": 151643, + "transformers_version": "5.12.0", + "use_cache": true +} diff --git a/model.safetensors b/model.safetensors new file mode 100644 index 0000000..64bc01c --- /dev/null +++ b/model.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7175b36525c9067d2892388ac4785d4197057d634dcfcf2e29ccdaa87223e9e5 +size 3552549728 diff --git a/optimizer.pt b/optimizer.pt new file mode 100644 index 0000000..52ed53b --- /dev/null +++ b/optimizer.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:401d9b863f63ad990876a15e8a2d6479a4440a9426902056b63c17a16bbece7a +size 7105319372 diff --git a/rng_state.pth b/rng_state.pth new file mode 100644 index 0000000..5a8f17a --- /dev/null +++ b/rng_state.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61c19bab1174704a4a4441475683bf1270277af15d2e2c95e964789128e482c4 +size 14645 diff --git a/scheduler.pt b/scheduler.pt new file mode 100644 index 0000000..e3158ba --- /dev/null +++ b/scheduler.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac08bec92a4d36e0429c02d96598c370f748ac8366bfc29c7287da66814c605d +size 1465 diff --git a/tokenizer.json b/tokenizer.json new file mode 100644 index 0000000..34510ff --- /dev/null +++ b/tokenizer.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fd169731d2cbde95e10bf356d66d5997fd885dd8dbb6fb4684da3f23b2585d8 +size 11421892 diff --git a/tokenizer_config.json b/tokenizer_config.json new file mode 100644 index 0000000..770e41d --- /dev/null +++ b/tokenizer_config.json @@ -0,0 +1,30 @@ +{ + "add_prefix_space": false, + "backend": "tokenizers", + "bos_token": null, + "clean_up_tokenization_spaces": false, + "eos_token": "<|im_end|>", + "errors": "replace", + "extra_special_tokens": [ + "<|im_start|>", + "<|im_end|>", + "<|object_ref_start|>", + "<|object_ref_end|>", + "<|box_start|>", + "<|box_end|>", + "<|quad_start|>", + "<|quad_end|>", + "<|vision_start|>", + "<|vision_end|>", + "<|vision_pad|>", + "<|image_pad|>", + "<|video_pad|>" + ], + "is_local": false, + "local_files_only": false, + "model_max_length": 131072, + "pad_token": "<|endoftext|>", + "split_special_tokens": false, + "tokenizer_class": "Qwen2Tokenizer", + "unk_token": null +} diff --git a/trainer_state.json b/trainer_state.json new file mode 100644 index 0000000..6e4675c --- /dev/null +++ b/trainer_state.json @@ -0,0 +1,124 @@ +{ + "best_global_step": null, + "best_metric": null, + "best_model_checkpoint": null, + "epoch": 1.0, + "eval_steps": 500, + "global_step": 199, + "is_hyper_param_search": false, + "is_local_process_zero": true, + "is_world_process_zero": true, + "log_history": [ + { + "entropy": 0.9629484385251998, + "epoch": 0.10050251256281408, + "grad_norm": 4.09375, + "learning_rate": 1.9000000000000002e-06, + "loss": 0.9181639671325683, + "mean_token_accuracy": 0.8306790262460708, + "num_tokens": 40960.0, + "step": 20 + }, + { + "entropy": 0.9275371879339218, + "epoch": 0.20100502512562815, + "grad_norm": 4.28125, + "learning_rate": 3.900000000000001e-06, + "loss": 0.8665243148803711, + "mean_token_accuracy": 0.8379091203212738, + "num_tokens": 81920.0, + "step": 40 + }, + { + "entropy": 0.8652732700109482, + "epoch": 0.3015075376884422, + "grad_norm": 3.359375, + "learning_rate": 5.9e-06, + "loss": 0.7930655002593994, + "mean_token_accuracy": 0.8541035562753677, + "num_tokens": 122880.0, + "step": 60 + }, + { + "entropy": 0.780908739566803, + "epoch": 0.4020100502512563, + "grad_norm": 2.6875, + "learning_rate": 7.9e-06, + "loss": 0.7104530334472656, + "mean_token_accuracy": 0.8606008648872375, + "num_tokens": 163840.0, + "step": 80 + }, + { + "entropy": 0.598466919362545, + "epoch": 0.5025125628140703, + "grad_norm": 4.9375, + "learning_rate": 9.9e-06, + "loss": 0.5393049240112304, + "mean_token_accuracy": 0.8908646881580353, + "num_tokens": 204800.0, + "step": 100 + }, + { + "entropy": 0.40023221969604494, + "epoch": 0.6030150753768844, + "grad_norm": 2.734375, + "learning_rate": 9.118382907149164e-06, + "loss": 0.3737324237823486, + "mean_token_accuracy": 0.9215437412261963, + "num_tokens": 245760.0, + "step": 120 + }, + { + "entropy": 0.3805061921477318, + "epoch": 0.7035175879396985, + "grad_norm": 3.125, + "learning_rate": 6.635339816587109e-06, + "loss": 0.35905587673187256, + "mean_token_accuracy": 0.9224676638841629, + "num_tokens": 286652.0, + "step": 140 + }, + { + "entropy": 0.31945948526263235, + "epoch": 0.8040201005025126, + "grad_norm": 3.125, + "learning_rate": 3.5153981233586277e-06, + "loss": 0.29033424854278567, + "mean_token_accuracy": 0.935295569896698, + "num_tokens": 327612.0, + "step": 160 + }, + { + "entropy": 0.3433520093560219, + "epoch": 0.9045226130653267, + "grad_norm": 2.9375, + "learning_rate": 9.73648712344707e-07, + "loss": 0.32125253677368165, + "mean_token_accuracy": 0.930393049120903, + "num_tokens": 367708.0, + "step": 180 + } + ], + "logging_steps": 20, + "max_steps": 199, + "num_input_tokens_seen": 0, + "num_train_epochs": 1, + "save_steps": 1000, + "stateful_callbacks": { + "TrainerControl": { + "args": { + "should_epoch_stop": false, + "should_evaluate": false, + "should_log": false, + "should_save": true, + "should_training_stop": true + }, + "attributes": {} + } + }, + "total_flos": 3757085019549696.0, + "train_batch_size": 1, + "trial_name": null, + "trial_params": null +} diff --git a/training_args.bin b/training_args.bin new file mode 100644 index 0000000..2275adc --- /dev/null +++ b/training_args.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92877bd1dbb18040fd11831cbfb5c38b02d1713f51f32d02bf001e28842c0deb +size 5649