ChatGPT retrieval plugin  導入メモ

# はじめに
ChatGPTで自前のDB（PostgreSQL16）に保管したドキュメントから自然言語でQAをする仕組みを検証するために、前回までにPostgreSQL16とpgvectorを導入しました。
今回はいよいよChatGPT retrieval pluginを導入します。
特記事項なき場合は作業用の一般ユーザーでコマンド実行します。

# OpenAI APIキーの取得
https://platform.openai.com/api-keys
こちらのサイトから自身のOpenAIのAPIキーを作成、取得します。
APIキーは作成したタイミングでしか確認できませんので、忘れずにテキストエディタなどにコピーし保管しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/5ac49952-26be-c645-8461-886b92106de0.png)

# ChatGPT retrieval plugin の導入
基本的にはGitHubのドキュメントの内容で導入可能です。
https://github.com/openai/chatgpt-retrieval-plugin

### 前提パッケージの導入
PostgreSQLを利用するにはlibpgが必要でしたので、インストールしました。
本来であれば、ソースで導入したものを使うようにすべきかとは思いますが、今回は利用を優先したため、パッケージで導入しています。
```
apt install libpq5
```
### Bearerトークンの取得
下記URLでBearerトークンを作成します。
https://jwt.io/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/1a4d175f-985d-9655-8920-1e2d47b3fb0b.png)
"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が表示されることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/d3dc2e61-d06e-0e9e-8cf1-5a8aefaf7446.png)
4つのエンドポイントがWebから操作できるようになっています。機能は以下のとおり
- /upsert-file
PDF、TXT(md)、DOCX、PPTXをアップロードし、そのテキストとメタデータをベクトルデータベースに保存します。
ファイルはプレーンテキストに変換された上、約200トークンのチャンクに分割され、それぞれに一意のIDが付与されます。レスポンスとして、アップロードされたファイルの内容に対し、発行されたIDを返します。
- /upsert
こちらは、単一のドキュメントのテキストとメタデータをベクトルデータベースに保存します。
チャンクの分割などはupsert-fileと同じです。
- /query
こちらのエンドポイントはChatGPTからベクトルデータベースにアクセスする際に使うエンドポイントになります。
自然言語クエリを実行し、最も関連性の高いチャンクのテキストとメタデータ、関連度合いを返します。
- /delete
ベクトルデータベースに登録したドキュメントを削除します。

#### 動作チェック
1. 画面右上のAuthorizeをクリックし、Bearerトークンを入力し認証
1. Upsert-fileエンドポイントに適当なPDFをアップロード
今回は、Sirilという天体写真画像処理用のソフトウェアのドキュメントPDFをダウンロードし、Upsert-fileで登録しました。
https://siril.readthedocs.io/_/downloads/en/latest/pdf/
1. 正常に登録されたことを確認
1. 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