メインコンテンツへスキップ
見出し画像

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

    関連



     
     

    npaka

     
     
    プログラマー。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガジェット。年2冊ペースで技術書を執筆。アニソン / カラオケ / ギター / 猫 twitter : @npaka123

    あなたへのおすすめ