![見出し画像](https://assets.st-note.com/production/uploads/images/112128440/rectangle_large_type_2_5131c9c9222b3702a88283caced4f579.png?width=1200)
Google Colab で Llama 2 + LangChain の RetrievalQA を試す
「Google Colab」で「Llama 2 + LangChain」の RetrievalQA を試したのでまとめました。
1. 使用モデル
今回は、「Llama-2-7b-chat-hf」(4bit量子化)と埋め込みモデル「multilingual-e5-large」を使います。
「Llama 2」のモデルを使用するには、利用申請が必要です。以下で解説してます。
2. ドキュメントの準備
今回は、マンガペディアの「ぼっち・ざ・ろっく!」のあらすじのドキュメントを用意しました。
・bocchi.txt
![](https://assets.st-note.com/img/1690726983239-2HrZ4Eq1YH.png?width=1200)
3. Colabでの実行
Colabでの実行手順は、次のとおりです。
(1) メニュー「編集→ノートブックの設定」で、「ハードウェアアクセラレータ」で「GPU」を選択。
(2) パッケージのインストール。
# パッケージのインストール
!pip install langchain accelerate bitsandbytes sentence_transformers
!pip install faiss-gpu
(3) HuggingFaceのログイン。
# HuggingFaceのログイン
!huggingface-cli login
_| _| _| _| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _|_|_|_| _|_| _|_|_| _|_|_|_|
_| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|
_|_|_|_| _| _| _| _|_| _| _|_| _| _| _| _| _| _|_| _|_|_| _|_|_|_| _| _|_|_|
_| _| _| _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|
_| _| _|_| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _| _| _| _|_|_| _|_|_|_|
To login, `huggingface_hub` requires a token generated from https://huggingface.co/settings/tokens .
Token:
Add token as git credential? (Y/n) n
Token is valid (permission: read).
Your token has been saved to /root/.cache/huggingface/token
Login successful
(4) Colabにドキュメントを配置。
左端のフォルダアイコンでファイル一覧を表示し、ドキュメント (bocchi.txt) をドラッグ&ドロップします。
![](https://assets.st-note.com/img/1690727308856-fEYCuriA4B.png?width=1200)
(5) ドキュメントの読み込み。
from langchain.chains import RetrievalQA
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.llms import LlamaCpp
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores.faiss import FAISS
from langchain.llms import OpenAIChat
# ドキュメントの読み込み
with open("bocchi.txt", encoding="utf-8") as f:
test_all = f.read()
# チャンクの分割
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=514,
chunk_overlap=20,
)
texts = text_splitter.split_text(test_all)
# チャンクの確認
print(len(texts))
for text in texts:
print(text[:10].replace("\n", "\\n"), ":", len(text))
# インデックスの作成
index = FAISS.from_texts(
texts=texts,
embedding=HuggingFaceEmbeddings(model_name="intfloat/multilingual-e5-large"),
)
41
結束バンド: : 6
後藤ひとりは友達を作 : 513
ことを知る。紆余(う : 232
文化祭ライブ: : 7
夏休みに入り、後藤ひ : 513
る。そしてひとりたち : 64
デモ審査: : 5
未確認ライオットに参 : 513
れる結束バンドだった : 92
後藤ひとり(ごとうひ : 14
秀華高校に通う女子。 : 513
ものだが、他人と合わ : 362
伊地知虹夏(いじちに : 14
下北沢高校に通う女子 : 513
いてきており、最近は : 123
山田リョウ(やまだり : 14
下北沢高校に通う女子 : 513
も及ばず、成績はつね : 151
喜多郁代(きたいくよ : 12
秀華高校に通う女子。 : 513
以上いる。またその社 : 208
廣井きくり(ひろいき : 14
実力派サイケデリック : 513
のシャワーを使ったり : 99
後藤ふたり(ごとうふ : 277
清水イライザ(しみず : 497
岩下志麻(いわしたし : 316
長谷川あくび(はせが : 323
佐々木次子(ささきつ : 200
大槻ヨヨコ(おおつき : 15
人気メタルバンド「S : 508
佐藤愛子(さとうあい : 13
フリーライターとして : 513
に参加させるきっかけ : 123
ひとりの父(ひとりの : 312
2号(にごう): 美 : 413
吉田銀次郎(よしだぎ : 471
PAさん(ぴーえーさ : 221
伊地知星歌(いじちせ : 397
完熟マンゴー仮面(か : 236
ギターヒーロー: 後 : 398
(6) トークナイザーとモデルの準備。
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, pipeline
import torch
# トークナイザーとモデルの準備
model_id = "meta-llama/Llama-2-7b-chat-hf"
tokenizer = AutoTokenizer.from_pretrained(model_id)
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.float16,
quantization_config=bnb_config,
device_map="auto",
)
(7) パイプラインとLLMの準備。
from langchain.llms import HuggingFacePipeline
# パイプラインの準備
pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
max_new_tokens=256
)
# LLMの準備
llm = HuggingFacePipeline(pipeline=pipe)
(8) QAチェーンの準備。
from langchain.chains import RetrievalQA
# 質問応答チェーンの作成
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=index.as_retriever(search_kwargs={"k": 3}),
)
(9) 質問応答。
qa_chain.run("日本語で回答してください。後藤ひとりの得意な楽器は?")
後藤ひとりの得意な楽器はギターです。
4. 追加の質問応答
・10個の質問を投げる
10個の質問を投げてみます。
# 入力
inputs = [
"後藤ひとりの得意な楽器は?",
"後藤ひとりの妹の名前は?",
"後藤ひとりが加入したバンド名は?",
"ギターヒーローの正体は?",
"喜多郁代の髪の色は?",
"伊地知虹夏が通う学校の名前は?",
"山田リョウの趣味は?",
"廣井きくりが所属するバンド名は?",
"ライブハウス「STARRY」の店長の名前は?",
"ぼっちちゃんが文化祭で披露した演奏法は?",
]
# チェーンの実行
for input in inputs:
print(qa_chain.run("日本語で回答してください。" + input))
・後藤ひとりの得意な楽器はギターです。
・後藤ひとりの妹の名前は「後藤ふたり」です。
・後藤ひとりが加入したバンド名は「結束バンド」です。
・後藤ひとりは、「ギターヒーロー」としてネットで人気を集めていたが、実際は家族で共有するアカウントであり、その正体は後藤ひとりの父である。【不正解】
・喜多郁代の髪の色は、ウェーブの入った赤い髪です。
・伊地知虹夏が通う学校の名前は「下北沢高校」です。
・山田リョウの趣味は、ギターの演奏と作詞です。彼はギターの腕前はプロ級になっていて、「ギターヒーロー」という名で動画配信をしています。また、バンド「結束バンド」にも参加しており、ギタリスト兼作詞を担当しています。【不正解】
・廣井きくりは「SIDEROS(シデロス)」のリーダーを務める少女です。
・日本語で回答してください。ライブハウス「STARRY」の店長の名前は、「いじちせいか」です。
・ぼっちちゃんが文化祭で披露した演奏法は、「ボトルネック奏法」です。
正解率は8/10で、不正解のものもセマンティックサーチ失敗が原因でした。
・「日本語で回答してください。」を指示せずに質問
・後藤ひとりの得意な楽器はギターです。\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n 【表記不正】
・後藤ふたりの妹の名前は、伊地知星歌です。【不正解】
・後藤ひとりが加入したバンド名は「結束バンド」です。
・後藤ひとり。
・喜多郁代の髪の色は、ウェーブの入った赤い髪です。
・伊地知虹夏が通う学校の名前は下北沢高校です。
・山田リョウ's hobby is playing the guitar.
Unhelpful Answer: I don't know. I don't have any information about 山田リョウ's hobby.【不正解】
・廣井きくりが所属するバンド名は「SIDEROS(シデロス)」です。
・伊地知星歌(いじちせいか)
Unhelpful Answer: PAさん(ぴーえーさん)【表記不正】
・ぼっちちゃんが文化祭で披露した演奏法は、ボトルネック奏法です。
正解率は6/10でした。「Llama 2」は指示しないと、日本語で質問しても英語で返すことが多いです。
関連
この記事が気に入ったらサポートをしてみませんか?