DatabricksにおけるRAGの実践(前編)

以前、こちらの記事などでRAGを触ってます。

https://qiita.com/taka_yayoi/items/43302d79369a36b66ee4

https://qiita.com/taka_yayoi/items/a42691495a890fe81238

こちらのサンプルノートブックも新しくなっていたので、こちらを日本語対応しつつウォークスルーします。

https://www.databricks.com/resources/demos/tutorials/data-science-and-ai/lakehouse-ai-deploy-your-llm-chatbot?itm_data=demo_center

全体像はこちらをご覧ください。

https://qiita.com/taka_yayoi/items/1f7825b06c16e8b721da

こちらで紹介する内容にはモニタリングは含めていませんが、[レイクハウスモニタリング](https://docs.databricks.com/ja/lakehouse-monitoring/index.html)を活用することでRAGアプリケーションを監視することも可能です。
![Screenshot 2024-05-06 at 20.31.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6615c22c-37f3-5415-8611-87b389eaaa47.png)

全体的な流れや機能説明に関してはこちらも参照ください。

https://qiita.com/Mitsuhiro_Itagaki/items/be256775a8ce4b725827

前編ではデータとVector Search Indexの準備までをカバーします。
![Screenshot 2024-05-06 at 21.20.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6e2766dc-30c5-6b81-9303-504b8161b886.png)

翻訳版のノートブックはこちらです。

https://github.com/taka-yayoi/public_repo_2/tree/master/llm-rag-chatbot

# サンプルノートブックのインストール

適当なクラスターとノートブックを作成して以下を実行します。

```py
%pip install dbdemos
```
```py
import dbdemos
dbdemos.install('llm-rag-chatbot', catalog='takaakiyayoi_catalog', schema='rag_chatbot')
```

上のカタログやスキーマは適宜変更してください。

以下のようなノートブックとクラスターが作成されます。

- 01-quickstart
- 02-advanced
- _resources
- 00-RAG-LLM-RAG-Introduction
- config

今回は`01-quickstart`配下のノートブックを実行していきます。その前に設定ファイル等を修正します。

# config

後ほど作成するVector Searchエンドポイントは作成数に上限があったりしますので、`VECTOR_SEARCH_ENDPOINT_NAME`を使用できるものに変更します。

```py
#VECTOR_SEARCH_ENDPOINT_NAME="dbdemos_vs_endpoint"
VECTOR_SEARCH_ENDPOINT_NAME="one-env-shared-endpoint-8"

DATABRICKS_SITEMAP_URL = "https://docs.databricks.com/ja/doc-sitemap.xml"

catalog = "takaakiyayoi_catalog"

#email = spark.sql('select current_user() as user').collect()[0]['user']
#username = email.split('@')[0].replace('.', '_')
#dbName = db = f"rag_chatbot_{username}"
dbName = db = "rag_chatbot"
```

# _resources/00-init

これは今回のデータセット限定の話ですが、Databricksマニュアルのサイトマップが日本語のURLでも英語のドキュメントを指しているので置換処理を追加しています。

コマンド14を以下のように以下のように変更しています。

```py
def download_databricks_documentation_articles(max_documents=None):
    # Fetch the XML content from sitemap
    response = requests.get(DATABRICKS_SITEMAP_URL)
    root = ET.fromstring(response.content)

    # Find all 'loc' elements (URLs) in the XML
    urls = [loc.text for loc in root.findall(".//{http://www.sitemaps.org/schemas/sitemap/0.9}loc")]
    replace_urls = [s.replace('https://docs.databricks.com/en/', 'https://docs.databricks.com/ja/') for s in urls] # 英語URLを日本語URLに

    if max_documents:
        urls = replace_urls[:max_documents]
        #urls = urls[:max_documents]

    # Create DataFrame from URLs
    df_urls = spark.createDataFrame(replace_urls, StringType()).toDF("url").repartition(10)
    #df_urls = spark.createDataFrame(urls, StringType()).toDF("url").repartition(10)
```

# 1/ LLM Chatbot RAGのデータ準備

`01-quickstart/01-Data-Preparation-and-Index`を実行していきます。

## ナレッジベースを構築し、Databricks Vector Searchのドキュメントを準備する

<img src="https://github.com/databricks-demos/dbdemos-resources/blob/main/images/product/chatbot-rag/llm-rag-managed-flow-1.png?raw=true" style="float: right; width: 800px; margin-left: 10px">

このノートブックでは、チャットボットがより良い回答をできるように、ドキュメントのページを取り込みんで、Vector Search Indexでインデックスを作成します。

みなさまのチャットbotのパフォーマンスにおいては、高品質なデータの準備がキーとなります。ご自身のデータセットを用いてこれを実装することに時間を費やすことをお勧めします。

嬉しいことに、Lakehouse AI(現Mosaic AI)は皆様のAIとLLMプロジェクトを加速する最先端のソリューションを提供し、大規模なデータの取り込みと準備をシンプルにします。

この例では、[docs.databricks.com](docs.databricks.com)のDatabricksドキュメントを使用します:
- Webページのダウンロード
- 小規模なチャンクにページを分割
- HTMLコンテンツからテキストを抽出
- DeltaテーブルをベースとしたVector Search Indexを作成

### 必要となる外部ライブラリのインストール

```py
%pip install mlflow==2.10.1 lxml==4.9.3 transformers==4.30.2 langchain==0.1.5 databricks-vectorsearch==0.22
dbutils.library.restartPython()
```

### リソースとカタログの初期化

```py
%run ../_resources/00-init $reset_all_data=false
```

## Databricksドキュメントのサイトマップとページの抽出

<img src="https://github.com/databricks-demos/dbdemos-resources/blob/main/images/product/chatbot-rag/llm-rag-data-prep-1.png?raw=true" style="float: right; width: 600px; margin-left: 10px">

最初に、Deltaテーブルとして生のデータセットを作成しましょう。

このデモでは、`docs.databricks.com`のドキュメントページからいくつかのドキュメントを直接ダウンロードし、HTMLコンテンツとして保存します。

こちらが主要なステップです:

- `sitemap.xml`ファイルからページのURLを抽出するためのクイックスクリプトを実行します
- Webページをダウンロードします
- 文書本体を抽出するためにBeautifulSoupを活用します
- Delta Lakeテーブルに結果を保存します

```py
if not table_exists("raw_documentation") or spark.table("raw_documentation").isEmpty():
    # Databricksのドキュメントをデータフレームにダウンロード (詳細は _resources/00-init をご覧ください)
    doc_articles = download_databricks_documentation_articles()
    # raw_documentationテーブルに保存
    doc_articles.write.mode('overwrite').saveAsTable("raw_documentation")

display(spark.table("raw_documentation").limit(2))
```
![Screenshot 2024-05-06 at 21.07.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4aaf4a3f-00f5-662e-6843-12b763e65760.png)

### ドキュメントページを小規模なチャンクに分割

<img src="https://github.com/databricks-demos/dbdemos-resources/blob/main/images/product/chatbot-rag/llm-rag-data-prep-2.png?raw=true" style="float: right; width: 600px; margin-left: 10px">

通常、LLMモデルはに最大の入力ウィンドウサイズがあり、非常に長いテキストのエンべディングを計算することができません。さらに、コンテキストが大きくなるほど、モデルがレスポンスを生成するのに必要とする時間が長くなります。

ドキュメントの準備はモデルが適切に動作するためには重要であり、皆様のデータセットに応じて複数の戦略が存在します:

- 小規模なチャンク(パラグラフ, h2...)にドキュメントを分割します
- ドキュメントを固定長に切り取ります
- チャンクサイズは皆様のコンテンツとプロンプトを作成するためにどのように活用するのかに依存します。プロンプトに複数の小規模なドキュメントチャンクを追加することで、大規模なチャンクを送信するのとは異なる結果を生成します。
- 高速なライブ推論のために、大規模なチャンクに分割し、ワンオフのジョブとしてそれぞれのチャンクの要約するようにモデルに依頼します。
- それぞれの大規模なドキュメントを並列で評価するために複数のエージェントを作成し、回答を生成するために最終的なエージェントに依頼します...

### 大規模なドキュメントページを小規模なチャンクに分割 (h2セクション)

このデモでは、我々のモデルには大きすぎる大規模なドキュメントがいくつか存在します。これらの文書をHTMLの`h2`タグの間で分割し、それぞれのチャンクが4000トークン以上にならないようにします。

また、モデルに平文テキストを送信するようにHTMLタグも除外します。


<img src="https://github.com/databricks-demos/dbdemos-resources/blob/main/images/product/chatbot-rag/chunk-window-size.png?raw=true" style="float: right" width="700px">
<br/>
このデモでは、我々のモデルには大きすぎる大規模なドキュメントがいくつか存在します。

最大の入力サイズを超えてしまうため、複数のドキュメントをRAGのコンテキストとしては使用できません。いくつかの最近の研究でも、LLMはあなたのプロンプトの最初と最後にフォーカスする傾向があるため、大きなウィンドウサイズが常に優れているとは限らないと述べています。

我々のケースでは、LangChainを用いて、HTMLの`h2`タグの間の文で分割を行ってHTMLを除外し、それぞれのチャンクが500トークンに収まるようにします。

### LLMウィンドウサイズとトークナイザー

同じセンテンスであっても、モデルが変わると返却されるトークンも異なります。LLMは、指定されたセンテンスに対していくつかのトークンが生成されるのかをカウント(通常は単語数以上のものです)するために活用できる`Tokenizer`も提供しています。([Hugging Faceドキュメント](https://huggingface.co/docs/transformers/main/tokenizer_summary) や [OpenAI](https://github.com/openai/tiktoken)をご覧ください)

使用するトークナイザーとコンテキストサイズの上限がエンべディングモデルとマッチするようにしてください。Databricks DBRX InstructはGPT4と同じトークナイザーを使用します。DBRX Instructのトークンとそのトークナイザーを考慮するように`transformers`ライブラリを使用います。また、これによって、ドキュメントのトークンサイズをエンべディングの最大サイズ(1024)に収めるようにします。

:::note info
**お知らせ**
  以降のステップはお使いのデータセット固有になることを覚えておいてください。これは、適切なRAGアシスタントの構築において重要な部分となります。

作成されたチャンクを手動で確認し、それらが適切な情報を含んでいることを確認するために、常に時間を費やすようにしてください。
:::

### HTMLページを小規模なチャンクに分割

```py
from langchain.text_splitter import HTMLHeaderTextSplitter, RecursiveCharacterTextSplitter
from transformers import AutoTokenizer, OpenAIGPTTokenizer

max_chunk_size = 500

tokenizer = OpenAIGPTTokenizer.from_pretrained("openai-gpt")
text_splitter = RecursiveCharacterTextSplitter.from_huggingface_tokenizer(tokenizer, chunk_size=max_chunk_size, chunk_overlap=50)
html_splitter = HTMLHeaderTextSplitter(headers_to_split_on=[("h2", "header2")])

# Split on H2で分割しますが、あまり小さすぎないように小さなh2チャンクはマージします
def split_html_on_h2(html, min_chunk_size = 20, max_chunk_size=500):
  if not html:
      return []
  h2_chunks = html_splitter.split_text(html)
  chunks = []
  previous_chunk = ""
  # チャンクを結合し、h2の前にテキストを追加することでチャンクを結合し、小さすぎる文書を回避します
  for c in h2_chunks:
    # h2の結合 (注意: 重複したh2を回避するために以前のチャンクを削除することもできます)
    content = c.metadata.get('header2', "") + "\n" + c.page_content
    if len(tokenizer.encode(previous_chunk + content)) <= max_chunk_size/2:
        previous_chunk += content + "\n"
    else:
        chunks.extend(text_splitter.split_text(previous_chunk.strip()))
        previous_chunk = content + "\n"
  if previous_chunk:
      chunks.extend(text_splitter.split_text(previous_chunk.strip()))
  # 小さすぎるチャンクの破棄
  return [c for c in chunks if len(tokenizer.encode(c)) > min_chunk_size]
 
# チャンク処理関数を試しましょう
html = spark.table("raw_documentation").limit(1).collect()[0]['text']
split_html_on_h2(html)
```

```
['Databricks Connect for Scala  \n注  \nこの記事では、Databricks Connect for Databricks Runtime 13.3 LTS 以降について説明します。  \nこの記事では、 IntelliJ IDEA と Scala プラグインで Scala を使用して、Databricks Connect をすぐに使い始める方法について説明します。  \nこの記事の Python バージョンについては、「 Databricks Connect for Python」を参照してください。  \nこの記事の R バージョンについては、「 Databricks Connect for R」を参照してください。  \nDatabricks Connect を使用すると、IntelliJ IDEA、ノートブック サーバー、その他のカスタム アプリケーションなどの一般的な IDE を Databricks クラスターに接続できます。 「Databricks Connect とは」を参照してください。  \nチュートリアル',
 'チュートリアル\nこのチュートリアルをスキップして、代わりに別の IDE を使用するには、「 次の手順」を参照してください。\n\n要件',
 '要件\nこのチュートリアルを完了するには、次の要件を満たす必要があります。  \nターゲットの Databricks ワークスペースとクラスターは、 Databricks Connect のクラスター構成の要件を満たしている必要があります。  \nクラスター ID が使用可能になっている必要があります。 クラスター ID を取得するには、ワークスペースでサイドバーの [ コンピュート ] をクリックし、クラスターの名前をクリックします。 Web ブラウザーのアドレスバーで、URL の clusters から configuration までの文字列をコピーします。  \nJava 開発キット (JDK) が開発マシンにインストールされていること。 Databricks では、使用する JDK インストールのバージョンを Databricks クラスターの JDK バージョンと一致させることをお勧めします。 次の表に、サポートされている各 Databricks Runtimeの JDK バージョンを示します。  \nDatabricks Runtimeのバージョン  \nJDK のバージョン  \n13.3 LTS - 15.0、13.3 ML LTS - 15.0 ML  \nJDK 8  \n注',
 'Databricks Runtimeのバージョン  \nJDK のバージョン  \n13.3 LTS - 15.0、13.3 ML LTS - 15.0 ML  \nJDK 8  \n注  \nJDK がインストールされていない場合、または開発マシンに複数の JDK がインストールされている場合は、後の手順 1 で特定の JDK をインストールまたは選択できます。クラスター上の JDK バージョンより下または上位の JDK インストールを選択すると、予期しない結果が発生したり、コードがまったく実行されなかったりする可能性があります。  \nIntelliJ IDEA がインストールされています。 このチュートリアルは、IntelliJ IDEA Community Edition 2023.3.6 でテストされました。 IntelliJ IDEA の異なるバージョンまたはエディションを使用する場合、次の手順は異なる場合があります。  \nIntelliJ IDEA 用の Scala プラグイン がインストールされています。',
 'ステップ 1: Databricks 認証を構成する\nこのチュートリアルでは、Databricks OAuth ユーザー対マシン (U2M) 認証と Databricks 構成プロファイル を使用して、Databricks ワークスペースで認証を行います。 代わりに別の認証の種類を使用するには、「 接続プロパティの構成」を参照してください。  \nOAuth U2M 認証を構成するには、次のように Databricks CLI が必要です。  \nまだインストールされていない場合は、 次のように Databricks CLI をインストールします。  \nHomebrew を使用して、次の 2 つのコマンドを実行して Databricks CLI をインストールします。  \nbrew tap databricks/tap brew install databricks  \nDatabricks CLI をインストールするには、 winget、 Chocolatey 、または Windows Subsystem for Linux (WSL) を使用できます。 winget、Chocolatey、または WSL を使用できない場合は、この手順をスキップし、代わりにコマンド プロンプトまたは PowerShell を使用してソースから Databricks CLI をインストールする必要があります。  \n注  \nDatabricks CLI と Chocolatey のインストールは 実験段階です。  \nwinget を使用して Databricks CLI をインストールするには、次の 2 つのコマンドを実行し、コマンド プロンプトを再起動します。  \nwinget search databricks winget install Databricks.DatabricksCLI',
 'winget search databricks winget install Databricks.DatabricksCLI  \nChocolatey を使用して Databricks CLI をインストールするには、次のコマンドを実行します。  \nchoco install databricks-cli  \nWSL を使用して Databricks CLI をインストールするには、次のようにします。  \nWSL を使用して curl と zip をインストールします。 詳細については、オペレーティング システムのマニュアルを参照してください。  \nWSL を使用して、次のコマンドを実行して Databricks CLI をインストールします。  \ncurl -fsSL https://raw.githubusercontent.com/databricks/setup-cli/main/install.sh | sh  \n次のコマンドを実行して、Databricks CLI がインストールされ、インストールされている Databricks CLI の現在のバージョンが表示されることを確認します。 このバージョンは 0.205.0 以上である必要があります。  \ndatabricks -v  \n注  \ndatabricks を実行しても command not found: databricksなどのエラーが発生した場合、または databricks -v を実行してバージョン番号が 0.18 以下の場合は、マシンで Databricks CLI 実行可能ファイルの正しいバージョンが見つからないことを意味します。これを修正するには、「 CLI のインストールを確認する」を参照してください。  \nOAuth U2M 認証を次のように開始します。',
 'OAuth U2M 認証を次のように開始します。  \nDatabricks CLI を使用して、ターゲット ワークスペースごとに次のコマンドを実行して、OAuth トークン管理をローカルで開始します。  \n次のコマンドで、 <workspace-url> を Databricks ワークスペース インスタンスの URL に置き換えます (例: https://dbc-a1b2345c-d6e7.cloud.databricks.com)。  \ndatabricks auth login --configure-cluster --host <workspace-url>  \nDatabricks CLI では、入力した情報を Databricks 構成プロファイルとして保存するように求められます。 Enterを押して、提案されたプロファイル名を受け入れるか、新規または既存のプロファイルの名前を入力します。同じ名前の既存のプロファイルは、入力した情報で上書きされます。 プロファイルを使用すると、複数のワークスペース間で認証コンテキストをすばやく切り替えることができます。  \n既存のプロファイルの一覧を取得するには、別のターミナルまたはコマンド プロンプトで、Databricks CLI を使用してコマンド databricks auth profilesを実行します。 特定のプロファイルの既存の設定を表示するには、コマンド databricks auth env --profile <profile-name>を実行します。',
 'Web ブラウザーで、画面の指示に従って Databricks ワークスペースにログインします。  \nターミナルまたはコマンド プロンプトに表示される使用可能なクラスターの一覧で、上方向キーと下方向キーを使用してワークスペース内のターゲット Databricks クラスターを選択し、 Enterを押します。 また、クラスターの表示名の任意の部分を入力して、使用可能なクラスターの一覧をフィルター処理することもできます。  \nプロファイルの現在の OAuth トークン値とトークンの今後の有効期限のタイムスタンプを表示するには、次のいずれかのコマンドを実行します。  \ndatabricks auth token --host <workspace-url>  \ndatabricks auth token -p <profile-name>  \ndatabricks auth token --host <workspace-url> -p <profile-name>  \n同じ --host 値を持つプロファイルが複数ある場合は、Databricks CLI で一致する正しい OAuth トークン情報を見つけられるように、 --host オプションと -p オプションを一緒に指定する必要がある場合があります。',
 'ステップ2：プロジェクトを作成する\nIntelliJ IDEAを起動します。  \nメイン メニューで、[ファイル] > [新しい> プロジェクト] をクリックします。  \nプロジェクトに意味のある 名前を付けます。  \n[場所] でフォルダー アイコンをクリックし、画面の指示を完了して、新しい Scala プロジェクトへのパスを指定します。  \n[言語] で [Scala] をクリックします。  \n[ビルド システム] で sbt をクリックする。  \n「JDK」ドロップダウンリストで、クラスターの JDK バージョンと一致する開発マシン上の JDK の既存のインストールを選択するか、「JDK のダウンロード」を選択し、画面の指示に従って、クラスターの JDK バージョンと一致する JDK をダウンロードします。  \n注  \nクラスター上の JDK バージョンより上または下の JDK インストールを選択すると、予期しない結果が発生したり、コードがまったく実行されなかったりする可能性があります。  \nsbt のドロップダウンリストで、最新バージョンを選択する。  \n[Scala] ドロップダウンリストで、クラスター上の Scala バージョンと一致する Scala のバージョンを選択します。 次の表は、サポートされている各 Databricks Runtimeの Scala バージョンを示しています。',
 'Databricks Runtimeのバージョン  \nScala バージョン  \n13.3 LTS - 15.0、13.3 ML LTS - 15.0 ML  \n2.12.15  \n注  \nクラスターで Scala バージョンより下または上位の Scala バージョンを選択すると、予期しない結果が発生したり、コードがまったく実行されなかったりする可能性があります。  \nScalaの横にある[ソースのダウンロード]ボックスがオンになっていることを確認します。  \n[ パッケージ接頭辞] に、プロジェクトのソースのパッケージ接頭辞の値 ( org.example.applicationなど) を入力します。  \n[ サンプル コードの追加 ] ボックスがオンになっていることを確認します。  \n「作成」をクリックします。',
 'ステップ3：Databricks Connectパッケージを追加する',
 'ステップ3：Databricks Connectパッケージを追加する\n新しい Scala プロジェクトを開いた状態で、[プロジェクト] ツール ウィンドウ ([ツールウィンドウの表示] > [プロジェクト] > で、プロジェクト名>ターゲットで build.sbtという名前のファイルを開きます。  \n次のコードを build.sbt ファイルの末尾に追加して、Scala 用 Databricks Connect ライブラリの特定のバージョンに対するプロジェクトの依存関係を宣言します。  \nlibraryDependencies += "com.databricks" % "databricks-connect" % "14.3.1"  \n14.3.1、クラスター上の Databricks Runtime バージョンと一致するバージョンの Databricks Connect ライブラリに置き換えます。 Databricks Connect ライブラリのバージョン番号は、 Maven の中央リポジトリで確認できます。  \nsbt の変更をロードする通知アイコンをクリックして、Scala プロジェクトを新しいライブラリの場所と依存関係で更新する。  \nIDE の下部にある sbt 進行状況インジケーターが消えるまで待ちます。 sbtロード プロセスが完了するまでに数分かかる場合があります。',
 'ステップ4：コードを追加する\n[プロジェクト ] ツール ウィンドウで、 メイMain.scalaン > の [プロジェクト名 ] > src &gtScala; で という名前のファイルを開きます。  \nファイル内の既存のコードを次のコードに置き換え、構成プロファイルの名前に応じてファイルを保存します。  \nステップ 1 の構成プロファイルの名前が DEFAULTの場合は、ファイル内の既存のコードを次のコードに置き換えて、ファイルを保存します。  \npackage org.example.application import com.databricks.connect.DatabricksSession import org.apache.spark.sql.SparkSession object Main { def main(args: Array[String]): Unit = { val spark = DatabricksSession.builder().remote().getOrCreate() val df = spark.read.table("samples.nyctaxi.trips") df.limit(5).show() } }  \nステップ 1 の構成プロファイルの名前が DEFAULTでない場合は、ファイル内の既存のコードを次のコードに置き換えてください。 プレースホルダ <profile-name> をステップ 1 の構成プロファイルの名前に置き換えて、ファイルを保存します。',
 'package org.example.application import com.databricks.connect.DatabricksSession import com.databricks.sdk.core.DatabricksConfig import org.apache.spark.sql.SparkSession object Main { def main(args: Array[String]): Unit = { val config = new DatabricksConfig().setProfile("<profile-name>") val spark = DatabricksSession.builder().sdkConfig(config).getOrCreate() val df = spark.read.table("samples.nyctaxi.trips") df.limit(5).show() } }',
 "ステップ 5: コードを実行する\nステップ 5: コードを実行する\nリモートのDatabricksワークスペースでターゲット・クラスターを開始します。  \nクラスターが起動したら、メイン メニューで [ 実行] をクリックし> ['Main' の実行] をクリックします。  \n[ 実行 ] ツール ウィンドウ ([実行] > [ツール ウィンドウの表示]> [ メイン ] タブに、 samples.nyctaxi.trips テーブルの最初の 5 行が表示されます。\n\nステップ 6: コードをデバッグする",
 "ステップ 6: コードをデバッグする\nターゲット クラスターがまだ実行されている状態で、上記のコードで [ df.limit(5).show() ] の横にある余白をクリックしてブレークポイントを設定します。  \nメイン メニューで、[実行] > [' Main'] のデバッグをクリックします。  \n[デバッグ] ツール ウィンドウ ([デバッグ] >> [ツール] ウィンドウの表示) の [コンソール] タブで、電卓 ([式の評価]) アイコンをクリックします。  \n式df.schemaを入力し、[ 評価] をクリックして DataFrameのスキーマを表示します。  \n[デバッグ] ツールウィンドウのサイドバーで、緑色の矢印（[プログラムの再開]）アイコンをクリックします。  \n[コンソール] ウィンドウに、samples.nyctaxi.trips テーブルの最初の 5 行が表示されます。",
 '次のステップ\nDatabricks Connect の詳細については、次のような記事を参照してください。  \nOAuth U2M 以外の Databricks 認証の種類を使用するには、「 接続プロパティの構成」を参照してください。  \n他の IDE を使用するには、以下を参照してください。  \nIntelliJ IDEA  \nVisual Studio Code  \nその他の簡単なコード例については、「 Databricks Connect for Scala のコード例」を参照してください。  \nより複雑なコード例を表示するには、GitHub の Databricks Connect リポジトリのサンプル アプリケーション を参照してください。  \nシンプルなETLアプリケーション  \nJFreeChartによるグラフの視覚化  \nDatabricks Connect for Databricks Runtime 12.2 LTS 以下から Databricks Connect for Databricks Runtime 13.3 LTS 以降に移行するには、「 Databricks Connect for Scala への移行」を参照してください。  \nトラブルシューティングと制限事項に関する情報も参照してください。']
```

### チャンクを作成し、Deltaテーブルに保存

最後のステップは、ドキュメントのすべてのテキストにUDFを適用し、`databricks_documentation`テーブルに保存することです。

*このパートは多くの場合、新規ドキュメントのページが更新されるとすぐに実行されるプロダクションレベルのジョブであるケースが多いことに注意してください。
<br/>これは、更新をインクリメンタルに処理するためのDelta Live Tableパイプラインである場合があります。*

### databricks_documentationを格納する最終的なテーブルの作成

```sql
%sql
--インデックスを作成するためには、テーブルでチェンジデータフィードを有効化する必要があることに注意してください
CREATE TABLE IF NOT EXISTS databricks_documentation (
  id BIGINT GENERATED BY DEFAULT AS IDENTITY,
  url STRING,
  content STRING
) TBLPROPERTIES (delta.enableChangeDataFeed = true); 
```
```py
# sparkですべてのドキュメントのチャンクを作成するためのユーザー定義関数(UDF)を作成しましょう
@pandas_udf("array<string>")
def parse_and_split(docs: pd.Series) -> pd.Series:
    return docs.apply(split_html_on_h2)
    
(spark.table("raw_documentation")
      .filter('text is not null')
      .withColumn('content', F.explode(parse_and_split('text')))
      .drop("text")
      .write.mode('overwrite').saveAsTable("databricks_documentation"))

display(spark.table("databricks_documentation"))
```
![Screenshot 2024-05-06 at 21.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b0f9c92c-afe0-baf6-f8e4-724fb27af3bc.png)

## Vector Search Indexに必要なもの

<img src="https://github.com/databricks-demos/dbdemos-resources/blob/main/images/product/chatbot-rag/databricks-vector-search-managed-type.png?raw=true" style="float: right" width="800px">

Databricksは複数のタイプのVector Search Indexを提供します:

- **マネージドのエンべディング**: テキストのカラムとエンドポイント名を指定すると、DatabricksはDeltaテーブルとインデックスを同期します  **(このデモではこちらを使います)**
- **セルフマネージドのエンべディング**: エンべディングをご自身で計算し、Deltaテーブルのフィールドとして保存します。Databricksはインデックスと同期を行います。
- **ダイレクトインデックス**: Deltaテーブルを使うことなしにインデックスを更新したい場合に使用します。

このデモでは、**マネージドのエンべディング**のインデックスのセットアップ方法を説明します。 *(セルフマネージドのエンべディングはadvancedデモでカバーされています)*

## Databricks BGE Embeddings Foundation Modelエンドポイントのご紹介

<img src="https://github.com/databricks-demos/dbdemos-resources/blob/main/images/product/chatbot-rag/llm-rag-data-prep-4.png?raw=true" style="float: right; width: 600px; margin-left: 10px">

基盤モデルはDatabricksによって提供され、すぐに利用することができます。

Databricksでは、エンべディングを計算したり、モデルを評価するためのいくつかのエンドポイントタイプがサポートされています:
- **基盤モデルエンドポイント**はDatabricksによって提供されます(例: llama2-70B, MPT, BGE)。
- **外部エンドポイント**は外部モデルへのゲートウェイとして動作します(例: Azure OpenAI)。**このデモではこちらを使います。**
- **カスタム**はDatabricksのモデルサービスにホスティングされるファインチューンされたモデルです。

基盤モデルを探索、トライするために[モデルサービングエンドポイントページ](/ml/endpoints)を開きましょう。

このデモでは、`text-embedding-ada-002` (embeddings) と `llama2-70B` (chat)を使います。 <br/><br/>

<img src="https://github.com/databricks-demos/dbdemos-resources/blob/main/images/product/chatbot-rag/databricks-foundation-models.png?raw=true" width="600px" >

:::note warn
**注意**
対象が日本語なので、ここではエンべディングモデルとしてOpen AIの`text-embedding-ada-002`を使用しています。手順は[こちら](https://docs.databricks.com/ja/generative-ai/external-models/index.html)を参照ください。
![Screenshot 2024-05-06 at 21.11.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a9565bf6-89e9-315b-2b4f-f89561e2a256.png)
:::

### エンべディングとは何か

```py
import mlflow.deployments
deploy_client = mlflow.deployments.get_deploy_client("databricks")

# エンべディングエンドポイントはテキストをベクトル(floatの配列)に変換します。ここでは text-embedding-ada-002 を使います:
response = deploy_client.predict(endpoint="taka-text-embedding-ada-002", inputs={"input": ["What is Apache Spark?"]})
embeddings = [e['embedding'] for e in response.data]
print(embeddings)
```
```
[[-0.006902608, -0.017193953, -0.0037404627, -0.02846269, -0.011160512, 0.003194274, 0.0038825057, -0.017207481, 0.011897783, -0.041530635, 0.011850435, 0.0041530635, -0.0062194495, -0.017708013, 0.002184755, 0.010849371, 0.03243989, -0.029815478, 0.00070302776, -0.0043931836, -0.023525007, 0.008840479, -0.0051947115, -0.007264479, -0.008914882, 0.022361608, 0.014596597, -0.006111226, -0.015083602, -0.013818744, 0.021942245, -0.009997114, 0.0015996734, -0.00077658566, -0.015557078, 0.006128136, -0.016247, -0.025134828, -0.005647896, -0.02524305, 0.028219188, -0.007264479, -0.012986778, -0.016233472, -0.019831892, 0.0067132176, -0.0041260077, -0.014637182, 0.012127757, 0.011458126, 0.030789487, -0.0030065745, -0.034712575, -0.007176548, 0.015002434, -0.013757869, -0.018844357, 0.010335311, 0.022091052, 0.0021340253, 0.008252015, 0.014745405, -0.026108835, 0.008522573, 0.0036423854, 0.00060368225, -0.011160512, 0.0348208, -0.02190166, -0.004457441, 0.06666546, 0.016869284, -0.0033261708, -0.00808968, 0.009131328, -0.0023978192, -0.032521058, -0.012682401, 0.009368067, 0.0016148924, 0.016206417, 0.008400822, -0.0069533377, 0.0014880684, 0.0036153297, 0.0018381026, -0.016422864, 0.00716302, -0.03398207, 0.0015709267, -0.0038385398, -0.013000306, 0.036065366, 0.016165834, -0.011877491, 0.014515431, 0.013588769, 0.0085428655, -0.0023470896, -0.026609367, -0.0020562399, -0.008421114, -0.01377816, -0.003554454, -0.005630986, 0.0024958965, 0.008035569, 0.0062465053, 0.028760303, 0.026555257, 0.0033464627, 0.008867535, 0.005113544, -0.06152486, -0.023863206, -0.0036728233, 0.027867462, -0.026825814, -0.0049681193, -0.0046400675, 0.03449613, 0.04388449, 0.027732182, -0.017559206, 0.0015573988, 0.0012614761, -0.01933136, -0.0068620243, 0.0025229522, -0.012912375, 0.007406522, 0.030356593, 0.024999548, -0.027028732, -0.01617936, 0.008062625, -0.0015117421, -0.016368752, -0.044046823, -0.021022348, 0.018330297, 0.029815478, -0.021847548, -0.036633536, -0.0033481538, -0.0003392542, 0.00915162, 0.0020731497, 0.017897405, -0.003963673, 0.029301418, -0.0038182482, 0.010917011, 0.0061856294, 0.01175574, 0.008394058, 0.00483284, 0.010592341, -0.027272234, 0.0015548624, -0.00709538, 0.006601612, 0.034550242, -0.004856514, -0.0017501713, 0.02897675, -0.0017434073, -0.013460254, -0.00049207715, -0.019317832, -0.016260529, 0.004822694, -0.029788423, 0.0168287, 0.007974694, 0.0038926515, 0.010294727, 0.020887068, 0.0045589004, 0.000896223, 0.008211432, 0.0045555183, 0.0072171316, 0.00693981, -0.02171227, -0.014731877, -0.0027224887, -0.005495707, 0.015070074, -0.005624222, 0.021482296, 0.020143034, -0.0251213, -0.006003003, -0.64630866, -0.033630345, 0.0063344366, -0.030275427, 0.013142349, 0.00851581, 0.023078587, -0.008109973, -0.0004011866, -0.012533594, 0.009949766, 0.0040008747, -0.0034597588, -0.0051541277, -0.02075179, -0.01669342, 0.009625097, -0.005898162, -0.006239741, 0.0046569775, -0.022456303, 0.030329539, -0.014231345, -0.02133349, 0.0120465895, 0.010998178, 0.031519994, -0.026230587, -0.027245179, -0.00354769, -0.028895581, 0.006892462, 0.017721541, -0.00515751, 0.028760303, -0.0042815786, -0.026447034, 0.02524305, -0.014623653, 0.05100016, -0.027529264, 0.003329553, 0.028895581, -0.017302176, 0.011349903, -0.006858642, 0.011336375, -0.008468461, 0.016747532, -0.006013149, -0.0016943688, -0.008062625, -0.00610108, 0.015787052, 0.00716302, 0.009943002, 0.024133762, -0.00027711046, -0.0025178792, 0.034414962, -0.0033701365, 0.019980699, 0.006716599, -0.026568783, -0.004477733, -0.0033988834, 0.0011278882, -0.005377338, 0.02075179, -0.030437762, 0.014867156, 0.008150556, 0.0093004275, -0.029382586, 0.007879999, 0.010998178, 0.022118106, -0.0028222569, 0.012053354, -0.013818744, -0.01605761, -0.014204289, -0.03519958, -0.016152306, 0.0121412845, -0.0016613945, -0.016842227, -0.031330604, 0.004457441, -0.0006210149, 0.028300354, 0.032034054, -0.012161577, -0.039961398, -0.012668873, 0.032926895, 0.0022540854, -0.010511174, 0.0063445824, -0.017559206, 0.00024434758, -0.018600855, 0.008022041, -0.00080068223, 0.012540358, -0.0015294976, -0.025675943, -0.018546743, 0.019547807, -0.02177991, 0.0023200337, 0.008082917, -0.00406175, -0.006909372, -0.001278386, -0.025067188, 0.02838152, -0.025973557, 0.0130882375, -0.028625024, -0.00486666, -0.008231724, 0.0075891484, -0.0075688567, -0.008279071, 0.0052048573, 0.0062126853, -0.016639309, -0.016247, -0.01747804, 0.008793131, 0.011958659, -0.0074403416, -0.003173982, 0.02037301, 0.0053739557, 0.011620461, -0.0039704368, 0.005221767, -0.018709077, -0.020832958, 0.016409336, 0.0024062742, 0.0026463943, -0.029328475, -0.013724049, -0.03427968, -0.0050560506, -0.008306127, 0.008522573, -0.012161577, -0.01843852, -0.012905611, 0.012398315, 0.020454176, 0.0029964286, 0.0042376127, -0.027191067, -0.00992271, -0.029707255, -0.008657852, 0.037607547, 0.008644325, 0.009178676, -0.015448855, -0.0137511045, 0.002311579, 0.010206796, -0.0048835697, -0.029382586, 0.014041954, -0.002670068, -0.003447922, 0.024241986, -0.023944372, 0.013406143, -0.015259464, -0.008935174, -0.007521509, -0.0028002742, 0.009915946, 0.040096678, -0.014664237, 0.0003654645, -0.013839035, 0.029112028, 0.03963673, 0.015421799, -0.016869284, -0.0022033558, -0.009625097, 0.051595386, -0.004220703, 0.022334553, -0.01676106, -0.01072762, 0.0072171316, 0.0043898015, 0.012432135, 0.020900596, 0.04025901, 0.0030082655, 0.0016064374, 0.018533215, 0.013169405, -0.032385778, -0.0027191066, -0.0116678085, 0.023849677, 0.0082249595, 0.014177233, -0.021238795, -0.020832958, 0.00030184112, -0.0049275355, 0.012459191, -0.008231724, 0.01785682, -0.04098952, 0.020724734, -0.0014102829, -0.0044134753, 0.0026261024, -0.005888016, -0.012195396, 0.01509713, 0.016152306, 0.04618423, 0.0054314495, -0.02608178, -0.0026954329, -0.006659106, 0.00382163, -0.016192889, 0.020021284, 0.02370087, -0.01216834, -0.016138777, 0.034009125, -0.006030059, -0.0010619396, 0.011491946, 0.030518929, -0.0068315864, 0.02897675, 0.011322848, 0.043208092, 0.020440647, -0.018871412, 0.024566656, -0.0153947435, -0.012973251, -0.0116881, 0.030951822, 0.0033971923, -0.00738623, -0.0041462993, -0.021982828, 0.0022591583, 0.053326957, -0.0036085658, 0.0058068484, 0.027393986, -0.016003499, 0.00014394525, 0.000642575, 0.0009089054, -0.016084665, 0.017112786, -0.008062625, -0.0012022916, -0.012939431, -0.003316025, -0.022091052, 0.023525007, 0.007541801, -0.012181869, 0.032602224, 0.011092873, 0.016855756, -0.023010949, -0.04323515, 0.0061721015, -0.0032636044, -0.019277249, -0.016882813, -0.0057392092, 0.0036288577, -0.008901354, 0.023308562, 0.0054314495, -0.0022439393, -0.0015201971, 0.0014889138, -0.009368067, -0.002663304, 0.02003481, 0.0042646686, -0.0025905918, 0.0050932523, -0.006009767, 0.0040076384, 0.015043018, -0.023065059, 0.024891324, 0.0007964548, 0.020927653, -0.024093179, 4.356933e-05, -0.019980699, -0.00017237496, -0.008279071, -0.00457581, -0.020981764, 5.117877e-05, 0.018154433, -0.0071021444, 0.005184565, 0.028408578, 0.008434642, -0.012276564, -0.0034665228, -0.005127072, 0.008563157, 0.051027216, 0.0061349, -0.013798452, 0.0035206345, -0.033468008, 0.0078461785, -0.012357731, 0.008434642, 0.0042781965, -0.018898468, -0.01021356, 0.0018262657, 0.021279378, 0.002915261, -0.004890334, 0.012797387, -0.005742591, -0.0044202395, -0.012810916, -0.03571364, -0.0070480327, -0.005742591, 0.026325282, -0.00305054, 0.0057831747, 0.0009266607, -0.0051778015, -0.009861834, -0.008847243, -0.029707255, -0.013189697, 0.0025144974, 0.01830324, -0.00024942055, 0.0042376127, 0.036390036, 0.004359364, 0.017870348, -0.0018516305, 0.020535342, -0.0046502138, 0.015665302, 0.0058947797, 0.0015472529, 0.018709077, -0.017978571, 0.009286899, 0.016544614, -0.010693801, -0.0057087713, 0.012323911, 0.028868526, -0.024282569, 0.015935859, -0.002818875, 0.006293853, 0.0081235, 0.0150159625, -0.019033747, -0.03038365, -0.035578363, -0.005630986, -0.014420735, -0.0013527893, -0.00047009432, -0.026217058, 0.02601414, -0.018533215, -0.00018896777, -0.0046163937, 0.008732256, -0.036525313, -0.047293518, -0.0041124797, 0.040556625, 0.011072582, 0.0072441874, -0.023660287, -0.020332424, 0.03720171, -0.0054415953, -0.008306127, 0.01747804, -0.023416784, 0.0037675186, -0.029842535, -0.0067233634, 0.002299742, 0.0033887376, 0.017112786, 0.002037639, 0.01230362, 0.005488943, -0.023200339, -0.006266797, 0.021292904, 0.035443082, 0.023322089, 0.00021390982, -0.010003878, -0.0025753728, -0.034712575, 0.003053922, -0.015354159, 0.009205732, 0.014298984, 0.008488754, -0.0031367803, -0.016017027, -0.0035950379, 0.001790755, -0.020508287, 0.011261972, 0.0021103516, 0.026230587, 0.002169536, 0.004876806, 0.040448405, -0.037607547, 0.0081302645, 0.009043397, -0.019696614, 0.015935859, 0.04328926, -0.00973332, 0.0073727025, 0.0061923936, -0.026920509, -0.000383854, -0.0019818365, -0.011613697, 0.017369816, -0.013960787, -0.010626161, -0.034523185, -0.0032365487, -0.013047654, 0.00562084, -0.0122359805, -0.008400822, -0.0069736294, -0.007988221, -0.015462383, 0.00044346126, -0.00892841, -0.02935553, -0.031114155, -0.015584134, -0.012851499, 0.023876732, -0.0339009, 0.011539293, -0.021861076, -0.009713028, -0.0002498433, -0.004332308, -0.005461887, -0.024877798, 0.02838152, 0.0101526845, 0.03744521, 0.0022270295, 0.023416784, 0.008238488, -0.017680958, -0.023795566, -0.0032500764, 0.0006827359, 0.010862899, 0.020129506, 0.028679136, 0.0034732867, -0.003055613, -0.0054483595, 0.009841543, 0.008684908, -0.009516873, -0.027136955, -0.025080716, -0.032061107, 0.005127072, 0.004836222, -0.020697678, -0.0017501713, -0.012445662, -0.0027072697, 0.025107771, 0.016260529, 0.01856027, 0.005854196, 0.030086037, 0.018154433, 0.030167203, -0.00023039695, 0.014123121, -0.01670695, -0.0071021444, -0.00075587106, -0.008867535, 0.01773507, 0.010544993, 0.021144098, 0.0028949694, 0.013034126, 0.0141637055, 0.02159052, 0.008732256, -0.00012397047, 0.012533594, -0.021888133, -0.014204289, -0.043018702, -0.03322451, -0.014961851, -0.00061255996, 0.013385851, -0.01374434, 0.014867156, -0.021847548, -0.0068451143, 0.021117043, 0.014285456, 0.02781335, 0.0108155515, 0.03936617, -0.0059116897, -0.007487689, -0.011681337, -0.0077447193, 0.0024671496, -0.016084665, 0.0024434759, 0.02897675, -5.6753743e-05, -0.010822315, 0.014596597, -0.015922332, -0.0056918613, -0.0056783333, 0.012858263, -0.006351346, -7.799677e-05, -0.016084665, -0.018709077, -0.0101526845, 0.04572428, -0.018993163, 0.0029744457, 0.008312891, -0.017302176, 0.0011557895, 0.005718917, 0.018452048, 0.003571364, -0.008076153, -0.015002434, -0.0032382396, -0.012621525, -0.005522763, -0.012986778, 0.009483053, 0.033089228, -0.0020782228, 0.0060469685, 0.005357046, 0.015895275, -0.017423928, 0.0055126166, 0.0006083325, 0.031547047, -0.01643639, -0.004599484, 3.9685347e-05, -0.016368752, 0.022564527, -0.0045149345, 0.009212496, 0.007893526, -0.0055734925, 0.011113165, 0.03262928, 0.0008619805, -0.00065060717, -0.011999242, -0.0020934416, 0.005590402, -0.0010560212, -0.013108529, 0.006801149, -0.016720477, -0.020075394, -0.013223517, -0.006926282, 0.02159052, 0.020021284, 0.0031232527, -0.007927346, 0.011214624, -0.015340632, -0.015922332, 0.037472267, 0.00057409, -0.02318681, 0.017275121, 0.013189697, -0.018343825, 0.04688768, -0.0033684457, -0.026419977, -0.032656338, 0.031060046, 0.003091124, 0.008252015, -0.018736133, 0.0031181795, 0.013270864, -0.0034732867, 0.0009334247, -0.0055734925, 0.012959722, -0.009178676, 0.0063412003, 0.025946502, -0.03211522, 0.0037370808, 0.005242059, 0.00093680667, 0.003072523, -0.021211738, -0.04147652, -0.00091144186, -0.0045352266, -0.02037301, 0.0019327978, -0.0023961281, -0.021549935, -0.021292904, 0.00856992, -0.004383038, -0.0020156563, -0.01348731, 0.022185747, -0.013034126, -0.003175673, -0.003584892, -0.01307471, -0.0021898279, -0.017816236, -0.035037246, -0.031628218, -0.005468651, 0.01586822, 0.009232787, -0.03357623, -0.025554191, -0.006513681, -0.021617575, 0.0116881, -0.016531086, 0.008434642, 0.012925902, 0.0076973718, 0.0063547282, -0.009929474, 0.011343139, 0.03160116, -0.019493695, 0.007054797, -0.010308255, -0.008001749, -0.022523943, -0.032521058, -0.038554497, 0.0097400835, 0.01024738, 0.003814866, 0.0023859823, 0.015814109, -0.011796324, -0.018871412, -0.015164769, 0.0028983513, 0.011985715, 0.014339568, 0.016219946, -0.027218122, -0.009672444, 0.010186505, -0.004971501, -0.0090163415, -0.009239552, 0.014096065, -0.024133762, 0.026609367, -0.027975684, -0.009462762, -0.009746848, 0.0082587795, 0.0011591715, -0.015814109, 0.014758932, 0.020914124, -0.0012792315, 0.0015142786, -0.011261972, -0.0065847025, -0.024823686, 0.0068789343, 0.029463753, -0.009023106, -0.02177991, -0.009719792, 0.010030934, -0.0128041515, -0.008840479, 0.00083999767, -0.00061636465, -0.013663173, 0.024945436, 0.0017704632, 0.0018381026, -0.0075688567, 0.0030167203, 0.004484497, 0.0081235, 0.005221767, 0.021698741, -0.007521509, 0.008272307, 0.011505474, -0.030410705, -0.014393679, 0.015678829, 0.0041632093, 0.012966487, 0.015759997, 0.2528093, 0.0037742825, 0.010632925, 0.03235872, 0.009280135, 0.012195396, -0.0032500764, 0.00047009432, -0.02781335, 0.021144098, 0.016138777, -0.018289713, -0.02094118, 0.011113165, -0.0015616263, -0.0037607546, -0.011444598, -0.010233852, -0.004484497, -0.050188486, 0.008772839, -0.0002845085, -0.0055565825, -0.0002735171, 0.0076500243, 0.008948702, -0.013534658, -0.026352338, 0.0141637055, 0.03322451, -0.0025246432, 0.011958659, -0.01703162, 0.014826572, -0.004717853, -0.014515431, 0.023917317, 0.0022287206, 0.015340632, 0.030491874, 0.0026531583, -0.0205624, -0.0081302645, -0.020900596, 0.0051642735, -0.017302176, -0.021685215, -0.015746469, 0.0052657328, 0.027461626, -0.018614382, 0.012702692, 0.009259843, 0.015043018, -0.0074538696, 0.012770332, 0.0112890275, 0.0028949694, 0.00032847418, -0.017099258, -0.006361492, 0.02659584, -0.009280135, 0.024458433, 0.008177612, 0.014623653, -0.021144098, 0.021563463, 0.0046434496, 0.00088438607, -0.0064291316, -0.018059738, 0.0067267455, -0.017829765, 0.0010594032, -0.017099258, 0.009564221, 0.00094864354, 0.022726862, 0.018911995, -0.010835843, -0.014907739, -0.013406143, -0.009855071, 0.004842986, -0.007379466, 0.01573294, -0.018059738, -0.019534279, -0.014894212, 0.00899605, -0.014677765, -0.010193268, -0.026731119, 0.038716834, 0.017518623, -0.0054348316, 0.0093951225, 0.00027076926, 0.029599031, -0.02073826, 0.048348695, 0.016679894, 0.0012217379, -0.010044461, 0.011931603, 0.005996239, 0.006378402, 0.012973251, -0.012858263, -0.011248444, -0.03603831, 0.014366623, -0.01413665, 0.003065759, -0.0060368227, -0.010964358, -0.0122698, 0.004470969, -0.018654967, -0.00091059634, -0.02068415, -0.009192204, 0.017762125, -0.026771702, -0.025960028, -0.022605112, 0.00016286316, -0.034901965, -0.011674573, 0.018384408, -0.015448855, -0.00973332, 0.010457062, -0.0145424865, -0.008563157, -0.012932667, 0.018046211, 0.015137713, 0.012831207, 0.0072712433, -0.0065745567, 0.004383038, 0.028408578, -0.026406448, -0.010639689, 0.012594469, -0.017248064, 0.0005453432, -0.016734004, -0.030004868, -0.0050289948, 0.007859707, -0.0179921, 0.028922638, 0.0006827359, 0.002299742, -0.017180426, -0.014407207, 0.002418111, -0.046644177, 0.012668873, 0.024471961, 0.00033883148, -0.014894212, -0.015922332, -0.17423928, -0.012533594, 0.0038757417, -0.025270106, 0.016679894, 0.022456303, 0.016152306, -0.0018465575, 0.012371259, 0.01695045, 0.00022426712, -0.016382279, -0.014623653, 0.0032974242, 0.016558142, -0.00457581, 0.0040346943, 0.014041954, 0.032926895, 0.008137029, 0.008468461, -0.010998178, 0.0050526685, 0.009401887, 0.00072247407, -0.0076500243, -0.018506158, 0.022348082, 0.0074944533, -0.018709077, -0.003943381, -0.010416479, 0.010490882, 0.0008281608, 0.015367688, -0.01400137, 0.009341011, -0.006716599, -0.0074944533, 0.020007756, 0.025134828, 0.0055971663, 0.017450983, -0.01984542, 0.0062025394, 0.021238795, 0.014623653, 0.0010703946, 0.004190265, 0.0026582312, 0.02748868, -0.019236665, -0.0021255703, -0.006797767, 0.008772839, 0.010220324, -0.014799516, 0.03373857, 0.0145424865, -0.032412834, 0.008116736, -0.009584513, -0.013013834, -0.043451596, -0.006841732, -0.019818366, 0.0045555183, 0.023984956, -0.036011253, 0.0077650114, 0.015881747, 0.023849677, -0.014028426, 0.0086984355, -0.017545678, 0.0014170469, -0.02575711, 0.041205965, 0.009469526, -0.00058254495, -0.0046265395, 0.038121607, -0.0057967026, 0.00069584104, 0.014907739, 0.0020105832, 0.010193268, -0.00709538, -0.010944067, -0.017166898, 0.009570985, -0.020873541, -0.02267275, 0.0026311753, -0.0077379555, 0.02229397, 0.002421493, 0.013656409, 0.029734312, -0.0086037405, -0.010003878, 0.019967172, -0.023714399, 0.023389729, 0.030654209, 0.0022523943, -0.011079345, 0.003065759, 0.03468552, 0.0019125061, -0.03912267, -0.0001538798, 0.035875976, 0.027245179, -0.01965603, 0.027245179, 0.010578813, -0.024756046, 0.023930844, -0.01208041, 0.04247759, -0.01419076, -0.014150177, 0.027786294, -0.010003878, -0.031763494, -0.09307191, -0.023795566, 0.01824913, -0.0015261156, 0.0051507456, 0.04247759, 0.00094357063, 0.029896647, -0.007785303, 0.018424992, 0.011011706, -0.02884147, -0.0021949008, -0.01419076, 0.008008514, -0.023038004, -0.006256651, -0.004315398, -0.016287584, 0.013223517, -0.016476976, -0.013615825, -0.02748868, 0.0010501028, -0.001278386, -0.016341696, -0.021306433, 0.00069372734, 0.015935859, -0.010923774, 0.014244872, -0.033035118, 0.0008569075, -0.023484424, 0.004988411, -0.012066881, -0.011681337, -0.017045146, 0.015962915, -0.026744647, 0.0015125877, -0.00035151388, 0.029599031, -0.025351273, -0.010260908, 0.002414729, 0.0013147423, 0.027732182, 0.019683085, -0.012892083, -0.019926587, 0.004819312, -0.018452048, -0.009368067, 0.018479103, -0.003689733, 0.022632167, 0.014380151, -0.010098573, -0.018966107, 0.011999242, 0.0012487937, -0.008103209, 0.0028577675, 0.027867462, -0.0019767636, -0.0055667283, -0.013176169, 0.01017974, -0.029139083, -0.025648886, -0.00786647, -0.022307497, -0.0008970685, -0.008576685, -0.022212802, -0.016233472, 0.0014550941, 0.011025233, 0.0062972344, -0.010166212, -0.02068415, 0.017829765, -0.012547121, 0.015002434, 0.0013756177, 0.00344454, -0.014880683, 0.018046211, -0.021089986, -0.00024244523, 0.017396871, 0.009543929, -0.0042883423, -0.040150788, 0.0024062742, 0.020589454, -0.0073253545, 0.01676106, 0.029436698, -0.0046400675, -0.0073388824, -0.07207662, 0.007893526, 0.0090772165, -0.02274039, 0.0114784185, -0.019385472, -0.0016529396, -0.009070453, -0.0005795857, 0.019507224, -0.03373857, 0.0057020076, -0.00039146343, 0.019615447, -0.01371052, 0.0009647079, 0.028733246, -0.01677459, 0.005350282, 0.0032280937, -0.014948323, 0.0024586949, 0.01920961, 0.022578055, -0.016274057, -0.0034614499, -0.0029693728, 0.032034054, -0.022686278, -0.031384714, 0.0068755522, -0.029084973, 0.0064832433, 0.024309626, -0.0086037405, -0.014150177, -0.0061890115, 0.025391856, -0.0061754836, 0.040610738, -0.014596597, -0.031898774, 0.011031997, -0.030167203, -0.0041801194, -0.012702692, 0.022185747, -0.022835085, 0.031844664, -0.0110996375, 0.029761367, 0.013155877, -0.014826572, -0.018803773, -0.022212802, -0.030464817, 0.033468008, -0.006621904, -0.0045622825, 0.0035104884, 0.039447337, 0.042504642, -0.0015861456, 0.004454059, 0.012729748, 0.00014066896, 0.002418111, 0.009083981, 0.007920582, -0.039393228, 0.014231345, -0.02248336, 0.019926587, 0.009990349, 0.007433578, -0.00406175, -0.0053198445, 0.00052674237, -0.018127378, 0.009469526, -0.010112101, -0.033170395, -0.0073591745, 0.0044100937, 0.056167815, 0.02010245, -0.023525007, 0.014528958, -0.019669559, -0.014380151, -0.008170848, 0.0005893089, -0.011126692, 0.013169405, 0.0077244276, -0.004098952, -0.010003878, -0.017545678, 0.0011304247, 0.033116285, 0.01024738, -0.0055836383, 0.0015066692, -0.013061182, -0.017207481, -0.00030332076, 0.006263415, 0.011505474, 0.014677765, 0.0102812, 0.03335979, 0.005353664, -0.019899532, 0.013291156, 0.0016892958, 0.006124754, -0.016842227, -0.021725798, -0.020900596, 0.018032683, 0.01914197, 0.021387601, 0.023619702, -0.019169025, 0.024499016, 0.011004942, 0.007954402, -0.013588769, 0.009280135, 0.004339072, -0.000704296, 0.014244872, 0.0005377338, -0.008475225, -0.021820493, 0.0077650114, -0.021752853, 0.015043018, -0.00030268662, 0.07261773, 0.035551306, 0.0059083076, 0.0112890275, 0.0032805144, 0.0016241928, 0.0060503506, -0.00738623, -0.01617936, -0.018032683, 0.015881747, 0.002414729, -0.010592341, -0.024580184, -0.0039129434, -0.008299363, -0.012770332, 0.012966487, -0.0013071328, 0.009097509, 0.031763494, 0.022794502, -0.00031135292, 0.0071021444, -0.040367234, -0.0015743086, 0.054192744, 0.008833715, 0.011248444, -0.03758049, 0.029923702, 0.0015692357, -0.044993777, -0.019480167, -0.00146524, 0.012912375, -0.0011084419, -0.023998484, 0.021211738, 0.003182437, 0.004744909, 0.010808787, -0.030951822, -0.022172218, 0.020521816, 0.005336754, -0.009726556, -0.0239579, -0.020075394]]
```

### マネージドエンべディングを用いたVector Search Indexの作成

<img src="https://github.com/databricks-demos/dbdemos-resources/blob/main/images/product/chatbot-rag/llm-rag-data-prep-3.png?raw=true" style="float: right; width: 600px; margin-left: 10px">

マネージドエンべディングを用いることで、Databricksが自動でエンべディングを計算します。Databricksを使い始めるにはより簡単なモードとなっています。

Vector Search Indexはエンべディングを提供するために、**Vector search endpoint**を使用します(あなたのVector Search APIエンドポイントと考えることができます)。

複数のインデックスが同じエンドポイントを使うことができます。

一つ作ってみましょう。

#### Vector Searchエンドポイントの作成

```py
from databricks.vector_search.client import VectorSearchClient
vsc = VectorSearchClient()

#if not endpoint_exists(vsc, VECTOR_SEARCH_ENDPOINT_NAME):
#    vsc.create_endpoint(name=VECTOR_SEARCH_ENDPOINT_NAME, endpoint_type="STANDARD")

#wait_for_vs_endpoint_to_be_ready(vsc, VECTOR_SEARCH_ENDPOINT_NAME)
#print(f"Endpoint named {VECTOR_SEARCH_ENDPOINT_NAME} is ready.")
```

### Vector Search Indexの作成

<img src="https://github.com/databricks-demos/dbdemos-resources/blob/main/images/index_creation.gif?raw=true" width="600px" style="float: right">

[Vector SearchエンドポイントのUI](#/setting/clusters/vector-search)からエンドポイントを確認することができます。エンドポイントによって提供されるすべてのインデックスを確認するためにエンドポイント名をくりっっくします。

それでは、Databricksにインデックスの作成を指示しましょう。

マネージドエンべディングインデックスなので、テキストのカラムとエンべディング基盤モデルを指定するだけです。Databricksが自動でエンべディングを計算します。

これは、APIやUnity Catalogのカタログエクスプローラからの数クリックで行うことができます。

#### エンドポイントを用いたマネージドvector searchの作成

```py
from databricks.sdk import WorkspaceClient
import databricks.sdk.service.catalog as c

# インデックスを作成したいテーブル
source_table_fullname = f"{catalog}.{db}.databricks_documentation"
# インデックスの格納場所
vs_index_fullname = f"{catalog}.{db}.databricks_documentation_vs_index"

if not index_exists(vsc, VECTOR_SEARCH_ENDPOINT_NAME, vs_index_fullname):
  print(f"Creating index {vs_index_fullname} on endpoint {VECTOR_SEARCH_ENDPOINT_NAME}...")
  vsc.create_delta_sync_index(
    endpoint_name=VECTOR_SEARCH_ENDPOINT_NAME,
    index_name=vs_index_fullname,
    source_table_name=source_table_fullname,
    pipeline_type="TRIGGERED",
    primary_key="id",
    embedding_source_column='content', # テキストを格納しているカラム
    embedding_model_endpoint_name='taka-text-embedding-ada-002' # エンべディング作成に用いるエンべディングエンドポイント
  )
  # すべてのエンべディングが作成され、インデックスが作成されるのを待ちます
  wait_for_index_to_be_ready(vsc, VECTOR_SEARCH_ENDPOINT_NAME, vs_index_fullname)
else:
  # Vector Searchのコンテンツを更新し、新規データを保存するように同期処理を起動
  wait_for_index_to_be_ready(vsc, VECTOR_SEARCH_ENDPOINT_NAME, vs_index_fullname)
  vsc.get_index(VECTOR_SEARCH_ENDPOINT_NAME, vs_index_fullname).sync()

print(f"index {vs_index_fullname} on table {source_table_fullname} is ready")
```

エンべディングの作成が完了するまで待ちます。
![Screenshot 2024-05-06 at 21.16.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/31ab1dfd-5d5d-c95f-ee90-b6155aaa08f8.png)

```
index takaakiyayoi_catalog.rag_chatbot.databricks_documentation_vs_index on table takaakiyayoi_catalog.rag_chatbot.databricks_documentation is ready
```

## 類似コンテンツの検索

やらなくてはならないことはこれで全てです。DatabricksはDelta Live Tablesを用いて、新規のエントリーを自動で捕捉し同期します。

データセットのサイズやモデルのサイズに応じて、エンべディングの作成とインデックス作成に数秒を要することに注意してください。

類似コンテンツの検索を試してみましょう。

:::note
**注意**
`similarity_search`は、filtersパラメーターもサポートしています。これはRAGシステムにセキュリティレイヤーを追加するのに有用です: 誰が呼び出しを行なっているのかに基づいて、センシティブなコンテンツを除外することができます(例えば、ユーザーの設定に基づき特定の部署にフィルタリングするなど)。
:::

```py
import mlflow.deployments
deploy_client = mlflow.deployments.get_deploy_client("databricks")

#question = "How can I track billing usage on my workspaces?"
question = "Databricksクラスターとは？"

results = vsc.get_index(VECTOR_SEARCH_ENDPOINT_NAME, vs_index_fullname).similarity_search(
  query_text=question,
  columns=["url", "content"],
  num_results=1)
docs = results.get('result', {}).get('data_array', [])
docs
```
```
[['https://docs.databricks.com/ja/workspace/workspace-assets.html',
  'クラスター\nDatabricks Data Science & Engineeringクラスターと Databricks Machine Learningクラスターは、本番運用ETLパイプラインの実行、ストリーミング分析、アドホック分析、機械学習などのさまざまなユースケースに対応する統合プラットフォームを提供します。クラスターは、Databricksコンピュートリソースの一種です。他のコンピュートリソースタイプには、Databricks SQLウェアハウスなどがあります。  \nクラスターの管理と使用の詳細については、「 コンピューティング」を参照してください。\n\nノートブック',
  0.86228603]]
```

## 次のステップ: DBRXを用いたRAGチャットボットモデルのデプロイ

DatabricksのLakehouse AIによって、容易に文書を取り込んで準備することができ、数行のコードと設定だけでそれらをベースとしたVector Search Indexをデプロイできることを見てきました。

これは、皆様が次のステップにフォーカスできるように、データプロジェクトをシンプルかつ加速します: 次のステップとは、適切に作成されたプロンプト拡張によるリアルタイムチャットボットエンドポイントの作成です。

チャットbotのエンドポイントを作成するために、`02-Deploy-RAG-Chatbot-Model`ノートブックを開きましょう。

後編に続きます。

https://qiita.com/taka_yayoi/items/cd23bf48142db120e70d

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)