見出し画像

CAMEL-5B と SentenceTransformers で LlamaIndex を試す

「CAMEL-5B」と「Sentence Transformer」で「LlamaIndex」を試したのでまとめました。

1. CAMEL-5B と SentenceTransformers

公式チュートリアルをベースに、ローカルモデルに「CAMEL-5B」、埋め込みに「SentenceTransformers」(sentence-transformers/all-mpnet-base-v2)を使って、「LlamaIndex」を試しました。

2. ドキュメントの準備

はじめに、チャットボットに教える専門知識を記述したドキュメントを用意します。

今回は、マンガペディアの「ぼっち・ざ・ろっく!」のあらすじのドキュメントを英語に翻訳したものを用意しました。

・bocchi_en.txt

3. Colabでの実行

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

(1) Colabにdataフォルダを作成してドキュメントを配置。
左端のフォルダアイコンでファイル一覧を表示し、右クリック「新しいフォルダ」でdataフォルダを作成し、ドキュメントをドラッグ&ドロップします。

(2) パッケージのインストール。

# パッケージのインストール
!pip install pymupdf pygpt4all sentence_transformers accelerate
!pip install llama_index==0.6.38

(3) パッケージのインポート。

# パッケージのインポート
import torch
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from llama_index.llm_predictor import HuggingFaceLLMPredictor
from llama_index.node_parser.simple import SimpleNodeParser
from llama_index.prompts.prompts import SimpleInputPrompt
from llama_index import (
    GPTVectorStoreIndex,
    LangchainEmbedding,
    LLMPredictor,
    ServiceContext,
    SimpleDirectoryReader,
    PromptHelper
)

(4) ドキュメントの準備。

# ドキュメントの準備
documents = SimpleDirectoryReader("data").load_data()
print("documents :", documents)

(5) サービスコンテキストの準備。

# プロンプトのラッパーの準備
query_wrapper_prompt = SimpleInputPrompt(
    "Below is an instruction that describes a task. "
    "Write a response that appropriately completes the request.\n\n"
    "### Instruction:\n{query_str}\n\n### Response:"
)

# HuggingFaceLLMPredictorの準備
hf_predictor = HuggingFaceLLMPredictor(
    max_input_size=2048,
    max_new_tokens=256,
    generate_kwargs={"temperature": 0.25, "do_sample": False},
    query_wrapper_prompt=query_wrapper_prompt,
    tokenizer_name="Writer/camel-5b-hf",
    model_name="Writer/camel-5b-hf",
    device_map="auto",
    tokenizer_kwargs={"max_length": 2048},
    model_kwargs={"torch_dtype": torch.bfloat16}
)

# 埋め込みモデルの準備
embed_model = LangchainEmbedding(HuggingFaceEmbeddings(
    model_name="sentence-transformers/all-mpnet-base-v2"
))

# サービスコンテキストの準備
service_context = ServiceContext.from_defaults(
    chunk_size=512, 
    llm_predictor=hf_predictor, 
    embed_model=embed_model
)

(6) インデックスの準備。

# インデックスの準備
index = GPTVectorStoreIndex.from_documents(
    documents,
    service_context=service_context
)
index.storage_context.persist(persist_dir="./storage")

(7) クエリエンジンの準備。

# クエリエンジンの準備
query_engine = index.as_query_engine(
    streaming=True, 
    similarity_top_k=3
)

(8) 推論の実行。

# 推論の実行
response_stream = query_engine.query("What instrument is Hitori Goto good at?")
response_stream.print_response_stream()
Guitar<|endoftext|>

Q: 後藤ひとりの得意な楽器は?
A:ギター

response_stream = query_engine.query("What kind of person is Hitori Goto?")
response_stream.print_response_stream()
Hitori Goto is a mysterious and complex character, known for his strange abilities, such as hiding behind walls and remodeling masks, and his desire to regain his family's position in the family hierarchy. He is a high school student, a guitarist, and a video production student, and he is a fan of "Kessoku Band" and "SIDEROS". He is a talented guitarist and a skilled musician, but he struggles with his finances and has a tendency to be self-destructive.<|endoftext|>

Q: 後藤ひとりはどんな人?
A: 後藤ひとりは謎に満ちた複雑なキャラクターで、壁の後ろに隠れたりマスクを改造したりするなどの奇妙な能力と、家族の階層における家族の地位を取り戻したいという願望で知られています。 高校生、ギタリスト、映像制作学生で、「結束バンド」と「SIDEROS」のファンです。 彼は才能のあるギタリストであり、熟練したミュージシャンですが、経済的に苦労しており、自己破壊的な傾向があります。

response_stream = query_engine.query("Who is Nijika's best friend?")
response_stream.print_response_stream()
Ikuyo Kita<|endoftext|>

Q: 虹夏ちゃんの親友は?
A: 喜多郁代

関連



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