この小規模プロジェクトは、検索拡張生成 (RAG) 技術を利用したナレッジ ベースに WordPress ブログ エントリを組み込むことを目的としています。
このプロジェクトの前提は単純です。一連のスクリプトがコマンド ラインを介して特定のアクションを実行します。各スクリプトは自己完結型であり、独自のコンテキスト内で各アクションを比較的簡単に示すのに役立ちます。
デフォルトでは、含まれているスクリプトは無料のオープンソースのライブラリとモデルを使用しますが、アクセス権がある場合は OpenAI の LLM を使用するオプションも利用できます。この例は、互換性のある GPU がない場合でも、YMMV を使用すれば CPU 上で実行できるはずです。
RAG は、検索システムと生成言語モデルという 2 つのコンポーネントを利用します。検索システムは、データ ストア/ナレッジ ベース (ブログ投稿のコレクションなど) からクエリに関連するドキュメントをクエリします。取得されたドキュメントは言語モデルに入力され、ユーザーに対して情報を提供した応答が生成されます。 RAG を使用する主な利点の 1 つは、微調整や再トレーニングを必要とせずに、AI システムがトレーニング データを超えて拡張できることです。データは、データ ストア内で動的に追加および更新できます。クエリ結果には、言語モデルが提供するテキストだけでなく、関連するドキュメントやソースのコレクションも含めることができます。 RAG について詳しくは、IBM Research Blog をご覧ください。
これは立ち上げて実行するのが非常に簡単なプロジェクトです...
まずプロジェクトの仮想環境をセットアップし、アクティブ化します。
python3 -m venv virtualenv
source ./virtualenv/bin/activate
このプロジェクトのすべての依存関係は、 requirements.txt
ファイルを使用してインストールできます。そうする場合、このドキュメントではpip
介して他のパッケージを手動でインストールする必要はありません。
pip install -r requirements.txt
env.example
ガイドとして使用して.env
ファイルを作成します。
cp env.example .env
これはWordPressデータをダウンロードする際に重要になります。 Wordpress のユーザー名、アプリケーションのパスワード、ブログのドメインを.env
にコピーしてください。注: これは、ブログがルート パスにあることを前提としています。
pip install --upgrade python-dotenv requests pandas langchain langchain_community html2text sentence_transformers
wordpress コンテンツを./data
ディレクトリにダウンロードします (現時点では、ブログがドメイン ルートにあることを前提としています)。
python3 wordpress-dl.py
PGVector は、Postgresql データベースにテキスト埋め込み (ベクター) を保存およびクエリするために使用されます。 PGVector の利点の 1 つは、既存のデータベース システムに追加でき、独自のサードパーティ製品を必要としないことです。
pgvector 埋め込みサポートの場合:
pip install pgvector psycopg2-binary
適切な.env
値があることを確認してください。ローカル開発ではデフォルトで問題ありませんが、既存の Postgres データベースを使用している (つまり、Docker イメージを実行していない) 場合は、異なる結果になる可能性があります。ここでは、セットアップをシンプルにするために Docker イメージを使用していますが、pgvector 拡張機能を自分で追加してロードできる場合は、別の PostgreSQL インスタンスを簡単に使用できます。
./postgres
で Docker イメージを実行するには:
docker compose up
埋め込みスクリプトを実行して、WordPress をダウンロードし、埋め込みを postgres データベースに保存します。これには時間がかかる場合があります。 _データベースにデータを挿入する場合、つまり、データを消去してクリーンなデータから開始する場合は、 --embed
CLI 引数を渡します。
python3 embed.py --embed
デフォルトでは、テスト用に 1 つのレコードのみが挿入されます (つまり、 --limit
指定せずに 1 より大きい整数を指定すると、最初のレコードのベクトル埋め込みのみが作成されます)。そのため、余分な計算時間を費やすことなくテストが容易になります。
追加情報が必要な場合は、 --verbose
を渡します
サンプル呼び出しは次のようになります。
python3 embed.py --verbose --embed --limit 100
...ただし、WordPress ブログに合わせて適切なサイズの制限を増やしてください。この数がエントリの数より大きくても問題はありません。最大レコード数までインポートするのが賢明です。
このリポジトリでは、ローカルと API ベースの両方のユースケースを示します。ローカルで実行されるモデルの利点の 1 つは、データが非公開のままであり、他の人のモデルのトレーニングに使用されないことです。さらに、クエリをサーバーまたはネットワークに対してローカルに保持することで、パフォーマンスがある程度向上する可能性がありますが、セルフホスト システムでは API 使用コストが発生しません。一方、OpenAI にはこのプロジェクトで使用されるモデルよりもはるかに大きなコンテキスト ウィンドウがあり、OpenAI モデルは非常に優れている可能性があるため、API の使用が望ましい場合もあります。
ローカル言語モデルの使用には、 trsnformers
python パッケージと pytorch ( torch
) が必要です。
pip install transformers torch llama-cpp-python
次に、このオフライン アプローチで使用されるモデルをダウンロードします。言語モデルは大きくなる可能性があるため (数 GB)、デモ用に小さい Llama モデルを選択しました。さらに小さなモデルも使用できますが、コンテキスト ウィンドウの限界に達することが多く、これは軽減できますが、このプロジェクトの範囲外です。このプロジェクトはTheBloke/Llama-2-7b-Chat-GGUF
( Q4_K_M
) を使用します。
( huggingface-cli
がインストールされていない場合は、ここで詳細を確認できます)。
huggingface-cli download TheBloke/Llama-2-7b-Chat-GGUF llama-2-7b-chat.Q4_K_M.gguf --local-dir ./models/ --local-dir-use-symlinks True
このコマンドは、モデルをユーザー アカウントのキャッシュ ディレクタにダウンロードし、モデル ディレクトリからシンボリックリンクを作成します。
モデルがダウンロードされたら、デフォルトのオプションであるローカル推論を実行できます。手順については、次のセクション「クエリ」を参照してください。
OpenAI APIを使用するにはインストールが必要です
pip install langchain_openai
OpenAI API キーが.env
ファイルに保存されていることを確認してください。 OpenAI Platform API Key タブで設定できます: OPENAI_API_KEY="...
このプロジェクトでは、ドキュメント (埋め込みおよび取得) は次の一般的な構造を持っています。
## document
## page_content
## metadata
## id
## link
## title
## categories
## tags
結果はタプル (idx、Document) のList
として返されることが多いため、リストを列挙することが適切です。
for ( idx , doc ) in enumerate ( results [" docs ]):
print ( f" { doc . metadata [ 'title' ] } " )
LLM 応答を拡張するために最も役立つデータは、埋め込み中に入力されるデータの辞書であるmetadata
プロパティに含まれます。
CLI からのクエリの実行は簡単です。
...ローカルモデル:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? "
...OpenAI を使用:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? " --use-api
しばらくすると、次のような応答が表示されると予想されます。
❓ 'Does RaspberryPi have GPIO that swift can use?'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yes, RasbperryPi has GPIO that swift can use as per the context given.
- - Supporing Docs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
? Accessing Raspberry Pi GPIO Pins (With Swift) ? https://archive.mistercameron.com/2016/06/accessing-raspberry-pi-gpio-pins-with-swift/
? Currently, Swift on Raspberry Pi3 ? https://archive.mistercameron.com/2016/04/currently-swift-on-raspberry-pi3/
? Compile Swift 3.0 on Your ARM computers (Raspberry Pi, BeagleBone Black, etc) ? https://archive.mistercameron.com/2016/06/compile-swift-3-0-on-your-arm-computer/
? Ready Your Raspberry Pi for Swift ? https://archive.mistercameron.com/2016/05/ready-your-raspberry-pi-for-swift/
~ ~ ~ ~ ~ Finished in 14.80s ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
********************************************************************************
データとモデルをテストするときに役立つ追加の引数があります。その他のオプションについては、 python3 query.py --help
を実行してください。