メむンコンテンツぞスキップ
芋出し画像

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

    あなたぞのおすすめ