Traffine I/O

日本語

2023-06-11

ChatGPT Retrieval Plugin

ChatGPT Retrieval Pluginとは

ChatGPT Retrieval Pluginは、個人または組織のドキュメントのセマンティックサーチと取得を可能にするプラグインです。ここで、セマンティックサーチとは、検索ユーザーの意図・目的を適切に理解し、ユーザーの求める結果を提供する概念のことです。ユーザーは自然言語で質問したりニーズを表現したりすることで、ベクトルDBに格納されているファイル、メモ、メールなどのデータソースからもっとも関連性の高いドキュメントのチャンクを取得することができます。このプラグインを使用することで、ChatGPTを介して内部ドキュメントを参照したレスポンスを返すことが可能です。

ChatGPT Retrieval Pluginの仕組み

ChatGPT Retrieval Pluginは次のような仕組みとなっています。

  1. OpenAIのtext-embedding-ada-002埋め込みモデルを使用してドキュメントのチャンクの埋め込みを生成
  2. ベクトルDBに埋め込みを保存
  3. ベクトルDBに対してクエリを実行

サポートされているベクトルDB

ChatGPT Retrieval Pluginは、さまざまなベクトルDBのプロバイダーをサポートしており、それぞれが異なる機能、パフォーマンスを持っています。。選択するプロバイダーによっては、異なるDockerfileを使用し、異なる環境変数を設定する必要があります。

以下はChatGPT Retrieval PluginがサポートしているベクトルDBです。

  • Pinecone
  • Weaviate
  • Zilliz
  • Milvus
  • Qdrant
  • Redis
  • LlamaIndex
  • Chroma
  • Azure Cognitive Search
  • Supabase
  • Postgres
  • AnalyticDB

また、ソースコードを編集して、デフォルトでサポートされていないベクトルDBを使うことも可能です。

https://www.m3tech.blog/entry/chatgpt-retrieval-plugin-vector-search

ChatGPT Retrieval Pluginのセットアップ

ChatGPTの検索プラグインセットアップして実行するためには、次の手順に従います。

  1. インストールされていない場合は、Python 3.10をインストール

  2. レポジトリをクローン

bash
$ git clone https://github.com/openai/chatgpt-retrieval-plugin.git
  1. クローンしたリポジトリのディレクトリに移動
bash
$ cd /path/to/chatgpt-retrieval-plugin
  1. poetryをインストール
bash
$ pip install poetry
  1. Python 3.10を使用した新しい仮想環境を作成
bash
$ poetry env use python3.10
  1. 仮想環境をアクティベート
bash
$ poetry shell
  1. 依存関係をインストール
bash
$ poetry install
  1. Bearerトークンの作成

  2. 必要な環境変数の設定

DATASTOREBEARER_TOKENOPENAI_API_KEYは必須の環境変数です。その他、選択したベクトルDBの環境変数を設定します。

名前 必須 説明
DATASTORE Yes ベクトルDBのプロバイダーを指定します。埋め込みを保存およびクエリするためのDBをchromapineconeweaviatezillizmilvusqdrantredisazuresearchsupabasepostgresanalyticdbから選択できます。
BEARER_TOKEN Yes APIへのリクエストを認証するために必要なシークレットトークンです。好きなツールや方法を使用して生成できます。例えば、jwt.ioなどです。
OPENAI_API_KEY Yes text-embedding-ada-002モデルを使用して埋め込みを生成するために必要なOpenAI APIキーです。OpenAIでアカウントを作成することでAPIキーを取得できます。
bash
$ export DATASTORE=<your_datastore>
$ export BEARER_TOKEN=<your_bearer_token>
$ export OPENAI_API_KEY=<your_openai_api_key>

# Optional environment variables used when running Azure OpenAI
$ export OPENAI_API_BASE=https://<AzureOpenAIName>.openai.azure.com/
$ export OPENAI_API_TYPE=azure
$ export OPENAI_EMBEDDINGMODEL_DEPLOYMENTID=<Name of text-embedding-ada-002 model deployment>
$ export OPENAI_METADATA_EXTRACTIONMODEL_DEPLOYMENTID=<Name of deployment of model for metatdata>
$ export OPENAI_COMPLETIONMODEL_DEPLOYMENTID=<Name of general model deployment used for completion>
$ export OPENAI_EMBEDDING_BATCH_SIZE=<Batch size of embedding, for AzureOAI, this value need to be set as 1>

# Add the environment variables for your chosen vector DB.
# Some of these are optional; read the provider's setup docs in /docs/providers for more information.

# Pinecone
$ export PINECONE_API_KEY=<your_pinecone_api_key>
$ export PINECONE_ENVIRONMENT=<your_pinecone_environment>
$ export PINECONE_INDEX=<your_pinecone_index>

# Weaviate
$ export WEAVIATE_URL=<your_weaviate_instance_url>
$ export WEAVIATE_API_KEY=<your_api_key_for_WCS>
$ export WEAVIATE_CLASS=<your_optional_weaviate_class>

# Zilliz
$ export ZILLIZ_COLLECTION=<your_zilliz_collection>
$ export ZILLIZ_URI=<your_zilliz_uri>
$ export ZILLIZ_USER=<your_zilliz_username>
$ export ZILLIZ_PASSWORD=<your_zilliz_password>

# Milvus
$ export MILVUS_COLLECTION=<your_milvus_collection>
$ export MILVUS_HOST=<your_milvus_host>
$ export MILVUS_PORT=<your_milvus_port>
$ export MILVUS_USER=<your_milvus_username>
$ export MILVUS_PASSWORD=<your_milvus_password>

# Qdrant
$ export QDRANT_URL=<your_qdrant_url>
$ export QDRANT_PORT=<your_qdrant_port>
$ export QDRANT_GRPC_PORT=<your_qdrant_grpc_port>
$ export QDRANT_API_KEY=<your_qdrant_api_key>
$ export QDRANT_COLLECTION=<your_qdrant_collection>

# AnalyticDB
$ export PG_HOST=<your_analyticdb_host>
$ export PG_PORT=<your_analyticdb_port>
$ export PG_USER=<your_analyticdb_username>
$ export PG_PASSWORD=<your_analyticdb_password>
$ export PG_DATABASE=<your_analyticdb_database>
$ export PG_COLLECTION=<your_analyticdb_collection>

# Redis
$ export REDIS_HOST=<your_redis_host>
$ export REDIS_PORT=<your_redis_port>
$ export REDIS_PASSWORD=<your_redis_password>
$ export REDIS_INDEX_NAME=<your_redis_index_name>
$ export REDIS_DOC_PREFIX=<your_redis_doc_prefix>
$ export REDIS_DISTANCE_METRIC=<your_redis_distance_metric>
$ export REDIS_INDEX_TYPE=<your_redis_index_type>

# Llama
$ export LLAMA_INDEX_TYPE=<gpt_vector_index_type>
$ export LLAMA_INDEX_JSON_PATH=<path_to_saved_index_json_file>
$ export LLAMA_QUERY_KWARGS_JSON_PATH=<path_to_saved_query_kwargs_json_file>
$ export LLAMA_RESPONSE_MODE=<response_mode_for_query>

# Chroma
$ export CHROMA_COLLECTION=<your_chroma_collection>
$ export CHROMA_IN_MEMORY=<true_or_false>
$ export CHROMA_PERSISTENCE_DIR=<your_chroma_persistence_directory>
$ export CHROMA_HOST=<your_chroma_host>
$ export CHROMA_PORT=<your_chroma_port>

# Azure Cognitive Search
$ export AZURESEARCH_SERVICE=<your_search_service_name>
$ export AZURESEARCH_INDEX=<your_search_index_name>
$ export AZURESEARCH_API_KEY=<your_api_key> (optional, uses key-free managed identity if not set)

# Supabase
$ export SUPABASE_URL=<supabase_project_url>
$ export SUPABASE_ANON_KEY=<supabase_project_api_anon_key>

# Postgres
$ export PG_HOST=<postgres_host>
$ export PG_PORT=<postgres_port>
$ export PG_USER=<postgres_user>
$ export PG_PASSWORD=<postgres_password>
$ export PG_DATABASE=<postgres_database>
  1. ローカルでAPIを実行
bash
$ poetry run start
  1. http://0.0.0.0:8000/docsでAPIのドキュメントにアクセスし、APIのエンドポイントをテスト(Bearerトークンを追加することを忘れずに)

ChatGPT retrieval plugin swagger

APIエンドポイント

ChatGPT Retrieval Pluginは、PythonでAPIを構築するためのウェブフレームワークであるFastAPIを使用して構築されています。FastAPIを使用することで、APIエンドポイントの簡単な開発、バリデーション、およびドキュメント化が可能になります。

ChatGPT Retrieval Pluginは、ベクトルDBへのドキュメントのアップサート、クエリ、削除のためのエンドポイント公開しています。全てのリクエストとレスポンスはJSON形式であり、有効なBearerトークンを認証ヘッダーとして要求します。

  • /upsert
    このエンドポイントでは、1つ以上のドキュメントをアップロードし、そのテキストとメタデータをベクトルデータベースに保存することができます。ドキュメントは約200トークンずつのチャンクに分割され、各チャンクには固有のIDがあります。エンドポイントはリクエストボディ内のドキュメントのリストを想定しており、各ドキュメントにはtextフィールドとオプションのidフィールドおよびmetadataフィールドが含まれています。metadataフィールドには、sourcesource_idurlcreated_atauthorのサブフィールドを含めることができます。エンドポイントは挿入されたドキュメントのIDのリストを返します(IDが最初に提供されていない場合はIDが生成されます)。

  • /upsert-file
    このエンドポイントでは、単一のファイル(PDF、TXT、DOCX、PPTX、またはMD)をアップロードし、そのテキストとメタデータをベクトルデータベースに保存することができます。ファイルはプレーンテキストに変換され、約200トークンずつのチャンクに分割されます。エンドポイントは、挿入されたファイルの生成されたIDを含むリストを返します。

  • /query
    このエンドポイントでは、自然言語クエリとオプションのメタデータフィルタを使用してベクトルデータベースをクエリすることができます。エンドポイントは、リクエストボディ内のクエリのリストを想定しており、各クエリにはqueryフィールドとオプションのfilterフィールドおよびtop_kフィールドが含まれています。filterフィールドには、sourcesource_iddocument_idurlcreated_atauthorのサブセットを含めることができます。top_kフィールドは、指定されたクエリに対して返される結果の数を指定し、デフォルト値は3です。エンドポイントは、各クエリに対してもっとも関連性の高いドキュメントチャンクのリストを含むオブジェクトのリストを返します。各オブジェクトには、テキスト、メタデータ、類似度スコアが含まれます。

  • /delete
    このエンドポイントでは、ID、メタデータフィルタ、またはdelete_allフラグを使用して、ベクトルデータベースから1つ以上のドキュメントを削除することができます。エンドポイントは、リクエストボディ内のidsfilter、またはdelete_allのパラメータを少なくとも1つ受け取ります。idsパラメータは、削除するドキュメントのIDのリストで、これらのIDを持つドキュメントの全てのチャンクが削除されます。filterパラメータには、sourcesource_iddocument_idurlcreated_atauthorのサブフィールドを含めることができます。delete_allパラメータは、ベクトルデータベースから全てのドキュメントを削除するかどうかを示すブール値です。エンドポイントは、削除が成功したかどうかを示すブール値を返します。

参考

https://github.com/openai/chatgpt-retrieval-plugin
https://note.com/npaka/n/n238d33db593e
https://www.m3tech.blog/entry/chatgpt-retrieval-plugin-vector-search

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!