ChatGPT Retrieval PluginのAPIをローカルで動かしてみる
はじめに
ChatGPT Pluginは現在ウェイトリスト受付中の段階で、私もまだ試すことができません。そこで、OpenAIが公式のサンプルとして公開しているChatGPT Retrieval PluginのAPIをローカル環境で動かしてみて、Plugin開発の雰囲気を掴んでみたいと思います。
本記事の前提知識として、以下の公式情報を読むことをおすすめします。
ChatGPT Retrieval Pluginの概要
ChatGPT Retrieval Pluginは、自然言語の問い合わせにより個人や組織のドキュメント検索を行うことができるプラグインです。ChatGPTからのリクエストに応答するエンドポイントを実装することで、ChatGPTにドキュメント検索機能を追加することができます。
セットアップ
READMEのQuickstartの手順に従ってセットアップしていきます。
手順では、Pythonの構成管理にはpoetryが使われていますので、この記事でもpoetryを使っていきます。
Datastoreはいくつかの選択肢が与えられていますが、ここらの違いが分かってないので、ひとまず一番上にあるPineconeを使うことにします。
Pineconeのセットアップ手順に従い、セットアップします。
- Pinecone にサインアップする
- ダッシュボードのAPI Keysから、
API_KEY
とENVIRONMENT
を取得する
ここまでできたら環境変数をセットします。
- BEARER_TOKENはAPIのAPIキーのようなものです。適当に
secret
とします。 - Indexの名前は
chatgpt-retrieval-plugin
とします。Indexはまだ作成していなくて大丈夫です。
export DATASTORE=pinecone export BEARER_TOKEN=secret export OPENAI_API_KEY=[OpenAIのAPIキー] # Pinecone export PINECONE_API_KEY=[PineconeのAPIキー] export PINECONE_ENVIRONMENT=us-east4-gcp export PINECONE_INDEX=chatgpt-retrieval-plugin
環境変数のセットができたら、以下のスクリプトを作成します。
import os, pinecone pinecone.init(api_key=os.environ['PINECONE_API_KEY'], environment=os.environ['PINECONE_ENVIRONMENT']) pinecone.create_index(name=os.environ['PINECONE_INDEX'], dimension=1536, metric='cosine', metadata_config={ "indexed": ['source', 'source_id', 'url', 'created_at', 'author', 'document_id']})
スクリプトを実行してIndexを作成します。
$ poetry run python setup_pinecone.py
スクリプトの実行が完了するまで30秒くらいかかるので待ちます。PineconeのIndexが作成され、StatusがReadyになるまで待ってから完了するようです。
最後に、サーバーを起動します。
$ poetry run start
動作確認
http://0.0.0.0:8000/docs にアクセスするとSwagger UIが開きます。ここからAPIのリクエストを試すことができます。
はじめにAuthorizeを開き、環境変数 BEARER_TOKEN
に設定した値をセットします。
POST /query
ChatGPTからのリクエストに応答するエンドポイントです。
叩いてみますが、いまはIndexに何もデータがないのでresultsが空で返ってきます。
初期データの登録
Indexに初期データを登録するためのスクリプトが用意されています。手順を読んで、データを登録します。より具体的なデータにするため、ChatGPTにECサイトの領収書のサンプルデータを作成してもらいました。
サンプルデータ
[ { "id": "1", "text": "領収書番号:0001、購入日時:2020年2月20日14時、購入商品:スーパーウルトラケース、購入個数:1個、価格:2500円、お支払い方法:クレジットカード決済、お届け先:東京都新宿区、お届け日時:2020年2月22日、商品の詳細:最新の技術を応用し、耐衝撃性を高めたスーパーウルトラケースです。薄くて軽量で、耐久性の高いアルミ製ボディに、落下時の衝撃を大幅に減らす効果があります。", "source": "file", "source_id": "https://example.com/doc1", "url": "https://example.com/doc1", "created_at": "2021-01-01T12:00:00Z", "author": "Alice" }, { "id": "2", "text": "領収書番号:0002、購入日時:2021年3月5日15時、購入商品:ノートパソコン、購入個数:1台、価格:120000円、お支払い方法:銀行振込、お届け先:大阪府堺市、お届け日時:2021年3月8日、商品の詳細:最新のCPUとGPUを搭載した高性能ノートパソコンです。15.6インチのフルHDディスプレイに、大容量のSSDを搭載しています。ビジネスシーンからプライベートまで幅広く使えます。", "source": "file", "source_id": "https://example.com/doc2", "url": "https://example.com/doc2", "created_at": "2021-03-06T10:00:00Z", "author": "Bob" }, { "id": "3", "text": "領収書番号:0003、購入日時:2021年4月10日11時、購入商品:ワイヤレスイヤホン、購入個数:2個、価格:12000円、お支払い方法:クレジットカード決済、お届け先:東京都渋谷区、お届け日時:2021年4月12日、商品の詳細:Bluetooth 5.0に対応したワイヤレスイヤホンです。高音質で、ノイズキャンセリング機能も搭載しています。片耳モードにも対応しており、ワンタッチで切り替えられます。", "source": "file", "source_id": "https://example.com/doc3", "url": "https://example.com/doc3", "created_at": "2021-04-10T13:00:00Z", "author": "Charlie" }, { "id": "4", "text": "領収書番号:0004、購入日時:2021年5月20日9時、購入商品:コーヒーマシン、購入個数:1台、価格:35000円、お支払い方法:代金引換、お届け先:神奈川県横浜市、お届け日時:2021年5月22日、商品の詳細:簡単に本格的なコーヒーが楽しめるコーヒーマシンです。ドリップ式で、豆から挽いたコーヒーを使用することができます。タンクに水を入れるだけで、簡単にコーヒーが淹れられます。", "source": "file", "source_id": "https://example.com/doc4", "url": "https://example.com/doc4", "created_at": "2021-05-20T12:00:00Z", "author": "David" }, { "id": "5", "text": "領収書番号:0005、購入日時:2021年6月1日14時、購入商品:スマートフォン、購入個数:1台、価格:80000円、お支払い方法:クレジットカード決済、お届け先:北海道札幌市、お届け日時:2021年6月3日、商品の詳細:最新のスマートフォンです。5G対応で、高速な通信が可能です。6.7インチの大画面ディスプレイに、高精細なカメラを搭載しています。バッテリーも長持ちで、快適なスマートフォンライフを楽しめます。", "source": "file", "source_id": "https://example.com/doc5", "url": "https://example.com/doc5", "created_at": "2021-06-01T14:30:00Z", "author": "Emily" }, { "id": "6", "text": "領収書番号:0006、購入日時:2021年7月15日11時、購入商品:ノートパソコン、購入個数:1台、価格:150000円、お支払い方法:クレジットカード決済、お届け先:東京都千代田区、お届け日時:2021年7月17日、商品の詳細:高性能なノートパソコンです。最新のCPUとGPUを搭載しており、快適な動作が可能です。15.6インチのフルHDディスプレイに、大容量のSSDを搭載しています。高速なWi-Fiにも対応しています。", "source": "file", "source_id": "https://example.com/doc6", "url": "https://example.com/doc6", "created_at": "2021-07-15T12:00:00Z", "author": "Frank" }, { "id": "7", "text": "領収書番号:0007、購入日時:2021年8月20日17時、購入商品:スマートウォッチ、購入個数:1個、価格:25000円、お支払い方法:代金引換、お届け先:大阪府堺市、お届け日時:2021年8月22日、商品の詳細:健康管理に役立つスマートウォッチです。心拍数や睡眠時間、消費カロリーなどを計測することができます。スポーツシーンにも対応しており、ランニングやウォーキングのトレーニングがより効果的になります。", "source": "file", "source_id": "https://example.com/doc7", "url": "https://example.com/doc7", "created_at": "2021-08-20T17:30:00Z", "author": "Grace" } ]
以下のスクリプトを実行して、Indexにデータを登録します。
$ poetry run python process_json.py --filepath example.json
再びPOST /query
今度はqueryの文字列に応じて、それに近しい文章が返ってくるようになりました。
ChatGPTはこのレスポンスを受け取り、更に自然な文章で返答を生成します。APIのレスポンスは、自然な文章ではなくJSONデータで良いようです。
その他のエンドポイント
データの更新用として、以下のエンドポイントが用意されていますので、軽く紹介します。基本的にはマスターのデータが更新された時にIndexを更新するためのWebhookとして使うことを想定しているようです。
POST /upsert
Indexのデータを更新します。
その他に、会話の断片をこのエンドポイントを経由して保存しておき、あとから参照できるようにするというオプションも用意されています。
https://github.com/openai/chatgpt-retrieval-plugin/tree/main/examples/memory
POST /upsert-file
ファイルからテキストを抽出してIndexに登録します。データ形式として、PDF、docx、txt、markdown、pptx、CSVなどがサポートされています。
DELETE /delete
Indexに登録されているデータを削除します。
メタデータ
ChatGPT Pluginに必要なメタ情報です。詳細は省きます。
- GET /.well-known/ai-plugin.json
- GET /.well-known/logo.png
- GET /.well-known/openapi.yaml
まとめ
サンプル実装を読み解くことで、ChatGPT Plugin開発に必要な具体的な要素が分かりました。ウェイトリストの順番が来たらすぐに試せるように準備しておこうと思います?♂️?♂️?♂️