Databricks デモ：Compound AI System and Agent Tools - その１

# はじめに

株式会社NTTデータ [デジタルサクセスソリューション事業部](https://enterprise-aiiot.nttdata.com/) で Databricks や AWS を推進している [nttd-saitouyun](https://qiita.com/nttd-saitouyun) です。

DATA + AI Summit 2024 の発表の目玉であった **AI Agent に関するデモがリリースされていました**。今回はこのデモを動かしてみようと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/e6c53f05-1d52-1969-6946-0ae2cd12c5c3.png)
（[Data + AI Summit Keynote Day 1 - Full](https://www.youtube.com/watch?v=UfbyzK488Hk&list=PLTPXxbhUt-YXh57uL3QUQiKLwTf39IoT1&index=2) より）



# デモについて
デモは Databricks社が提供しているデモ資材をダウンロドするツールである **dbdemos** から入手可能です。※dbdemos やその使い方は[こちらの記事](https://qiita.com/taka_yayoi/items/d0f872d0d8d9c6b20beb)を参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/10081891-6006-f97e-4cb6-52d6e8f7494e.png)


今回の対象のデモは以下のものです。
>**Compound AI System and Agent Tools**
Build and deploy tools to support your AI Systems with Unity Catalog

https://www.databricks.com/resources/demos/tutorials/data-science-and-ai/llm-tools-functions?itm_data=demo_center

デモ資材の入手は以下のコマンドを実行することでワークスペース上にダウンロードされます。
```python
%pip install dbdemos
```
```python
import dbdemos
dbdemos.install('llm-tools-functions', catalog='xxx', schema='xxx')
```
※`catalog` と `schema` はオプションです。オプションを指定し忘れた場合も config ファイルで後から設定可能です。


# Compound AI System and Agent Tools

現時点（2024年9月15日）では「00-AI-function-tools-introduction」というノートブックが１つ提供されていました。

ノートブックの末尾に追加のデモの予告が記載されているので今後増えていくのだと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/800377d0-5b02-5ac1-a9ea-65329c570ea0.png)



# 00-AI-function-tools-introduction

デモのノートブックを開いてみます。コンテンツは以下の通り英語であるため、翻訳した内容でデモを見ていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/a58aef84-6238-1279-b880-0bc9e51c0a18.png)

## 実行環境について
実行環境は、**サーバレスコンピュート**で実施します。

※デモのインストール時にサーバレスコンピュートでは適切に動作確認できていない旨のメッセージが出ますが、サーバレスでチャレンジします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/45a66d0c-dc91-c745-c711-773ab69c522c.png)

<br>

ここより下はデモの内容になります。

# 組み合わせ可能なAIシステム：当社製品を販売するAIスタイリストスペシャリストの構築 <br> <font color="silver">Composable AI systems: Building and AI Stylist Specialist selling our products</font>

デモのシナリオは「**AIスタイリスト**」です。「明日の面接に向けて何を着ればいい？」と言ったユーザが与えた状況に応じて、ただ一般論に基づいて回答するのではなく、**翌日の天気をAPIで取得したり、関連した商品を検索したりしながら、より適した服装を提案するAIを構築していきます**。



## 組み合わせ可能なAIシステムとは <br> <font color="silver">What's a composable AI systems</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/964db186-25cf-c615-2c4b-d97cf80e71b6.png)

"Composable AI systems" という表現をこのデモでは使っていますが、"[**Compound AI Systems**](https://www.databricks.com/jp/glossary/compound-ai-systems)"という表現をDatabricksは使うことが多いです。私も[こちら](https://qiita.com/nttd-saitouyun/items/4fc9bde0b338cb180e02#databricks-%E3%81%8C%E7%9B%AE%E6%8C%87%E3%81%99-%E7%94%9F%E6%88%90ai-%E3%81%AE%E4%B8%96%E7%95%8C%E8%A6%B3)に解説を記載していますので参考にしていただければ幸いです。


## Databricks Mosaic AIエージェントフレームワークを使用した組み合わせ可能なAIシステムの構築 <br> <font color="silver">Building Composable AI Systems with Databricks Mosaic AI agent framework</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/c275cfb8-b645-ea29-a202-887952d22b36.png)

AIスタイリストを実現するためには、AIエージェントが利用する**ツール**を定義します。

ツールには、服装を考えるようプロンプトエンジニアリングされたLLMだけでなく、LLMが苦手な計算を行う関数、LLMが知らない情報をAPIやテーブルを検索して取得する関数をいった非AIのツールも含まれます。**これらのツールをAIエージェントがタスクに応じて使い分け、より実用的なAIを実現します。**

そして、**これらのツールは Unity Catalog で管理することができ**、データやAIモデルと一緒に、適切にアクセス制御やメタデータ管理することができます。
<br>

事前の説明は以上です。ここから本題に入ります。

## 前準備

必要なパッケージのインストールと初期化スクリプトの実行を準備として行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/9dba9f40-a515-3021-08d4-a4ab3ec9fe16.png)





## ツールの作成：Unity Catalog関数の使用 <br> <font color="silver">Creating our tools: Using Unity Catalog Functions</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/0b54c3d7-78c9-5d9a-37b8-559515de34a8.png)

ここからAIエージェントが利用する数々のツールを定義していきます。作り方は特別なものではなく、[ユーザー定義関数 (UDF)](https://docs.databricks.com/ja/udf/index.html)と同じです。





### 数学の計算：インチからセンチメートルへの変換

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/5884ab58-edc5-9b05-54e4-127fcf04d3a3.png)

ご存知の通り、**LLMは計算が苦手**です。この例のようにセンチ↔︎インチなどの計算を正確に行うために関数を定義します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/39263d61-08cf-b697-a02f-57dc6178f05c.png)

関数の内容はシンプルな**スカラーUDF**です。スカラーUDFの詳細は[こちら](https://docs.databricks.com/ja/udf/python.html)から。

もちろん、 SQL以外にもPythonでコーディングすることもでき、以下のようになります。

```sql
%sql
CREATE OR REPLACE FUNCTION convert_inch_to_cm_py (size_in_inch FLOAT)
RETURNS FLOAT
LANGUAGE PYTHON
COMMENT 'convert size from inch to cm'
AS $$
  return size_in_inch * 2.54
$$
```

※Python UDF を Unity Catalog に登録するには、二重ドル記号 ($$) でくくる必要がありますのでご注意ください。詳細は[こちら](https://docs.databricks.com/ja/udf/unity-catalog.html#register-a-python-udf-to-uc)。
<br>
<br>

関数を作成すると Unity Catalog 上に表示されるようになります。ここから関数の詳細を確認したり、権限付与を行ったりすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/f26e87d5-0df5-5d52-b073-ff0439e766e4.png)




### 内部データを取得するツールの実行：最新の顧客注文の取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/4e4f3103-27a5-99b4-3f5c-e583f7b07806.png)

２つ目の関数です。初期化スクリプトによって、tools_customers（顧客テーブル）、tools_orders（注文テーブル）が作成されています。この２つのテーブルを使って、ユーザの注文情報を関数で抽出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/2f5e44b3-3ae9-2aab-4fc9-1808cc8c6edb.png)

こちらは戻り値がスカラーではなく、テーブル形式のデータである**ユーザー定義テーブル関数**です。細かい点は以下のマニュアルを参照してください。
- [Python ユーザー定義テーブル関数 (UDTF)](https://docs.databricks.com/ja/udf/python-udtf.html)
- [Create a SQL table function](https://docs.databricks.com/ja/sql/language-manual/sql-ref-syntax-ddl-create-sql-function.html#create-a-sql-table-function)


パッと見で処理の内容がわかりにくくなってきたので少し解説します。
まず、参照しているテーブルを確認しておきます。

【tools_customers（顧客テーブル）】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/8efdc224-804a-4fad-6da2-fea60e1ad36e.png)

（続き）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/0a0be66e-0159-5ee4-3066-8cd0927cecca.png)

【tools_orders（注文テーブル）】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/aba941da-001a-e3a8-8fee-172222c38a7c.png)

よくあるベーシックなテーブルでした。

ここで、関数の定義で `where email=current_user()` と条件を指定しいている点に注目してみます。`current_user()` はプログラムを実行しているユーザのユーザ名を取得する関数です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/c0b48df9-e428-b10c-a0d6-8d582fababf0.png)

ん？自分のダミーデータなんてあるのか？と思ったので、顧客テーブルを検索してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/bcf2d34c-79b8-ba1d-8020-6d994051a2b2.png)

ありました。「Dawn May」という名前で email が現在のユーザ名になっているようです。このような処理が初期化スクリプト内で仕込まれているようです。

よって、「Dawn May」の顧客IDである「d8ca793f-7f06-42d3-be1b-929e32fc8bc9」で注文テーブルと結合し、4件の注文データが表示されていました。

プログラムだけだと、どのような処理になっているのか分かりにくいと感じたため、データを見ながら説明してみました。





### リアルタイムで外部データセットを取得するPython関数の実行：天気の取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/2c70bc4c-e277-6639-bc6b-e1df22345248.png)

３つ目の関数です。[Open-Meteo](https://open-meteo.com/) というオープンソースの**天気APIを使って外部の情報を取得します**。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/8f1a0eeb-a5e4-91f0-360a-c3c0eb6d22ed.png)

API の URL は以下の通りです。
`
https://api.open-meteo.com/v1/forecast?latitude={latitude}&longitude={longitude}&current=temperature_2m,rain&forecast_days=1
`

調べたところ、API の各パラメーターは以下の通りでした。
- `latitude={latitude}` : 関数の引数として渡された緯度を指定
- `longitude={longitude}` : 関数の引数として渡された経度を設定
- `current=temperature_2m,rain` : 地上から2メートルの温度と降水量を取得値として指定
- `forecast_days=1` : 1日後の予測値を取得するように指定

ただし、初期状態では、デモで値を固定するために`#weather = ・・・`の部分がコメントアウトされているいます。よって、APIもコールされず、weather変数が定義されないため、値は `except`句に定義された値が必ず返るようになっています。

ちなみに、(緯度, 経度) = (52.52, 13.41)は なぜかベルリンテレビ塔の座標でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/22e28cff-3636-1284-da47-0b59f27d9d92.png)

本書執筆時（2024/9/15）でAPIを呼び出してみると、18.2度、降水量0.00でした。

`
https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41&current=temperature_2m,rain&forecast_days=1
`

```json
{"latitude":52.52,"longitude":13.419998,"generationtime_ms":0.0209808349609375,"utc_offset_seconds":0,"timezone":"GMT","timezone_abbreviation":"GMT","elevation":38.0,"current_units":{"time":"iso8601","interval":"seconds","temperature_2m":"°C","rain":"mm"},"current":{"time":"2024-09-15T13:15","interval":900,"temperature_2m":18.2,"rain":0.00}}
```






### 特定のプロンプトを持つLLMを呼び出す関数をツールとして作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/dfe815f8-0cbc-277d-15a7-c1c327741e58.png)

４つ目の関数です。天気の情報（気温と降水量）とユーザからの指示を受け取って、LLM が出力した推奨される服装に関する情報を提示します。

この関数は**内部で特定の専門知識を持った特化型LLMを呼び出しています**。今回はプロンプトエンジニアリングしかしていないですが、**RAG や Fine-Tuningした LLM を活用することもできます**。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/741f6683-0572-e6b5-5d25-a39ad9f41b5a.png)

Databricks には SQL から LLM を呼び出す`ai_query`関数が用意されています。呼び出す LLM とプロンプトを引き渡すだけです。より具体的な例は[他の記事](https://qiita.com/nttd-saitouyun/items/fb18480171acf1c12cda#ai_query-function-%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%9F%E6%83%85%E5%A0%B1%E6%8A%BD%E5%87%BA)にまとめています。

今回は `databricks-meta-llama-3-70b-instruct` という Databricks 上でホストされる Meta Llama 3 のモデルを利用しています。`databricks-meta-llama-3-1-70b-instruct`という次のバージョンがすでに利用できるのでこちらに変えてみてもいいかもしれません。

また、エンドポイントを作成すれば、**Databricks の外の LLM を呼び出すこともできます**。各プラットフォームのサービスを使用する方法は以下の記事を参照いただけばと思います。

- [Databricks の Mosaic AI Model Serving Endpoint から Amazon Bedrock の LLM を利用する](https://qiita.com/nttd-saitouyun/items/4fc9bde0b338cb180e02)
- [Databricks の Mosaic AI Model Serving Endpoint から Azure OpenAI の LLM を利用する](https://qiita.com/nttd-saitouyun/items/04e61af84e5cc25a26b9)
- [Databricks の Mosaic AI Model Serving Endpoint から Google Cloud Vertex AI の LLM を利用する](https://qiita.com/nttd-saitouyun/items/ec29189abfca6722fc00)





### ツールとして類似コンテンツを見つけるためのベクトル検索の使用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/fddb9339-21b6-1812-5ad6-dfd54dfb963f.png)

５つ目の関数です。４つ目の関数で生成した翌日の天気に適した服装の情報から、**ベクトル検索によって商品テーブルを検索し**、適切な商品を３つ提示します。が、デモを単純にするためここはモック化されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/7849e6e9-3d71-fd3c-55e5-212b40a91421.png)

４つ目の関数と作りはおなじで、`ai_query`関数を使って LLM にダミーの商品情報を生成させています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/91638391-63e6-db8d-319a-d6671a1b2241.png)




# おわりに
だいぶ長くなってきたので、前編はここまでにしたいと思います。

前編では、**AIエージェント（AIスタイリスト）が利用するツール（関数）を定義してきました**。

ツールは、以下のような**非AI**のものから、**AIを活用する**様々なものを定義してきました。
- LLM が苦手な計算をする関数
- LLM が知り得ないテーブルの情報や外部の情報をAPIで取得する関数
- 専門家の LLM にタスクを依頼する関数

**ツールの定義はUDFで定義するだけで簡単です**し、ツールの関数は **Unity Catalog の配下でガバナンスをかけることができます**。


[後編](https://qiita.com/nttd-saitouyun/items/692896ae12d3cbdd5d8c)ではこれらのツールをAIエージェントが活用するところをみていきます！


# 仲間募集
NTTデータ デザイン＆テクノロジーコンサルティング事業本部 では、以下の職種を募集しています。

<details><summary> 1. クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア) </summary>
クラウド／プラットフォーム技術の知見に基づき、DWH、BI、ETL領域におけるソリューション開発を推進します。

https://enterprise-aiiot.nttdata.com/recruitment/career_sp/cloud_engineer

</details>

<details><summary> 2. データサイエンス領域（データサイエンティスト／データアナリスト） </summary>
データ活用／情報処理／AI／BI／統計学などの情報科学を活用し、よりデータサイエンスの観点から、データ分析プロジェクトのリーダーとしてお客様のDX／デジタルサクセスを推進します。

https://enterprise-aiiot.nttdata.com/recruitment/career_sp/datascientist

</details>

<details><summary> 3.お客様のAI活用の成功を推進するAIサクセスマネージャー </summary>
DataRobotをはじめとしたAIソリューションやサービスを使って、
お客様のAIプロジェクトを成功させ、ビジネス価値を創出するための活動を実施し、
お客様内でのAI活用を拡大、NTTデータが提供するAIソリューションの利用継続を推進していただく人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=804

</details>

<details><summary> 4.DX／デジタルサクセスを推進するデータサイエンティスト《管理職/管理職候補》 </summary>
データ分析プロジェクトのリーダとして、正確な課題の把握、適切な評価指標の設定、分析計画策定や適切な分析手法や技術の評価・選定といったデータ活用の具現化、高度化を行い分析結果の見える化・お客様の納得感醸成を行うことで、ビジネス成果・価値を出すアクションへとつなげることができるデータサイエンティスト人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=898

</details>

# ソリューション紹介
<details><summary> Trusted Data Foundationについて </summary>
～データ資産を分析活用するための環境をオールインワンで提供するソリューション～

https://enterprise-aiiot.nttdata.com/tdf/
最新のクラウド技術を採用して弊社が独自に設計したリファレンスアーキテクチャ（Datalake+DWH+AI/BI）を顧客要件に合わせてカスタマイズして提供します。
可視化、機械学習、DeepLearningなどデータ資産を分析活用するための環境がオールインワンで用意されており、これまでとは別次元の量と質のデータを用いてアジリティ高くDX推進を実現できます。

</details>

<details><summary> NTTデータとDatabricksについて </summary>
NTTデータは、お客様企業のデジタル変革・DXの成功に向けて、「databricks」のソリューションの提供に加え、情報活用戦略の立案から、AI技術の活用も含めたアナリティクス、分析基盤構築・運用、分析業務のアウトソースまで、ワンストップの支援を提供いたします。

 https://enterprise-aiiot.nttdata.com/service/databricks

</details>

<details><summary> TDF-AM（Trusted Data Foundation - Analytics Managed Service）について </summary>
～データ活用基盤の段階的な拡張支援（Quick Start) と保守運用のマネジメント（Analytics Managed）をご提供することでお客様のDXを成功に導く、データ活用プラットフォームサービス～

https://enterprise-aiiot.nttdata.com/service/tdf/tdf_am
TDF-AMは、データ活用をQuickに始めることができ、データ活用の成熟度に応じて段階的に環境を拡張します。プラットフォームの保守運用はNTTデータが一括で実施し、お客様は成果創出に専念することが可能です。また、日々最新のテクノロジーをキャッチアップし、常に活用しやすい環境を提供します。なお、ご要望に応じて上流のコンサルティングフェーズからAI/BIなどのデータ活用支援に至るまで、End to Endで課題解決に向けて伴走することも可能です。

</details>

</details>

<details><summary> NTTデータとSnowflakeについて </summary>
NTTデータでは、Snowflake Inc.とソリューションパートナー契約を締結し、クラウド・データプラットフォーム「Snowflake」の導入・構築、および活用支援を開始しています。
NTTデータではこれまでも、独自ノウハウに基づき、ビッグデータ・AIなど領域に係る市場競争力のあるさまざまなソリューションパートナーとともにエコシステムを形成し、お客さまのビジネス変革を導いてきました。
Snowflakeは、これら先端テクノロジーとのエコシステムの形成に強みがあり、NTTデータはこれらを組み合わせることでお客さまに最適なインテグレーションをご提供いたします。

https://enterprise-aiiot.nttdata.com/service/snowflake

</details>

</details>

<details><summary> NTTデータとInformaticaについて </summary>
データ連携や処理方式を専門領域として10年以上取り組んできたプロ集団であるNTTデータは、データマネジメント領域でグローバルでの高い評価を得ているInformatica社とパートナーシップを結び、サービス強化を推進しています。

https://enterprise-aiiot.nttdata.com/service/informatica

</details>

</details>

<details><summary> NTTデータとTableauについて </summary>
ビジュアル分析プラットフォームのTableauと2014年にパートナー契約を締結し、自社の経営ダッシュボード基盤への採用や独自のコンピテンシーセンターの設置などの取り組みを進めてきました。さらに2019年度にはSalesforceとワンストップでのサービスを提供開始するなど、積極的にビジネスを展開しています。

これまでPartner of the Year, Japanを4年連続で受賞しており、2021年にはアジア太平洋地域で最もビジネスに貢献したパートナーとして表彰されました。
また、2020年度からは、Tableauを活用したデータ活用促進のコンサルティングや導入サービスの他、AI活用やデータマネジメント整備など、お客さまの企業全体のデータ活用民主化を成功させるためのノウハウ・方法論を体系化した「デジタルサクセス」プログラムを提供開始しています。

https://enterprise-aiiot.nttdata.com/service/tableau

</details>

</details>

<details><summary> NTTデータとAlteryxについて </summary>
Alteryxは、業務ユーザーからIT部門まで誰でも使えるセルフサービス分析プラットフォームです。
Alteryx導入の豊富な実績を持つNTTデータは、最高位にあたるAlteryx Premiumパートナーとしてお客さまをご支援します。

導入時のプロフェッショナル支援など独自メニューを整備し、特定の業種によらない多くのお客さまに、Alteryxを活用したサービスの強化・拡充を提供します。

https://enterprise-aiiot.nttdata.com/service/alteryx

</details>

</details>

<details><summary> NTTデータとDataRobotについて </summary>
DataRobotは、包括的なAIライフサイクルプラットフォームです。
NTTデータはDataRobot社と戦略的資本業務提携を行い、経験豊富なデータサイエンティストがAI・データ活用を起点にお客様のビジネスにおける価値創出をご支援します。

https://enterprise-aiiot.nttdata.com/service/datarobot

</details>