【SIGNATE】第3回金融データ活用チャレンジ（Dataiku）：Dataiku 13.4新機能のドキュメント埋め込み（Vision LLMs）を試してみた


### はじめに
[前回の記事](https://qiita.com/yatta3/items/7e4ab78fef917b062235)では、SIGNATE主催の第3回金融データ活用チャレンジ (RAGコンペティション) に参加し、DataRobotを使用して取り組んだ内容について紹介しました。

今回のRAGを構築するうえで、PDF（様々な企業のESGレポートや統合報告書）から精度良く情報を抽出することが非常に重要でした。コンペ終了後、Dataiku 13.4でドキュメントの埋め込み機能がリリースされたと知り、さっそく試してみました。その内容を紹介します。RAG構築の詳細については、ハンズオン記事がとても参考になります。なお、ドキュメントの埋め込み以外は同じ流れになります。

参考リンク: [【完全網羅】第3回金融データ活用チャレンジ提出までの手引書 (@fumihiko_kimuraさん)](https://qiita.com/fumihiko_kimura/items/bdb889de49b1f863904f)

また、ドキュメントの埋め込み機能についてはこちらの紹介記事も大変参考にさせていただきました。
参考リンク: [Dataiku 13.4 新機能 ドキュメントの埋め込み~RAGを作りやすくする, keywalker](https://www.keywalker.co.jp/blog/dataiku-new-feature-13-4.html)）

---

### 1. 環境構築

今回の動作確認は、[Windows用のDataiku](https://www.dataiku.com/ja/%E8%A3%BD%E5%93%81/%E5%A7%8B%E3%82%81%E3%82%8B/windows/)で行いました。まず、アドミニストレーション > Code Envs > Internal envs setupの「Retrieval augmented generation code environment」でPython 3.9を選択し、「CREATE CODE ENVIRONMENT」を実行します（デフォルトのPythonバージョンが3.7ですとエラーが出るため、Python 3.9が必要でした）。

![スクリーンショット 2025-02-16 210328.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635931/97e88280-4c8b-46da-8e46-65bc2af6745a.png)


---

### 2. OpenAI接続設定

今回はVLM(Vision LLMs)としてOpenAIのGPT4o-miniを使用しました。アドミニストレーション > ConnectionsでOpenAIのAPIキーを設定します。確認はできていませんが、AnthropicのClaudeなどでも可能と思われます。

![スクリーンショット 2025-02-16 101439.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635931/18f3e9a4-a5ea-4291-8452-fd3b61c90a42.png)

---

### 3. ドキュメントの埋め込み
Dataiku 13.4では、ドキュメントの埋め込み方法として以下の2つのアプローチがサポートされています。[参照: Text Extraction vs. Vision LLM](https://doc.dataiku.com/dss/latest/generative-ai/knowledge/documents.html#vlm) 

1. **テキスト抽出**
   - ドキュメントのテキスト内容を抽出
   - 抽出されたテキストを埋め込みモデルに合わせてチャンクに分割（Markdownファイルの解析時には、Markdownセクションも考慮）
   - 質問時には、質問文と類似度が高いドキュメントの関連部分がLLMのコンテキストに渡される
   
   この方法は、シンプルなテキストドキュメントには適していますが、画像、図、複雑な表が含まれるドキュメントには適していません。

2. **VLM (Vision LLMs)**
   - 複雑なドキュメントの場合、DataikuはVision LLMs (VLM) を使用
   - テキスト抽出の代わりに、ドキュメントの各ページを画像に変換
   - 画像の範囲をVLMに送信し、要約を依頼
   - 各画像範囲の要約を埋め込み

   質問時には：
   - 質問の埋め込みを使用して関連する範囲を取得
   - 一致する画像をVLMのコンテキストに直接渡す
   - VLMは画像を直接使用して回答

   VLMの高度な画像理解能力により、テキストを抽出するだけの場合よりも、はるかに関連性の高い回答が得られます。

VLMによるRAG構築の流れですが、まず、「＋IMPORT YOUR FIRST DATASET」で作成したフォルダにPDFを格納し、フォルダアイコンを選択（アクティブに）すると「ドキュメントの埋め込み」のビジュアルレシピが選択できます。「Vison language model」、「Embedding model」、「Vector store type」を設定してCREATE RECIPEを実行します。

![スクリーンショット 2025-02-16 103658.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635931/061ff602-450c-40ae-83fc-97710d584dd8.png)

次の画面でStrategy rulesを設定します。Applyは「VLM extraction」にします（補足. 今回は紹介しませんが、txtやmdファイルを埋め込む場合はStructured text extractionを選択します。フォルダに様々な形式のファイルが混在していても、まとめて埋め込みできるのは良いですね）。advanced settingで「Customize extraction prompt」のチェックボタンを押すと、VLMに指示する抽出プロンプトもカスタマイズできます。例えば、「PDFの内容をすべて抽出してMarkdown記法で出力してください」など自由に変更できます。

その他、チャンクサイズ、オーバーラップなど適宜設定して実行すれば、画像が格納されたフォルダとナレッジバンクの2つが出力されます。これだけでRAG構築は完了です。

![スクリーンショット 2025-02-16 203221.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635931/cbd7ee1f-08fa-4aec-a5b8-5151277fbaad.png)

![スクリーンショット 2025-02-16 225734.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635931/50934c93-a61e-45c0-869b-ca5ad544243c.png)

---

### 4. RAGを利用した質疑応答テスト (Test in Prompt Studio)

Prompt Studioで試しにPDFに関する内容を質問すると、回答とソース画像が表示されます。回答は正確であったため、PDFから上手くRAGが構築できていると思われます。ただ、気になった点（理解できていない部分）として

- 画像から抽出したテキスト情報は確認できないのか（プラグイン:Text extraction and OCRで抽出した場合は確認できます）
- PDFはページ毎に画像として保存されているが、回答する場合はどこを参照しているのか（例えば、グラフや表など）フォーカスして確認できないのか

例えば、質問プロントで「抽出したソーステキストも提示してください。」のような指示を追加するとPDFのおおよその該当箇所を出力してくれました。構築したベクトルデータベース(今回はChromaDB)の情報を読み出せないか、さらに調査できればと考えています。

![スクリーンショット 2025-02-16 225937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635931/abe94f1f-eab3-4dd3-a801-06027959adf2.png)


![スクリーンショット 2025-02-16 204350.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635931/1ce3c701-e2e5-413d-97c2-95e249a20114.png)

---

### 5. まとめ

今回、VLMを用いたドキュメントの埋め込み機能を試してみましたが、非常に簡単に実行できて驚きました。今後、精度などを引き続き評価していきたいと思います。Pythonコードでも同様のことができるかとは思いますが、どんどん便利になりますね。また、今回のようなRAGコンペティションが開催された時には、ぜひこの機能を活用したいと思います。