チャットボットサンプルを触ってみて Denodo AI SDK を体験する

こんにちは！インサイトテクノロジーの松尾です。

本投稿では、Denodo Platform の新バージョン 9.1 で提供開始された Denodo AI SDK とそのチャットボットサンプルを試し、Denodo + AI で何ができるのかを体験してみたいと思います。

Denodo と AI で何ができるのでしょうか？ Query Assistant やメタデータのリコメンデーションなど、個々の機能での AI 活用とは別の Denodo + AI の切り口をぜひご体験ください。

## Denodo Platform とは

Denodo Platform は、データ仮想化を活用した論理的なデータ統合、データ管理、データ配信のソリューションです。国内でも大手企業を中心に多くの企業で採用されています。

https://www.denodo.com/ja/denodo-platform/denodo-platform?utm_source=partner_lead_InsightTech

https://www.denodo.com/ja/press-release/2022-08-31/denodo-japan-momentum.html2022-08-31/denodo-japan-momentum.html?utm_source=partner_lead_InsightTech

## Denodo AI SDK とは

Denodo Platform の新バージョン 9.1 で Denodo AI SDK が提供開始されました。

https://www.denodo.com/en/solutions/by-capability/ai-software-development-kit?utm_source=partner_lead_InsightTech

Denodo Platform を利用することで、複数のソースから高品質なデータを提供する安全で統一されたデータアクセス層を実現できます。これにより、ビジネスユーザーや生成 AI モデルは信頼性が高く一貫した情報を得られると同時に、データのやり取りにおけるセキュリティとコンプライアンスを一元管理できるようになります。一方、実際に AI でこれらのデータを活用するには、何かしらの作りこみをする必要がありますが、Denodo AI SDK は事前構築された API を通じてデータ統合や変換を簡略化し、LLM 向けデータセットを効率的に準備できるようにします。これにより、手作業やカスタムコードを削減し、AI 開発を効率化することを目的としています。

このあたりは、やはり実際に触ってみないとイメージしづらいと思いますので、まずはサンプルを触ってみましょう。サンプルを試すにあたっては、以下のチュートリアル "Building an AI Chatbot with Denodo in Minutes" に従うのが簡単です。

https://community.denodo.com/tutorials/browse/chatbot/index#0?utm_source=partner_lead_InsightTech

Denodo AI SDK は Denodo からのデータ取得と生成 AI の間に位置し、テキストの内容を SQL に変換してそれを Denodo に投げてデータを取得する、などの機能を提供します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/1e71bd46-6e75-9f43-ac5c-cf4e27830e61.png)

ではさっそくやってみましょう。

## チャットボットサンプルを触ってみて Denodo AI SDK を体験してみよう

### 開始前に必要なもの

* **生成 AI を利用できる環境** ： Open AI や Bedrock などをサポートしています。それらの API を使用できる必要があります。本投稿では Open AI を使用します。
* **Denodo のライセンス** ： Denodo のライセンスが必要です。制限付きで無償利用できる Express ライセンスか、Enterprise Plus ライセンスを事前に用意してください。
* **Docker を利用できること** ： 本投稿では Docker を利用して試します。Docker を利用しない方法については、先に言及した Denodo の公式チュートリアルを参照ください。

### Docker を使った環境の準備

以下の順番で進めていきます。

#### Docker の使用環境の準備

私の手元では、Windows 11 の WSL2 で Docker を使用します。Docker がセットアップされていない場合は、適宜調べて、まずは自身の環境で Docker を利用可能にしてください。

```bash
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.5 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
$ docker --version
Docker version 27.4.1, build b9d17ea
$ docker compose version
Docker Compose version v2.32.1
```

#### denodo のレポジトリへのアクセスを有効にします。

以下のチュートリアルの "Using Denodo Containers" を参考にします。

https://community.denodo.com/tutorials/browse/installation/index#2?utm_source=partner_lead_InsightTech

手順に従って Secret を作成したら `docker login` でログインします。

```bash
$ docker login harbor.open.denodo.com
Username: xxxxxxxx@yyyyy.co.jp
Password:
WARNING! Your password will be stored unencrypted in /home/xxxxxxx/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded
```

#### Denodo Community Lab Environment の環境の準備

* Denodo Community Lab Environment を GitHub から Clone します。
* `denodocommunity-lab-environment/lab-environment-containers/res/denodo/license` ディレクトリにライセンスファイルをコピーします。

```bash
$ cd ~
$ git clone https://github.com/denodo/denodocommunity-lab-environment.git
$ cd ~/denodocommunity-lab-environment/lab-environment-containers/res/denodo/license
$ cp /xxx/xxx/xxx/denodo-express-lic-9-202512.lic .
$ ls -l
total 4
-rwxr-xr-x 1 xxxxxxxxxx xxxxxxxxxx 752 Jan  3 15:45 denodo-express-lic-9-202512.lic
```

* `denodocommunity-lab-environment/lab-environment-containers/build` ディレクトリに `.env` ファイルを作成し、必要個所を修正します。
    * ライセンスファイルの指定
    * 言語指定
    * Chatbotで使用する LLM 関連の指定
        * Open AIを使用する場合は `PROVIDER`, `LLM_MODEL`, `EMB_MODEL`, `OPENAI_API_KEY`, `OPENAI_ORG_ID` を指定

```bash
$ cd ~/denodocommunity-lab-environment/lab-environment-containers/build
$ cp .env.template .env
$ vi .env
```

私の環境では編集したファイルの差分は以下の感じです。

```diff
$ diff .env.template .env
15c15
< DENODO_SA_LIC=../res/denodo/license/
---
> DENODO_SA_LIC=../res/denodo/license/denodo-express-lic-9-202512.lic
287c287
< PROVIDER=
---
> PROVIDER=OpenAI
289c289
< LLM_MODEL=
---
> LLM_MODEL=gpt-4o
291c291
< EMB_MODEL=
---
> EMB_MODEL=text-embedding-3-large
293c293
< OPENAI_API_KEY=
---
> OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxx_example
```

設定のチェックに以下のコマンドを実行するようにチュートリアルに記載がありましたので実行しておきます。

```bash
$ cd ~/denodocommunity-lab-environment/lab-environment-containers/build
$ docker compose -f docker-compose-sample-chatbot.yml config
name: build
services:
  denodo-ai-sdk-chatbot:
    container_name: denodo-ai-sdk-chatbot
    depends_on:
    :
    :
```

#### イメージの取得と起動

続いて、イメージの取得と起動を行います。

```bash
$ docker compose -f docker-compose-sample-chatbot.yml pull
[+] Pulling 16/16
 ✔ denodo-ai-sdk-chatbot Pulled                                                                                  324.9s
   ✔ f880e45fcfa4 Pull complete                                                                                   59.9s
   ✔ fe58394f23b1 Pull complete                                                                                   64.5s
   ✔ 7664767ecc6c Pull complete                                                                                   64.6s
   ✔ 94a8b29a4636 Pull complete                                                                                   64.6s
   ✔ 08f02e274c12 Pull complete                                                                                   64.9s
   ✔ a25695930cc5 Pull complete                                                                                   65.0s
   ✔ 6e8e14311ce0 Pull complete                                                                                  321.2s
 ✔ denodo-platform-chatbot Pulled                                                                               1123.9s
   ✔ dc69890cd6d9 Pull complete                                                                                   24.3s
   ✔ 005739a67eb3 Pull complete                                                                                   24.4s
   ✔ af3f83706ab0 Pull complete                                                                                   24.5s
   ✔ 7ab9fd05e5d2 Pull complete                                                                                   34.7s
   ✔ a537fd3e3258 Pull complete                                                                                   34.7s
   ✔ 6f43d6fa09c5 Pull complete                                                                                 1120.1s
   ✔ 4f4fb700ef54 Pull complete                                                                                 1120.2s
$ docker compose -f docker-compose-sample-chatbot.yml up -d
[+] Running 3/3
 ✔ Network build_default              Created                                                                      0.1s
 ✔ Container denodo-platform-chatbot  Healthy                                                                    303.9s
 ✔ Container denodo-ai-sdk-chatbot    Started
$ docker ps
CONTAINER ID   IMAGE                                                          COMMAND                  CREATED          STATUS                    PORTS                                                                                                                                                                                                                                                                        NAMES
9629de068161   harbor.open.denodo.com/denodo-express/ai-sdk:latest            "/opt/ai-sdk/entrypo…"   44 minutes ago   Up 22 minutes             0.0.0.0:8008->8008/tcp, :::8008->8008/tcp, 0.0.0.0:9992->9992/tcp, :::9992->9992/tcp                                                                                                                                                                                         denodo-ai-sdk-chatbot
2bbbf5baeb1a   harbor.open.denodo.com/denodo-express/denodo-platform:latest   "/opt/denodo/tools/c…"   44 minutes ago   Up 34 minutes (healthy)   7998-8000/tcp, 8998-9000/tcp, 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp, 9097-9099/tcp, 0.0.0.0:9994->9994/tcp, :::9994->9994/tcp, 9995/tcp, 0.0.0.0:9996-9997->9996-9997/tcp, :::9996-9997->9996-9997/tcp, 9998/tcp, 10091/tcp, 0.0.0.0:9999->9999/tcp, :::9999->9999/tcp   denodo-platform-chatbot
```

### チャットボットサンプルを触ってみましょう

しばらくすると、`http://localhost:9992` で以下のような画面にアクセスできるようになりました。 (※アクセスできるようになるまでしばらくかかります)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/0b6872a6-ffcf-7de2-8a75-10b47fade8c4.png)

:::note info
うまく起動できない/アクセスできない場合は、`docker compose -f docker-compose-sample-chatbot.yml down` で一度終了し、起動時のコマンドから `-d` をとって実行を試してください。起動時のメッセージが画面に表示されるようになり、エラーなどの原因調査をしやすくなります。
:::

Sign in から、`admin/admin` でログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/dd400dfe-9618-ff25-6a6b-dd550fee6bc7.png)

すると質問受付状態になるので、まずは、チュートリアルにある質問を入力してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/bb1d2299-e992-de0a-69af-6266094c34d6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/63c243c5-9341-22f8-fe94-6dbfa9a69024.png)

すると、若干応答メッセージが異なるものの、チュートリアルと同様の内容が返ってくることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/accf5fcf-43ed-7d1d-6d11-95a383f42924.png)

チュートリアルにも記載があるように、グラフアイコンからグラフの表示もできますね！

#### 日本語でも質問は実行できるの？

もちろんです！この辺は ChagGPT を使う時と同じですね。ほかの LLM では試していませんが。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/3340d0cc-977f-5982-b1e6-32c5c3f892ab.png)

例えば「住宅ローンのビューの一覧を教えて」に対する応答は以下の感じです。

> Question: 住宅ローンのビューの一覧を教えて
> Metadata
> Answer:
> Querying Denodo for: List of views related to mortgages. Give me a second.
> 
> 住宅ローンに関連するビュー（テーブル）の一覧は以下の通りです：
> 
> 1. samples_bank.loan
>    *  各ローンに関する情報を含むテーブルです。カラムには、ローンID、顧客ID、ローン金額、金利、期間、物件ID、ローン担当者ID、ステータス、作成日などがあります。
> 1. samples_bank.property
>    * 各物件に関する情報を含むテーブルです。カラムには、物件ID、住所、市、州、郵便番号、物件価値などがあります。
> 1. samples_bank.underwriting
>    * アンダーライティングに関する情報を含むテーブルです。カラムには、アンダーライティングID、ローンID、クレジットスコア、雇用履歴、財務履歴などがあります。
> 1. samples_bank.rate
>    * 各ローンタイプに対する金利情報を含むテーブルです。カラムには、レートID、ローンタイプ、期間、金利などがあります。
> 1. samples_bank.loan_officer
>    * ローン担当者に関する情報を含むテーブルです。カラムには、ローン担当者ID、名前、姓、メール、電話番号などがあります。
> 
> これらのテーブルは、住宅ローンに関連するデータを管理しています。何か他に知りたいことがあれば教えてください。

また、やり取りの内容は状態を保存しているので、前の質問の回答を受けて、さらに追加の指示を行うなども可能です。このあたりは ChatGPT とやり取りするのと同じですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/b9d9ce07-0c26-7da2-7e63-d401caa23de4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/e44279f7-14e7-300e-d6ce-a34a7219656d.png)

さらには、Denodo に含まれていないような質問をすることも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/56d702d8-ea2f-3316-c84d-bce258a58ad4.png)

このチャットボットからの回答をよく見ると、「Metadata」「Data」「LLM」とマークがついています。これにより、何をソースとして回答をしているのかがわかります。

このように、チャットボットサンプルを通して、Denodo から自然言語でデータを取得するというのを体験できたと思います。

## チャットボットサンプルの動き

チャットボットサンプルがどのように動いているのかについては、チュートリアル "Building an AI Chatbot with Denodo in Minutes" に詳細な説明がありますので、興味がある方はそちらを参照ください。大まかな流れとしては、以下のように動いているようです。

1. 質問の解析
ユーザーの質問を LLM (大規模言語モデル) に送り、以下を判断します：
    * 質問のカテゴリ
    * 必要な情報 (関連するテーブルやデータの種類)
1. ロジックの分岐
LLMが質問を分類した結果に応じて、Denodo AI SDK は次のステップを決定します：
    * 質問がシステムに関連しない場合
        * 質問が既存のデータ（例: Denodo Platform や他のデータソース）に依存しないと判断された場合、LLM がそのまま回答を生成し、直接ユーザーに返します。
    * 質問が Denodo Platform のデータに関連する場合
        * Denodo Platform で利用可能なビューやスキーマの情報を基に、LLM が適切なクエリを生成します。
        * そのクエリを Denodo Platform に実行してデータを取得します。
        * 取得したデータを元に、LLM がユーザーの質問に答えるための形式に整えて回答します。
    * 質問がベクトルストアに保存された非構造化データに関連する場合
        * LLM が検索用のキーワードを生成します。
        * そのキーワードで非構造化データのインデックスを検索します。
        * 検索結果を LLM に再度渡し、文脈を踏まえた回答を生成してユーザーに返します。

#### ポイント
* LLM は状況に応じて直接回答を提供するか、データソースにアクセスして回答を構築するかを決定します。
* Denodo Platform を活用する場合、LLM が自動的にクエリを生成し、取得したデータをフォーマットします。
* 非構造化データ(例: 文書やテキスト)が関係する場合、インデックスを検索して回答に必要な情報を収集します。

## 自分のデータを対象にしてみよう

ここまではチュートリアルで事前に用意されたサンプルデータを対象に実施しました。もし自分の手持ちのデータを対象にしたい場合は、以下の流れとなります。

1. Design Studio で自分のデータ用の仮想 DB を作成
    * 仮想 DB 単位で対象データとして扱うようなので、別の仮想 DB とした方がよさそうです
1. Design Studio で仮想 DB に必要なデータソースを接続しビューを作成
    * ビューの説明やカラムの説明はなるべくきちんと入れておく
1. Data Catalog で "Sync with VDP" を実行
1. `.env` ファイルの `VDB_NAMES` で作成した仮想 DB を指定
1. チャットボットサンプルを再起動
    * `docker compose -f docker-compose-sample-chatbot.yml down` (* `-d` をつけずに起動している場合は `up` を起動した画面で Ctrl+C で終了します)
    * `docker compose -f docker-compose-sample-chatbot.yml up -d`

例えば以下の感じでデータソースやビューを定義します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/2c15befc-d79c-f539-bc06-772f50bfa5a2.png)

するとこんな感じで返してくれるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/dcb555ed-e23d-a91a-90a3-98845dae02bd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/86a23297-6a27-9f99-c42a-8ba0553306b9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/d9bacffd-0ae9-e4b4-dcca-aa900b441c93.png)

できました！

## SDK を直接使ってみる

Denodo AI SDK は "SDK" ですので、他のシステムと組み合わせて使うことを便利にするための機能を提供しており、マニュアルも以下で公開されています。

https://community.denodo.com/docs/html/document/denodoconnects/9.1/en/Denodo%20AI%20SDK%20-%20User%20Manual?utm_source=partner_lead_InsightTech

せっかくなので、サンプルを実行してみましょう。このサンプルは基本的には質問を `answerQuestion` エンドポイントに投げているだけです。サンプルコードは以下になります。

https://github.com/denodo/denodo-ai-sdk/blob/public/9/dev/api/example.py

実際に以下のように結果が返ってくることを確認できました。エンドポイントのソースコードも GitHub で公開されているので確認できますが、そこそこ面倒そうなことをやっています。これを自分でやろうとするととても大変だと思いますので、Denodo AI SDK があることで楽をできるというのは大いに意味のあることだと思います。

```bash
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $ pip3 install requests
Collecting requests
  Downloading requests-2.32.3-py3-none-any.whl (64 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 64.9/64.9 KB 1.5 MB/s eta 0:00:00
Collecting certifi>=2017.4.17
  Downloading certifi-2024.12.14-py3-none-any.whl (164 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 164.9/164.9 KB 5.0 MB/s eta 0:00:00
Collecting charset-normalizer<4,>=2
  Downloading charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (146 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 146.1/146.1 KB 14.5 MB/s eta 0:00:00
Collecting urllib3<3,>=1.21.1
  Downloading urllib3-2.3.0-py3-none-any.whl (128 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 128.4/128.4 KB 14.3 MB/s eta 0:00:00
Collecting idna<4,>=2.5
  Downloading idna-3.10-py3-none-any.whl (70 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 70.4/70.4 KB 8.4 MB/s eta 0:00:00
Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests
Successfully installed certifi-2024.12.14 charset-normalizer-3.4.1 idna-3.10 requests-2.32.3 urllib3-2.3.0
(venv) $ python3 example.py
Metadata retrieved and inserted into the vector store.
Time taken: 6.12 seconds


Question: 都道府県ごとのメンバー数を多い順に
Streaming answer:
**都道府県ごとのメンバー数を多い順に**Here are the top prefectures by member count:| Prefecture | Member Count ||------------|--------------|| 東京都     | 4,830        || 神奈川県   | 3,462        || 大阪府     | 3,388        || 愛知県     | 2,794        || 埼玉県     | 2,748        || 千葉県     | 2,328        || 北海道     | 2,307        || 兵庫県     | 2,161        || 福岡県     | 1,942        || 静岡県     | 1,524        || 茨城県     | 1,188        || 広島県     | 1,123        || 京都府     | 1,063        || 新潟県     | 944          || 宮城県     | 938          |DISCLAIMER: This response has been generated based on an LLM's interpretation of the data and may not be accurate.Time taken: 10.80 seconds


Question: 都道府県ごとのメンバー数を多い順に
Direct Answer:
Mode: default
Answer: **都道府県ごとのメンバー数を多い順に**

Here is a list of the top prefectures by member count:

| Prefecture | Member Count |
|------------|--------------|
| 東京都     | 4,830        |
| 神奈川県   | 3,462        |
| 大阪府     | 3,388        |
| 愛知県     | 2,794        |
| 埼玉県     | 2,748        |
| 千葉県     | 2,328        |
| 北海道     | 2,307        |
| 兵庫県     | 2,161        |
| 福岡県     | 1,942        |
| 静岡県     | 1,524        |
| 茨城県     | 1,188        |
| 広島県     | 1,123        |
| 京都府     | 1,063        |
| 新潟県     | 944          |
| 宮城県     | 938          |

:
:
```

## おわりに

Denodo AI SDK とそのチャットボットサンプルを触り、Denodo + AI で何ができるのかを体験してみました。さらには、サンプルデータだけでなく自身で用意したデータに対しての実行や、サンプルアプリからではなく Python コードからの実行も試してみました。本番レベルで利用するには考えるべきことはさらに多いとは思いますが、Denodo AI SDK を利用することで、AI の力を使って Denodo のデータをより便利に使える可能性を感じることができたのではないでしょうか。Docker 環境があると比較的簡単に（ローカル環境を汚さずに）試すことが可能です。ぜひ試してみていただければと思います。

### もう少し詳しく知りたい方へ

弊社インサイトテクノロジーでは Denodo 社のパートナーとして Denodo Platform の紹介、販売、導入などを行っています。Denodo Platform に興味を持たれた方はぜひ弊社または Denodo 社までお問い合わせください。

https://www.insight-tec.com/products/denodo/

また、「これからデータ統合基盤を整備していきたい！」「どういった形でデータを統合していったらいいか迷っているので相談したい！」など、これからのデータ基盤整備のお困りごとや、「すでにこういうことをしているんだけどココをなんとかしたい！（例えば Snowflake に SAP からリアルタイムデータを持ってきたい）」などについてもぜひご相談いただければと思います。

https://www.insight-tec.com/products/consulting/