File size: 3,559 Bytes
967216e
 
ee17ba7
 
 
 
 
24aded6
 
a8cf88e
 
 
 
 
 
 
 
 
 
 
 
 
 
e4b5235
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
---
license: apache-2.0
datasets:
- hotchpotch/jaqket_v1_qa_wikija_context
- shunk031/JGLUE
language:
- ja
---

## 🤔 これは何?

- 🧠 学習元LLMモデル
  - 🔗 https://huggingface.co/rinna/youri-7b-instruction 
- 📚 利用データセット
  - 📖 JAQKET (dev / unuse) + JSQuAD(train・サンプリングで一部を利用)
- 🛠️ 学習手法
  - 📈 SFT(Supervised fine-tuning)
- 🧮 量子化手法
  - 🤖 AutoGPTQ
- 💡 このモデルのできること
  - 💬 コンテキスト付きのQ&Aに対して、回答を生成

## 🚀 実行例

```
import torch
from transformers import AutoTokenizer
from auto_gptq import AutoGPTQForCausalLM  # type: ignore

MODEL_NAME = "hotchpotch/youri-7b-stf-qa-context-jaqket-jsquad-gptq"
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
tokenizer.pad_token = tokenizer.eos_token

device = "cuda:0" if torch.cuda.is_available() else "cpu"
model = AutoGPTQForCausalLM.from_quantized(
    MODEL_NAME,
    device=device,
    use_safetensors=True,
    inject_fused_mlp=True,
    inject_fused_attention=True,
    use_flash_attention_2=True,
)


def generate(prompt: str) -> str:
    token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")

    with torch.no_grad():
        output_ids = model.generate(
            input_ids=token_ids.to(model.device),  # type: ignore
            max_new_tokens=24,
            do_sample=False,
            pad_token_id=tokenizer.pad_token_id,
            bos_token_id=tokenizer.bos_token_id,
            eos_token_id=tokenizer.eos_token_id,
        )
    output = tokenizer.decode(output_ids[0])
    output = output.replace(prompt, "")
    output = output.split(tokenizer.eos_token)[0]
    return output.strip()


prompt_template = """
以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。

### 指示:
{question}

### 入力:
{context}

### 応答:
"""
question = "楽曲『約束はいらない』でデビューした、声優は誰?"
context = """
Suara 大阪府立豊中高等学校を経て大阪外国語大学でインドネシア語を専攻中にバンド・ユニットを組んで音楽活動を始めた。普段はお笑い番組が大好きなこともあってよく喋るほうだが、東京の仕事で標準語の喋りをする時は、
早見沙織 声優デビュー時より、数多くの主題歌やキャラクターソングを担当し、バラードからポップス、ヒットソングのカバー曲や英語の楽曲など、様々な曲を歌いこなす。2009年には吉田仁美とのユニット「blue dro
約束はいらない 「約束はいらない」(やくそくはいらない)は、坂本真綾のデビューシングル。
約束はいらない 坂本真綾の歌手デビュー作品。当時坂本はまだ無名の声優であったが、同曲がテーマソングとなったアニメ『天空のエスカフローネ』とともに知名度を上げることとなる。後に「指輪」が同アニメの劇場版映画の主題歌とな
坂本真綾 本格的な歌手活動は、1996年にテレビアニメ『天空のエスカフローネ』へ出演したことがきっかけで始めており、同作のオープニングテーマソングである「約束はいらない」(岩里祐穂作詞、菅野よう子作曲)をシング
""".strip()

prompt = prompt_template.format(question=question, context=context)
print(generate(prompt))
# => 坂本真綾
```