Dataiku社営業マン(文系ノーコーダー)が金融データ活用チャレンジに挑む！vol.2 (RAG編) 



# 目次
1. [はじめに](#はじめに)  
2. [取組んだ内容](#取組んだ内容)  
   - [2-1. 前処理](#2-1-前処理)  
   - [2-2. プロンプト](#2-2-プロンプト)  
   - [2-3. 後処理](#2-3-後処理)  
3. [おわりに](#おわりに)

---

# 1. はじめに
今年のRAGコンペは、生成AIと実データを組み合わせた超実践的な挑戦！FDUAさんとSignateさんのおかげで、無料のAPIキーも提供され、多くのことを学ばせて頂きました。感謝です✨今回はマイクロソフト社および日立製作所社から生成AIのAPIキーまでご用意いただき、それが**無料**で使えるという太っ腹な企画。しかも実物の統合報告書をRAG形式で扱う、まさに**実践的なコンテンツ**でした。

<br>

昨年同様（※）今年もDataikuのチャネルは大盛り上がりでしたね🐦️。「**DataikuのおかげでRAGコンペに投稿までできました！**」という初心者の方から、Pythonレシピを駆使して高度なことに挑戦する上級者まで、幅広く活用していただけたことに改めてDataikuの可能性を実感しました。
ご利用いただいた皆さん、本当にありがとうございました！ （ブログ執筆の上、Dataiku賞への応募お待ちしております）

(※)昨年のコンペの様子

https://qiita.com/yukinaka_data/items/a5cfb931a72cb9373082

<br>

昨年はFDUAコンペ委員会の一員として参加していましたが、Dataikuの成長により社員が増えたこともあり、今年は一参加者として思いっきりチャレンジしています。しかも今年はDataiku賞の審査員でもないため、マジでDataiku賞を狙っていきます！（というのは冗談で、昨年どうよ自分の学びの軌跡としてここに残したいと思います。）

https://qiita.com/yukinaka_data/items/36b8c3f25acd3ba374ee

<br>

### スコア推移
先にお断りしておきますが、、、スコアは高くないのであまり参考になるような情報はございません。。。（涙）さすがによく考えられた良問です。
2回目の投稿が最もスコアが高く、それ以降スコアは下がる一方・・・（涙）新しいことを試すたびにスコアが下がっていく＞＜
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/63033cb7-d7a2-9bde-bc95-e47999bd41f0.png)



---

# 2. 取組んだ内容

**今回作成したフロー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/9f731f40-97d5-0adc-35f5-39d1071ef663.png)




基本的な手順自体は、Qiitaで「いいね」を48個（2025/2/9時点）もらっている@fumihiko_kimuraの下記のブログと同じです。

https://qiita.com/fumihiko_kimura/items/bdb889de49b1f863904f


ここでは **「そのブログに書いていない部分」** を中心にご紹介します。

## 2-1. 前処理
### **2-1-1. チャンク分割** 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/70eb68a2-81de-b3c2-b57e-ad14bbb7f88b.png)

### **2-1-2. 企業名の抽出**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/bd148390-3a5d-b7ff-9988-f65ed61dc240.png)


### **2-1-3. 各チャンクからキーワードの抽出**  
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/b08ae057-ae3a-e468-7c29-4ce6064c8168.png)

### **2-1-4. 各チャンクの要約作成**  
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/104258db-f6e4-434e-3481-b98a8c260247.png)

### 2-1-5. 上記情報をまとめて **Knowledge Bank** の作成へ
上記の情報（企業名、サマリー、キーワード）をチャンクされた文章の冒頭につけて、それでKnowleage Bankを作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/62eccdac-b53e-92cc-fafd-43c8b5ff227f.png)

## 2-2. プロンプト

### 2-2-1.　プロンプトの工夫点
いろいろと試行錯誤を重ねたり、「実践で使える神プロンプト！」系のYouTube動画を参考にしたり、実際にChatGPTに聞いたりして、最終的にこちらのプロンプトに行きつきました。

```
あなたは証券会社のシニアアナリストです。顧客に正確かつ最善の情報を提供するため、以下のガイドラインに従い、慎重かつ段階的に回答してください。回答生成にあたっては、十分な考察時間を確保し、Chain of Thought（内部の思考過程）をステップバイステップで実施してください（ただし、最終出力には内部の思考過程は含めないこと）。

【基本ルール】

回答は統合報告書の情報のみを根拠とし、必要な情報が見つからない場合は「わかりません」と答え、その場合はすべてのフィールドに「わかりません」と記載してください。
回答は日本語で記述すること。
【出力形式】 最終出力は必ず以下のJSON形式のみとし、他の文章、コードブロック、コメント、内部メモ等は一切含めないこと。トップレベルのキーは以下の4つに限定します：

complete_answer: 詳細な回答とその根拠を含む説明を記述
concise_answer: 単語形式（必要に応じて単位を含む）、改行なし、54トークン以内の簡潔な回答を記述
evidence: 回答の根拠となる統合報告書から抽出した該当箇所（必要に応じて引用符(")で囲む）を記述
evidence_check: 回答の評価結果を記述。concise_answer が evidence に照らし合わせて最適な回答となっている場合は 1、最適でない場合は 2 を出力する
【思考プロセスに関して】 3. 回答前に十分な考察時間を確保し、ステップバイステップで問題を検討してください。
4. 内部のChain of Thought（思考過程）はMarkdown形式で記録して構いませんが、最終出力には一切含めないこと。 5. 常に自分の限界を超える努力を払い、可能な限り正確かつ深い洞察を提供すること。

【その他の注意点】 6. ハルシネーション（虚偽情報）を絶対に起こさず、統合報告書の情報のみを用いて回答すること。

質問： {problem}
```
**工夫点**

- **専門性の強調**  
  - 「証券会社のシニアアナリスト」として回答するように指示し、信頼性と専門的な視点を強調している。

- **根拠の徹底利用**  
  - 統合報告書の情報のみを根拠に回答するよう指定し、ハルシネーション（虚偽情報）を防止している。

- **不明時の一律対応**  
  - 必要な情報が見つからなかった場合は「わかりません」と統一した回答を出すことで、曖昧さを排除している。

- **厳格な出力フォーマット**  
  - 最終出力をJSON形式に限定し、キーは `complete_answer`、`concise_answer`、`evidence`、`evidence_check` の4つのみとすることで、出力内容の一貫性を確保している。

- **簡潔な回答の制約**  
  - `concise_answer` は54トークン以内、単語形式（必要に応じて単位を含む）、改行なしの1行で出力するように制約を設け、回答の要点を簡潔にまとめることを求めている。

- **回答根拠の明示**  
  - `evidence` キーに、統合報告書から抽出した回答の根拠となる箇所を記載するように指示し、透明性を向上させている。

- **内部評価システムの導入**  
  - `evidence_check` キーに、`concise_answer` が `evidence` に照らし合わせて最適な回答となっているかを評価し、最適であれば1、そうでなければ2を出力する仕組みを組み込んでいる。

- **Chain of Thought の活用と非公開**  
  - 回答生成前に十分な考察時間を確保し、ステップバイステップで内部のChain of Thoughtを実施するよう促しているが、最終出力には内部の思考過程を含めないようにしている。

- **原文引用のルール明示**  
  - 必要に応じて原文の引用を行う場合、引用符（"）で囲む指示を加え、出典の明確化と正確な情報伝達を図っている。




### 2-2-2.　出力の設定
これまでの経験から、曖昧な回答を出すと減点されるパターンが多かったため、**わからない**を多めに返すほど高スコアが出る傾向がありました。そのため、プロンプト全体にも「情報がない場合は即座に『わからない』と回答させる」方針を盛り込んでいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/7bfa3b16-5006-06da-5c58-f2ff77740b97.png)


## 2-3. 後処理
- JSON形式で吐き出した回答を列ごとに分割  
- **evidence** と **concise_answer** が合致していないもの（`evidence_check = 2`）を「わからない」に変換  
- 54トークンを超えた回答があれば、**わからない**に変換

このあたりも生成AIがプロセッサーに変換してくれるのでとても便利です。（※無償版は対象外の機能）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550964/59508b02-bab6-1c2c-f15b-a6114a81f4e5.png)

---

# 3. おわりに
AIは一見“魔法のツール”と思われがちですが、実際にはその裏側で**人間が（生成）AIにどこで何をさせるのかを緻密にロジック化**し、与えるデータやプロンプトを試行錯誤しながら最適解を作り上げていくプロセスが重要であることを、このコンペで改めて学ぶことができました。


今回の精度に関しては、下記の3点がポイントだと理解しています。Dataikuの活用有無に限らず、みなさんの解法を学ばせていただき、さらに理解を深めたいと思います。  
1. **PDFのデータをいかに正確に読み込むか**  
2. **精度の高いRAGを作るためのデータ整形および設定**  
3. **プロンプトエンジニアリング**

一方、私の技術力ではまだ挑戦できなかったのが**マルチモーダル対応**です。画像や表の取り込みを自動化しようと、生成AIのサポートを受けつつPythonレシピを試したのですが、うまくいかず断念しました。まだまだ基礎知識が足りないことを痛感しました。

来年のコンペも非常に楽しみです。きっと今よりも生成AIの性能がさらに上がっていることでしょうし、Dataikuのノーコードでできることもさらに増えているはずです。来年はどんな世界になっているか、今からワクワクしています！

<br>
参考情報

https://www.dataiku.com/ja/%E8%A3%BD%E5%93%81/key-capabilities/

https://qiita.com/yukinaka_data/items/8270e1a559e8fc3c047d