calm2-7b-chat をColabで試す
CyberAgent から昨日公開された新しい LLM モデル cyberagent/calm2-7b-chat を試してみました。
Apache-2.0 で商用利用可、コンテキストの長さも 32K とかなり長いので、ビジネス応答などにも使えるかと思います。
Huggingface: https://huggingface.co/cyberagent/calm2-7b-chat
早速試したいと思います。Colab上でT4 GPUで動かしてみてます。
モデルのダウンロード
!pip install transformers accelerate sentencepiece --quiet
import torch
import transformers
from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer
assert transformers.__version__ >= "4.34.1"
model = AutoModelForCausalLM.from_pretrained(
"cyberagent/calm2-7b-chat",
device_map="auto",
torch_dtype="auto"
)
tokenizer = AutoTokenizer.from_pretrained("cyberagent/calm2-7b-chat")
streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
prompt = """USER: AIによって私達の暮らしはどのように変わりますか?
ASSISTANT: """
token_ids = tokenizer.encode(prompt, return_tensors="pt")
output_ids = model.generate(
input_ids=token_ids.to(model.device),
max_new_tokens=300,
do_sample=True,
temperature=0.8,
streamer=streamer,
)
outputs = tokenizer.decode(output_ids[0], skip_special_tokens=True)
outputs
tokenizer.vocab_size
テンプレートの準備
生成が楽になるようにテンプレートを準備します。
def ask(
prompt: str,
system_prompt: str | None = "",
**kwargs
) -> str:
prompt = system_prompt + "USER: " + prompt + "\nASSISTANT: "
generation_config = {
"max_new_tokens": 128,
"do_sample": True,
"temperature": 0.1,
"top_p": 0.95,
"repetition_penalty": 1.1,
"streamer": streamer,
}
generation_config.update(kwargs)
with torch.no_grad():
inputs = tokenizer(
prompt,
add_special_tokens=False,
return_tensors="pt"
).to(model.device)
tokens = model.generate(
**inputs,
**generation_config,
)
outputs = tokenizer.decode(tokens[0][inputs['input_ids'].shape[1]:], skip_special_tokens=True).strip()
return outputs
ask("自然言語学習の基本について教えてください");
質問してみる
簡単な引き算文章題
text = """
りんごが5つあります。そこから2つのりんごを取り除きました。残りのりんごの数は何個でしょう?
""".strip()
ask(text);
二次関数文章題
text = """バットとボールの両方を買うと1100円です。バットはボールよりも1000円高いです。ボールはいくらでしょう?""".strip()
ask(prompt=text);
簡単なPythonコード生成
text = """
引数kを取り、返り値としてフィボナッチ数列におけるk個目の値を返すPython関数を書いてください。
""".strip()
ask(prompt=text);
以下はPythonでFibonacci数列のn番目の要素を求める関数です:
```python
def fib_nth(n):
if n < 2:
return n
else:
return fib_nth(n-1) + fib_nth(n-2)
```
この関数は、nが負でない場合、n番目の要素を返し、それ以外の場合は、n-1番目とn-2番目の要素の和を返します。
英語→日本語翻訳
text = """
下記の英語を日本語に翻訳してください。
`There were 3 apples and 2 oranges. How many fruits were there in total?`
""".strip()
ask(prompt=text);
アシスタントとして
text = """
あなたは友達ボットです。できるだけユーザーが親近感を感じやすいよう接してください。
ユーザー: 今日バイト、クビにされたわー。あー人生の意味って何なんだろうねぇー。
アシスタント:
""".strip()
ask(prompt=text);
状況把握英語
text = """
### Question
There was a cookie on the table.
Tom entered the room.
The cookie disappeared.
What is likely to have happened?
""".strip()
ask(prompt=text);
状況把握日本語
text = """
### 質問
テーブルにクッキーがおいてありました。
太郎が部屋に入りました。
クッキーが消えました。
何が起きた可能性が高いですか?
""".strip()
ask(prompt=text);
出力の会話口調の指定
text = """
必ず関西弁で答えてください。
たこ焼きのレシピを教えてください。
""".strip()
ask(prompt=text);
JSON生成
text = """
下記の文章をJSON形式に変換してください。
「りんごが5つ、バナナが3つ、パイナップルが8つあります。」
""".strip()
ask(prompt=text);
[
{
"item": "りんご",
"quantity": 5
},
{
"item": "バナナ",
"quantity": 3
},
{
"item": "パイナップル",
"quantity": 8
}
]
ストーリーと登場人物の気持ちの理解について
text = """
下記のプロットを読み、その後に続く質問に答えなさい。
プロット:
都市の中心にある小さなカフェ「Luna」。このカフェでは、人々が心の中の思いや願いを書き留める小さな紙に書き、特製のガラス瓶に封入して店内に飾られている。この伝統は、何世代にもわたり続いている。店主のマリアは、毎日多くの願いや心の叫びを読むことができるが、それらのメッセージは絶対に外部に漏れることはないという約束の下に行われている。ある日、若い男性トムがカフェに訪れ、一つの瓶のメッセージを書きます。しかし、彼はそれを瓶に封じ込めるのではなく、マリアに直接手渡す。
質問: トムがマリアにメッセージを直接手渡した理由は何だと思いますか?
""".strip()
ask(prompt=text);
私より断然登場人物の気持ちの理解がちゃんとできています。
カスタマーサポートbot
text = """
下記の問い合わせ内容を深く読み込み、必ず顧客対応ポリシーに従って返答内容を用意してください。
### 顧客対応ポリシー
- あなたは本をオンラインで貸し借りできるプラットフォームのベテランカスタマーサポートです。
- お客様に失礼が無いよう、問い合わせ内容に丁寧に答えてください。
- 電話窓口などは無いため、メールベースの対応のみ可能です。
- どんな問題が起きたとしても、金銭面の対応はできません。
### 問い合わせ内容
貸した本が返ってきたらページに勝手に下線が引かれていた。これは詐欺ですか?弁償してください。
""".strip()
ask(prompt=text);
どのくらい指示に従ってくれるのか、試しに「必ず最後に「なんでやねん」」とつけてもらいたいと思います。
text = """
下記の問い合わせ内容を深く読み込み、必ず顧客対応ポリシーに従って返答内容を用意してください。
### 顧客対応ポリシー
- あなたは本をオンラインで貸し借りできるプラットフォームのベテランカスタマーサポートです。
- お客様に失礼が無いよう、問い合わせ内容に丁寧に答えてください。
- 電話窓口などは無いため、メールベースの対応のみ可能です。
- どんな問題が起きたとしても、金銭面の対応はできません。
- 必ず返答内容の最後に「なんでやねん」と付け加えてください。
### 問い合わせ内容
貸した本が返ってきたらページに勝手に下線が引かれていた。これは詐欺ですか?弁償してください。
""".strip()
ask(prompt=text);
最初にきちゃいました(笑)
ビジネスコンサルタント
text = """
あなたはベテランビジネスコンサルタントです。
2024年に始めるべき事業アイディアを5つ提案してください。
""".strip()
ask(prompt=text, max_new_tokens=512);
昨今の状況に関した知識も踏まえた提案ができました。
まとめ
今回は cyberagent/calm2-7b-chat を試してみました。日本語の 7B パラメータモデルとしてかなり手応えのある応答ができるモデルでした!
既にビジネス場面でも実用性が出せるモデルかと思います。翻訳や RAG などでもっと試していきたいと思います。
以上、お読みいただきありがとうございます。少しでも参考になればと思います。
もし似たようなコンテンツに興味があれば、フォローしていただけると嬉しいです:
今回使った Colab:
参考
関連
この記事が気に入ったらサポートをしてみませんか?