EASとElasticsearchを使用したRAGベースのLLMチャットボットのデプロイ

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/use-eas-and-elasticsearch-to-deploy-a-rag-based-llm-chatbot_601902?spm=a2c65.11461433.0.0.4ee353553LTf3v)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

# ElasticsearchとRAGベースのLLMチャットボットを連携させる方法

<a href=https://www.alibabacloud.com/product/machine-learning?spm=a3c0i.14956477.6791778070.539.51702adeIchdwe target=_blank>Platform for AI</a> (PAI) は、Elasticsearch を Retrieval-Augmented Generation (RAG) ベースの大型言語モデル (LLM) チャットボットと統合することを可能にします。これにより、モデルが生成する回答の正確性と多様性が向上します。Elasticsearch は効率的なデータ検索機能を備えており、辞書設定やインデックス管理などの特別な機能も提供しています。これにより、RAGベースのLLMチャットボットはユーザーの要求をより適切に識別し、より適切で価値のあるフィードバックを提供することができます。この記事では、RAGベースのLLMチャットボットを展開する際に、Elasticsearch を RAGベースのLLMチャットボットと関連付ける方法について説明します。また、RAGベースのLLMチャットボットが提供する基本的な機能と、Elasticsearchが提供する特別な機能についても説明します。

## 背景情報

### EASの紹介
Elastic Algorithm Service (EAS) は、PAI のオンラインモデルサービスプラットフォームであり、モデルをオンライン推論サービスまたはAI搭載ウェブアプリケーションとして展開することができます。EAS は自動スケーリングやブルーグリーンデプロイなどの機能を提供しており、大量の同時リクエストに対応できる安定したオンラインモデルサービスを開発するコストを削減します。さらに、EAS はリソースグループ管理やモデルバージョン管理、包括的な運用管理（O&amp;M）とモニタリングなどの機能も提供します。詳細については、<a href=https://www.alibabacloud.com/help/en/pai/user-guide/overview-2 target=_blank>EAS 概要</a>をご覧ください。

### RAGの紹介
AI技術の急速な発展により、生成型AIはテキスト生成や画像生成など、様々な分野で目覚ましい成果を上げています。しかし、LLMが広く使用されるにつれて、以下の固有の制限が徐々に明らかになってきました：

**分野知識の制限**: 多くの場合、LLMは大規模な一般的なデータセットを使用して訓練されます。そのため、専門的な垂直分野での深く的確な処理には苦慮することがあります。
**情報更新の遅延**: トレーニングデータセットの静的性質により、LLMはリアルタイムの情報や知識の更新を取り入れることができません。
**誤った出力**: LLMは幻覚に陥りやすく、事実とは異なるが一見合理的な出力を生成することがあります。これはデータバイアスやモデル自体の制限によるものです。

これらの課題を解決し、LLMの能力と正確性を向上させるために、RAGが開発されました。RAG は外部の知識ベースを統合することで、LLMの幻覚問題を大幅に軽減し、最新の知識へのアクセスと適用能力を強化します。これにより、LLMのカスタマイズが可能になり、よりパーソナライズされ、正確になります。

### Elasticsearchの紹介
Alibaba Cloud Elasticsearch は、<a href=https://www.elastic.co/elasticsearch/features/ target=_blank>オープンソースのElasticsearch</a>に基づいて開発された完全に管理されたクラウドサービスです。Alibaba Cloud Elasticsearch は、オープンソースのElasticsearchが提供するすべての機能と互換性があります。このサービスは、従量制課金方式で利用可能です。Elasticsearch、Logstash、Kibana、Beats などの Elastic Stack コンポーネントに加えて、Alibaba Cloud Elasticsearch は Elastic と協力して X-Pack 商用プラグインを無料で提供しています。X-Pack 高度な機能は、オープンソース Elasticsearch チームによって X-Pack プラグインに基づいて開発されており、セキュリティ、SQL プラグイン、機械学習、アラート、モニタリングなどの機能を含みます。Alibaba Cloud Elasticsearch は、リアルタイムログ分析と処理、情報検索、多次元データクエリ、統計データ分析などのシナリオで広く使用されています。詳細については、<a href=https://www.alibabacloud.com/help/en/es/product-overview/what-is-alibaba-cloud-elasticsearch target=_blank>Alibaba Cloud Elasticsearch とは何か？</a>をご覧ください。

## 手順
EAS は柔軟なパラメータ設定を備えた独自の RAG システムソリューションを提供しています。Web ユーザーインターフェース (UI) または API 操作を呼び出すことで、カスタムの RAG ベースの LLM チャットボットを構成できます。RAG の技術アーキテクチャは、検索と生成に焦点を当てています。

**検索**: EAS は、オープンソースの Faiss から Alibaba Cloud サービスの Milvus、Elasticsearch、Hologres、OpenSearch、AnalyticDB for PostgreSQL まで、幅広いベクトルデータベースを統合しています。
**生成**: EAS は Qwen、Meta Llama、Mistral、Baichuan などのさまざまなオープンソースモデルをサポートし、ChatGPT との統合も行っています。

この例では、Elasticsearch クラスターを使用して、以下のように EAS と Elasticsearch を使用して RAG ベースの LLM チャットボットを展開する方法を示します：
1. Elasticsearch を使用してベクトルデータベースを準備する
2. RAG ベースの LLM チャットボットを展開し、Elasticsearch クラスターに関連付ける
3. RAG ベースの LLM チャットボットを使用する

## 前提条件
- VPC、vSwitch、およびセキュリティグループが作成されていること。詳細については、<a href=https://www.alibabacloud.com/help/en/vpc/getting-started/create-vpc-with-ipv4 target=_blank>IPv4 CIDR ブロックを使用して VPC を作成する</a>と <a href=https://www.alibabacloud.com/help/en/ecs/user-guide/create-a-security-group-1 target=_blank>セキュリティグループを作成する</a>をご覧ください。

## 注意事項
この実践は、LLM サービスのトークン数の最大値に基づいて設計されており、RAG ベースの LLM チャットボットの基本的な検索機能を理解するためのものです。チャットボットは、LLM サービスのサーバーリソースサイズとデフォルトのトークン数によって制限され、サポートする会話の長さも制限されます。複数回の会話を実施する必要がない場合は、WebUI ページでチャット履歴機能を無効にすることをお勧めします。これにより、制限に達する可能性が低くなります。詳細については、<a href=https://www.alibabacloud.com/help/en/pai/user-guide/deploy-a-rag-based-dialogue-system#b2c14801c6ol6 target=_blank>RAG ベースのチャットボットのチャット履歴機能を無効にする方法</a>をご覧ください。

## Elasticsearchを使用してベクトルデータベースを準備する

### ステップ1: Alibaba Cloud Elasticsearchクラスターの作成
<a href=https://elasticsearch.console.aliyun.com/?spm=a2c63.p38356.0.0.2591987ckcSZCC#/home target=_blank>Alibaba Cloud Elasticsearch コンソール</a>にログインします。左側のナビゲーションパネルで、Elasticsearch Clusters をクリックします。表示されるページで、Create をクリックします。以下の表は主なパラメータを説明しています。その他のパラメータについては、<a href=https://www.alibabacloud.com/help/en/es/user-guide/create-an-alibaba-cloud-elasticsearch-cluster target=_blank>Alibaba Cloud Elasticsearchクラスターの作成</a>をご覧ください。

| パラメータ | 説明 |
| --- | --- |
| Region and Zone | クラスターが存在するリージョンとゾ
### Elasticsearchクラスターのアクセスパスワードをリセットする方法について詳しくは、[こちら](https://www.alibabacloud.com/help/en/es/user-guide/reset-the-access-password-for-an-elasticsearch-cluster)をご覧ください。

RAGベースのLLMチャットボットをデプロイし、Elasticsearchクラスターに関連付ける
1. [PAIコンソール](https://pai.console.aliyun.com/?spm=a2c63.p38356.0.0.2591533cSsV4ro&&s#/sw?path=/eas)にログインします。ページの上部で、ワークスペースを作成したいリージョンを選択します。左側のナビゲーションパネルで、「モデルトレーニング > エラスティックアルゴリズムサービス (EAS)」を選択します。表示されたページで、必要なワークスペースを選択し、「エラスティックアルゴリズムサービス (EAS) に入ります」をクリックします。
2. エラスティックアルゴリズムサービス (EAS) ページで、「サービスをデプロイ」をクリックします。「シナリオベースのモデルデプロイ」セクションで、「RAGベースのスマートダイアログデプロイ」をクリックします。
   ![](https://help-static-aliyun-doc.aliyuncs.com/assets/img/en-US/1460610271/p805910.png)
3. RAGベースのLLMチャットボットデプロイページで、以下の表に記載されている主要なパラメータを設定します。他のパラメータに関する情報は、[ステップ1: RAGベースのチャットボットをデプロイする](https://www.alibabacloud.com/help/en/pai/user-guide/deploy-a-rag-based-dialogue-system#7644d650f0cp1)をご覧ください。

| パラメータ | 説明 |
| --- | --- |
| **基本情報** |  |
| モデルソース | 「オープンソースモデル」を選択します。 |
| モデルタイプ | 使用するモデルタイプです。この例では、Qwen1.5-1.8bを使用しています。 |
| **リソース構成** |  |
| リソース構成 | 選択したモデルタイプに基づいて、システムが適切なリソース仕様を推奨します。他のリソース仕様を使用すると、モデルサービスが起動できない場合があります。 |
| **ベクターデータベース設定** |  |
| ベクターデータベースタイプ | 「Elasticsearch」を選択します。 |
| プライベートエンドポイントとポート | [ステップ2](https://www.alibabacloud.com/help/en/pai/use-cases/build-an-intelligent-conversation-system-based-on-rag-and-elasticsearch-in-eas?spm=a2c63.p38356.help-menu-30347.d_3_3_0.bc7860d0kERkb7&scm=20140722.H_2835834..OR_help-T_intl#9e9759db83n00)で取得したElasticsearchクラスタURLを入力します。`<内部エンドポイント>`:`<ポート番号>`の形式で指定します。 |
| インデックス名 | インデックスの名前です。新しいインデックス名または既存のインデックス名を入力できます。既存のインデックス名を使用する場合は、インデックススキーマがRAGベースのチャットボットの要件を満たしている必要があります。例えば、EASを使用してRAGベースのチャットボトをデプロイしたときに自動的に作成されるインデックス名を入力できます。 |
| アカウント | `elastic`を入力します。 |
| パスワード | [ステップ2](https://www.alibabacloud.com/help/en/pai/use-cases/build-an-intelligent-conversation-system-based-on-rag-and-elasticsearch-in-eas?spm=a2c63.p38356.help-menu-30347.d_3_3_0.bc7860d0kERkb7&scm=20140722.H_2835834..OR_help-T_intl#9e9759db83n00)で指定したパスワードを入力します。 |
| **VPC構成（オプション）** |  |
| VPC | Elasticsearchクラスターが存在するVPCです。 |
| vSwitch |  |
| セキュリティグループ名 |  |

4. パラメータを設定したら、「デプロイ」をクリックします。

### RAGベースのLLMチャットボットを使用する

以下では、RAGベースのLLMチャットボットを使用する方法について説明します。詳細については、[RAGベースのLLMチャットボット](https://www.alibabacloud.com/help/en/pai/user-guide/deploy-a-rag-based-dialogue-system)をご覧ください。

1. ベクターデータベースに接続する
   - RAGベースのチャットボットをデプロイした後、「サービスタイプ」列の「Webアプリを表示」をクリックしてWeb UIに移動します。Elasticsearchクラスター内のベクターデータベースが接続されているか確認します。システムは、チャットボットをデプロイする際に設定したベクターデータベース設定を認識し適用します。「ElasticSearchに接続」をクリックして、Elasticsearchクラスター内のベクターデータベースが接続されているか確認します。接続に失敗した場合は、[ステップ2: 構成項目を準備する]に基づいてベクターデータベース設定が正しいか確認してください。設定が間違っている場合は、構成項目を修正し、「ElasticSearchに接続」をクリックして再接続します。

2. ビジネスデータファイルをアップロードする
   - 知識ベースファイルをアップロードします。システムは、知識ベースをPAI-RAG形式でベクターデータベースに自動的に保存し、検索のために使用します。既存の知識ベースも使用できますが、その場合にはPAI-RAG形式の要件を満たしている必要があります。そうでない場合、検索時にエラーが発生する可能性があります。
     ![](https://help-static-aliyun-doc.aliyuncs.com/assets/img/en-US/3593184271/p823629.png)
   1. 「アップロード」タブで、チャンクパラメータを設定します。次のパラメータは、ドキュメントのチャンク分割の粒度と、Q&A抽出の有無を制御します。
      | パラメータ | 説明 |
      | --- | --- |
      | チャンクサイズ | 各チャンクのサイズ。単位：バイト。デフォルト値：500。 |
      | チャンクオーバーラップ | 隣接するチャンク間の重複部分。デフォルト値：10。 |
      | Q&A抽出モデルでの処理 | Q&A情報の抽出を行うかどうかを指定します。`はい`を選択すると、知識ファイルがアップロードされた後、システムは自動的に質問と対応する回答をペアで抽出します。これにより、データクエリでより正確な回答が返されます。 |
   2. 「ファイル」タブまたは「ディレクトリ」タブで、1つ以上のビジネスデータファイルをアップロードします。ビジネスデータファイルを含むディレクトリをアップロードすることもできます。サポートされているファイル形式：txt, .pdf, Excel (.xlsx or .xls), .csv, Word (.docx or .doc), Markdown, .html。例：<a href=https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/en-US/20241030/unewhk/rag_chatbot_test_doc.txt target=_blank>rag_chatbot_test_doc.txt</a>。
   3. 「アップロード」をクリックします。システムは、ビジネスデータファイルをアップロードする前に、データクリーニングと意味に基づくチャンク分割を行います。データクリーニングには、テキスト抽出とハイパーリンク置換が含まれます。
     ![](https://help-static-aliyun-doc.aliyuncs.com/assets/img/en-US/7496734271/p824530.png)

3. 知識Q&Aを行う
   - R
# Alibaba Cloud Elasticsearchコンソールへのログイン

[Alibaba Cloud Elasticsearchコンソール](https://elasticsearch.console.aliyun.com/?spm=a2c63.p38356.0.0.3415533cVrjUkO#/home)にログインします。左側のナビゲーションパネルで、Elasticsearch Clustersをクリックします。必要なクラスターに移動します。上部のナビゲーションバーで、クラスターが属するリソースグループと、クラスターが配置されているリージョンを選択します。Elasticsearch Clustersページで、クラスターを見つけ、そのIDをクリックします。

1. 表示されるページの左側のナビゲーションパネルで、Configuration and Management > Plug-insを選択します。
2. Built-in Plug-insタブで、analysis-ikプラグインを見つけ、Actions列のRolling Updateをクリックします。
3. Configure IK Dictionaries - Rolling Updateパネルで、更新したい辞書の右側にあるEditをクリックし、辞書ファイルをアップロードしてからSaveをクリックします。辞書ファイルの更新には次のいずれかの方法を使用できます：

   - **オンプレミスファイルのアップロード**: アップロード領域をクリックし、オンプレミスのマシンからアップロードしたいファイルを選択します。または、オンプレミスのマシンからアップロードしたいファイルをアップロード領域にドラッグします。
   - **OSSファイルのアップロード**: Bucket NameとFile Nameのパラメータを設定し、Addをクリックします。指定したバケットは、Elasticsearchクラスターと同じリージョンに配置されている必要があります。指定した辞書ファイルは自動的に更新されません。OSSに保存されている辞書ファイルの内容が変更された場合は、ローリングアップデートを実行して変更を有効にする必要があります。

**注意:**
- ファイル名の拡張子は.dicである必要があります。
- ファイル名は1〜30文字の長さで、文字、数字、およびアンダースコア（_）のみを含めることができます。
- アップロードした辞書ファイルを変更したい場合は、ファイルの横にある![icon](https://help-static-aliyun-doc.aliyuncs.com/assets/img/en-US/0245948261/p296767.png)アイコンをクリックしてダウンロードし、変更することができます。その後、ファイルを削除して再度アップロードします。
- 複数の辞書ファイルをアップロードすることができます。辞書ファイルの内容が変更された場合のみ、クラスターの再起動が必要です。辞書ファイルの名前や辞書ファイルの数が変更されていない場合、システムはクラスターを再起動しません。
- 事業への影響を避けるために、オフピーク時間帯に更新を行うことをお勧めします。再起動が完了すると、新しい辞書ファイルが有効になります。

4. OKをクリックします。辞書ファイルが更新された後、Web UIでRAGベースのLLMチャットボットをElasticsearchクラスターに再接続します。詳細については、[ベクトルデータベースへの接続](https://www.alibabacloud.com/help/en/pai/use-cases/build-an-intelligent-conversation-system-based-on-rag-and-elasticsearch-in-eas?spm=a2c63.p38356.help-menu-30347.d_3_3_0.bc7860d0kERkb7&scm=20140722.H_2835834._.OR_help-T_intl#5ca4bfe7c1jd8)をご覧ください。
5. RAGベースのLLMチャットボットがElasticsearchクラスターに再接続された後、Web UIで知識Q&Aを実行します。Retrieval ModeパラメータでKeyword OnlyまたはHybridを選択した場合、更新されたElasticsearchクラスターの辞書ファイルを使用して全文検索を実行することができます。
   ! [image](https://help-static-aliyun-doc.aliyuncs.com/assets/img/en-US/1501931371/p857244.png)

## インデックス管理
Elasticsearchはインデックス管理機能を提供しています。効果的なインデックス管理により、RAGベースのLLMチャットボットは大量のデータセットから価値ある情報を効率的かつ正確に取得し、高品質な回答を生成することができます。インデックスを管理するには、次の手順を行います：

1. Elasticsearchクラスターの詳細ページに移動します。[Alibaba Cloud Elasticsearchコンソール](https://elasticsearch.console.aliyun.com/?spm=a2c63.p38356.0.0.4eb55e32Z5dEpk#/home)にログインします。
2. 左側のナビゲーションパネルで、Elasticsearch Clustersをクリックします。必要なクラスターに移動します。上部のナビゲーションバーで、クラスターが属するリソースグループと、クラスターが配置されているリージョンを選択します。Elasticsearch Clustersページで、クラスターを見つけ、そのIDをクリックします。
3. 表示されるページの左側のナビゲーションパネルで、Data Visualizationを選択します。
4. 表示されるページのKibanaセクションで、Modify Configurationをクリックします。Kibana Configurationページで、Kibana用のプライベートまたはパブリックIPアドレスのホワイトリストを設定します。詳細については、[KibanaのパブリックまたはプライベートIPアドレスのホワイトリストの設定](https://www.alibabacloud.com/help/en/es/user-guide/configure-a-public-or-private-ip-address-whitelist-for-kibana#task-2444468)をご覧ください。
5. Kibanaコンソールにログインします。ページの左上隅にあるBackアイコンをクリックして、Data Visualizationページに戻ります。Kibanaセクションで、Internet経由のアクセスまたは内部ネットワーク経由のアクセスを選択します。
   **注意:** Internet経由のアクセスまたは内部ネットワーク経由のアクセスエントリは、KibanaのPublic Network AccessまたはPrivate Network Accessスイッチがオンになっている場合にのみ表示されます。
   ! [image](https://help-static-aliyun-doc.aliyuncs.com/assets/img/en-US/2995829071/p766446.png)

   Kibanaのログインページで、ユーザー名とパスワードを入力します。
   - **ユーザー名**: Elasticsearchクラスターのデフォルトのユーザー名は`elastic`です。ユーザー名をカスタマイズすることもできます。詳細については、[Elasticsearch X-Packが提供するRBACメカニズムを使用してアクセス制御を実装する](https://www.alibabacloud.com/help/en/es/use-cases/use-the-rbac-mechanism-provided-by-elasticsearch-x-pack-to-implement-access-control#task-2008398)をご覧ください。
   - **パスワード**: `elastic`ユーザー名に対応するパスワードです。Elasticsearchクラスターを作成するときに`elastic`アカウントのパスワードを指定します。パスワードを忘れた場合は、リセットすることができます。パスワードのリセット手順と注意事項については、[Elasticsearchクラスターのアクセスパスワードのリセット](https://www.alibabacloud.com/help/en/es/user-guide/reset-the-access-password-for-an-elasticsearch-cluster#task-2458093)をご覧ください。

   Log Inをクリックします。次の図に示すようなページが表示されます。
   ! [image](https://help-static-aliyun-doc.aliyuncs.com/assets/img/en-US/3593184271/p823752.png)

6. インデックスの表示と管理。上部のナビゲーションバーで、![image](https://help-static-aliyun-doc.aliyuncs.com/assets/img/en-US/3593184271/p822422.png)アイコンをクリックし、Management > Stack Managementを選択します。左側のナビゲーションパネルで、Data > Index Managementを選択します。表示されるページのIndexタブで、管理したいインデックスを表示し、インデックスの無効化、インデックスのリフレッシュ、インデックスのクリア、またはインデックスの削除などの管理操作を実行します。次の図は、`es_test`という名前のインデックスを管理する例を示しています。

## 参考
EASは、AI