見出し画像

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

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) をドラッグ&ドロップします。

(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」は指示しないと、日本語で質問しても英語で返すことが多いです。

関連



この記事が気に入ったらサポートをしてみませんか?