|
|
--- |
|
|
license: apache-2.0 |
|
|
--- |
|
|
|
|
|
# softjapan-model |
|
|
|
|
|
本モデルは **[Qwen/Qwen2.5-3B-Instruct](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct)** をベースに、LoRA/PEFT によるファインチューニングを行った言語モデルです。 |
|
|
ファインチューニングにより、モデルは一貫して自身を「softjapan」として認識するよう調整されています。 |
|
|
|
|
|
--- |
|
|
|
|
|
## 特徴 |
|
|
- **ベースモデル**: Qwen/Qwen2.5-3B-Instruct |
|
|
- **微調整手法**: LoRA (PEFT) |
|
|
- **調整内容**: 応答時にモデルが自身を「softjapan」として識別するよう最適化 |
|
|
|
|
|
--- |
|
|
|
|
|
## ライセンス |
|
|
- ライセンス: [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0) |
|
|
- 本モデルの利用にあたっては、ベースモデルのライセンスおよび Hugging Face Hub のポリシーに従ってください。 |
|
|
|
|
|
--- |
|
|
|
|
|
## 利用例 |
|
|
|
|
|
```python |
|
|
from transformers import AutoModelForCausalLM, AutoTokenizer |
|
|
import torch |
|
|
|
|
|
model_id = "softjapan/softjapan-model" |
|
|
|
|
|
# --- ロード --- |
|
|
tokenizer = AutoTokenizer.from_pretrained( |
|
|
model_id, |
|
|
trust_remote_code=True # モデルにカスタムコードがある場合に必須 |
|
|
) |
|
|
|
|
|
model = AutoModelForCausalLM.from_pretrained( |
|
|
model_id, |
|
|
torch_dtype=torch.float16, # CPUならfloat32 |
|
|
device_map="auto", |
|
|
trust_remote_code=True |
|
|
) |
|
|
|
|
|
# EOS/PAD の整備 |
|
|
tokenizer.padding_side = "left" |
|
|
if tokenizer.pad_token_id is None: |
|
|
tokenizer.pad_token_id = tokenizer.eos_token_id |
|
|
|
|
|
GEN_KW = dict( |
|
|
max_new_tokens=256, |
|
|
do_sample=True, |
|
|
temperature=0.7, |
|
|
top_p=0.9, |
|
|
repetition_penalty=1.05, |
|
|
eos_token_id=tokenizer.eos_token_id, |
|
|
pad_token_id=tokenizer.pad_token_id, |
|
|
) |
|
|
|
|
|
def build_prompt(user_text: str) -> str: |
|
|
|
|
|
messages = [ |
|
|
{"role": "system", "content": "あなたは優秀な日本語アシスタントです。簡潔に答えてください。"}, |
|
|
{"role": "user", "content": user_text}, |
|
|
] |
|
|
return tokenizer.apply_chat_template( |
|
|
messages, |
|
|
tokenize=False, |
|
|
add_generation_prompt=True, |
|
|
) |
|
|
|
|
|
def chat(): |
|
|
print("=== softjapan-model Chat Demo ===") |
|
|
print("終了するには `exit` を入力してください。") |
|
|
|
|
|
while True: |
|
|
user_inp = input("あなた: ") |
|
|
if user_inp.lower() in ("exit", "quit", "終了"): |
|
|
print("チャットを終了します。") |
|
|
break |
|
|
|
|
|
# プロンプトを構築 |
|
|
prompt = build_prompt(user_inp) |
|
|
inputs = tokenizer(prompt, return_tensors="pt").to(model.device) |
|
|
|
|
|
# 生成 |
|
|
with torch.no_grad(): |
|
|
output = model.generate(**inputs, **GEN_KW) |
|
|
|
|
|
full_text = tokenizer.decode(output[0], skip_special_tokens=False) |
|
|
|
|
|
# アシスタントの返答部分を切り出し |
|
|
start_mark = "<|im_start|>assistant" |
|
|
if start_mark in full_text: |
|
|
reply = full_text.split(start_mark, 1)[-1] |
|
|
if reply.startswith("\n"): |
|
|
reply = reply[1:] |
|
|
reply = reply.split("<|im_end|>", 1)[0].strip() |
|
|
else: |
|
|
reply = tokenizer.decode(output[0], skip_special_tokens=True).strip() |
|
|
|
|
|
print(f"アシスタント: {reply}") |
|
|
|
|
|
if __name__ == "__main__": |
|
|
chat() |
|
|
```` |
|
|
|
|
|
--- |
|
|
|
|
|
## 注意事項 |
|
|
|
|
|
* 本モデルは研究および学習目的で公開されています。 |
|
|
* 実運用システムやクリティカルな用途での利用は推奨されません。 |
|
|
* 出力内容は不正確または不適切な場合があります。利用に際しては十分ご注意ください。 |