第３回金融データ活用チャレンジ で DataRobotを使ってみた

# 謝辞

昨年に引き続き[第３回金融データ活用チャレンジ](https://signate.jp/competitions/1515) を企画・開催くださった関係者の皆様，およびLLMモデルやGUIツールを期間限定ではありますが無償提供くださった企業の皆様に心より感謝申し上げます.
今回のチャレンジで **DataRobot** を利用させていただき流石だなと思ったのでレポートさせていただきます.

# [第３回金融データ活用チャレンジ](https://signate.jp/competitions/1515)

## 今回のコンペは?
今回のコンペは「企業のESGレポートや統合報告書に関連する質問に対して自動的かつ正確に回答できるRAGシステムの構築」がテーマとなりました.
詳細は[第３回金融データ活用チャレンジ](https://signate.jp/competitions/1515)をご確認ください.

![ALHiAfdbNQ4GwoYwbUihSsXIigzVtpWUmTCaBTlS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/24dd21ce-0e58-4c46-a1d2-d3627bbe43c0.png)

## [DataRobot](https://www.datarobot.com/jp/)はどんなツール？

何年か前の話になりますがあるエンジニアの方から金融機関のプロジェクトでターゲット顧客を[LightGBM](https://lightgbm.readthedocs.io/en/stable/)という非常にメジャーなAIツールを使って分類したが性能がいまいちなので**DataRobot**で検証することにしたという話を聞き強烈な印象を受けました.
**DataRobot**を一度使ってみたいと思ってましたが絶好な機会が今回のチャレンジでした.

個人的な見解で恐縮ですが使ってみて**オールマィティ**な印象を受けました.
今回同じく無償提供された[Dataiku](https://www.dataiku.com/ja/)も同様かと思います.
**オールマィティ**を具体的にいうと上の図のUIも含めてその右側のRetrieve,Store,Augment,GenerateすべてをカバーしRAGシステムが自己完結しています.
自己完結したRAGシステムを構築するのはなかなか大変です.
スクラッチでRAGを構築しようとすると最低以下のタスクが必要になりそうです.

- LLMモデル(chat, embeded)の選定と利用のための手続き
- UI,Retrieve,Store,Augment,Generateの設計,実装,テスト

途中いろいろな試行錯誤を経てまともに動くようになるまで自分なら最短でも10日くらいほしいところです.
**DataRobot**や**Dataiku**は自己完結したRAGシステムが存在しているのでデータを放り込めばその日のうちに使えます.

もしコンペの期間が１週間とかだったらGUIツール(ノーコードツール)を使っている人たちには勝てなかったと思います.

#  [DataRobot](https://www.datarobot.com/jp/)を使ってみた
本コンペでDataRobotに関してすばらしい知見をブログにしていただいている方々もいらっしゃいますが公開可能になった時点で改めてリンクを共有させていただきます.

## これは便利だと思った！

### モデルを自由に切り替えられる

自分はPythonでRAGをスクラッチ開発しましたがLLMを何個も試すことはできませんでした.
Azure OpenAI GPT-4o MiniをLlama-3.3-70B-Instruct-fp16やQwen2.5-72B-Instruct-fp16に切り替えるとなるとひと手間かかります.
DataRobotはプルダウン操作1回でモデルを自由に切り替えて試すことができます.
「アクセスポリシー」の制約内であれば外部モデルも利用できるようです.
![available models](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/a4a58840-d068-4a3c-bbec-8dcdfd2fcad0.png)

### プロンプトの壁打ち

これは実務用途というよりコンペ対策の活用法です.

今回のコンペではRAGの精度を検証する用途でvalidationデータ(10個のpdf,50個の質問,正解)が提供されました.
これを利用してどういうプロンプトがうまく動きそうか試すことができます.

たとえばこんなプロンプト
```
???ホールディングスにおいて、2024年2月29日現在の深夜営業店舗数は何店舗か

回答は以下のルールに従うこと.
- ベクターDB以外の情報は参照しないこと.
- 回答の作成にあたり推論の過程、理由、説明、根拠、出典、補足と結論は分けて出力する.
- 結論には推論の過程、理由、説明、根拠、出典、補足や「です」、「ます」などの接尾語は一切つけないこと.
- 以下の情報に回答が存在しない場合は「わかりません」と答える.
- 質問に対して以下のルールで回答を作成する.
  -- 回答の作成にあたり出典、引用(これをAとする)、推論の過程、理由、説明、補足(これをBとする)、結論(これをCとする)を分けて回答すること.
  -- 結論が数値である場合は質問文に以下の単位が含まれる場合は単位を末尾につけて回答すること.
    --- %
    --- 人
    --- 名
    --- 千円
    --- 万円
    --- 百万円
    --- 面積を表す単位
    --- 体積を表す単位

  -- JSON形式でkeyとして"conclusion"を指定しそのvalueにCを記載して出力すること.
  -- JSON形式でkeyとして"reason"を指定しそのvalueにBを記載して出力すること.
  -- JSON形式でkeyとして"source"を指定しそのvalueにAを記載して出力すること.
```

**DataRobot**の回答はこんな感じ
![answer](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/843bdaf3-e508-4568-af2c-ba88ce9edb49.png)



下段の99は回答のトークン数 99, その右の61.84%は[ROUGE-1](https://docs.datarobot.com/ja/docs/workbench/nxt-registry/nxt-model-workshop/nxt-configure-evaluation-moderation.html)
回答の確信度のようなものかな？と思ったりしており40％くらいだと「わかりません」に倒したらいいのかな？などなど考えてしまいます.


![tokens](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/6aaf4c01-248b-4804-ba4f-90fbb5c5cbeb.png)


**引用**がこれまた便利でどのPDFのどこら辺を参照したのかがわかります.
![source](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/939e8574-8fc0-43cf-9d83-037d2dc1b97d.png)


これは超まれなケースですが正解は4,62**6**件なのになぜ4,62**4**件？
![why](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/a021a6f9-c817-42fb-86cc-4e0a4f7c3ea3.png)


というときは**引用**をクリックするとこのページを見て判断したことがわかりますが,あれぇ？これ正解なんでは？ans_txt.csv(正解ラベル)が間違っている？
なんてこともあります.
![patent](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/136fcf4e-6c7e-4ba1-a484-8dde37807f57.png)


ドキュメントの要約を試してみた
```
？？？ホールディングスに関する情報を以下の形式で要約し回答を作成してください.
- 1. ** タイトル **
- 2. ** 著者(株式会社や団体、組織の名前) **
- 3. ** ドキュメントの概要 **
- 4. ** 目次 **
- 5. ** 企業情報 **
- 6. ** 業績ハイライト **
- 7. ** 重要なキーワードおよび固有名詞の一覧 **
```

回答はこんな感じになるので,ばらつきのあるPDFを標準フォーマットで整理したいなどの要件を満たすプロンプトの壁打ちをためしたり出来ると思いました.
```
{
  "title": "？？？ホールディングス 統合報告書 2024",
  "author": "？？？ホールディングス株式会社",
  "document_summary": "この報告書は？？？ホールディングスの2024年度における業務戦略、社会貢献活動、環境への取り組み、健康寿命の延伸に向けたヘルスケア事業に関する詳細を提供しています。また、企業の成長に向けた財務情報や企業の社会的責任についても示されています。",
  "table_of_contents": [
    "1. 企業概要",
    "2. 経営戦略",
    "3. 社会貢献活動",
    "4. 環境への取り組み",
    "5. ヘルスケア事業",
    "6. 財務報告",
    "7. 未来の挑戦"
  ],
  "company_information": {
    "設立年": "2001年",
    "所在地": "日本",
    "店舗数": "2,825店舗",
    "従業員数": "63,520人"
  },
  "performance_highlights": {
    "売上高": "1兆2,173億円",
    "営業利益": "43,231百万円",
    "純利益": "26,451百万円",
    "成長率": "前年同期比6.4%増"
  },
  "important_keywords_and_proper_nouns": [
    "？？？ホールディングス",
    "ヘルスケア",
    "地域貢献",
    "環境保護",
    "健康寿命",
    "CSR",
    "店舗展開"
  ]
}

```

## DataRobotを使ってみた感想

- コンペで使う場合はなんといっても数時間でRAGを構築できてプロンプトの壁打ちができる.
- アクセスポリシーで通信を制限するなど外部流出のセキュリティ対策も万全そうなので個人でも安心して使えそう.
- 個人で使う場合はとりあえずデータを放り込んでExcelライクに個人の自由な観点でデータの整理,分析,蓄積ができて便利そう.

以上なんですが**DataRobot賞**,応募が多くてレッドオーシャンっぽくなってしまった.