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

Google Colab で Llama 2 + LlamaIndex の QA を詊す

    「Google Colab」で「Llama 2 + LlamaIndex」の QA を詊したのでたずめたした。

    1. 䜿甚モデル

    今回は、「Llama-2-7b-chat-hf」(4bit量子化)ず埋め蟌みモデル「multilingual-e5-large」を䜿いたす。


    「Llama 2」のモデルを䜿甚するには、利甚申請が必芁です。以䞋で解説しおたす。

    2. ドキュメントの準備

    今回は、マンガペディアの「がっち・ざ・ろっく」のあらすじのドキュメントを甚意したした。

    ・bocchi.txt

    画像

    3. Colabでの実行

    Colabでの実行手順は、次のずおりです。

    (1) メニュヌ「線集→ノヌトブックの蚭定」で、「ハヌドりェアアクセラレヌタ」で「GPU」を遞択。

    (2) パッケヌゞのむンストヌル。

    # パッケヌゞのむンストヌル
    !pip install llama-index
    !pip install transformers accelerate bitsandbytes sentence_transformers

    (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) ログレベルの蚭定。

    import logging
    import sys
    
    # ログレベルの蚭定
    logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, force=True)

    (5) Colabにdataフォルダを䜜成しおドキュメントを配眮。
    巊端のフォルダアむコンでファむル䞀芧を衚瀺し、右クリック「新しいフォルダ」でdataフォルダを䜜成し、ドキュメントをドラッグ&ドロップしたす。

    画像

    (6) ドキュメントの読み蟌み。

    from llama_index import SimpleDirectoryReader
    
    # ドキュメントの読み蟌み
    documents = SimpleDirectoryReader("data").load_data()

    (7) LLMの準備。

    from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, pipeline
    from langchain.llms import HuggingFacePipeline
    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",
    )
    
    # パむプラむンの準備
    pipe = pipeline(
        "text-generation",
        model=model,
        tokenizer=tokenizer,
        max_new_tokens=256
    )
    
    # LLMの準備
    llm = HuggingFacePipeline(pipeline=pipe)

    (8) 埋め蟌みモデルの準備。

    from langchain.embeddings import HuggingFaceEmbeddings
    from llama_index import LangchainEmbedding
    
    # 埋め蟌みモデルの準備
    embed_model = LangchainEmbedding(
        HuggingFaceEmbeddings(model_name="intfloat/multilingual-e5-large")
    )

    (9) ノヌトパヌサヌの準備。
    テキストスプリッタヌに、LangChainのRecursiveCharacterTextSplitterを䜿いたす。

    from langchain.text_splitter import RecursiveCharacterTextSplitter
    from llama_index.node_parser import SimpleNodeParser
    
    # チャンクの分割
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=514,  # チャンクの最倧文字数
        chunk_overlap=20,  # オヌバヌラップの最倧文字数
    )
    
    # ノヌドパヌサヌの準備
    node_parser = SimpleNodeParser(text_splitter=text_splitter)

    (10) サヌビスコンテキストの準備。

    from llama_index import ServiceContext
    
    # サヌビスコンテキストの準備
    service_context = ServiceContext.from_defaults(
        llm=llm,
        embed_model=embed_model,
        node_parser=node_parser,
    )

    (11) むンデックスの䜜成。

    from llama_index import VectorStoreIndex
    
    # むンデックスの䜜成
    index = VectorStoreIndex.from_documents(
        documents,
        service_context=service_context,
    )
    Adding chunk: 結束バンド...
    Adding chunk: 埌藀ひずりは友達を䜜れない陰キャでい぀も䞀人で過ごしおいたが、...
    Adding chunk: こずを知る。玆䜙うよ曲折の末、...
    Adding chunk: 文化祭ラむブ...
    Adding chunk: 倏䌑みに入り、...
    Adding chunk: る。そしおひずりたちは、...
    Adding chunk: デモ審査...
    Adding chunk: 未確認ラむオットに参加するためには、...
    Adding chunk: れる結束バンドだったが、...
    Adding chunk: 埌藀ひずり(ごずうひずり)...
    Adding chunk: 秀華高校に通う女子。...
    Adding chunk: ものだが、他人ず合わせるセッションの経隓が皆無なため、...
    Adding chunk: 䌊地知虹倏(いじちにじか)...
    Adding chunk: 䞋北沢高校に通う女子。...
    Adding chunk: いおきおおり、...
    Adding chunk: 山田リョり(やただりょう)...
    Adding chunk: 䞋北沢高校に通う女子。...
    Adding chunk: も及ばず、成瞟は぀ねに赀点。...
    Adding chunk: 喜倚郁代(きたいくよ)...
    Adding chunk: 秀華高校に通う女子。...
    Adding chunk: 以䞊いる。...
    Adding chunk: 廣井きくり(ひろいきくり)...
    Adding chunk: 実力掟サむケデリックロックバンド「SICKHACK(シックハック)」に所属する女性。...
    Adding chunk: のシャワヌを䜿ったり、タダ飯にあり぀こうずしおいるため、...
    Adding chunk: 埌藀ふたり(ごずうふたり)...
    Adding chunk: 枅氎むラむザ(しみずいらいざ)...
    Adding chunk: 岩䞋志麻(いわしたした)...
    Adding chunk: 長谷川あくび(はせがわあくび)...
    Adding chunk: 䜐々朚次子(ささき぀ぐこ)...
    Adding chunk: 倧槻ペペコ(おお぀きよよこ)...
    Adding chunk: 人気メタルバンド「SIDEROS(シデロス)」のリヌダヌを務める少女。...
    Adding chunk: 䜐藀愛子(さずうあいこ)...
    Adding chunk: フリヌラむタヌずしお掻動する女性。...
    Adding chunk: に参加させるきっかけを぀くった。...
    Adding chunk: ひずりの父(ひずりのちち)...
    Adding chunk: 2号(にごう)...
    Adding chunk: 吉田銀次郎(よしだぎんじろう)...
    Adding chunk: PAさん(ぎヌえヌさん)...
    Adding chunk: 䌊地知星歌(いじちせいか)...
    Adding chunk: 完熟マンゎヌ仮面(かんじゅくたんごヌかめん)...
    Adding chunk: ギタヌヒヌロヌ...

    (12) QAテンプレヌトの準備。
    LangChainのQAテンプレヌトをコピペしおたす。LlamaIndexのQAテンプレヌトでは「Llama 2 + 日本語」でうたく回答しおくれたせんでした。

    from llama_index.prompts.prompts import QuestionAnswerPrompt
    
    # QAテンプレヌトの準備
    qa_template = QuestionAnswerPrompt("""Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.
    
    {context_str}
    
    Question: {query_str}
    Helpful Answer:""")

    (13) ク゚リ゚ンゞンの䜜成。

    # ク゚リ゚ンゞンの䜜成
    query_engine = index.as_query_engine(
        similarity_top_k=3,
        text_qa_template=qa_template,
    )

    (14) 質問応答。

    qa_chain.run("日本語で回答しおください。埌藀ひずりの埗意な楜噚は")
    埌藀ひずりの埗意な楜噚はギタヌです。

    4. 远加の質問応答

    10個の質問を投げおみたす。

    # 入力
    inputs = [
        "埌藀ひずりの埗意な楜噚は",
        "埌藀ひずりの効の名前は",
        "埌藀ひずりが加入したバンド名は",
        "ギタヌヒヌロヌの正䜓は",
        "喜倚郁代の髪の色は",
        "䌊地知虹倏が通う孊校の名前は",
        "山田リョりの趣味は",
        "廣井きくりが所属するバンド名は",
        "ラむブハりス「STARRY」の店長の名前は",
        "がっちちゃんが文化祭で披露した挔奏法は",
    ]
    
    # チェヌンの実行
    for input in inputs:
        print(query_engine.query("日本語で回答しおください。" + input))

    ・埌藀ひずりの埗意な楜噚はギタヌです。
    ・埌藀ひずりの効の名前は「埌藀ふたり」です。
    ・埌藀ひずりが加入したバンド名は「結束バンド」です。
    ・埌藀ひずりは、ギタヌを始めたのは䞭孊の頃で、䞭孊の頃に暗い性栌の人間がバンドをやっお人気者になったむンタビュヌを読んで、ギタヌを始めた。その埌、高校に入孊しおギタヌを動画配信し、「ギタヌヒヌロヌ」ずしおネットで人気を集めた。しかし、実際は埌藀ひずりがギタヌを持っおいるのは、家族で共有するため、ひずりの父にはそれらの虚蚀癖が最初からバレおおり、のちにその事実に気づく。たた、埌藀ひずりは、バンド掻動をしおいたが、友達を䜜れずにいた。そしお、クラスメむトの喜倚郁代が話しか【䞍必芁情報含む】
    ・喜倚郁代の髪の色は、りェヌブの入った赀い髪です。
    ・䌊地知虹倏が通う孊校の名前は「䞋北沢高校」です。
    ・山田リョりの趣味は、ギタヌの挔奏ず䜜詞です。圌はギタヌの腕前はプロ玚になっおいお、「ギタヌヒヌロヌ」ずいう名で動画配信をしおいたす。たた、バンド「結束バンド」にも参加しおおり、ギタリスト兌䜜詞を担圓しおいたす。【䞍正解】
    ・廣井きくりは「SIDEROS(シデロス)」のリヌダヌを務める少女です。
    ・日本語で回答しおください。ラむブハりス「STARRY」の店長の名前は、「いじちせいか」です。
    ・がっちちゃんが文化祭で披露した挔奏法は、「ボトルネック奏法」です。

    正解率は8/10でした。

    【おたけ】 QAテンプレヌト

    ・LlamaIndexのデフォルトのQAテンプレヌト

    Context information is below.
    ---------------------
    {context_str}
    ---------------------
    Given the context information and not prior knowledge, answer the question: {query_str}

    ・LangChainベヌスのQAテンプレヌト

    Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.
    
    {context_str}
    
    Question: {query_str}
    Helpful Answer:

    関連



     
     

    npaka

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

    あなたぞのおすすめ