オープンソースを使ったローカルで動く無料の社内RAGの作成 #1

生成AIが勢いを増している今、遅いかもしれませんが、会社用にオープンソースを使用した、ローカルで動くRAGを作成しました。

できるだけ費用を0で実施したかったため、オープンソースのOpenSearchgemma2モデルを使用して作成しました。

しかしながら、良い使い道が見つからず、作ったのに使われないのはもったいないので、ここにまとめておきます。参考にしていただけると幸いです。

長くなるので、2回にわけて、今回はOpenSearchの導入まで、次回でそれを利用したRAGの作成を行います。

なお、Widnows11で開発しております。

そもそもRAGとは

この記事を見ている人は必要ないかもしれませんが、RAGについてChatGPTに聞きました。

つまり、なにか検索するのに、AIが検索の手助けしてくれる感じでしょうか。

メリットは社内の情報など汎用AIが知っていない情報も検索対象にできる点だと思います。

RAGを使えば、モデルを一から作ることなく、汎用AIで、社内の情報を検索、まとめてくれます。

さらにこれらをローカルで行えば、外部に情報が漏れることなく、閉鎖した環境で調べ物ができるというすぐれものです。

まさに散らかった社内の情報をまとめて検索する社内検索システムにぴったりな手法だと思いました。

例えば、ドライブ内に業務ごとにフォルダーは別れて入るけど、テキスト形式やdoc形式、csv形式など統一感のなく、検索しづらい社内情報を一つにまとめるいい機会だと思いました。

準備

どこかに作業ディレクトリを作成します。

私の場合は、"D:\codes\python\rag-opensearch"にしました。

ここを拠点に開発していきます。

OpenSearch

OpenSearchはオープンソースの検索エンジンです。似たものにElasticsearchというものがありますが、ライセンス関係で何やら違うとか、今回はオープンソースのOpenSearchを使いました。

OpenSearchのダウンロード

OpenSearchはこちらからダウンロードできます。

作業ディレクトリに展開します(特にここにする必要はありません)。

パスワードの設定と接続確認

パスワードを設定します。

# コマンドプロンプト(パスワードは適宜変更してください)
set OPENSEARCH_INITIAL_ADMIN_PASSWORD="tG7$9!5A"

でパスワードを変更できたら、"opensearch-windows-install.bat"を起動します。

起動には少し時間がかかります。

起動できたら、以下のコマンドで接続できるか確認します。パスワードは特殊文字がある場合は、エスケープする必要がありました。

以下のように表示されれば成功です。

日本語トークナイザーのインストール

日本語を検索に使用するためには、別でトークナイザーが必要になります。

そこで、日本語のトークナイザーとして、analysis-kuromojiをインストールします。

-> Installed analysis-kuromoji with folder name analysis-kuromoji

となれば成功です。成功した場合は次の以下はスキップしてください。

エラーが発生したとき

私の場合以下のエラーが出ました。

権限がなくてエラー担っているみたいなので権限を付与します。

opensearch-windows-install.batがあるディレクトリの "\lib\tools\plugin-cli\opensearch-plugin-cli-2.17.1.jar"のプロパティを開き、

「セキュリティタブ」の「編集」から、「Authenticated User」の「アクセス許可」で「フルコントロール」を「許可」し、適用します。

その後管理者モードでコマンドプロンプトを開きます。そして、先と同様に拡張機能をインストールしたら、成功しました。

Pythonのインストール

Pythonのダウンロードとインストール

Pythonをインストールします。今回はPython3.10.11をインストールしました。

仮想環境の作成

インストールしたPythonで仮想環境を作成します。

どこか作業ディレクトリを作成し、そこに移動して仮想環境を作成します。

仮想環境をアクティブにします。

アクティブになっているか確認します。

Python 3.10.11と表示されればOKです。

ログフォルダとモデル用フォルダと検索データ用フォルダの作成

ログファイルの保存用にディレクトリ"./log"を作成しておきます。また、モデル保存用に"./llm/model""./embeddings/models"を作成しておきます。さらに、検索データ用のフォルダとして"./data"を作成しておきます。

あとで気づきましたが、フォルダ名がややこしいので、適宜変更してもらって大丈夫です。その場合はこの後のプログラムで参照先も変更するのをお忘れなく。

埋め込みモデルとLLMモデルのダウンロード

RAGに必要なモデルたちをダウンロードします。以下の2つです。

  1. 埋め込みモデル(intfloat/multilingual-e5-large)
    これは下に記載する filebulkinsert.pyでダウンロードするため、省略します。
  2. LLMモデル(gemma-2-2b-jpn-it)
    こちらのリンクからダウンロードします。今回はQ4_K_Mのモデルを使います。下図のようにダウンロードします。 ダウンロードしたファイルは、今回は作業フォルダの "./llm/model"の中に保存します。ちなみにサイトのcontext_lengthがモデルのコンテキスト長です。

ちなみに、モデルのQ4とかQ8とかは量子化の方法の違いによるもので、数字が小さいほどサイズが小さいけど精度が低いみたいです。

OpenSearchにデータを格納する

検索データのダウンロード

最低限の準備は整ったのでここから、まずOpenSearchにデータを格納します。

実際に社内RAGとして使うなら、検索データは社内のいろんな情報であり、まず、それらをまとめる必要があります。ここが一番大変かもしれません。

今回はRAGの検索対象として、青空文庫にある2022アクセスランキングから上位10作品までを使用します。

ダウンロードリンクからテキストファイルを作業ディレクトリの"./data"に格納します。"./zip_file"は元ファイルを入れているだけなので、気にしないでください。

./dataフォルダの中身

検索データ追加のプログラム

ダウンロードした作品たちをOpenSearchに追加していきます。

追加するプログラム(filebulkinsert.py)を以下にまとめて記載します。

足りないライブラリは適宜 pip install 〇〇でインストールしてください。

opensearchpyは pip install opensearch-pyでインストールできると思います。

また、中で参照しているsetting.pyは以下です。OpenSearchのインデックスの設定を記載しています。インデックスの設定については、こちらなどを参考にしました。

埋め込みモデルを変更する場合は、vector_fielddimensionなどを適切に設定しないとエラーとなりますので、モデルのパラメータをしっかり確認してから、設定しなければなりません。

プログラムの基本的な流れは、以下の通りです。

  1. 埋め込みモデルのダウンロード
  2. 対象ファイルの読み込みと、埋め込みベクトル化
  3. OpenSearchに追加
GPUを使用する方法

ここで、プログラムの始めの方の埋め込みモデルの読み込みでGPUを使用する場合とCPUを使用する場合に分けていますが、

体感でGPUを使用したときの方が埋め込み処理が10倍以上速かったと思いましたので、

GPUを持っている方はできれば使用したほうが良いと思います。

ただGPUを使用するにはCUDAのツールキットPyTorchをインストールする必要があります。

具体的な方法はこちらが参考になりますが、バージョンによって、うまくいかないことが結構ありますので、気を付けてインストールしてください。

例として私の環境は、以下のとおりです。

  • Windows11Pro
  • GeForce RTX 3060 Ti
  • cuda 12.4
  • cuDNN 9.3.0
  • pytorch 2.5.1+cu124
  • Python 3.10.11

以下に手順を記載します。

CUDA Toolkitのインストール

まずGPUの型を確認し、こちら(表:Compute Capability, GPU semiconductors and Nvidia GPU board products)でCompute Capabilityを確認します(下図参照)。

そして、表: Compute Capability (CUDA SDK support vs. Microarchitecture)で対応しているCUDA SDK Version(s)を確認します(下図参照)。

私の場合、Compute Capabilityが8.6で11.4-11.4のバージョンが対応しているようですが、緑背景のバージョンも対応しているようで、12.4でも大丈夫でした。

そして、対象のCUDA Toolkitをダウンロードして、インストールします。

cuDNNのインストール

次に、こちらから自分の環境を選択し、cuDNNをダウンロードして、インストールします。アーカイブはこちらから。

パスの確認

インストールできたらパスが通っているか確認したほうが良いです。

試しにCUDAのバージョン確認を実行します。

パスが通っていれば下図のように、CUDAのバージョンが表示されます。

もしパスが通っていなければ、

先程のこちらのように、設定>システム>バージョン情報>システムの詳細設定から環境変数をクリックし、

システム環境変数のPathをクリックし、編集します。下図のようにCUDAとcuDNNのパスを入力し、OKをクリックして終了です。

これでもう一度、 nvcc -Vを入力し、バージョン情報は表示されなければ再起動を試してみるといいかもしれません。

PyTorchのインストール

CUDAをインストールしたあとはPyTorchをインストールします。

こちらから、自分にあった環境の選択するとコマンドが表示されます(下図参照)。

私の場合は pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124です。

これをPythonのインストールで作成した、仮想環境の中で実行します。

GPUを使用するまでの流れは以上です。

cuDNNのバージョン確認方法

ちなみにcuDNNのバージョンの確認方法は、こちらに方法があります。以下に方法を記載します。

まず、コマンドプロンプトで where cudnn64_*.dllと入力して、cuDNNの場所を特定します。

私の場合は、C:\tools\cuda\bin\cudnn64_9.dllでした。そして、パスのbin以降(bin\cudnn64_9.dllの部分)を変更して、以下のように入力します。

find "#define" "C:\tools\cuda\include\cudnn_version.h"

すると、下図のように結果が表示されるので、CUDNN_MOJOR 9, CUDNN_MINOR 3, CUDNN_PATCHLEVEL 0の数字を取って9.3.0とわかるようです。

OpenSearchへの検索データの追加

プログラムが完成して、GPUを利用できる方はGPUが利用できるようになったら、filebukkinsert.pyを実行します。

実行する際は、作成した仮想環境に入ってから実行することをお忘れなく。

1ファイルずつ追加していき、私の場合、一つ数秒~数十秒で追加できましたので、合計数分で追加完了しました。

CPUだけの場合は、もっと時間かかります。

OpenSearchの検索

データの格納が終わりましたので、OpenSearchで検索ができるか確認します。

以下のコマンドをコマンドプロンプトから実行します。このコマンドはキーワード”羅生門”が含まれる文章をすべて検索するものです。

以下のように結果が出力されます。

ヒットした項目がすべて表示されています。大量の数字の羅列は埋め込みベクトルです。少し見づらいので、戻り値をpathのみに絞ってhighlight機能で文中の“羅生門”の部分を抽出し強調表示してみます。

結果は下図の通り、

確かに、ヒットした項目に”羅生門”が含まれていることがわかります。

正直これだけでも、社内の文章を全文検索するデータベースとして機能しているので、ここからRAGを利用しなくても、このOpenSearchを社内のどこかのサーバに立ち上げとくだけで、簡単に社内の文章検索が可能です。highlight機能は検索フォームなどで検索結果を表示する際に使えそうですね。

OpenSearchにも検索方法として、この他にも様々なものがありますし、別にWebなどで検索フォームを作成すれば、より活用することができると思います。

まとめ

今回はRAGのための下準備とOpenSearchのインストール、データの追加を行いました。

次回は作成したOpenSearchを利用して、RAGを実施します。

参考サイト

Pythonのライブラリ一覧

一応、今回と次回で私の環境でPythonにインストールしたライブラリの一覧を以下に載せておきます。

コメント

タイトルとURLをコピーしました