【SIGNATE】第３回金融データ活用チャレンジ (DataRobot)

# 企業のESGレポートQA自動応答システム構築に挑戦

金融庁とSIGNATEが共催する第3回金融データ活用チャレンジ (https://signate.jp/competitions/1515) に参加し、企業のESGレポートや統合報告書に関する質問に対して自動的かつ正確に回答できるRAG（Retrieval Augmented Generation：検索拡張生成）システムの構築に挑戦しました。本記事では、DataRobotを中心に、その過程で得られた知見や技術的な工夫についてご紹介します(DataRobotの生成AI機能は今回初めて利用したため、理解に誤りがあるかもしれません。その点についてはご容赦ください)。

## コンペティション概要

本コンペティションでは、Microsoft Azure Open API (GPT4o-mini, text-embedding-3-large)、日立製作所環境API（Llama3.3-70b、qwen2.5-72b、そして話題のDeepSeek R1もエキシビジョンとして提供！）、DataRobot、Dataikuなどの強力なツール群を無償で利用できる点が大きな魅力でした。また、ハンズオン形式での学習機会やSlackでの活発な質疑応答を通じて、初心者でも取り組みやすい環境が提供され、大変勉強になりました。

## RAGシステム構築手順

RAGシステムの構築は、大きく分けて以下の4つのステップに分けられます。

1. **データ整形（Store）**: 質問応答に利用するデータを整理・加工し、検索可能な状態にする
2. **検索・関連情報収集（Retrieve）**: 質問内容に応じて関連性の高い情報を検索する
3. **プロンプト構築（Augment）**: 検索された情報をLLM（Large Language Model：大規模言語モデル）に入力するためのプロンプトを構築する
4. **回答生成（Generate）**: LLMを用いて質問に対する回答を生成する

![signate_rag1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635931/014f5a4b-edc0-4af0-8926-6a62de9f5d6c.png)
（出所：SIGNATE（金融庁共催）第３回金融データ活用チャレンジ）


今回は、DataRobotをメインに活用し、各ステップでどのようなアプローチを取ったかについて紹介します。

### 1. データ整形（Store）

DataRobotでは、データソース（テキスト、PDFなど）をアップロードし、チャンク方法（再帰的、セマンティック）、チャンクサイズ（テキストを分割する単位）やオーバーラップ（チャンクの重複部分）を設定するだけで、簡単にベクターデータベースを自動構築できます。デフォルト（推奨）設定でもベースラインとしては良い精度が得られましたが、最終的には別途、Gemini 2.0 FlashなどのマルチモーダルLLMを用いてPDFをMarkdown形式に変換し、そのMarkdownファイルをデータソースとして利用しました（チャンキング方法は再帰的で、テキスト区切り文字は見出し（#など）をカスタムルールとして設定しました）。

![signate_rag2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635931/5cc7c64d-1041-4cfa-a3fa-964ac7f0d560.png)
(DaraRobot ベクターデータベース作成画面)

##### 補足

- 今回はDataRobotトライアル版で使用できるモデル (GPT4o-mini, GPT3.5-turboなど)とDataRobotに追加でデプロイしたカスタムモデル(日本マイクロソフト提供のGPT4o-mini)以外のモデルは動作を確認することができませんでした（Google geminiなど。トライアルのアクセス制限が原因かもしれません）
- DataRobotは自動で良い感じにやってくれますが、Codespace（ノートブック環境）でさらに柔軟に、応用的なことができるようです
- DataRobot Communityのai-accelerators（サンプルコード: [Generative AI accelerators](https://github.com/datarobot-community/ai-accelerators/tree/main/generative_ai)）には、「LLM custom inference model template」や「Google Gemini with DataRobot（multimodal_model使用）」といった有用なサンプルコードが提供されています
- Streamlitによる生成AIアプリケーション作成も容易に行えるようでしたので、別の機会に再チャレンジしたいと思います（エラーで詰まったので今回は時間の制約もあり中断しました）
- Codespaceでのアプリ作成については、こちらの記事がとても参考になります [DataRobotで構築したベクターDBの中身を確認する(@ynabekurさん)](https://qiita.com/ynabekur/items/516a90203825c0e35faf)

##### 参考: Dataikuの場合

DataRobotはシンプルな構成で良いのですが、比較としてDataikuには、「[Text extraction and OCR](https://www.dataiku.com/product/plugins/tesseract-ocr/) 」という高機能なプラグインが搭載されており、PDFファイルのテキスト抽出に威力を発揮します。また、今回のコンペティション期間中には間に合いませんでしたが、「ドキュメントの埋め込み」機能も新たにリリースされました。VLM（Vision Language Model：視覚言語モデル）による抽出も可能とのことですので、別の機会にぜひ試してみたいと思います。

（参考リンク: [Dataiku 13.4 新機能 ドキュメントの埋め込み~RAGを作りやすくする, keywalker](https://www.keywalker.co.jp/blog/dataiku-new-feature-13-4.html)）

※追記(試しました): [【SIGNATE】第3回金融データ活用チャレンジ（振り返り）：Dataiku 13.4新機能のドキュメント埋め込み（Vision LLMs）を試してみた](https://qiita.com/yatta3/items/d933090f9149cb3c57c2)

### 2. 検索・関連情報収集（Retrieve）

参考リンク: [DataRobot LLMブループリントの構築](https://docs.datarobot.com/ja/docs/gen-ai/playground-tools/build-llm-blueprints.html)

DataRobotでは、いくつかのRetriever（検索機能）メソッドが提供されています。

* **Single-Lookup Retriever**: 各クエリに対して単一のベクトルデータベース検索を実行し、最も類似したドキュメントを返します。基本的な検索方法として、まずはこちらを試しました
* **Conversational Retriever**: チャット履歴に基づいてクエリを書き換える機能です。今回はチャット履歴を考慮しないため、選択肢から除外しました
* **Multi-Step Retriever**: チャット履歴がない場合には推奨されないものの、複数の新しい検索クエリを使用する（クエリを書き換える）ことで、最適なドキュメントを取得できる可能性があるようです。質問によっては、様々な視点から検索することで回答精度が良くなるので、採用しました

さらに、検索された類似ドキュメントのチャンク前後（例えば、チャンク番号42を取得した場合、41と43も）の情報も取得できる「隣接チャンク追加」設定も試しました。これにより、関連情報が複数のチャンクにまたがる場合、有効ですが、処理時間が増加するため要注意です（Multi-Step Retrieverとは組み合わせない方が良いかもしれません）。Store時のチャンクサイズとオーバーラップの設定を調整する前に、試してみるのに良いと思いました。

![signate_rag3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635931/0c29e615-dbd5-4e57-8a4c-6027622c1634.png)
(DataRobot LLMブループリント設定)

### 3. プロンプト構築（Augment）

システムプロンプトはプロンプトエンジニアリング（Chain of Thoughtなど）を考慮して設定しました。DataRobotでは、プロンプトと回答が履歴として残り、LLMブループリントの比較ができるため、様々なプロンプトを試行錯誤する上で非常に役立ちました。
参考リンク: [DataRobot LLMブループリントの比較](https://docs.datarobot.com/ja/docs/gen-ai/playground-tools/compare-llm.html)

![signate_rag4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635931/398d12f8-5934-4230-82fc-6a4f5a6aa97c.png)
(DataRobotプレイグラウンド - LLMブループリントの比較)

### 4. 回答生成（Generate）

回答の根拠となるソース（どの程度引用されているか）、回答との類似度や隣接チャンクも確認できるため、詳細な分析に繋がりました。また、確認画面が見やすくて良いです。
![signate_rag5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635931/cfda1ee5-55fe-4a79-a2e4-1c6010562290.png)
(DataRobotプレイグラウンド - 引用)

## まとめ

今回の金融データ活用チャレンジを通じて、RAGシステム構築の一連の流れを体験し、多くの知見を得ることができました。特に、データ整形段階におけるマルチモーダルLLMの活用や、検索段階における複数のRetrieverメソッドの組み合わせ、プロンプトエンジニアリングの重要性などを学ぶことができました。

残念ながらメダル獲得までには及びませんでしたが（最終提出スコア: 0.38、ベストスコア: 0.46）、今回の経験は今後のRAG開発に必ず活かせるものと確信しています。

本コンペティションを共催してくださった金融庁様、SIGNATE様、事務局の皆様、そして貴重な機会を与えてくださった関係者の皆様に、心より感謝申し上げます。