ChatGPT Retrieval Plugin を試す
「ChatGPT Retrieval Plugin」を試したので、まとめました。
1. ChatGPT Retrieval Plugin
「ChatGPT Retrieval Plugin」は、情報提供を許可した個人・団体のデータにアクセスできる「ChatGPTプラグイン」です。OpenAI公式の「ChatGPTプラグイン」の実装になります。
2. ベクトルデータベースの準備
「ChatGPT Retrieval Plugin」は、ドキュメントの埋め込みの保存とクエリにベクトルデータベースを使います。
以下のデータベースに対応しています。
今回は、「Pinecone」を使います。
(1) 「Pinecone」のアカウントを作成してログイン。
(2) 以下の設定でインデックスを作成。
(3) 「Pinecone Console」の「API Keys」で「PineconeのAPIキー」「Pineconeの環境名」を確認。
後ほど環境変数で設定します。
3. JWTトークンの準備
「jwt.io」でJWTトークンを作成します。APIへのリクエストを認証するためのシークレットトークンです。
今回は、ローカルで動作確認したいだけなので、「Encoded」をコピーするだけでも動作しました。本番ではもちろんきちんと設定する必要あります。
4. サーバーの起動
サーバーの起動手順は、次のとおりです。
(1) ローカルPCで「Python 3.10」の仮想環境を準備。
(2) 「chatgpt-retrieval-plugin」リポジトリのクローン後、ルートフォルダに移動。
$ git clone https://github.com/openai/chatgpt-retrieval-plugin.git
$ cd chatgpt-retrieval-plugin
(3) poetryのインストール。
$ pip install poetry
(4) 「chatgpt-retrieval-plugin」用のPython仮想環境の作成し、有効化し、依存パッケージをインストール。
$ poetry env use python3.10
$ poetry shell
$ poetry install
(5) 環境変数の準備
macOSでは「.zshrc」に以下を追記後、「source ~/.zshrc」で反映させます。
export DATASTORE=pinecone
export BEARER_TOKEN=<BEARER_TOKEN>
export OPENAI_API_KEY=<OpenAI_APIのAPIキー>
export PINECONE_API_KEY=<PineconeのAPIキー>
export PINECONE_ENVIRONMENT=<Pineconeの環境名>
export PINECONE_INDEX=<インデックス名>
(6) サーバーの実行。
$ poetry run start
(7) ブラウザで「http://0.0.0.0:8000/docs」(または http://localhost:8000/docs)にアクセス。
OpenAPIドキュメントが開きます。APIエンドポイントを動作確認できます。Bearerトークンが必要です。
5. LlamaIndexからの操作
「LlamaIndex」で、「ChatGPT Retrieval Plugin」を操作します。
(1) ローカルPCで「Python 3.10」の仮想環境を準備。
(2) 「Jupyter Notebook」パッケージのインストールして起動。
$ pip install jupyter
$ jupyter notebook
(3) 「新規 → Python 3」でJupyterのノートブックを作成。
(4) 「LlamaIndex」パッケージのインストール。
# パッケージのインストール
!pip install llama-index
(5) 環境変数の準備。
以下のコードの <OpenAI_APIのトークン> にはOpenAI APIのトークンを指定します。(有料)
import os
os.environ["OPENAI_API_KEY"] = "<OpenAI_APIのトークン>"
(6) ログレベルの設定。
import logging
import sys
# ログレベルの設定
logging.basicConfig(stream=sys.stdout, level=logging.INFO, force=True)
(7) 「data」フォルダを作成し、ドキュメント「bocchi.txt」を配置。
「bocchi.txt」は以下で使ったものと同様になります。
(8) ドキュメントの読み込み。
from llama_index import SimpleDirectoryReader
# ドキュメントの読み込み
documents = SimpleDirectoryReader("data").load_data()
(9) ChatGPTRetrievalPluginIndexの作成。
「ChatGPT Retrieval Plugin」経由で、ドキュメントを埋め込みに変換して、Pineconeに格納されます。
from llama_index.indices.vector_store import ChatGPTRetrievalPluginIndex
# ChatGPTRetrievalPluginIndexの作成
index = ChatGPTRetrievalPluginIndex(
documents,
endpoint_url="http://localhost:8000",
bearer_token=os.getenv("BEARER_TOKEN"),
)
(10) 質問応答。
# 質問応答
response = index.query("ぼっちちゃんの得意な楽器は?")
print(response)
ぼっちちゃんの得意な楽器はギターです。
6. LangChainからの操作
「LangChain」で、「ChatGPT Retrieval Plugin」を操作します。
(1) ローカルPCで「Python 3.10」の仮想環境を準備。
(2) 「Jupyter Notebook」パッケージのインストールして起動。
$ pip install jupyter
$ jupyter notebook
(3) 「新規 → Python 3」でJupyterのノートブックを作成。
(4) 「LangChain」パッケージのインストール。
# パッケージのインストール
!pip install langchain
!pip install openai
(5) 環境変数の準備。
以下のコードの <OpenAI_APIのトークン> にはOpenAI APIのトークンを指定します。(有料)
import os
os.environ["OPENAI_API_KEY"] = "<OpenAI_APIのトークン>"
(6) ChatGPTPluginRetrieverの準備。
from langchain.retrievers import ChatGPTPluginRetriever
# ChatGPTPluginRetrieverの準備
retriever = ChatGPTPluginRetriever(
url="http://0.0.0.0:8000",
bearer_token=os.getenv("BEARER_TOKEN")
)
(7) RetrievalQAチェーンの生成。
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
# RetrievalQAチェーンの生成
qa = RetrievalQA.from_chain_type(
llm=OpenAI(),
chain_type="stuff",
retriever=retriever
)
(8) 質問応答。
# 質問応答
qa.run("ぼっちちゃんの得意な楽器は?")
' ボッチちゃんの得意な楽器はギターです。'
【おまけ】 ChatGPTプラグインの用語
ChatGPTプラグインの用語が混乱しやすいので整理しました。