Google Colab で LongChat-v1.5 を試す
「Google Colab」で「LongChat-v1.5」を試したので、まとめました。
1. LongChat-v1.5
「LongChat」は、コンテキスト長 32Kを持つ「Llama 2」ベースのモデルです。
2. LongChat-v1.5のモデル
「LongChat-v1.5」では、次の1種類です。
3. ドキュメントの準備
今回は、マンガペディアの「ぼっち・ざ・ろっく!」のあらすじのドキュメントを用意しました。
・bocchi.txt
4. Colabでの実行
Colabでの実行手順は、次のとおりです。
(1) パッケージのインストール。
# パッケージのインストール
!pip install langchain accelerate bitsandbytes sentence_transformers
(2) トークナイザーとモデルの準備。
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
# トークナイザーとモデルの準備
tokenizer = AutoTokenizer.from_pretrained(
"lmsys/longchat-7b-v1.5-32k",
use_fast=False,
)
model = AutoModelForCausalLM.from_pretrained(
"lmsys/longchat-7b-v1.5-32k",
load_in_8bit=True,
torch_dtype=torch.float16,
device_map="auto",
)
(3) Colabにドキュメントを配置。
左端のフォルダアイコンでファイル一覧を表示し、ドキュメント (bocchi.txt) をドラッグ&ドロップします。
(4) ドキュメントの読み込み。
# ドキュメントの読み込み
with open("bocchi.txt", "r", encoding="utf-8") as file:
context = file.read()
print(len(context))
print(context)
(5) 質問応答。
プロンプトが長いほどVRAMを消費し、40GBでは 8000文字が限界(9000文字は Out Of Memory) でした。
# プロンプトの準備
prompt_template=f'''以下の文脈を読んで、最後の質問に答えてください。
{context[:8000]}
USER: 後藤ひとりの得意な楽器は?
ASSISTANT:'''
# 質問応答
input_ids = tokenizer(prompt_template, return_tensors='pt').input_ids.cuda()
output = model.generate(inputs=input_ids, temperature=0.7, max_new_tokens=512)
print(tokenizer.decode(output[0]))
# メモリ解放
del input_ids
del output
torch.cuda.empty_cache()
:
USER: 後藤ひとりの得意な楽器は?
ASSISTANT: 後藤ひとりの得意な楽器はギターである。彼はギターを始め、毎日練習し、かなりの腕前を獲得していたが、友達を作ることができずに卒業した。その後、高校に入学し、ギターの演奏を動画配信し、「ギターヒーロー」としてネットで人気を集める。</s>
5. 追加の質問
10の追加の質問を行います。
# 入力
inputs = [
"後藤ひとりの得意な楽器は?",
"後藤ひとりの妹の名前は?",
"後藤ひとりが加入したバンド名は?",
"ギターヒーローの正体は?",
"喜多郁代の髪の色は?",
"伊地知虹夏が通う学校の名前は?",
"山田リョウの趣味は?",
"廣井きくりが所属するバンド名は?",
"ライブハウス「STARRY」の店長の名前は?",
"ぼっちちゃんが文化祭で披露した演奏法は?",
]
# チェーンの実行
for input in inputs:
# プロンプトの準備
prompt_template=f'''以下の文脈を読んで、最後の質問に答えてください。
{context[:8000]}
USER: {input}
ASSISTANT:'''
# 推論の実行
input_ids = tokenizer(prompt_template, return_tensors='pt').input_ids.cuda()
output = model.generate(inputs=input_ids, temperature=0.7, max_new_tokens=512)
print(tokenizer.decode(output[0]))
# メモリ解放
del input_ids
del output
torch.cuda.empty_cache()
正解率は7/10でした。
後藤ひとりと後藤ふたりがごっちゃになってるのと、ドキュメントに含まれない (8000文字制限のため) 質問はハルシネーションしてるようです。
関連
この記事が気に入ったらサポートをしてみませんか?