🔥

ChatGPT Retriever PluginsをLangChainでデバッグする

2023/04/13に公開

任意のChatGPT Retriever PluginsのAPIサーバーと対話できるプログラムをLangChainのRetrievalQA ChainChatGPTPluginRetrieverを使って実現します。

これによって

  • ChatGPT Pluginsのインターフェイスの外でRetriever Plugins単体の動作が確認できます
  • Chain間連携やAgentsなどのLangChainの諸機能と統合できます

利用イメージとしては開発者自身がjupyter notebookなどで質問→回答を繰替えしてテストします。

ただしChatGPTPluginRetrieverは/query以外のエンドポイントには対応していません。

実装したRetriever Plugins

https://github.com/laiso/chatgpt-retrieval-plugin-zqh

zenn.devとqiita.comとb.hatena.ne.jpの記事をPineconeにインデックスしておき参照するシンプルなプラグインです。

ChatGPTの知識データに含まれない最新の技術情報をコンテキストとして与えることが目的です。

ローカルサーバーの起動

上記リポジトリをチェックアウトして poetry run dev を実行すると http://localhost:3333 でアクセスできます。

http://localhost:3333/.well-known/openapi.yaml に仕様書が見えれば準備okです。

RetrievalQA Chainの実装

from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
from langchain.retrievers import ChatGPTPluginRetriever

retriever = ChatGPTPluginRetriever(url="http://localhost:3333", bearer_token="XXX")

llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
# llm = ChatOpenAI(model_name="gpt-4", temperature=0)

chain = RetrievalQA.from_chain_type(llm=llm,
                                    # chain_type="map_rerank",
                                    # chain_type="map_reduce",
                                    # chain_type="refine",
                                    chain_type="stuff",
                                    retriever=retriever,
                                    return_source_documents=True)
answer = chain({'query': "langchainについてできるだけ詳しく説明して"})
print(answer['result'])

chain_typeによる違い

chain_typeによる違いを検証するために「langchainについてできるだけ詳しく説明して」の回答を比較しました。

結論としてはこのプラグインの場合はデフォルトのchain_type="stuff"でよさそうでした。

それぞれのprompt実装はlangchain/langchain/chains /question_answering/以下にあります。

以下がPineconeから参照できたsource_documentsです、この情報がpromptに挿入されます(zerebomさんfuyu_quantさんHakkyさんありがとうございます)。

コンテキスト
[Document(page_content='LangChainを触って動かしたときのメモ LangChain何もわからないので、ChatGPTに解説してもらいつつ、さらっていきたい。 ※ ⚠️スピード重視でキャッチアップ & ちゃんとドキュメント精読してるわけではないので注意 まずはドキュメント読む 下記のような主要なモジュールがあるらしい。 Models(モデル):LangChainがサポートする様々なモデルタイプとモデル統合 Prompts(プロンプト):プロンプトの管理、プロンプトの最適化、プロンプトのシリアル', metadata={'id': 'https://zenn.dev/zerebom/scraps/689dafd0f42a4a_0', 'metadata': {'source': 'zenn', 'source_id': None, 'url': 'https://zenn.dev/zerebom/scraps/689dafd0f42a4a', 'title': 'LangChainを触って動かしたときのメモ', 'created_at': '1680708720.0', 'author': None, 'document_id': 'https://zenn.dev/zerebom/scraps/689dafd0f42a4a'}, 'embedding': None, 'score': 0.870361388}), 
 Document(page_content='ようになります.今回は自然言語での入力により機械学習モデル(LightGBM)の学習および推論を行う方法を紹介します. 記事に誤り等ありましたらご指摘いただけますと幸いです。 目次 1. LangChainとは 2. langchain-toolsについて 3. langchain-toolsの活用例 4. LangChainのtoolとlangchain-too', metadata={'id': 'https://qiita.com/fuyu_quant/items/c0b29f037b7834c19e2c_1', 'metadata': {'source': 'hatena', 'source_id': None, 'url': 'https://qiita.com/fuyu_quant/items/c0b29f037b7834c19e2c', 'title': 'ChatGPTとLangChainで何でもできるAIを作る - Qiita', 'created_at': '1679656320.0', 'author': None, 'document_id': 'https://qiita.com/fuyu_quant/items/c0b29f037b7834c19e2c'}, 'embedding': None, 'score': 0.867474377}), Document(page_content='LangChainとは | Hakky Handbook LangChainとはLangChainとは何か\u200bLangChainとは、GPT-3のような大規模言語モデル(Large Language Model: LLM)を利用してサービスの開発をしたいときにおいて便利に使えるライブラリです。 例えば、ChatGPTのようなAIとチャットできるサービスを開発したい場合を考えます。OpenAIが提供するGPT-3のAPIだけでも非常にシンプルで使いやすいので、GPT-3のみを使用したAIチャットサービスを開発するにはLangChainは不要かもしれないですが、例えば開発した', metadata={'id': 'https://book.st-hakky.com/docs/langcain-intro/_0', 'metadata': {'source': 'hatena', 'source_id': None, 'url': 'https://book.st-hakky.com/docs/langcain-intro/', 'title': 'LangChainとは | Hakky Handbook', 'created_at': '1679543460.0', 'author': None, 'document_id': 'https://book.st-hakky.com/docs/langcain-intro/'}, 'embedding': None, 'score': 0.866519809})]

chain_type="stuff"

stuffはよりシンプルなデファルトのpromptでコンテキストと質問から回答を生成します。

stuff
LangChainは、GPT-3のような大規模言語モデル(Large Language Model: LLM)を利用してサービスの開発をしたいときに便利に使えるライブラリです。LangChainは、自然言語処理のタスクを簡単に実行できるようにするために設計されています。LangChainは、様々なモデルタイプとモデル統合をサポートするModels(モデル)と、プロンプトの管理、プロンプトの最適化、プロンプトのシリアルなどを行うPrompts(プロンプト)などの主要なモジュールを提供しています。

LangChainを使用することで、自然言語での入力により機械学習モデルの学習および推論を行うことができます。LangChainは、自然言語処理のタスクを簡単に実行できるようにするために設計されています。例えば、ChatGPTのようなAIとチャットできるサービスを開発したい場合にLangChainを使用することができます。

LangChainは、Pythonで書かれており、langchain-toolsというツールセットを提供しています。langchain-toolsには、LangChainを使用するための様々なツールが含まれており、LangChainを使用することで、自然言語処理のタスクを簡単に実行できるようになります。

chain_type="refine"

refineはコンテキストなしの回答をコンテキストありでrefine(洗練)させるという動作をします。「ChatGPTの知識データに含まれない最新の技術情報をコンテキストとして与える」という本プラグインの目的とは似わなさそうでした。

refine
LangChainは、大規模言語モデル(Large Language Model: LLM)を利用してサービスの開発をしたいときに便利に使えるライブラリです。
具体的には、ChatGPTのようなAIとチャットできるサービスを開発する場合に使用されます。
LangChainは、OpenAIが提供するGPT-3のAPIだけではなく、他の言語モデルを組み合わせることができるため、より高度な自然言語処理の機能を実現することができます。
また、LangChainは、言語モデルのトレーニングやチューニングを容易にするためのツールも提供しています。

chain_type="map_reduce"

map_reduceはコンテキストから回答に使えそうな文章をLLMで抽出し、再度それをコンテキストとして採用し回答するというものです。コンテキストの文量が多い時や、ベクトル検索の結果で充分に絞り込めない時などは有効そうです。

map_reduce
LangChainは、自然言語処理のためのオープンソースのフレームワークです。LangChainは、様々な種類のモデルをサポートしており、プロンプトの管理や最適化、シリアル化などの機能も提供しています。LangChainを使用することで、自然言語処理のタスクを簡単に実行することができます。

具体的には、LangChainは大規模言語モデル(Large Language Model: LLM)を利用してサービスの開発をするためのライブラリです。LangChainを使用することで、自然言語での入力により機械学習モデルの学習および推論を行うことができます。例えば、ChatGPTのようなAIとチャットできるサービスを開発する場合に利用されます。

LangChainは、OpenAIが提供するGPT-3のAPIだけでも非常にシンプルで使いやすいので、GPT-3のみを使用したAIチャットサービスを開発するには不要かもしれませんが、LangChainを使用することで、より高度なカスタマイズや機能拡張が可能になります。ただし、LangChainの使用には、ドキュメントの精読やモデルの理解が必要です。

chain_type="map_rerank"

map_rerankは説明によると回答を自己評価しスコア付けするものらしいですが以下の例のように期待する回答を生成しなかったのであまり調べていません。

map_rerank
LangChainは自然言語での入力により機械学習モデル(LightGBM)の学習および推論を行うためのツールです。
この記事では、LangChainの使い方や活用例について紹介されています。ただし、具体的な詳細については記事を参照してください。

Discussion