🤖

LLaMa2 + PrivateGPTでローカルドキュメントを読めるオフラインチャットAIを実装

2023/08/06に公開

OpenAIが開発したChatGPTは非常に高い性能を持っています。しかし、自分のドキュメントを読み込ませるためには月額20ドルの料金が必要で、プライバシーの懸念も存在します。そのため、ローカルのドキュメントを大規模な言語モデルに読ませる「PrivateGPT」と、Metaが最近公開したGPT3.5に匹敵する性能を持つと言われる「LLaMa2」を使用して、オフラインのチャットAIを実装する試みを行いました。

結果として、下の図に示すように、質問に対してローカルのドキュメントに基づく回答を参考文献とともに提供することができ、高い性能を発揮しました。

日本語訳

質問:
アメリカ合衆国大統領の任期は何年ですか?

回答 (25.2秒で回答しました。):
アメリカ合衆国大統領の任期は4年間で、1月20日に開始して、翌年の1月20日に終了します。しかし、アメリカ合衆国憲法の修正条項には、大統領の役職に2回以上選出される者はいないと定められており、他の人が大統領に選出された任期で2年以上大統領または大統領代行として務めた人は、大統領の役職に1回以上選出されることはありません。

参考文献/constitution.pdf:
アメリカ合衆国憲法

記事 II.
セクション 1
行政権はアメリカ合衆国の大統領に与えられます。彼は4年間の任期中、その役職にとどまり、同じ任期で選出される副大統領とともに、以下のように選出されます: 各州は、その立法府が指示する方法で、選挙人を指名し、上院議員と代表者の総数に等しい選挙人を指名します。

参考文献/constitution.pdf:
アメリカ合衆国憲法

修正条項 XXII.
1947年3月21日に議会によって可決。1951年2月27日に批准。

セクション 1
大統領の役職に2回以上選出される者はいない。また、他の人が大統領に選出された任期で2年以上大統領または大統領代行として務めた人は、大統領の役職に1回以上選出されることはありません。

LLaMa2とは

https://ai.meta.com/llama/
https://github.com/facebookresearch/llama

Metaが発表したオーブンソース大規模言語モデル。GPT3.5に匹敵する性能を持ちながら無料で利用でき、商用も可能。

PrivateGPTとは

https://github.com/imartinez/privateGPT

大規模言語モデルで構築したチャットAIにローカルのドキュメントを読み込んだ上で回答させることができるプロジェクト。

実装

環境構築

まずはコードをGitHubからダウンロードする

git clone https://github.com/imartinez/privateGPT.git

今回はDokcerを利用して実装を行います。
Dockerについて詳しくない方はこちらの記事を参考してください:

https://qiita.com/etaroid/items/b1024c7d200a75b992fc

まずはDockerfileを用意します。


FROM nvidia/cuda:12.1.1-runtime-ubuntu22.04

RUN apt update && apt install -y git python3 python3-pip gcc

Dockerイメージをビルドし、実行する

docker build -t privategpt:ubuntu22.04_cuda12.1.1 -f {path/to/Dockerfile}
docker run -d -i -t --gpus all --name privategpt -v $(pwd):$(pwd) -w $(pwd) privategpt:ubuntu22.04_cuda12.1.1

GitHubからダウンロードしたディレクトリに入り、必要なライブラリーをインストール

cd privateGPT
pip3 install -r requirements.txt

Llama-2大規模言語モデルをダウンロードする

apt install -y curl
mkdir -p models && curl \
https://huggingface.co/TheBloke/Llama-2-13B-chat-GGML/resolve/main/llama-2-13b-chat.ggmlv3.q4_0.bin \
-o models/llama-2-13b-chat.ggmlv3.q4_0.bin

privateGPT環境変数ファイルを作成

cp example.env .env

作成したファイルを以下のように編集する

PERSIST_DIRECTORY=db
MODEL_TYPE=LlamaCpp
MODEL_PATH=/home/privateGPT/models/llama-2-13b-chat.ggmlv3.q4_0.bin
EMBEDDINGS_MODEL_NAME=all-MiniLM-L6-v2
MODEL_N_CTX=1000
MODEL_N_BATCH=1024
TARGET_SOURCE_CHUNKS=4

Note:MODEL_PATHは絶対パスに編集してください

実行

チャットAIに読ませて欲しいドキュメントを/privateGPT/source_documentsに入れる
サポートするファイル形式:

  • .csv: CSV,
  • .docx: Word Document,
  • .doc: Word Document,
  • .enex: EverNote,
  • .eml: Email,
  • .epub: EPub,
  • .html: HTML File,
  • .md: Markdown,
  • .msg: Outlook Message,
  • .odt: Open Document Text,
  • .pdf: Portable Document Format (PDF),
  • .pptx : PowerPoint Document,
  • .ppt : PowerPoint Document,
  • .txt: Text file (UTF-8),

以下のコマンドを実行してデータを読み込む

python ingest.py

これが出たら成功

Creating new vectorstore
Loading documents from source_documents
Loading new documents: 100%|██████████████████████| 1/1 [00:01<00:00,  1.73s/it]
Loaded 1 new documents from source_documents
Split into 90 chunks of text (max. 500 tokens each)
Creating embeddings. May take some minutes...
Using embedded DuckDB with persistence: data will be stored in: db
Ingestion complete! You can now run privateGPT.py to query your documents

いよいよ実行!

python privateGPT.py

これが表示されたらインプットできます

> Enter a query:

結果

アメリカ合衆国大統領の任期について質問すると、ローカルのドキュメントに基ついた回答ができた。

日本語訳

質問:
アメリカ合衆国大統領の任期は何年ですか?

回答 (25.2秒で回答しました。):
アメリカ合衆国大統領の任期は4年間で、1月20日に開始して、翌年の1月20日に終了します。しかし、アメリカ合衆国憲法の修正条項には、大統領の役職に2回以上選出される者はいないと定められており、他の人が大統領に選出された任期で2年以上大統領または大統領代行として務めた人は、大統領の役職に1回以上選出されることはありません。

参考文献/constitution.pdf:
アメリカ合衆国憲法

記事 II.
セクション 1
行政権はアメリカ合衆国の大統領に与えられます。彼は4年間の任期中、その役職にとどまり、同じ任期で選出される副大統領とともに、以下のように選出されます: 各州は、その立法府が指示する方法で、選挙人を指名し、上院議員と代表者の総数に等しい選挙人を指名します。

参考文献/constitution.pdf:
アメリカ合衆国憲法

修正条項 XXII.
1947年3月21日に議会によって可決。1951年2月27日に批准。

セクション 1
大統領の役職に2回以上選出される者はいない。また、他の人が大統領に選出された任期で2年以上大統領または大統領代行として務めた人は、大統領の役職に1回以上選出されることはありません。

Discussion