ChatGPT Retrieval PluginのAPIをローカルで動かしてみる

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

ChatGPT Pluginは現在ウェイトリスト受付中の段階で、私もまだ試すことができません。そこで、OpenAIが公式のサンプルとして公開しているChatGPT Retrieval PluginのAPIをローカル環境で動かしてみて、Plugin開発の雰囲気を掴んでみたいと思います。

本記事の前提知識として、以下の公式情報を読むことをおすすめします。

ChatGPT Retrieval Pluginの概要

ChatGPT Retrieval Pluginは、自然言語の問い合わせにより個人や組織のドキュメント検索を行うことができるプラグインです。ChatGPTからのリクエストに応答するエンドポイントを実装することで、ChatGPTにドキュメント検索機能を追加することができます。

セットアップ

READMEのQuickstartの手順に従ってセットアップしていきます。

手順では、Pythonの構成管理にはpoetryが使われていますので、この記事でもpoetryを使っていきます。

Datastoreはいくつかの選択肢が与えられていますが、ここらの違いが分かってないので、ひとまず一番上にあるPineconeを使うことにします。

Pineconeのセットアップ手順に従い、セットアップします。

  1. Pinecone にサインアップする
  2. ダッシュボードのAPI Keysから、API_KEYENVIRONMENT を取得する

ここまでできたら環境変数をセットします。

  • 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開発に必要な具体的な要素が分かりました。ウェイトリストの順番が来たらすぐに試せるように準備しておこうと思います?‍♂️?‍♂️?‍♂️