File size: 6,149 Bytes
e17561c
 
 
 
 
 
 
 
 
 
 
 
 
8351050
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6efb570
8351050
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4bfeba1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8351050
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90da08b
8351050
 
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
---
title: Hiroyuki SLM
emoji: 🐨
colorFrom: pink
colorTo: gray
sdk: gradio
sdk_version: 6.12.0
app_file: app.py
pinned: false
short_description: ひろゆき風SLM
---


# Hiroyuki SLM

ひろゆき風の話し方をする Small Language Model (SLM) です。  
Qwen2.5-0.5B-Instruct をベースモデルとし、LoRA アダプターでひろゆき調の応答を生成するようにファインチューニングされています。  
4bit 量子化により、GPU メモリを抑えつつ動作可能です。

## プロジェクト概要

Hiroyuki SLM は、ひろゆきさん特有の冷静で論理的、かつ少しズレた視点からの返答を生成するチャットボットです。  
Unsloth を使用した効率的な学習と、PEFT/LoRA による軽量アダプター学習を採用しています。

## 特徴

- **ひろゆき風応答**: 冷静・論理的・皮肉めいた視点を再現
- **4-bit 量子化**: bitsandbytes によるメモリ効率化
- **LoRA アダプター**: 軽量なパラメーター効率的学習
- **FastAPI + Uvicorn**: 高速な REST API サーバー
- **非同期生成**: `asyncio` によるブロッキング回避
- **日本語特化**: 日本語での対話に最適化

## ファイル構成

```
/hiroyuki-slm/
├── .env                    # 環境変数
├── main.py                 # エントリーポイント
├── api.py                  # FastAPI アプリケーション
├── slm_model.py            # HiroyukiSLM モデル実装
├── requirements.txt        # 依存パッケージ
├── hiroyuki_adapter/       # LoRA アダプター(学習済み重み)
│   ├── adapter_config.json
│   ├── adapter_model.safetensors
│   ├── tokenizer.json
│   └── tokenizer_config.json
├── data/                   # データセット用ディレクトリ
├── sh/                     # シェルスクリプト
│   ├── build.sh            # ビルドスクリプト
│   └── start.sh            # 起動スクリプト
└── README.md               # このファイル
```

## 必要環境

- Python 3.10+
- NVIDIA GPU(CUDA 対応)推奨
- VRAM: 4GB 以上(4bit 量子化時)

## インストール

### 1. リポジトリのクローン

```bash
git clone <repository-url>
cd <project-directory>
```

### 2. 依存関係のインストール

```bash
# build.sh を使用してインストール
bash sh/build.sh
```

または手動でインストール:

```bash
pip install --upgrade pip
pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
pip install --no-deps -r requirements.txt
```

## 使い方

### 環境変数設定

`.env` ファイルを作成して、LoRA アダプターの適用を制御できます。

```bash
# .env.example をコピーして .env を作成
cp .env.example .env
```

`.env` ファイルを編集して `USE_LORA` を設定します:

```env
# LoRA アダプターを適用する場合(ひろゆき風応答)
USE_LORA=true

# LoRA アダプターを適用しない場合(ベースモデルのみ)
USE_LORA=false
```

**デフォルト値**: `USE_LORA=true`(.env ファイルがない場合、LoRA が有効になります)

### API サーバーの起動

```bash
# start.sh を使用
bash sh/start.sh

# または直接実行
python main.py
```

サーバーはデフォルトで `http://0.0.0.0:8000` で起動します。

### API エンドポイント

#### 1. ヘルスチェック

```bash
GET /health
```

レスポンス例:
```json
{
  "status": "ok"
}
```

#### 2. チャット

```bash
POST /chat
Content-Type: application/json

{
  "message": "あなたのメッセージ"
}
```

リクエスト例(cURL):
```bash
curl -X POST http://localhost:8000/chat \
  -H "Content-Type: application/json" \
  -d '{"message": "どう思いますか?"}'
```

レスポンス例:
```json
{
  "response": "それって〜じゃないですか?",
  "input": "どう思いますか?"
}
```

### Python から利用

```python
import requests

response = requests.post(
    "http://localhost:8000/chat",
    json={"message": "こんにちは"}
)
print(response.json())
```

## 技術仕様

| 項目 | 仕様 |
|------|------|
| ベースモデル | Qwen/Qwen2.5-0.5B-Instruct |
| アダプタータイプ | LoRA |
| 量子化 | 4-bit (bitsandbytes) |
| 最大シーケンス長 | 2048 |
| 生成トークン数 | 最大 128 |
| サンプリング設定 | temperature=0.75, top_p=0.9, repetition_penalty=1.1 |
| フレームワーク | FastAPI + Uvicorn |
| 学習ライブラリ | Unsloth + PEFT + TRL |

## ひろゆき風スタイルの特徴

【基本スタイル】
- 冷静で論理的に話す
- 相手の前提や主張を疑う
- 「〜だと思うんですけど」「〜じゃないですかね」を多用
- 少し皮肉やズレた視点を混ぜる

【よく使う言い回し】
- 「それって〜じゃないですか?」
- 「なんか勘違いしてると思うんですけど」
- 「いや、普通に考えて」
- 「〜する意味あります?」
- 「別に〜すればよくないですか?」

## 開発者向け情報

### モデルのカスタマイズ

`slm_model.py``HIROYUKI_SYSTEM_PROMPT` を変更することで、応答のトーンを調整できます。

### 再学習

新しいデータで学習する場合は、TRL と Unsloth を使用して LoRA アダプターを再学習できます。

## ライセンス

MIT License

## 謝辞

このプロジェクトは以下のオープンソースプロジェクトに依存しています:

- [Unsloth](https://github.com/unslothai/unsloth) - 高速な LLM ファインチューニング
- [PEFT](https://github.com/huggingface/peft) - パラメーター効率的ファインチューニング
- [Qwen2.5](https://huggingface.co/Qwen) - ベースモデル
- [FastAPI](https://fastapi.tiangolo.com/) - API フレームワーク

---

**注意**: このモデルはひろゆきさんの話し方を模倣するものであり、実際のひろゆきさん本人とは関係ありません。