DatabricksでLlamaIndexのSentenceTransformerRerankを動かしてみる

こちらのチュートリアルを試してみます。

https://docs.llamaindex.ai/en/stable/examples/node_postprocessor/SentenceTransformerRerank/

元記事は英語テキストを用いているので、こちらの記事で準備した自分のQiita記事を使います。

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

# SentenceTransformerRerank

リランクは精度を犠牲にすることなし(実際には改善することがあります)にLLMクエリーをスピードアップすることができます。コンテキストから不適切なノードを刈り取ることで、これを実現しています。

# ライブラリのインストール

```py
%pip install llama-index-embeddings-huggingface
%pip install llama-index-llms-openai
%pip install llama-index
%pip install "databricks-sql-connector[sqlalchemy]"
dbutils.library.restartPython()
```

```py
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
```

# Unity Catalogとの接続

```py
from llama_index.core import download_loader, SQLDatabase, VectorStoreIndex, SimpleDirectoryReader, Settings

DatabaseReader = download_loader('DatabaseReader')

access_token    = dbutils.notebook.entry_point.getDbutils().notebook().getContext().apiToken().getOrElse(None)
server_hostname = "<Databricksワークスペースのホスト名>"
http_path       = "<クラスターのHTTPパス>"
catalog         = "takaakiyayoi_catalog"
schema          = "qiita_2023"

reader = DatabaseReader(
    sql_database = SQLDatabase.from_uri(f"databricks://token:{access_token}@{server_hostname}?" +
        f"http_path={http_path}&catalog={catalog}&schema={schema}")
)
```

```py
query = f"""
SELECT
    body
FROM takaakiyayoi_catalog.qiita_2023.taka_qiita_2023
"""

documents = reader.load_data(query=query)
```

# インデックスの作成

```py
import os
os.environ["OPENAI_API_KEY"] = dbutils.secrets.get("demo-token-takaaki.yayoi", "openai_api_key")
```

```py
from llama_index.core import Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.openai import OpenAI

Settings.llm = OpenAI(model="gpt-3.5-turbo")
Settings.embed_model = HuggingFaceEmbedding(
    model_name="BAAI/bge-small-en-v1.5"
)
```

```py
# インデックスの構築
index = VectorStoreIndex.from_documents(documents=documents)
```

```py
from llama_index.core.postprocessor import SentenceTransformerRerank

rerank = SentenceTransformerRerank(
    model="cross-encoder/ms-marco-MiniLM-L-2-v2", top_n=3
)
```

# リランキングあり

最初にリランキングを試します。取得したコンテキストのアウトプットを処理するのにどのくらい時間がかかるのかを確認するためにクエリーを計測します。

```py
from time import time
```
```py
query_engine = index.as_query_engine(
    similarity_top_k=10, node_postprocessors=[rerank]
)

now = time()
response = query_engine.query(
    "レイクハウスとはなんですか？データレイクとの違いを教えてください",
)
print(f"Elapsed: {round(time() - now, 2)}s")
```
```
Elapsed: 5.85s
```

```py
print(response)
```

> レイクハウスは、データエンジニアリングにおいてデータの品質とAI資産の品質を同時に追跡し、データとAIを統合したモニタリングサービスです。レイクハウスモニタリングは、データとAI資産のプロファイルとドリフトのメトリクスを保持し、プロアクティブなアラートや品質ダッシュボードを提供し、データ品質アラートを関連付けて根本原因分析を促進します。一方、データレイクは、構造化されていないデータを格納するための大容量のデータストレージシステムであり、フォーマットが適用されていないデータも含まれます。レイクハウスは、データの品質とAI資産の品質を追跡するためのモニタリングサービスであり、データレイクはデータを格納するための大容量のデータストレージシステムです。

```py
print(response.get_formatted_sources(length=200))
```

```
> Source (Doc id: d2921ddc-d410-4536-aab4-32c729c267ba): データレイクの出現によって、データエンジニアは後段にいるデータ利用者が分析に使用するより多くのデータを管理、提供することになりました。データレイクに格納されるデータは、構造化されておらず、フォーマットも適用されていないことがあります。ビジネスサイドがデータから価値を導出する前に、データエンジニアは注意を払う必要があります。

幸運なことに、データエンジニアリングを通じてデータが完全に綺麗にフ...

> Source (Doc id: d4304a35-e904-4143-a751-d20eecfea0ee): お使いのテーブルのデータ分布や対応するモデルのパフォーマンスの変化を検知した際、Databricksレイクハウスモニタリングは変化を捕捉、警告することができるので、原意の特定の助けとなります。

Databricksレイクハウスモニタリングは、以下のような質問に回答する助けとなります:

- データの統一性はどのようなものか、そしてそれはどのように時間とともに変化しているのか？例えば、現在の...

> Source (Doc id: cdcc3c91-d79f-4f77-8a4f-7b98b3770d9d): これらのモデルのそれぞれに対して、レイクハウスAIのコンポーネントを最適化しています。例えば、モデルサービングのレーテンシーを最大10倍削減しています。[こちら](https://forms.gle/YDhv3RNCMxYC8iyM7)からプレビューにサインアップしてください。
- **AutoMLのLLMサポート:** 我々はAutoMLを、皆様のデータを用いたテキスト分類の生成AIモデル...
```

# リランク無し

次にリランク無しで試してみます。

```py
query_engine = index.as_query_engine(similarity_top_k=10)


now = time()
response = query_engine.query(
    "レイクハウスとはなんですか？データレイクとの違いを教えてください",
)

print(f"Elapsed: {round(time() - now, 2)}s")
```
```
Elapsed: 9.47s
```
```py
print(response)
```

> A Lakehouseは、データレイクとデータウェアハウスの最良の特徴を組み合わせた新しいデータ管理アーキテクチャです。データレイクの拡張性と柔軟性を提供することを目指しており、データウェアハウスの信頼性とパフォーマンスを兼ね備えています。Lakehouseとデータレイクの主な違いは、Lakehouseが通常データウェアハウスに関連付けられるデータガバナンス、品質、信頼性の要素を取り入れている点であり、同時にデータレイクのように多様なデータタイプや大容量を扱う能力を維持していることです.

```py
print(response.get_formatted_sources(length=200))
```
```
> Source (Doc id: b99aaaa9-618b-47c7-bc53-54d5b017544f): body: [Question Answering Over Documents \| 🦜️🔗 LangChain](https://docs.langchain.com/docs/use-cases/qa-docs)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

:::note
[Pyt...

> Source (Doc id: 2bce5ee3-7cb7-4d98-a9ee-8afbc0e4a7b9): 複雑なユースケースと、ローハンギングフルーツと考えられるユースケースとの間のバランスを取る必要があります。例えば、webの訪問者が既存顧客か新規顧客かを判別するには、webブラウザのクッキーデータと特定の個人、家庭で使用されるデバイスとの相関関係を活用する非常に単純なアルゴリズムを必要とします。しかし、アカウントの地理的、時間的情報、店舗情報、顧客の購買挙動を考慮する高度なクレジットカード不...

> Source (Doc id: d2921ddc-d410-4536-aab4-32c729c267ba): データレイクの出現によって、データエンジニアは後段にいるデータ利用者が分析に使用するより多くのデータを管理、提供することになりました。データレイクに格納されるデータは、構造化されておらず、フォーマットも適用されていないことがあります。ビジネスサイドがデータから価値を導出する前に、データエンジニアは注意を払う必要があります。

幸運なことに、データエンジニアリングを通じてデータが完全に綺麗にフ...

> Source (Doc id: 02c67862-6bed-42f8-ae52-95d1e080348f): 必要とされるものが前者であるならば、異なる次元における類似性を用いてアイテムを比較するコンテントベースのレコメンダーが必要となります。後者が必要な場合には、協調フィルターが適切な選択肢となります。

# マトリクス因数分解はユーザーの嗜好を認識するための堅牢な手段です

協調フィルターは長い歴史を持っており、多くの様々なフレーバーで提供されています。もし、*あなたの購買履歴に基づいた、あるい...

> Source (Doc id: 6e81956b-f40f-453a-87b8-c76cc6424bbf): このタスクでは、プロンプトは従うべき非常に固有な指示を与えるものである必要があります。制約、指示、ガイドライン、要件はすべて動作し、これらが多いほど優れています。
- **クローズドのQA:** Wikipediaの文に基づいた事実として正しいレスポンスを必要とする質問や指示を書いてください。この質問は複雑なものでも良く、人間レベルの理由づけ能力を必要としても構いませんが、特殊な知識を必要と...

> Source (Doc id: 7998605a-fc35-4dc8-a86a-4023eb1ee600): レガシーなデータアーキテクチャは、ビジネスの取り組みをサポートするために複数のベンダーのデータプロダクトを繋ぎ合わせており、最終的には以下の理由で失敗します:

- **複雑なアーキテクチャ:** 複数製品のアプローチのため、複数のベンダーのプロプライエタリなコードを理解する必要があり、チームの生産性と市場投入のスピードを阻害します。
- **高いレーテンシー:** データの種類、速度、ボリ...

> Source (Doc id: cdcc3c91-d79f-4f77-8a4f-7b98b3770d9d): これらのモデルのそれぞれに対して、レイクハウスAIのコンポーネントを最適化しています。例えば、モデルサービングのレーテンシーを最大10倍削減しています。[こちら](https://forms.gle/YDhv3RNCMxYC8iyM7)からプレビューにサインアップしてください。
- **AutoMLのLLMサポート:** 我々はAutoMLを、皆様のデータを用いたテキスト分類の生成AIモデル...

> Source (Doc id: c7a939bd-e166-46f0-b9f4-cb076c10d0dc): 既存のソーシャルネットワーク、技術的インフラストラクチャ、言語的、文化的な表現は、誰がアクセスでき、アクセスによってメリットを得られうのかにおいて重要な役割を担います。さらに、コンテンツ、情報エコシステム、過度の依存のセクションで議論するようにこのモデルは、特定のコンテンツの生成や特定の文脈でのデプロイメントを通じて特定のグループに対して経済的な害をなす場合があります。

トレーニングデータ...

> Source (Doc id: ec2483bf-bb63-42bd-be16-8da2bc8e79fd): **人手による取り組み、遅延、トレーニング/サービングの偏り:** このアーキテクチャでは多くの場合、JavaやC++のようにレーテンシーが最適化された言語を用いて、サーバーサイドで特徴量計算処理を再度記述する必要があります。これは、2つの異なる言語で特徴量が作られることによりトレーニングとサービングで偏りが生じる可能性を持ち込むだけではなく、機械学習エンジニアがオフラインシステムとオンライ...

> Source (Doc id: d4304a35-e904-4143-a751-d20eecfea0ee): お使いのテーブルのデータ分布や対応するモデルのパフォーマンスの変化を検知した際、Databricksレイクハウスモニタリングは変化を捕捉、警告することができるので、原意の特定の助けとなります。

Databricksレイクハウスモニタリングは、以下のような質問に回答する助けとなります:

- データの統一性はどのようなものか、そしてそれはどのように時間とともに変化しているのか？例えば、現在の...
```

見てわかるように、リランキングするクエリーエンジンはより短い時間でより正確なアウトプットを生成しています。両方のレスポンスは基本的には正しいですが、リランキングなしのクエリーエンジンには多くの不適切な情報が含まれており、我々はこれを「コンテキストウィンドウの汚染」によるものと考えることができます。

### はじめてのDatabricks

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

### Databricks無料トライアル

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