[Elasticsearch] Playgroundを利用してノーコードでRAGを試す

# はじめに
以前に以下の記事にてElasticsearchでRAGを構成するための手順を説明しました。
https://qiita.com/takeo-furukubo/items/e5d43fa734e4338b895f
この方法はPythonの知識を必要とするため、プログラミングに馴染みのない方にはあまりお役に立たなかったかもしれません。
Elasticは8.14というバージョンにて**Playground**という機能をリリースしました。この機能を使えばプログラミングの知識なしにノーコードでRAGを試すことができます。

:::note info
2024/08/19現在の最新バージョンである8.15.0ではまだPlayground機能はTech Previewです
:::

:::note info
2024/08/19現在、PlaygroundはEnterpriseライセンスが必要です
:::

## Playground
PlaygroundというのはKibana上で簡単にRAG(Rerieval Augmented Generation)を試せる機能です。
ドキュメントはこちらです。
https://www.elastic.co/guide/en/kibana/current/playground.html
![スクリーンショット 2024-08-18 14.58.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/5d1090e5-87fd-3a26-0e5b-41d816f331c6.png)
以前の記事でも書きましたが、RAGの成否は検索(=Retrieval)にかかっています。PlaygroundではRAGの応答の元になったドキュメントも簡単に確認ができます。
この機能で本番運用できるわけではないですが、まずは社内のドキュメントでRAGがどのような応答になるのか、といった検証には十分利用できます。

# 準備
## Elastic Cloud
以前の記事の「手順」の部分が全く同じなので、こちらの手順を参考にして「Elstic Cloudの作成」「機械学習ノードの作成」「形態素解析のためのExtension追加」を行ってください。
https://qiita.com/takeo-furukubo/items/e5d43fa734e4338b895f#%E6%89%8B%E9%A0%86

## 設定ファイル
こちらを`git clone`してください。
https://github.com/legacyworld/playground

## E5モデルの展開
以前の記事では東北大学のモデルを使用しましたが、今回はノーコードでやりたいのでKibanaのメニューから展開できるE5を使用します。

メニューからAnalytics -> Machine Learning -> Trained Modelsと選択して、下記の画面で右上の”Add trained model”をクリックします。
![スクリーンショット 2024-08-18 15.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/a2eed20e-65c9-1cb2-3c14-60825e097ba0.png)

下記の画面にて一番下にあるE5 (EmbEddings from bidirEctional Encoder rEpresentations)の”Intel and Linux optimized”を選び、Downloadをクリック。
![スクリーンショット 2024-08-18 15.46.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/809ce0a6-be77-3c26-1d3a-c799b31163c5.png)

すると以下のように”Downloading”が表示されます。
![スクリーンショット 2024-08-18 15.47.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/d7f3b3c6-0d47-389e-0f0c-f81fe8673499.png)

ダウンロードが終わると”Ready to deploy”と表示されるので、そのあたりにマウスをホバーさせると右側に▷が表示されるので、それをクリックします。
![スクリーンショット 2024-08-18 15.48.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/5a7924df-d58c-cf54-9271-3fd99f1a170d.png)

ウィンドウが立ち上がるのでそのまま”Start”をクリックします
![スクリーンショット 2024-08-18 15.48.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/22541a7c-a730-5912-c002-112810ab11ab.png)

暫く待つと”Deployed”と表示されます
![スクリーンショット 2024-08-18 15.49.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/7d32180e-332b-48ae-c095-437bd3115f19.png)

# ドキュメントアップロード
以前の記事ではPythonプログラムでアップロードしていますが、今回はノーコードを条件にしているのでKibanaの機能を使います。
ドキュメントは相変わらずNewsAPIです。
https://newsapi.org/
用意しているドキュメント(seminar.ndjson)はNewsAPIで「東京大学」を検索したものです。
このドキュメントではなく新しくNewsAPIで取得する場合には、NewsAPIではJSONで出力されるので`jq -c '.[]' hoge.json > hoge.ndjson`などでNDJSONに変換をしておきます。

## Kibanaからアップロード
メニューからAnalytics -> Machine Learning -> Data Visualizer -> Fileと選択すると下記の画面が表示されます。
![スクリーンショット 2024-08-18 15.28.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/88a1b97d-a4dd-c734-bc48-1ad239e612f1.png)
ここで`seminar.ndjson`をアップロードします。（自分でNDJSONをNewsAPIから作った場合はそちらをアップロードします）

以下のように処理がされるので**Import**をクリック
![スクリーンショット 2024-08-18 15.30.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/63f27bdc-9117-de0d-f372-a56af5228b63.png)

下記の画面で“Advanced”をクリックして、index nameに名前をいれる(ここではseminarと入れている)

:::note alert
ここではまだ”Import”をクリックしない
:::
![スクリーンショット 2024-08-18 15.32.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/c81d1e02-afa0-0ff1-882d-5ad3e0a1d6b0.png)

:::note info
Importを押してインデックスを作ってしまった方は、気にせずに同じ手順で別の名前のインデックスを作ってください
:::

### インデックス設定
左端の"Index Settings"にある文字をすべて消して、`index.txt`の内容を全てコピ＆ペーストします。
形態素解析を行う基本的な設定が行われています。

### Mapping設定
真ん中の"Mappings"にある文字をすべて消して、`mapping.txt`の内容を全てコピ＆ペーストします。

### Inget Pipeline設定
右端の"Ingest Pipeline"にある文字をすべて消して、`ingestpipeline.txt`の内容を全てコピ＆ペーストします。
ここではテキストデータの投入と同時にベクトル化をE5モデルで行っています。

全て変更し終わったら"Import"をクリックします。
![スクリーンショット 2024-08-19 8.17.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/187c7be6-1eca-6bfa-fb5c-3581cc0997bc.png)


問題がなければ以下のような画面になります。”View Index in Discover”をクリックするとDiscoverでデータを見ることができます。
![スクリーンショット 2024-08-18 15.53.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/9decaac8-650b-fc03-95cf-fb7bdc81c280.png)

# Playgroundの設定
では本題のPlaygroundを使っていきます。まずは以下の2点の設定が必要です。
- LLM
- インデックスと検索するフィールド

Search -> Playgroundとクリックすると以下の画面になります。まずはLLMの設定を行います。
![スクリーンショット 2024-08-18 16.16.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/03f68b62-8138-a581-c55d-dde9767aa5e3.png)
すでに設定されている方はスキップしてください。

## LLM
下記の画面のようにAWS Bedrock, Google Gemini, OpenAIが使用できます。APIキーなどは各LLMにてご準備ください。
![スクリーンショット 2024-08-19 8.11.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/95efb206-cf76-afee-c45f-1035af3a5854.png)

## インデックス
LLMの設定に問題なければ以下のように自動的に”LLM Connected”となるので、”Add data sources”をクリックします。ここで設定するのはどのデータを使ってRAGを行うかを選択しています。
![スクリーンショット 2024-08-19 8.19.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/55cbf6e9-2277-bae0-5f35-7e320a6410b8.png)

先ほど入力したインデックス名を選択（ここでは”seminar”)。Available Indicesの下に表示されているので、それをクリックして、最後に"Save and Continue"をクリックします。
![スクリーンショット 2024-08-19 8.20.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/bacac3c9-47d7-78cd-fa33-32dd672aeed6.png)

画面右下に“Context fields”という部分があります。ここにある”description”を選択します。これは検索して取ってきたドキュメントのどのフィールドをコンテキストとしてLLMに渡すか、という設定です。この設定については”Save”などをクリックしなくても適用されていますので、このまま次のステップに進みます。
![スクリーンショット 2024-08-19 8.22.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/35c92d5c-784c-902a-fb1b-e07a976f91f2.png)

## クエリ
ページ上部にある”Query”を選択します。ここでクエリ文(どのように検索するか)を決めます。
![スクリーンショット 2024-08-19 8.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/8e1e2161-85ec-d794-b960-1adb4dae699b.png)

デフォルトでは”text_embedding”のみ選ばれています。これはベクトル検索のみ行う設定です。”description”をEnableするとキーワード検索部分が追加されてハイブリッド検索(RRF: Reciprocal Rank Fusion)となっています。
![スクリーンショット 2024-08-19 8.25.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/71745e1e-45d0-786b-3ec3-fd48da659190.png)

ページ上部にある”Chat”をクリックしてチャットを行う画面に戻り、ページ下部にある”Ask a quesion”に”東京大学の授業料について教えて”と入力します
![スクリーンショット 2024-08-19 8.26.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/2acb4a63-b905-88ae-52fa-71525b52a9e6.png)

例えばAWS Bedrock Claude3 Haikuだとこのように要約されています。”3 document sources”をクリックするとこの要約を作成した根拠の文書が示されます。選択したLLMによってこの要約部分は結構変わります。
![スクリーンショット 2024-08-19 8.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/f1c72828-9150-fb46-2ee3-c88ae23dadf3.png)

![スクリーンショット 2024-08-19 8.28.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/9dbb20b1-0e16-ff68-2445-6a8ff788810c.png)

## アプリケーションコード
右上の"View Code"をクリックすると、これと同じことを行うソースコードが表示されます。現状ではOpenAIのみです。
![スクリーンショット 2024-08-19 8.33.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/a0bb590e-8707-7b93-28e2-9bcd51ae7f25.png)

# まとめ
いかがでしたでしょうか。非常に簡単にRAGを試せることを実感いただけかと思います。
似たようなサービスはあるとは思いますが、クエリ文を変更してRRFまで自動的に設定できるものはほとんど無いと思います。
またインデックスと同時にベクトル化も行えるため、ベクトル化のためのプログラムも必要ありません。
更に形態素解析の設定を簡単なので、高度な日本語処理も行えます。

是非Playgroundを利用してRAGに取り組んでみてください。