OpenAIを利用せずローカル環境でEmbedding DBを用いた質問応答の効率性は？ (1)埋め込み速度

# はじめに

ChatGPTを活用したPDFやテキスト文書の埋め込みデータベースを用いたQ&Aサービスや手法が多く公開されている。これらは非常に便利であるが、社内の機密情報など、セキュリティ上の理由から外部サービスの使用が制限されるケースも存在する。そのため、今回はローカル環境でこれらのサービスを効率的な速度で再現できるかどうかを検証する。

# まとめ



今回は Llama2、Llama2(日本語)、E5 の3つのモデルを使用して埋め込み速度を検証した。GPUなしの環境では、Llama2を使用した埋め込みには多くの時間がかかることが明らかになり、E5は現実的な速度で埋め込みが可能だと確かめられた。

今後の課題として、対象ファイルの内容が増加した場合の埋め込み時間の推移の確認や、GPUを利用した場合の速度向上の可能性が挙げられる。

# 埋め込み速度の検討

対象ファイルの内容を埋め込み処理(Embedding)する速度について確認する。

## サンプルソースコード
Llama2の4bit量子化したモデルを使用して埋め込みを行う場合にソースコードをサンプルとして示す。
```python: llm_cvs_embedding.py 
from langchain.vectorstores import Chroma
from langchain.document_loaders.csv_loader import CSVLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import LlamaCppEmbeddings

# load document
loader = CSVLoader(file_path='./knowledge_db.csv',  source_column='source')
data = loader.load()

text_splitter = CharacterTextSplitter(
    separator = " ",  
    chunk_size = 1000,  
    chunk_overlap  = 0, 
)

docs = text_splitter.split_documents(data)

# Indicate model for embedding
embeddings = LlamaCppEmbeddings(model_path="./models/llama-2-7b-chat.q4_K_M.gguf", n_ctx=4096)

# Stores information about the split text in a vector store
vectorstore = Chroma.from_documents(docs, embedding=embeddings, persist_directory="./chroma")
vectorstore.persist()
```

## 埋め込みに利用するサンプルファイル
調査に使用したドキュメントデータ (knowledge_db.csv)

```terminal
$ wc knowledge_db.csv 
```

| 単語数 | バイト数 | 文字数 |
| -: |-: |-: |
| 10,644 | 250,146 | 175,506 |


## テスト環境 (PC)

利用するモデルはCPUのみを利用して動作させる

| 説明 | サンプル出力 |
|------|--------------|
| OS | Ubuntu 22.04 |
| CPUの種別 |13th Gen Intel(R) Core(TM) i7-13700 |
| Performance-core 個数 |                        8 |
| Efficient-cores個数 |                           8 |
| スレッド数 | 24 |
| メモリの総量（GByte） | 125 GB |
| GPUの種別 |  Intel Corporation Device a780 (rev 04) |


## 調査コマンド
time コマンドで real 時間を計測した。

```terminal: sample
$ time python3 ./llm_cvs_embedding.py 

real    73m26.673s
user    876m48.304s
sys     0m11.906s
```

## モデル毎の埋め込み速度

Llama2、Llama2(日本語)、E5(EmbEddings from bidirEctional Encoder rEpresentations)の3つのモデルの結果に加え、参考としてgpt-3.5turboの結果を示す。

Llama2を使用した埋め込み速度はE5と比較して非常に遅い。今回のサンプルは17万文字と比較的小さいファイルであり、その埋め込みに一時間以上を用した。一方、E5は3分弱で埋め込みが完了し、Llama2と比較して非常に高速に動作している。

Cloudで動作しているChatGPTの埋め込み速度は圧倒的である。

|	モデル	|パラメータ数|　環境 | 処理時間	| 説明 |
|	:-:	|-:|:-:|	-:	| :-|
|	[llama-2-7b-chat.q4_K_M](https://huggingface.co/TheBloke/Llama-2-70B-Chat-GGML/tree/main)	|7B(70億)|PC| 77m17s|Llama2ローカルで動作させるために4bit量子化したモデル |
|	[ELYZA-japanese-Llama-2-7b-fast-instruct-q4_K_M](https://huggingface.co/elyza/ELYZA-japanese-Llama-2-7b-fast-instruct)	|7B(70億)|PC|73m26s|Llama2をベースとした商用利用可能な日本語LLM(4bit量子化)|
|	[multilingual-e5-large](https://huggingface.co/intfloat/multilingual-e5-large)|560M(5億)|PC|2m35s| 多言語のテキスト埋め込み用のモデル|
|	[gpt-3.5-turbo](https://platform.openai.com/docs/guides/gpt)|175B(1750億)|Cloud|5s|OpenAIによって開発された高度な会話型AIモデル|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017489/4afbdb1f-6844-85bd-915e-3e6bff0ffaff.png)



# 参考情報

## Llama2

https://dev.classmethod.jp/articles/15c6ef47d273a1d5c0f1891dd231a8718a836c3e/

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

https://note.com/elyza/n/na405acaca130




## E5

https://github.com/microsoft/unilm/tree/master/e5

https://www.elastic.co/search-labs/multilingual-vector-search-e5-embedding-model

https://blog.vespa.ai/simplify-search-with-multilingual-embeddings/

https://hironsan.hatenablog.com/entry/2023/07/05/073150

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

https://hironsan.hatenablog.com/entry/2023/07/05/073150