ChatGPTとElasticsearch:ElasticのデータにChatGPTを使用するためのプラグイン
前回のブログ記事では、Elasticによる、Elasticsearchの関連付け機能とOpenAIの質問と回答機能をリンクさせる取り組みについて解説しました。同記事の重要なポイントは、ElasticとOpenAIのGPTモデルを連携させて応答を構築し、ユーザーにコンテキストに合ったコンテンツを返す方法を説明することでした。
Elasticが構築したアプリケーションは検索エンドポイントを公開し、あらゆるフロントエンドサービスから呼び出すことができます。良い知らせは、Open AIが将来的なChatGPTのプラグインフレームワークのプライベートアルファをリリースしたことです。
このブログでは、プラグインを実装し、ChatGPTの利用を、Elasticsearchでインデックスされ、Elasticのドキュメントを使用したあらゆるコンテンツに拡張する方法をご紹介します。
ChatGPTプラグインとは
ChatGPTプラグインとは、モデルがその知識を補完し、アクションを実行するのを支援するために開発された拡張機能です。
たとえば、ChatGPTの知識の観点からのカットオーバーは2021年9月であり、そのために最近のデータに関する質問には回答できないことが知られています。さらに、モデルの訓練範囲を超えた過度に限定的な内容に関する質問にも回答できません。
プラグインは可能な適用範囲を広げ、モデルの機能を強化することができますが、逆にプラグインのアウトプットはモデルそのものによって強化されます。
現在ChatGPTで公式にサポートされているプラグインのリストは以下のとおりです。このリストは、ChatGPTを試す組織の増加に伴い、急速に拡大することが予想されます。
リストを見ると、徐々にユースケースが見えてきます。たとえばExpediaの場合は、プラグインによりChatGPTを旅行計画の支援に拡張し、ChatGPTを旅行計画のアシスタントとして利用できるようにしています。
このブログは、Elasticで同じような目的を達成すること、つまりChatGPTにElasticの現在のナレッジベースにアクセスさせ、Elasticのプロジェクトを支援してもらうことを目指しています。
アーキテクチャー
パート1で同僚のジェフ・ヴェストルが紹介したサンプルコードに、コスト面でのプラスの効果をもたらすわずかな修正を加えてみましょう。
現在はChatGPTがElasticsearchからコンテンツを取り出し、ダイジェストにしてユーザーに返す役割を果たしています。そこで、OpenAI APIへの呼び出しを削除します。
1.ChatGPTがプラグインの`/search`エンドポイントに対する呼び出しを行います。
- この決定は、プラグインの"ルール"の`description_for_human`に基づきます(以下のプラグインマニフェストを参照)。
2.プラグインコードにより、Elasticsearchに送信される検索リクエストが作成されます。
3.ドキュメント本文と元のURLがPythonに返されます。
4.プラグインがドキュメント本文とURLをテキスト形式でChatGPTに返します。
5.ChatGPTがプラグインからの情報を使用して回答を作成します。
このブログ記事は、Elastic Cloudアカウントが設定され、コンテンツがベクトル化され、Elasticsearchクラスターにすぐに使用可能なデータがあることを前提としています。これらの準備が済んでいない場合は過去の記事で詳細な手順を確認してください。
プラグインコード
OpenAIは比較的シンプルに処理できるChatGPT用のプラグインフレームワークを構築しています。以下を公開するサービスをデプロイしています。
- プラグインがユーザーおよびChatGPTに提供するサービスを説明するプラグインマニフェスト
- プラグインのOpen APIの定義。これはChatGPTが利用可能なAPIを理解できるようにする、機能に関する説明です
プラグインのファイル構成
以下のスクリーンショットで構成を確認できます。
- プラグインマニフェストは、OpenAIのベストプラクティスに従って、[.well-known]ディレクトリの下のai-plugin.jsonファイルに格納されています。
- 主なサービスコードはapp.py内にあります。
- Dockerfileは、後でGoogle Cloud Computeにプラグインをデプロイする際に使用します。
- ChatGPTのプラグインストアで表示されるプラグインのロゴ(logo.ong)。今回はElasticのロゴになります。
- OpenAIによるプラグインの説明です。
Pythonコード
完全なコードについては、GitHubレポジトリを参照してください。このコードの主な部分のみを見ていきます。
…
@app.get("/search")
…
@app.get("/logo.png")
…
@app.get("/.well-known/ai-plugin.json")
…
@app.get("/openapi.yaml")
…
すべての情報を引き出し、主な部分をこちらに記載しています。ここには2つのカテゴリーのAPIがあります。
1.プラグインを構築するためにOpenAIが必要とするAPI:
- /logo.png:プラグインのロゴを取得する
- /.well-known/ai-plugin.json:プラグインマニフェストを取得する
- /openapi.yaml:プラグインのOpen APIの説明を取得する
2.プラグインAPI:
- /search:Elasticsearchでの検索を実行する(上のコードでChatGPTに公開されているのはこれのみ)
プラグインマニフェスト
プラグインマニフェストとは、プラグインの存在(アクセスできること)を検証するためにChatGPTが使用するものです。以下に定義を示します。
{
"schema_version": "v1",
"name_for_human": "ElasticGPTDoc_Plugin",
"name_for_model": "ElasticGPTDoc_Plugin",
"description_for_human": "Elastic Assistant, you know, for knowledge",
"description_for_model": "Get most recent elasticsearch docs post 2021 release, anything after release 7.15",
"auth": {
"type": "none"
},
"api": {
"type": "openapi",
"url": "PLUGIN_HOSTNAME/openapi.yaml",
"is_user_authenticated": false
},
"logo_url": "PLUGIN_HOSTNAME/logo.png",
"contact_email": "info@elastic.co",
"legal_info_url": "http://www.example.com/legal"
}
いくつかの注意点があります。
1.以下の2つの説明があります。
- description_for_human:これはChatGPTのWeb UIにプラグインをインストールしたときに、利用者に表示されます。
- description_for_model:モデルにプラグインを使用するタイミングを理解させるための指示です。
2.Pythonコードでは、PLUGIN_HOSTNAMEなど、いくつかのプレースホルダーが置き換えられます。
OpenAPIの定義
Elasticのコードでは、ChatGPTに対して単一のAPIエンドポイントを公開し、Elasticのドキュメントの検索を許可します。以下がその説明です。
openapi: 3.0.1
info:
title: ElasticDocGPT
description: Retrieve information front the most recent Elastic documentation
version: 'v1'
servers:
- url: PLUGIN_HOSTNAME
paths:
/search:
get:
operationId: search
summary: retrieves the document matching the query
parameters:
- in: query
name: query
schema:
type: string
description: use to filter relevant part of the elasticsearch documentations
responses:
"200":
description: OK
定義ファイルの主なポイントを以下に示します。
- ChatGPTのプロンプトコンテンツをElasticsearchクラスターへのクエリとして渡します。
- Pythonコードでは、PLUGIN_HOSTNAMEなど、一部のプレースホルダーが置き換えられます。
Google Cloud Platform(GCP)にElasticプラグインをデプロイする
プラグインを公開するデプロイ方法を選択できるとともに、さまざまなクラウドプロバイダーを使用することができます。このブログ記事では、Google Cloud Platform(GCP)、もっと具体的にはGoogle Cloud RunとGoogle Cloud Buildを使用します。前者はサービスの公開と実行に、後者は継続的インテグレーションに使用します。
セットアップ
このセットアップでは、GCPユーザーに以下の権限があることを前提とします。
- Google Container RegistryでGoogle Cloud Buildを利用してコンテナーイメージを作成する権限
- Google Cloud Runにコンテナーをデプロイする権限
これらの権限がない場合は、GCPのIAMページで権限をアップデートする必要があります。
gcloud CLIを使用して環境をセットアップします。インストール手順はこちらに記載されています。
インストールが完了したら、以下のコマンドを実行して認証します。
gcloud auth
次にGCPプロジェクトにプロジェクト識別子を設定します。
gcloud config set project PROJECT_ID
これで構築とデプロイの準備ができました。
構築とデプロイ
最初のステップは、Cloud Buildを使用してコンテナーイメージを構築し、Google Container Registryにプッシュすることです。
gcloud builds submit --tag gcr.io/PROJECT_ID/my-python-app
PROJECT_IDをGCPプロジェクトのIDに置き換え、my-python-appをコンテナーイメージに付ける名前に置き換えます。
Pythonコードで必要な環境をエクスポートして、Elasticsearchクライアントを作成します。
export YOUR_CLOUD_ID=VALUE
export YOUR_CLOUD_PASS=VALUE
export YOUR_CLOUD_USER=VALUE
最後に、コンテナーイメージをCloud Runにデプロイします。
gcloud run deploy my-python-app \
--image gcr.io/PROJECT_ID/my-python-app \
--platform managed \
--region us-central1 \
--allow-unauthenticated \
--set-env-vars cloud_id=YOUR_CLOUD_ID,cloud_pass=YOUR_CLOUD_PASS,cloud_user=YOUR_CLOUD_USER
Cloud Runでサービスが実行されていることが確認できます。
継続的インテグレーションを有効化して、GitHubレポジトリでコミットがあった場合に再デプロイをトリガーすることもできます。サービスの詳細ページで、[Set up continuous deployment](継続的インテグレーションをセットアップ)をクリックします。
プラグインをChatGPTにインストールする
プラグインをデプロイしてパブリックアクセスが可能なエンドポイントができたら、ChatGPTにインストールすることができます。今回はGoogle Cloud Runにデプロイしたため、こちらからURLを取得できます。
次にChatGPTでプラグインストアに移動します。
[Develop your own plugin](独自のプラグインを開発)を選択します。
Google Cloud RunのページからコピーしたURLをペーストします。
プラグインが見つかり、有効であることを確認します。
利用可能なプラグインがリストに表示されるまで、インストール手順に従います。
プラグインをテストする
お待ちかねの時間です。ChatGPTは知識の範囲を超えたプロンプトについて委任を決定することを覚えておいてください。この状況を発生させるには、こちらの例に似た質問をします。
このブログで紹介した手順を使用して、独自のプラグインを作成し、クラウドプロバイダーまたは独自のホストにデプロイできます。これにより、ChatGPTの知識と機能の強化に着手し、すでに優れたツールをさらに特化された専門知識で強化することができます。
このブログで取り上げたあらゆる機能を今すぐ試すことができます。まずはElastic Cloudの無償トライアルにご登録ください。
その他のおすすめのブログを以下にご紹介します。
- ChatGPT and Elasticsearch:OpenAI meets private data(ChatGPTとElasticsearch:OpenAIによるプライベートデータへの対応)
- Monitor OpenAI API and GPT models with OpenTelemetry and Elastic(OpenTelemetryとElasticを利用してOpenAI APIとGPTモデルを監視)
- Exploring the Future of Security with ChatGPT(ChatGPTが描くセキュリティの未来像)
このブログ記事では、それぞれのオーナーが所有・運用するサードパーティの生成AIツールを使用している可能性があります。Elasticはこれらのサードパーティのツールについていかなる権限も持たず、これらのコンテンツ、運用、使用、またはこれらのツールの使用により生じた損失や損害について、一切の責任も義務も負いません。個人情報または秘密/機密情報についてAIツールを使用する場合は、十分に注意してください。提供したあらゆるデータはAIの訓練やその他の目的に使用される可能性があります。提供した情報の安全や機密性が確保される保証はありません。生成AIツールを使用する前に、プライバシー取り扱い方針や利用条件を十分に理解しておく必要があります。
Elastic、Elasticsearch、および関連するマークは、米国およびその他の国におけるElasticsearch N.V.の商標、ロゴ、または登録商標です。他のすべての会社名および製品名は、各所有者の商標、ロゴ、登録商標である場合があります。