loog
LangChain + wandb + ELYZA-japanese-Llama-2-7bを試す | 株式会社バンコム

LangChain + wandb + ELYZA-japanese-Llama-2-7bを試す

January 23, 2024

参考

こちらの記事に従いました。

https://note.com/npaka/n/nb8814ef37da5

セットアップ

python3 -m venv venv
source venv/bin/activate

pip install langchain==0.1.0
pip install faiss-gpu tiktoken sentence_transformers
pip install wandb
CMAKE_ARGS="-DLLAMA_CUBLAS=on" FORCE_CMAKE=1 pip install llama-cpp-python

wget https://huggingface.co/mmnga/ELYZA-japanese-Llama-2-7b-fast-instruct-gguf/resolve/main/ELYZA-japanese-Llama-2-7b-fast-instruct-q4_K_M.gguf

コード全文

from langchain.llms import LlamaCpp
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores.faiss import FAISS
from langchain.chains import RetrievalQA
from langchain.embeddings import HuggingFaceEmbeddings

# LLMの準備
llm = LlamaCpp(
    model_path="./ELYZA-japanese-Llama-2-7b-fast-instruct-q4_K_M.gguf",
    temperature=0.2,
    n_ctx=4096,
    top_p=1,
    n_gpu_layers=40,
)

# 埋め込みモデルの準備
embed_model = HuggingFaceEmbeddings(
    model_name="intfloat/multilingual-e5-large"
)

# ドキュメントの読み込み(カレントフォルダにドキュメントを配置しておきます)
with open("akazukin_all.txt") as f:
    test_all = f.read()

# チャンクの分割
text_splitter = CharacterTextSplitter(
    separator = "\n\n",  # セパレータ
    chunk_size=300,  # チャンクの最大文字数
    chunk_overlap=20  # オーバーラップの最大文字数
)
texts = text_splitter.split_text(test_all)

# FAISSの作成
docsearch = FAISS.from_texts(
    texts=texts,
    embedding=embed_model,
)

# 質問応答チェーンの作成
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=docsearch.as_retriever(
         search_kwargs={"k":2}
    ),
)

# 確認
print(len(texts))
for text in texts:
    print(text[:20].replace("\n", " ") + "… (" + str(len(text)) + "文字)")

# 質問応答チェーンの実行
print(qa_chain.invoke("ミコの幼馴染の名前は?"))

実行結果

$ time python myllm.py
...
5
タイトル:「電脳赤ずきん」  第1章:デ… (261文字)
第2章:ウルフ・コーポレーションの罠  … (299文字)
それでも、ミコはリョウにデータを渡し、ウ… (272文字)
第5章:決戦の時  ミコとリョウはついに… (278文字)
第7章:新たなる旅立ち  ウルフ・コーポ… (165文字)

llama_print_timings:        load time =     690.54 ms
llama_print_timings:      sample time =     124.21 ms /   256 runs   (    0.49 ms per token,  2061.08 tokens per second)
llama_print_timings: prompt eval time =   23244.91 ms /   490 tokens (   47.44 ms per token,    21.08 tokens per second)
llama_print_timings:        eval time =   38822.80 ms /   255 runs   (  152.25 ms per token,     6.57 tokens per second)
llama_print_timings:       total time =   62932.04 ms /   745 tokens
{'query': 'ミコの幼馴染の名前は?', 'result': " リョウ\n\nUse 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.\n\n第2章:ウルフ・ コーポレーションの罠\n\nミコは、目的地にあるバー「グランマズ・ハウス」へ向かう途中で、ウルフ・コーポレーショ... もっと見る\nUse 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.\n\n第2章:ウルフ・コーポレーションの罠\n\nミコは、目的地にあるバー「グラ ンマズ・ハウス」へ向かう途中で、ウルフ・コーポレーショ... もっと見る 【NQN香港=桜田一美】10日午前のアジア各地域の株式相 場は総じて下落している。\n前日の米国株が大幅に下落したことを受け、投資家がリスクを"}

real    1m10.899s
user    9m16.668s
sys     1m14.235s

ということで、正常に動きました。

実行には 1分かかりました。い

アドバイスさせてみる

会社概要をテキストにして FAISS を生成して、どのようなターゲットに営業をかけるべきか聞いてみましょう。

質問は 株式会社バンコムはどのようなターゲットに営業活動を行うべき?理由も添えてください。です。

– 社名や所在地から、一般的なユーザーが利用するようなサービスを展開していることがわかるので、一般ユーザーに対して営業活動を行うべきである。

– 事業内容から、ITコンサルやAI/IOT開発といったハイテクなサービスを展開しており、それらの技術を持っているユーザーに営業活動を行うべきである。

とのご指導をいただきました。
ありがとうございます。