概要
生成AIに文書を読み込ませるとセキュリティの心配があります。文書の内容を外部に流す訳なので心配です。その心配を払拭する技術としてローカルLLMとRAGなるものがあると知り、試してみました。様々なやり方がありますが、今回、ollamaとollamaのリポジトリに含まれるpythonパッケージで試行しました。仕組みとしては、自身のPC内で稼働する生成AI(ローカルLLM)を用意し、文書の内容が含まれたデータベースを基に回答をしてくれる、というもののようです。これはつまり、開発文書などの機密性の高い文書を安全に生成AIに入力できる技術だと言えます。
Ollamaをインストール
以下サイトからOllamaをダウンロード&インストールします。
https://ollama.com/download/windows
インストール完了後、Windows Power Shellが自動的に立ち上がりました。
Welcome to Ollama!
Run your first model:
ollama run llama3.1
llama3.1をインストールしてみます。
$ollama run llama3.1
インストール完了後、メッセージを入力できるようになりました。
チャットをしてみます。
“Please summarize the advantages and disadvantages of owning either a dog or a cat, and indicate which might be better if you were to choose one.”と質問してみました。
>>> Please summarize the advantages and disadvantages of owning either a dog or a cat, and indicate which might be better if you were to choose one.
**Dogs:**
Advantages:
1. **Loyal companions**: Dogs are often more social and affectionate than cats, making them great companions for people who want a loyal friend.
2. **Trainability**: Dogs can be trained to obey commands, walk on a leash, and even perform tricks.
3. **Exercise buddies**: Dogs need regular exercise, which encourages owners to stay active and healthy.
4. **Protection**: Some breeds of dogs can serve as deterrents for potential intruders.
Disadvantages:
1. **High maintenance**: Dogs require regular grooming, exercise, and training, which can be time-consuming and expensive.
2. **Noise**: Dogs can bark loudly, which may disturb neighbors or be a problem in apartments.
3. **Messy**: Dogs shed hair, slobber, and sometimes have accidents in the house.
4. **Expensive**: Owning a dog can cost around $1,000-2,000 per year, including food, vet bills, and supplies.
**Cats:**
Advantages:
1. **Low maintenance**: Cats are generally easier to care for than dogs, as they're self-cleaning, don't need regular exercise, and are less prone to behavioral problems.
2. **Quiet**: Cats are usually quiet animals that won't disturb neighbors or be a problem in apartments.
3. **Independent**: Cats enjoy spending time alone, which can be beneficial for owners who value their independence.
4. **Affordable**: Owning a cat is relatively inexpensive, with costs around $500-1,000 per year.
Disadvantages:
1. ** Aloofness**: Some cats can be aloof or unfriendly, which may not suit people who want a more interactive pet.
2. **Scratching**: Cats have sharp claws that can damage furniture and carpets if not properly trained or provided with scratching posts.
3. **Allergies**: Some people are allergic to cat dander, which can cause respiratory problems.
**Which is better?**
If I had to choose one as a hypothetical owner, I'd say a dog is the better choice for most people. Dogs offer more social interaction, exercise encouragement, and protection benefits than cats. However, if you're looking for a
low-maintenance pet that's relatively affordable and doesn't require a lot of attention, a cat might be a better fit.
Ultimately, the decision between a dog and a cat comes down to your personal preferences, lifestyle, and needs. If you're willing and able to provide the necessary care and attention, either animal can make a wonderful companion!
私の環境だと、上記回答で約6分かかりました。
実行環境は以下です。
- プロセッサ:Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz 2.11 GHz
- 実装RAM:8.00 GB (7.79 GB 使用可能)
- OS:Windows11(64bit)
ちなみに、仮想環境外でollamaを動かすと以下のエラーがでました。
Error: error reading llm response: read tcp 127.0.0.1:xxxxx->127.0.0.1:xxxxx:
wsarecv: An existing connection was forcibly closed by the remote host.
セキュリティソフトに妨害されたのかもしれません。
RAGをインストール
ollamaのリポジトリから必要なパッケージをインストールします。
$ git clone https://github.com/ollama/ollama.git
$ cd ollama/examples/langchain-python-rag-privategpt/
python実行環境を整備
Python環境を整えます。
$pip install -r requirements.txt
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
chainlit 1.1.402 requires fastapi<0.111.0,>=0.110.1, but you have fastapi 0.99.1 which is incompatible.
chainlit 1.1.402 requires starlette<0.38.0,>=0.37.2, but you have starlette 0.27.0 which is incompatible.
langchain-community 0.2.14 requires langchain<0.3.0,>=0.2.15, but you have langchain 0.0.274 which is incompatible.
langchain-community 0.2.14 requires langsmith<0.2.0,>=0.1.0, but you have langsmith 0.0.92 which is incompatible.
langchain-core 0.2.36 requires langsmith<0.2.0,>=0.1.75, but you have langsmith 0.0.92 which is incompatible.
langchain-core 0.2.36 requires pydantic<3.0.0,>=2.7.4; python_full_version >= "3.12.4", but you have pydantic 1.10.18 which is incompatible.
いくつかのパッケージが競合してしまったため、仮想環境を新しく用意しました。
$python -m venv venv_ollama
venv_ollama\Scripts\activate
生成AIに読み込ませる文書を用意
生成AIに読み込ませる文書を用意します。今回のサンプルはこれ。
<文書A.txt>
犬と猫はそれぞれ異なる特徴を持つペットで、性格や習性に大きな違いがあります。犬は一般的に社会的で忠実な動物で、飼い主との強い絆を求めます。犬は訓練しやすく、散歩や遊びが好きで、飼い主と一緒に活動することを楽しみます。また、犬はコミュニケーションが豊かで、吠えたり尻尾を振ったりして感情を表現します。
一方、猫は独立心が強く、自由を好む傾向があります。猫は自分のペースで生活し、飼い主に対しても比較的控えめです。猫は一人でいる時間を楽しむことができ、静かに過ごすことが多いです。感情の表現は控えめで、しっぽや耳の動き、鳴き声などで意思を伝えます。
これらの違いにより、犬と猫は異なるライフスタイルや飼い方を必要とし、どちらが適しているかは飼い主のライフスタイルや好みによります。
“examples\langchain-python-rag-privategpt”内に”source_documents”というフォルダを用意し、そこにこの「文書A.txt」を置きます。
データベース(DB)を入れる箱を用意
“examples\langchain-python-rag-privategpt”内に”db”というフォルダを用意します。中身は空です。
データベースを生成
“examples\langchain-python-rag-privategpt”内にある”ingest.py”というプログラムを実行すると”source_documents”を基にしたデータベースが生成されます(コマンドの書式はWindows Power Shellです)。
$env:SOURCE_DIRECTORY="source_documentsのパス";$env:PERSIST_DIRECTORY="dbのパス"; python ingest.py
Creating new vectorstore
Loading documents from C:\xxx\examples\langchain-python-rag-privategpt\source_documents
Loading new documents: 100%|██████████████████████| 1/1 [00:06<00:00, 6.48s/it]
Loaded 1 new documents from C:\xxx\examples\langchain-python-rag-privategpt\source_documents
Split into 1 chunks of text (max. 500 tokens each)
Creating embeddings. May take some minutes...
Ingestion complete! You can now run privateGPT.py to query your documents
↑こんな感じであれば大丈夫。
生成AI(ローカルLLM)を動かす
“examples\langchain-python-rag-privategpt”内にある”privateGPT.py”というプログラムを実行すると生成AIが動き出します。
とその前に、プログラムがデフォルトで選択している生成AIモデルは”llama2-uncensored”のようなので、”llama3.1″に修正しておきます。
#model = os.environ.get("MODEL", "llama2-uncensored")
model = os.environ.get("MODEL", "llama3.1")
1行目はコメントアウトしており、2行目を実行してもらうイメージです。
pythonプログラムを起動し、文書Aの内容を要約してもらいました。
$env:PERSIST_DIRECTORY="dbのパス"; python privateGPT.py
Enter a query: 文書Aの内容を100文字で要約してください。
Number of requested results 4 is greater than number of elements in index 1, updating n_results = 1
文書Aの内容は次の通りです。犬は社会的で忠実な動物で、訓練しやすく、飼い主と一緒に活動することを楽しみます。一方、猫は独立心が強く、自由を好む傾向があり、自分のペースで生活します。これらの違いにより、犬と猫には異なるライフスタイルや飼い方が必要です。
> Question:
文書Aの内容を100文字で要約してください。
文書Aの内容は次の通りです。犬は社会的で忠実な動物で、訓練しやすく、飼い主と一緒に活動することを楽しみます。一方、猫は独立心が強く、自由を好む傾向があり、自分のペースで生活します。これらの違いにより、犬と猫には異なるライフスタイルや飼い方が必要です。
> C:\xxx\examples\langchain-python-rag-privategpt\source_documents\文書A.txt:
犬と猫はそれぞれ異なる特徴を持つペットで、性格や習性に大きな違いがあります。犬は一般的に社会的で忠実な動物で、飼い主との強い絆を求めます。犬は訓練しやすく、散歩や遊びが好きで、飼い主と一緒に活動することを楽しみます。また、犬はコミュニケ ーションが豊かで、吠えたり尻尾を振ったりして感情を表現します。
一方、猫は独立心が強く、自由を好む傾向があります。猫は自分のペースで生活し、飼い主に対しても比較的控えめです。猫は一人でいる時間を楽しむことができ、静かに過ごすことが多いです。感情の表現は控えめで、しっぽや耳の動き、鳴き声などで意思を伝 えます。
これらの違いにより、犬と猫は異なるライフスタイルや飼い方を必要とし、どちらが適しているかは飼い主のライフスタイルや好みによります。
デバッグログが出ていてちょっと読みにくいですが、元々400文字近い文字を100文字に要約してくれています。整形すると・・・
<元々>
犬と猫はそれぞれ異なる特徴を持つペットで、性格や習性に大きな違いがあります。
犬は一般的に社会的で忠実な動物で、飼い主との強い絆を求めます。
犬は訓練しやすく、散歩や遊びが好きで、飼い主と一緒に活動することを楽しみます。
また、犬はコミュニケーションが豊かで、吠えたり尻尾を振ったりして感情を表現します。
一方、猫は独立心が強く、自由を好む傾向があります。
猫は自分のペースで生活し、飼い主に対しても比較的控えめです。
猫は一人でいる時間を楽しむことができ、静かに過ごすことが多いです。
感情の表現は控えめで、しっぽや耳の動き、鳴き声などで意思を伝えます。
これらの違いにより、犬と猫は異なるライフスタイルや飼い方を必要とし、
どちらが適しているかは飼い主のライフスタイルや好みによります。
<生成AIによる要約>
文書Aの内容は次の通りです。
犬は社会的で忠実な動物で、訓練しやすく、飼い主と一緒に活動することを楽しみます。
一方、猫は独立心が強く、自由を好む傾向があり、自分のペースで生活します。
これらの違いにより、犬と猫には異なるライフスタイルや飼い方が必要です。
そこそこいい感じに要約してくれました!
この程度の文章ですからそんなに時間はかかりませんが、大きめな文書で実験してみたいですね。
なお、README.mdによるとWordやPDF、CSVに対応しているようです。
参考にさせていただいたサイト
以下サイトを参考にさせていただきました。ありがとうございました。
[…] […]