softjapan-model / README.md
softjapan's picture
Update README.md
f53d7d2 verified
---
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()
````
---
## 注意事項
* 本モデルは研究および学習目的で公開されています。
* 実運用システムやクリティカルな用途での利用は推奨されません。
* 出力内容は不正確または不適切な場合があります。利用に際しては十分ご注意ください。