DataRobotと生成AIで顧客へのメッセージを自動作成してみた

# はじめに
はじめまして、社内でデータサイエンティストを務めております@hk13です。
本記事では、DataRobot社が提供するコンテンツであるAIアクセラレータの中の「[生成AIを使用した顧客コミュニケーションの向上](https://docs.datarobot.com/ja/docs/api/accelerators/gen-ai-accel/comm-genai.html)」を参考に、顧客コミュニケーションの改善に活用できる仕組みを構築していきます。

# DataRobotとは
DataRobot社は、AIに対するユニークなコラボレーション型のアプローチによってユーザーをAIサクセスに導くバリュー・ドリブン AIのリーダーです。

https://www.datarobot.com/jp/

DataRobot社の製品であるDataRobotは、10年以上にわたってユーザーの自動機械学習（AutoML）活用を支援してきたAIライフサイクル・プラットフォームであり、機械学習モデルの構築、トレーニング、評価、デプロイメントを自動化することができます。複雑なデータ分析を迅速かつ簡単に実行し、優れた予測モデルの作成と管理をサポートすることが可能です。近年では生成AI機能も強化し、予測AIとのコラボレーションによってさらなるAIサクセスの実現を加速させています。

# AIアクセラレーターとは
AIアクセラレーターは、DataRobot社によって提供されているコンテンツの一つで、機械学習プロジェクトの構築と提供を成功させるためのデータサイエンスの専門知識を、反復可能なコードファーストのワークフローとモジュール化されたビルディングブロックに体系化してパッケージ化したものです。

https://docs.datarobot.com/ja/docs/api/accelerators/index.html

# 生成AIを使用した顧客コミュニケーションの向上
**予測AI**とは、過去のデータを学習して未来を予測する技術のことを指します。
予測AIは経験や勘に頼るよりも確実かつスピーディーに将来を予測することができる強力なツールです。
しかし、ビジネスの現場において、ただ予測値を出して終わりというケースは少なく、
- モデルの**解釈性**（どのような特徴量がモデルで重要視されているのか、どのようにしてその予測値が算出されたのか、など）
- 業務に活かせる**インサイト**（どのような顧客が購買に至りやすいか、どのような条件で実験すれば結果が得られやすいか、など）

の2点も求められることが多いでしょう。
一般的に、解釈性やインサイトは図や数値といった無機質なデータとして出力されるため、人間が一目で理解したり、言語化したりするのはなかなか難しく、手間がかかってしまうのが現状です。

こうした問題を解決する手法として、今回は**生成AI**を活用していきます。ChatGPTに代表される生成AIは、その名の通り文章等の「生成」を得意としています。
予測AIから得られる無機質なデータ（予測結果やモデルの解釈性、インサイト）を、生成AIによって「人間味のある」文章に落とし込むことで、予測結果の活用を促進することが期待されます。

以降では、AIアクセラレータの中で提供されているコンテンツの一つである「生成AIを使用した顧客コミュニケーションの向上」を参考にし、予測AIと生成AIの組み合わせによって、予測AIの結果を活用しやすい形へ落とし込めるのか試していきたいと思います。

:::note info
元のノートブックとデータは英語なので、本記事では見やすいようにノートブックを和訳したり、データを日本語のものに差し替えたりしています。元のノートブックは[こちら](https://github.com/datarobot-community/ai-accelerators/blob/main/generative_ai/customer_communication_datarobot_gen_ai/effective_customer_communication_datarobot_gen_ai.ipynb)からダウンロードできます。
:::

:::note info
アクセラレータではOpenAIのAPIを叩いていますが、本記事では生成AI部分にAzure OpenAIでデプロイしたモデルを使用しています。
:::

## 想定シナリオ
ローン申請に対して、申請者の情報から貸し倒れ確率を予測するモデルをDataRobotでデプロイし運用しています。
貸し倒れのリスクが高いと予測された申請者に対しては貸し出しを拒否することになりますが、この際に改善点についてポジティブなメッセージを送ることで顧客コミュニケーションを向上させ、企業イメージの維持と顧客育成を実現したいです。
しかし、予測結果に基づいてパーソナライズされたメッセージを一つずつ作成しようとすると工数が大量にかかると予想されます。AIを活用してなんとかうまいことできないでしょうか。

## 想定する業務フロー
1. 顧客の情報にもとづき、ローン申請を承認するか否かを貸し倒れ予測モデルで判定
1. ローン申請が通らなかった顧客を抽出し、承認されなかった理由をピックアップ
1. 次回申請時にローン承認を得るためにどうすべきかをまとめたメッセージを作成し、顧客に送信

これらの工程を予測AIと生成AIを連携させて自動化し、顧客コミュニケーションの向上と人的コストの削減を目指していきます。

## 使用するデータ
申請したローンの情報や顧客の情報が特徴量として入った、以下のようなデータを用います。
実際のデータセットは、50,000行×27列でした。
| 申込ID | メンバーID | ローン申請額 |借り入れ目的（大分類）|借り入れ目的（小分類）|勤務先|…|貸し倒れ|
|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|
| 3296446| 4068857| 1120000 |クレジットカード|クレジットカードの借り換え|ペリドットネットワーク||FALSE|
| 3286412| 4058853| 1000000 |クレジットカード|クレジットカードの完済|ベクタ金融||TRUE|
| 3286406| 4058848| 800000  |借金のおまとめ|クレジットカードの支払い|エメラルド||FALSE|
| 3296434| 4068843| 1600000 |借金のおまとめ|借金のおまとめ|アクロアイト医院||FALSE|
| 3286395| 4058836| 400000  |クレジットカード|クレジットカードの借り換え|ビクスバイト情報会社||FALSE|	

## モデル構築
### 使用した環境
- ノートブック：DataRobot ワークベンチ
- 予測AI：DataRobot SaaS版
- 生成AI：Azure OpneAI gpt-4o

### フォルダ構成
```
root
├── effective_customer_communication_datarobot_gen_ai.ipynb <- 実行するノートブック
├── settings.yaml   <- DataRobotやAzureとの接続に必要な情報を記載したファイル
└── prediction.csv  <- 予測モデルによる予測結果が格納されたファイル（ノートブック実行時に生成）
```

### 接続設定
アクセラレータに倣ってDataRobotとAzure OpneAIを連携させるにあたり、必要な設定について解説します。

:::note info
DataRobotでのモデリングやデプロイ、Azure OpenAIでのモデルのデプロイに関してはこの記事では説明しません。
:::

#### settings.yaml
下記のように、DataRobotやAzureとの接続に必要なエンドポイントの情報やAPIキーなどをyamlファイル内に記載します。
```settings.yaml
endpoint: "https://xxxxxxx"
token: "xxxxxxxx"

aoai_endpoint: "https://xxxxxxx"
aoai_key: "xxxxxxxx"
```
それぞれの情報を取得する際は、DataRobotに関しては[こちら](https://docs.datarobot.com/ja/docs/api/api-quickstart/index.html)、Azureに関しては[こちら](https://www.desknets.com/neo/download/doc/chatgpt/chatgpt_azure.html)を参考にしてください。
Azure以外を用いる場合はご自身で調べてみてください。

これらの情報を用いて、ノートブック内では以下のように接続をしていきます。
```python
import datarobot as dr
from openai import AzureOpenAI

# yamlファイルの読み込み
with open("./settings.yaml", "r") as stream:
    config = yaml.safe_load(stream)

# DataRobotとの接続
dr.Client(endpoint=config["endpoint"], token=config["token"])

# Azure OpneAIとの接続
client = AzureOpenAI(
    azure_endpoint = config["aoai_endpoint"],
    api_key=aoai_config["aoai_key"],  
    api_version="2024-02-01"
)
```

#### ノートブック内
以下のパラメータは、アクセラレータのノートブックに従ってノートブック内で定義するとしていますが、`settings.yaml`内で取り扱う形でも問題ありません。

##### デプロイID
予測に用いる予測AIのデプロイのIDを定義します。
DataRobotのデプロイの概要タブで確認できます。
事前にDataRobotでAIモデルのデプロイが必要です。

```python
# デプロイを取得
DEPLOYMENT_ID = "xxxxxxxxxxxxxx"
deployment = dr.Deployment.get(DEPLOYMENT_ID)
```

##### データセットID
予測に用いるデータセットのデータセットIDを定義します。
DataRobotのデータセット情報の画面で確認できます。
事前に予測用のデータをDataRobotのAIカタログに登録しておく必要があります。

```python
# データセットを取得
df_inference_id = "xxxxxxxxxxxxxx"
df_inference_dataset = dr.Dataset.get(df_inference_id)
```

これらの情報を使って以下のようなコードを実行することで、DataRobotの予測AIから予測結果を得ることができます。
```python
job = dr.BatchPredictionJob.score(
    deployment=DEPLOYMENT_ID,
    intake_settings={"type": "dataset", "dataset": df_inference_dataset},
    output_settings={
        "type": "localFile",
        "path": "./prediction.csv"
    },
    max_explanations=3 # 予測の説明としていくつの特徴量を結果に含めるかを指定
)
```

## 実際に使ってみる

### 予測AIモデルの解釈
DataRobotでモデリングを行うと、作成されたモデルが精度順に並ぶリーダーボードと呼ばれる画面に遷移します。
もっとも精度が高いElastic-Net ClassifierについてDataRobot側が自動でデプロイの準備を進めてくれたので、以降はそちらのモデルを用いていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636913/9c7072a7-f45b-78a8-0dfa-dad337425395.png)


#### 特徴量のインパクト
DataRobotの[特徴量のインパクト](https://docs.datarobot.com/ja/docs/modeling/analyze-models/understand/feature-impact.html)では、どの特徴量がモデルの決定に大きく貢献しているのかを視覚的に確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636913/f9af4e04-bbd5-9622-ebb8-622c2893f6e6.png)

`信用`や`年収`、`ローン申請数`といった特徴量が予測値に大きく影響していると分かります。
感覚的にもローンの貸し倒れに効く要因として理解しやすいものが上位に来ているのではないでしょうか。

#### 特徴量ごとの作用
DataRobotの[特徴量ごとの作用](https://docs.datarobot.com/ja/docs/modeling/analyze-models/understand/feature-effects.html)では、各特徴量と予測値との間の1対1の関係を視覚的に確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636913/929589f7-10e3-abd2-b915-a82bd96368e4.png)

上図は貸し倒れの予測確率と年収の関係を表しています。
年収が低いほど貸し倒れのリスクが上がってしまうというのが一目見て分かりますね。
また、年収が700万あたりまでは予測値が線形に減少しますが、それ以上はリスクの減り方がかなりゆるやかになる、といった傾向を確認することができます。

#### 予測の説明
DataRobotの[予測の説明](https://docs.datarobot.com/ja/docs/modeling/analyze-models/understand/pred-explain/predex-overview.html)機能では、以下のようなUIで各レコードに対する予測に大きな影響を及ぼした特徴量を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636913/231e3a0d-340f-702e-d64a-4879d9602d91.png)

上図の例では`信用`、`ローン申請額`、`過去6ヶ月の信用情報照会件数`といった観点から貸し倒れの予測確率が高くなっていることが分かります。

DataRobotでは以上のようなモデル解釈するためのインサイトを提供する多数の機能を利用できます。
しかし、DataRobotから得られたインサイトをそのまま顧客コミュニケーションに活用できるわけではありません。
担当者自身が[特徴量のインパクト](#特徴量のインパクト)や[特徴量ごとの作用](#特徴量ごとの作用)を参照してしっかりと予測モデルを理解・解釈したうえで、各顧客の[予測の説明](#予測の説明)を読み解いて文章を考えていく必要があり、かなり骨が折れそうです。

今回はこのDataRobotのインサイトから文章を考える部分を生成AIに丸投げすることで、[予測の説明](#予測の説明)を読み解いたり、文章を作成したりといった工程さえも楽をしてしまいましょう。

### 生成AIの活用

デプロイした予測モデルで予測をする際、出力されるcsvファイルに[予測の説明](#予測の説明)の内容を含めることが可能です。
今回は、ローン申請が拒否された顧客のうち、以下のような予測が出力された方に対応していきます。

|予測を説明する特徴量名1|予測を説明する特徴量名1_実際の値|予測を説明する特徴量名2|予測を説明する特徴量名2_実際の値|予測を説明する特徴量名3|予測を説明する特徴量名3_実際の値|貸し倒れ_予測|
|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|:----|
|信用|D|ローン申請額|1975000|年収|5000000.0|True|

:::note info
カラム名はイメージが付きやすいように改変しています。
:::

:::note info
実際には、それぞれの特徴量が及ぼした影響の強さを数値や記号（`+++`や`-`など）で表現したカラムも一緒に出力されます。
:::

#### プロンプト作成
まずは予測結果として出力された[予測の説明](#予測の説明)の内容をもとに、生成AIに投げるプロンプトを作成します。
プロンプトの一例を以下に示します。
```text
あなたはローン販売の担当者です。以下の理由によりAIモデルがある顧客のローン申請をリスクが高いと判断し、ローン申請が拒否されました。
1. 信用がD
2. ローン申請額が1975000
3. 年収が5000000.0
ローン承認の可能性を高めるために必要な内容を顧客に伝えるためのメッセージを作成してください。メッセージには最も優先度の高いステップ3つを箇条書きで含め、受け取った顧客が前向きな気持ちになれるような表現を用いてください。また、メッセージの中ではAIモデルの存在や予測について一切言及しないでください。
```
今回参考にしているアクセラレータでは、[予測の説明](#予測の説明)をもとにプロンプトを作成する部分はノートブック内で定義する必要があります。
上記のスクリプトは以下のように作成しています。
```python
# 予測の説明の内容を箇条書きで表現
explanation_string = (
    "\n1. "
    + sample_1.EXPLANATION_1_FEATURE_NAME.iloc[0] # 予測を説明する特徴量名1
    + "が"
    + str(sample_1.EXPLANATION_1_ACTUAL_VALUE.iloc[0]) # 予測を説明する特徴量名1の値
    + "\n2. "
    + sample_1.EXPLANATION_2_FEATURE_NAME.iloc[0] # 予測を説明する特徴量名2
    + "が"
    + str(sample_1.EXPLANATION_2_ACTUAL_VALUE.iloc[0]) # 予測を説明する特徴量名2の値
    + "\n3. "
    + sample_1.EXPLANATION_3_FEATURE_NAME.iloc[0] # 予測を説明する特徴量名3
    + "が"
    + str(sample_1.EXPLANATION_3_ACTUAL_VALUE.iloc[0]) # 予測を説明する特徴量名3の値
    + "\n"
)
# 特徴量名を分かりやすい表現に置換
explanation_string = (
    explanation_string.replace("借り入れ目的（大分類）", "借り入れ目的の大分類")
     .replace("借り入れ目的（小分類）", "借り入れ目的の小分類")
     .replace("滞納回数（過去2年）", "過去2年の間に滞納した回数")
     .replace("信用情報照会件数（過去6ヶ月）", "過去6ヶ月の間に信用情報を照会された回数")
)

# 連結してプロンプトを作成
prompt = (
     'あなたはローン販売の担当者です。以下の理由によりAIモデルがある顧客のローン申請をリスクが高いと判断し、ローン申請が拒否されました。'
     + explanation_string
     + 'ローン承認の可能性を高めるために必要な内容を顧客に伝えるためのメッセージを作成してください。メッセージには最も優先度の高いステップ'
     + str(n_explanations) # 予測結果に含めた予測の説明の数
     + "つを箇条書きで含め、受け取った顧客が前向きな気持ちになれるような表現を用いてください。また、メッセージの中ではAIモデルの存在や予測について一切言及しないでください。"
)
```
ここを試行錯誤することで、生成される応答をよりよいものにできるかもしれません。

#### 応答生成
Azure OpenAIを叩く際のスクリプトに関しては[こちら](https://cookbook.openai.com/examples/azure/chat)を参照しました。
上記のプロンプトに対して、実際に生成AIが生成した応答を以下に示します。
```text
### ローン申請についてのご案内
[お客様のお名前] 様
この度は弊社にローン申請をいただき、誠にありがとうございます。お客様の現在の状況に基づく審査の結果、今回のご申請については残念ながら承認となりませんでした。しかし、お客様が希望のローンを利用できるよう、いくつかのステップを踏むことで、再申請の際の承認の可能性を高めることができます。
1. **信用評価の改善**:
   - 定期的にクレジットカードの支払いを行い、期限内に返済することで信用評価を向上させることができます。
   - 分割払いの滞納がないようにし、一定期間内にトラブルが発生しないよう注意しましょう。
2. **借入額の見直し**:
   - 申請額を少し下げることで、返済能力がより明確に証明でき、認可されやすくなります。例えば、今回の申請額197万5千円を見直してはいかがでしょうか？
3. **追加の収入源の確保**:
   - パートタイムの仕事や副業、賃貸収入など、年収を増やすことで申請の説得力が上がります。新しい収入源を見つけることで、収入の安定性を示すことが重要です。
この3つのステップを行うことで、次回のローン申請の承認率が大きく向上します。お客様が目指す目標に向けて、ぜひ前向きに取り組んでみてください。私たちも全力でサポートさせていただきますので、ご不明点や追加のご相談がある場合はお気軽にお知らせください。
引き続き、どうぞよろしくお願い申し上げます。
敬具
[担当者の名前]  
[会社名]  
[連絡先]  
```
人間が一目見て分かりやすい文章を作成できていますね。
影響の大きい特徴量とその値という無機質な情報を与えただけにも関わらず、内容としてもかなり実態に即したメッセージを生成できているのではないでしょうか？

さすがにこのメッセージをそのまま送信するわけにはいきませんが、この出力をたたき台として用いることで、少ない工数でも顧客コミュニケーションの向上や顧客育成を実現できるのではないかと思います。

# まとめ
本記事では、予測AIと生成AIを連携させて、顧客コミュニケーションの向上や業務効率化につながるようなユースケースをご紹介しました。
これからますます普及していくであろう生成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><div>

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

</div></details>


<details><summary> TDFⓇ-AM（Trusted Data Foundation - Analytics Managed Service）について</summary><div>

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

</div></details>


<details><summary>NTTデータとTableauについて </summary><div>

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

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

</div></details>


<details><summary>NTTデータとAlteryxについて </summary><div>
Alteryxは、業務ユーザーからIT部門まで誰でも使えるセルフサービス分析プラットフォームです。

Alteryx導入の豊富な実績を持つNTTデータは、最高位にあたるAlteryx Premiumパートナーとしてお客さまをご支援します。

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

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

</div></details>

<details><summary>NTTデータとDataRobotについて </summary><div>
DataRobotは、包括的なAIライフサイクルプラットフォームです。

NTTデータはDataRobot社と戦略的資本業務提携を行い、経験豊富なデータサイエンティストがAI・データ活用を起点にお客様のビジネスにおける価値創出をご支援します。

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

</div></details>

<details><summary> NTTデータとInformaticaについて</summary><div>

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

</div></details>

<details><summary>NTTデータとSnowflakeについて </summary><div>
NTTデータでは、Snowflake Inc.とソリューションパートナー契約を締結し、クラウド・データプラットフォーム「Snowflake」の導入・構築、および活用支援を開始しています。

NTTデータではこれまでも、独自ノウハウに基づき、ビッグデータ・AIなど領域に係る市場競争力のあるさまざまなソリューションパートナーとともにエコシステムを形成し、お客さまのビジネス変革を導いてきました。
Snowflakeは、これら先端テクノロジーとのエコシステムの形成に強みがあり、NTTデータはこれらを組み合わせることでお客さまに最適なインテグレーションをご提供いたします。

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

</div></details>