はじめに
ChatGPTで自前のDB(PostgreSQL16)に保管したドキュメントから自然言語でQAをする仕組みを検証するために、前回までにPostgreSQL16とpgvectorを導入しました。
今回はいよいよChatGPT retrieval pluginを導入します。
特記事項なき場合は作業用の一般ユーザーでコマンド実行します。
OpenAI APIキーの取得
https://platform.openai.com/api-keys
こちらのサイトから自身のOpenAIのAPIキーを作成、取得します。
APIキーは作成したタイミングでしか確認できませんので、忘れずにテキストエディタなどにコピーし保管しましょう。
ChatGPT retrieval plugin の導入
基本的にはGitHubのドキュメントの内容で導入可能です。
https://github.com/openai/chatgpt-retrieval-plugin
前提パッケージの導入
PostgreSQLを利用するにはlibpgが必要でしたので、インストールしました。
本来であれば、ソースで導入したものを使うようにすべきかとは思いますが、今回は利用を優先したため、パッケージで導入しています。
apt install libpq5
Bearerトークンの取得
下記URLでBearerトークンを作成します。
https://jwt.io/
"your-256-bit-secret" の箇所に自身のOpenAI APIキーを入れて左側のトークンをコピーし保存しておきます。
ChatGPT retrival pluginのセットアップ
リポジトリからのクローン
git clone https://github.com/openai/chatgpt-retrieval-plugin.git
PostgreSQLにテーブルを作成
エラーが表示されずテーブルが作成できている事を別途確認してください。
cd
psql -h localhost -p 5432 -U <DB接続ユーザー> -d <接続先DB> -f chatgpt-retrieval-plugin/examples/providers/supabase/migrations/20230414142107_init_pg_vector.sql
poetryで関連Pythonパッケージの導入と仮想環境準備
cd chatgpt-retrieval-plugin/
pip install poetry
poetry env use python3.10
poetry shell
poetry install
環境変数を設定し起動
下記の環境変数を設定し最後のpoetry run start
コマンドで起動します。
export DATASTORE=postgres
export BEARER_TOKEN=<上の手順で取得したBearerトークン>
export PG_HOST=<PostgreSQLサーバのIPもしくはホスト名>
export PG_PORT=<PostgreSQLのポート>
export PG_USER=<接続ユーザー>
export PG_PASSWORD=<接続ユーザーのパスワード>
export PG_DB=<利用するPostgreSQLのDataBase>
poetry run start
ChatGPT retrieval plugin動作確認
http://<インストールしたサーバのIP>:8000 にアクセスし、下記WebUIが表示されることを確認します。
4つのエンドポイントがWebから操作できるようになっています。機能は以下のとおり
- /upsert-file
PDF、TXT(md)、DOCX、PPTXをアップロードし、そのテキストとメタデータをベクトルデータベースに保存します。
ファイルはプレーンテキストに変換された上、約200トークンのチャンクに分割され、それぞれに一意のIDが付与されます。レスポンスとして、アップロードされたファイルの内容に対し、発行されたIDを返します。 - /upsert
こちらは、単一のドキュメントのテキストとメタデータをベクトルデータベースに保存します。
チャンクの分割などはupsert-fileと同じです。 - /query
こちらのエンドポイントはChatGPTからベクトルデータベースにアクセスする際に使うエンドポイントになります。
自然言語クエリを実行し、最も関連性の高いチャンクのテキストとメタデータ、関連度合いを返します。 - /delete
ベクトルデータベースに登録したドキュメントを削除します。
動作チェック
- 画面右上のAuthorizeをクリックし、Bearerトークンを入力し認証
- Upsert-fileエンドポイントに適当なPDFをアップロード
今回は、Sirilという天体写真画像処理用のソフトウェアのドキュメントPDFをダウンロードし、Upsert-fileで登録しました。
https://siril.readthedocs.io/_/downloads/en/latest/pdf/ - 正常に登録されたことを確認
- PostgreSQLからレコードの登録を確認
上記ドキュメントで680行のレコードとなった。
gptretdb=# select source,document_id,count(embedding) from documents group by document_id,source;
source | document_id | count
--------+--------------------------------------+-------
file | ee1c666c-e537-4fa9-aac0-2797ddde9d3b | 680
file | 8e5f5adf-6115-4643-9719-06f3dfde6fa6 | 1
参考にしたURL
本作業及び本頁作成にを実施するにあたり、下記のURLの記事を参考にしました。ありがとうございます。
https://www.slideshare.net/nttdata-tech/postgresql-chatgpt-odc2023-nttdata
https://push.co.jp/archives/616