エージェントを用いたアプリでの複数Genieスペースのパワーの活用

[Leverage the Power of Multiple Genie Spaces Inside\.\.\. \- Databricks Community \- 120003](https://community.databricks.com/t5/technical-blog/leverage-the-power-of-multiple-genie-spaces-inside-an-app-using/ba-p/120003)の翻訳です。

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

# イントロダクション

[Databricks AI/BIのGenie](https://docs.databricks.com/aws/ja/genie)スペースは、ビジネスユーザーと複雑なデータ分析のギャップを埋めるパワフルな自然言語(Text-to-SQLエンジン)インタフェースです。特に日常のビジネスに関する質問を正確なSQLクエリーに変換するように設計されており、Genieスペース(通常はシンプルに「Genie」と呼びます)によってユーザーはデータに関する会話を通じてやり取りを行うことができ、コーディングは不要です。組織のデータ、用語、コンテキストにファインチューンされた生成AIを活用することで、Genieはデータの探索をより直感的でアクセスしやすいものにします。ドメイン専門家は、キュレーションされたデータセット、サンプルクエリー、仕立てられた指示を用いてGenieスペースを設定し、信頼でき適切なレスポンスを確実にすることができます。これは、より迅速な意思決定プロセス、レポートにおける技術チームへの依存度の削減、ビジネス全体でのスケーラブルなセルフサービスの分析につながります。

*図1: Genieスペースの例*
![](https://community.databricks.com/t5/image/serverpage/image-id/17080iA61C804FA51E3729/image-size/medium?v=v2&px=400)

# エージェントベースのアプローチ

技術的なレベルにおいては、Genieのドメイン特化は最も優れた強みの一つとなっています。それぞれのGenieスペースは、[Unity Catalog](https://www.databricks.com/jp/product/unity-catalog)においてキュレーションされたテーブルにリンクされており、その構造、セマンティクス、特定データドメインのコンテキストにファインチューニングすることができます。このセットアップは特に、特定のチームやビジネスユニットに紐づけられたシナリオでうまく動作し、この場合、5-10の[ゴールドレベルのテーブル](https://www.databricks.com/jp/glossary/medallion-architecture)を格納する単一のGenieスペースは豊富な洞察を提供することができます。これらのテーブルは、適切に定義され、詳細なメタデータで補強され、SQLクエリーの例や明確な指示によって強化されます。

しかし、多くの場合、ビジネス上の質問は複数のドメインに跨ります。単純に一つのスペースにテーブルを追加したとしても常に効果的とは限らず、これは推奨されません。代わりに、エージェントベースのアプローチがさらにスケーラブルなソリューションを提供します。それぞれが特定のドメインやビジネス機能にフォーカスしている複数のGenieスペースを接続することで、エージェントは適切な場合にクエリーする[ツール](https://docs.databricks.com/aws/ja/generative-ai/agent-framework/agent-tool)としてそれぞれのGenieスペースを取り扱う、オーケストレーターとして動作します。これによって、ユーザーはより広範で複雑な質問に回答するためにそれらの洞察を組み合わせることで、特化された複数のGenieスペースを一度に利用することができます。実際にこれがどのように操作するのかを詳しく見て、サンプルのセットアップをウォークスルーしましょう。

# ユースケース例: 複数のGenieスペースをオーケストレーションするエージェント

異なる地域の複数の施設を創業している大規模な製造業企業を考えてみましょう。オペレーションチームは、機械の稼働時間、スループット率、メンテナンスのログのようなメトリクスを含む、**製造ラインの効率性**に特化したGenieスペースを使うかもしれません。これと同時に、サプライチェーンチームは、原材料レベル、サプライヤーのパフォーマンス、出荷スケジュールに関するデータを含む、**在庫と物流**にフォーカスした別個のGenieスペースを頼みにするかもしれません。財務チームは、創業の出費、調達コスト、予測データを捕捉するテーブルを用いた、**コスト分析や予算トラッキング**をカバーする自身のGenieスペースを管理しているかもしれません。

個別にはこれらのGenieスペースのそれぞれは、その利用者に対しては適切に動作し、個別のチームメンバーは背後のデータに関して自然言語で質問を行うことができます。しかし、ビジネスユーザーがサプライチェーンの遅延が製造のスループットやユニットごとの合計コストにどのような影響を与えるのかを理解したいとしたらどうなるでしょうか？単一のGenieはどれも全体像を掴んでいません。ここで、エージェントベースのアプローチがパワフルなものになり、精度と適切性を持って機能横断の質問にGenieスペースが回答できるように、製造、サプライチェーン、財務のGenieスペースを調整します。

*図2: 複数のGenieスペースを用いたエージェントのアーキテクチャ*
![](https://community.databricks.com/t5/image/serverpage/image-id/17078i54B3F3C51C069FB6/image-dimensions/507x232?v=v2)

# Genie APIを用いたエージェントツールとしてのGenieスペース

最近の[Genie API](https://docs.databricks.com/api/workspace/genie)プレビューのリリースによって、Databricks GenieはAIアプリケーションに埋め込めるようになりました。[こちら](https://www.databricks.com/jp/blog/genie-conversation-apis-public-preview)で、Genieの会話がAPIを用いてどのように動作するのかの実践的な例を確認できます。我々のケースでは、1つ以上のGenieスペースにエージェントがアクセスできるようにするために、Databricks Agent FrameworkやUnity Catalogの関数をこのAPIを組み合わせることができます。以下の例では、必要なパラメータやメタデータを用いて、モジュールからされた関数でこれをどのように行えるのかを示しています:

*図3: Unity Catalogの関数 - Genie APIコール*

```sql
%sql
CREATE OR REPLACE FUNCTION _genie_query(databricks_host STRING,
                 databricks_token STRING,
                 space_id STRING,
                 question STRING,
                 contextual_history STRING)
RETURNS STRING
LANGUAGE PYTHON
COMMENT 'This is an agent that you can converse with to get answers to questions. Try to provide simple questions and provide history if you had prior conversations.'
AS
$$
```

:::note info
**注意**
上のコードスニペットは抜粋であり、そのままでは動きません。[こちら](https://qiita.com/taka_yayoi/items/ec60b50c6ecc9a12f14e)で稼働するものをカバーしています
:::

そして、エージェントで新たな関数を使うことができます:

*図4: Unity Catalog関数 - Genieスペースにクエリーを行うラッパー*

```sql
CREATE OR REPLACE FUNCTION chat_with_production_line_effiency(question STRING COMMENT "the question to ask about amazon music reviews",
                 contextual_history STRING COMMENT "Provide relevant history to be able to answer this question & assume genie doesn't keep track of history. Use 'no relevant history' if there is nothing relevant to answer the question.")
RETURNS STRING
LANGUAGE SQL
COMMENT 'This is an agent that you can converse with to get answers to questions about amazon music reviews. Try to provide simple questions and provide history if you had prior conversations.'
RETURN SELECT _genie_query(
 "https://e2-dogfood.staging.cloud.databricks.com/",
secrets("genie_scope", "databricks_host_token"),
secrets("genie_scope", "databricks_space_id"),
 question, -- retrieved from function
 contextual_history -- retrieved from function
);
```

追加ボーナスとして、Unity Catalogの関数にこれらのGenie APIコールを埋め込む際、自動的にUnity Catalogに組み込まれたガバナンスのメリットを手に入れることができます！

*図5: Unity CatalogによるUC関数の管理*
![](https://community.databricks.com/t5/image/serverpage/image-id/17079i092645EC4F5EF017/image-size/medium?v=v2&px=400)

2つの関数をセットアップすることで、必要に応じてエージェントが関数を活用できるようになりました。Databricks Playgroundを用いたエージェントのプロトタイプがどれだけ簡単なのかをみてみましょう。

# Playgroundでのプロトタイプの構築

[Databricks Playground](https://docs.databricks.com/aws/ja/generative-ai/agent-framework/ai-playground-agent)を用いることで、サンプルプロンプトでさまざまなLLMを試して、すぐるに利用できるLLMジャッジを活用し、上で定義したUniyy Catalog関数のようなカスタムツールのアタッチをすべて同じUIで行うことができます！

*図6: Databricks Playground*
![](https://community.databricks.com/t5/image/serverpage/image-id/17083iB8111315DB4D58F4/image-size/medium?v=v2&px=400)

Playgroundでエージェントに上で定義したGenie呼び出しツールを追加しましょう。

*図7: Playgroundでエージェントにツールを追加*
![](https://community.databricks.com/t5/image/serverpage/image-id/17082iCB828BF8FF07522C/image-size/medium?v=v2&px=400)

PlaygroundでAIエージェントとの会話のプロトタイプを構築したら、ユーザーはさらにテストするために、デプロイメントプロセスをスタートし、背後のPythonコードの開発を継続するために、ノートブックにエクスポートすることができます。これらのノートブックは、完全に機能するエージェントを構築するための定型あるいは「スターター」コードを構成します。

# Databricks Appsによるエージェントの実践

ここからは、必要に応じてきめ細かいコードの調整を行ったり、我々の新たなエージェントをデプロイするために、エクスポートしたノートブックをシンプルに実行したりすることができます。我々の例では、モデルサービングエンドポイントでサービングされる、デプロイ済みで利用可能なエージェントを提供してくれるノートブックをそのまま実行します。また、デプロイされたエージェントには登録したツール、この場合は適切なGenieスペースを呼び出すUCの関数も含まれています。質問に回答するために必要な適切なGenieスペースを特定するためにエージェントが関数を活用する例をウォークスルーしましょう。

ユーザーが赤ちゃん用品について質問した際、エージェントはインテリジェントかつ適切に赤ちゃんのデータを持つGenieスペースにルーティングします。

*図8: ユーザーの質問 - Databricks Appに埋め込まれたGenie*
![](https://community.databricks.com/t5/image/serverpage/image-id/17081i13E99C00C7B63421/image-size/medium?v=v2&px=400)

適切なツール、我々の場合はGenieスペースが呼び出されると、オリジナルの質問と適切な文脈的な履歴が表示されることで反応します。これは初めてのクエリーであるため、事前の文脈はまだ存在しません。

*図9: エージェントのロジック*
![](https://community.databricks.com/t5/image/serverpage/image-id/17085i1D67A189AFDD6CDA/image-size/medium?v=v2&px=400)

次に、Genieのtext-to-SQLエンジンがテーブルの結果でレスポンスを生成します。レスポンスには顧客IDとトップのお客様が何回赤ちゃん用品をレビューしたのかが含まれています。

*図9: エージェントがGenieの結果に基づいた回答を提供*
![](https://community.databricks.com/t5/image/serverpage/image-id/17084iCEA651C2EA965A51/image-size/medium?v=v2&px=400)

また、データ収集に用いられた背後のSQLも含まれており、これはデバッグの助けとなります。

*図11: Genieが生成したSQLの例*
```sql
WITH ranked_reviews AS (
 SELECT
   `amazon_review_books`.`customer_id`,
   COUNT(`amazon_review_books`.`review_id`) AS review_count,
   ROW_NUMBER() OVER (ORDER BY COUNT(`amazon_review_books`.`review_id`) DESC) AS rank
 FROM
   `mfg_mid_central_sa`.`zach_jacobson`.`amazon_review_books`
 WHERE
   MONTH(`amazon_review_books`.`review_date`) = 7
 GROUP BY
   `amazon_review_books`.`customer_id`
)
SELECT
 `customer_id`,
 `review_count`
FROM
 ranked_reviews
WHERE
 rank = 1
```

ツールとして他のGenieスペースを追加するには、同じステップを踏むことができます。結果として、文脈に基づいてユーザーの質問を適切なGenieスペースにインテリジェントにルーティングする完全に動作するエージェントを手に入れることができます。Unity Catalogで管理されるUC関数としてそれぞれのGenieスペースが機能することで、ガバナンスと一貫性を確保します。Databricks Playgroundを用いることで、プロトタイプからデプロイされ、プロダクションレベルのエージェントに迅速に前進し、アクセスや操作を容易にするために[Databricks App](https://www.databricks.com/jp/blog/introducing-databricks-apps)にシームレスに埋め込むことができます。

# まとめ

Databrikcs AI/BIのGenieスペースは、自然言語インタフェースとキュレーションされたデータセット、ドメイン固有の専門性を組み合わせることで、新たなレベルのアクセシビリティとデータ駆動の意思決定に対する迅速性を提供します。エージェントベースのアプローチはこれをさらに推し進め、複数の特化したGenieスペースが複雑かつ企業規模の質問に取り組めるように、シームレスなコラボレーションを実現します。あらたなGeni API、Unity Catalog関数、Databricks Playgroundの連携によって、インテリジェントで文脈を解するエージェントの構築やデプロイがこれまで以上に高速で円滑なものとなります。

### はじめてのDatabricks

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

### Databricks無料トライアル

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