FDUA 第３回金融データ活用チャレンジに参加してみた！ #1 データの準備

# この投稿で書いていること
・「FDUA 第３回金融データ活用チャレンジ」にチャレンジ
・テーマの 「RAG」 について取り組んだ内容
・「今後」やっていきたいこと

# 目次
[FDUA 第３回金融データ活用チャレンジに参加してみた！ #1 データの準備](https://qiita.com/ooo0224jp/items/18b405a1d3685bfa274b)
[FDUA 第３回金融データ活用チャレンジに参加してみた！ #2 回答生成](https://qiita.com/ooo0224jp/items/b1c7f55fd212cf541764)
[FDUA 第３回金融データ活用チャレンジに参加してみた！ #3 精度向上 1/2](https://qiita.com/ooo0224jp/items/1892a9bb75a1afaa5441)
[FDUA 第３回金融データ活用チャレンジに参加してみた！ #3 精度向上 2/2](https://qiita.com/ooo0224jp/items/bdec0884ee1e0b0e7989)
[FDUA 第３回金融データ活用チャレンジに参加してみた！ #4 OCR](https://qiita.com/ooo0224jp/items/215a861cd4c317281977)

# 謝辞
この度は、「FDUA 第３回金融データ活用チャレンジ」の企画・実施について誠にありがとうございました。
運営チームの皆さまの卓越した企画力と、円滑な進行管理のおかげで、学びと成長の機会を得ることができました。

効果的に生成AIを利用することは今後の金融業界において必要と拝察しております。
今回この機会が参加者にとって非常に有意義な体験を提供する基盤となり、生成AIの可能性を深く理解するきっかけとなったことと思います。

また、運営の皆さまが創り出したオープンで協力的な環境は、コミュニティ全体の交流を促進し、参加者同士が刺激し合いながら素晴らしい成果を生み出す原動力となりました。

この場をお借りして、改めて心より感謝申し上げます。今後とも、生成AIを活用した新たな挑戦や取り組みがより広がっていくことを願っております。そして、皆さまのご活動がますます発展していくことをお祈り申し上げます。

ありがとうございました。

# はじめに
FDUA 一般社団法人金融データ活用推進協会、金融庁共催の「第３回金融データ活用チャレンジ」に参加してみました。

https://signate.jp/competitions/1515

今回のテーマは、「生成AIを活用した資産運用アドバイス」ですが、ずばり**RAG**です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006424/634ec655-d1eb-5c23-aeef-535cb278f906.png)

RAGは、生成AIに外部情報を渡して質問に回答してもらうための仕組みの事ですが、昨今流行りの AI Agent も RAG なしには限界があるので、ここで優秀な RAG 仕組みを皆さんと考えられればと思いました。

# 前準備
さてまず何を考えるにあたっては、RAGですのでやっぱり
・外部情報はなにか？
・課題はどんな？
ここから始まりますので SIGNATE さんのコンペページにあるデータをダウンロードして眺めます。

以下原文です。

:::note info
課題
本コンペティションでは、[J-LAKE](https://www.jpx.co.jp/corporate/news/news-releases/0060/20240227-01.html)(*パートナー企業であるDATAZORAのKIJIサービス提供データを含む)の情報を用いてRAGシステムを構築していただきます。提供されたデータを元に、質問（query.csv）に対する回答を生成し、その回答の精度を競います。 生成した回答は、指定のフォーマットに従い、投稿してください。
[（金融庁共催）第３回金融データ活用チャレンジ](https://signate.jp/competitions/1515)
:::

## 外部情報はなにか？
PDFファイルがいくつもあって、頁総数は結構多いです。

凝った作りのPDFもありますが、PDFですので割と一般的な人間が見やすいことを目的にした内容です。ですので、バラエティのある段組みや色に意味を持たせた図表が満載です。

パッと見、結構大変そうだな。。。

## 課題はどんな？
PDFに沿った質問が100問ありました。
単純な課題から、質問が込み入っていて一発で解くにはちょっと手こずりそうな課題もあります。


## で、どんな仕組みにするかの方針
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006424/ff7124e8-f721-1802-50af-858099754eb2.png)
まずは、よくあるRAGの仕組みで考えます。


### データストア（ナレッジベースなどとも言われる）

とにかくPDFを生成AIが処理できる形にする必要がありますので、まずはこんな形を考えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006424/0cf5132d-3423-4e4e-a3bb-1814be13c860.png)




**OCR**
今回は DI(Azure Document intelligence） の レイアウトモデル を使いました。
https://azure.microsoft.com/ja-jp/products/ai-services/ai-document-intelligence

でもこのサービスだとテキストや表、段組みは一定精度で認識してくれるものの、図に書かれていることは読み取れない、、、、なのでこちらの記事を参考に図を切り取り画像処理をします。
https://qiita.com/nohanaga/items/1263f4a6bc909b6524c8

**図の画像処理** は、まずは一番簡単な **生成AI** に情報抽出と構造化をしてもらいました。

 **チャンク** については、時間も限られているので一旦は **PDF1ページ1チャンク** とします。
256バイトがいいとか、512バイトが最も精度が高い検証結果があるとか、オーバーラップのサイズは・・・、諸説ありますが経験的に最初から考える必要はないかなと思ってます。
ものによって違うのと、汎用的に使うにはサイズを決めにくいこと、必要に応じて後で切ればいいかなと思っているからです。
それよりもなによりも **<font color="Blue">PDFの情報を正しくテキスト化する方が大事！</font>** ここが間違っていると回答も間違えてしまいますので！


今回は、DI でPDFをファイルごとに処理して、マークダウンにし、結果をページ分割しています。（ファイル名の後ろに -連番 をつけて保存）
PyMuPDF で分割も試しましたが、どちらでもできます。


生成AIも組み合わせて最終的には、このようなナレッジを作成しています。

1\.段組みでまとめられたテキスト（DIで処理）
2\.表（DIで処理）
3\.図（DIで抽出した座標位置から図を切り出し生成AIで処理）
4\.ページ情報要約（生成AIで処理）




ここまであんまり考えなく、とにかくpythonを書いて処理させる作業です。


### ナレッジ検索（Retrieveなどと言う RAGの "R" の部分ですね。）
これも躊躇することなく Azure AI Search のハイブリッドセマンティック検索を使います。
検索エンジンは色々ありますが、
・ベクター検索と従来のキーワード検索(BM25)のハイブリッド
・リランキング
・クエリリライト
・類義語、重み付けなどのチューニング機能がある
この辺を機能として持っているサービスが楽なのでといった発想です。

### ベクトル化
マークダウンにした PDF を Azure OpenAI の text-embedding-3-large でベクトル化します。
ベクトル化の対象は生成AIで生成したページの要約部分です。

text-embedding-3-large の入力テキストは最大 8,192トークンなので、要約ではなくページ情報全てでも良いのかもしれませんが、ナレッジ検索では質問に対して回答が含まれる情報がとにかく検索できればよいので要約部分でもベクトル的には近くなると考えました。
検索精度のチューニングはベクトル以外にもありますので、いったん**要約部分をベクトル化** しています。
ページによって含まれる情報が極端に多かったり、少なかったりすることもある為、要約によりベクトル化対象のトークン数をある程度一定にしたいと意図もあります。

### 全文検索
また、ハイブリッドで全文検索（従来型の検索）も同時に行いますので、こちらはページ情報全体に対して索引を作成しています。日本語解析のアナライザーは Apache Lucene です。

### 検索文と検索数
**検索文は課題の質問をそのまま**です。検索文の最適化（例えば単語単位に分解）などもテクニックとしてはありますが、あまり効果的ではなかったのでそのまま使います。

**検索数は 5（PDF 5ページ分）** としています。生成AIが処理できる入力文字数がかなり大きくなってはいますが、処理が遅くなるし、ノイズが入ることもありますので 5 としました。
5ページ分の中に必要な情報が入らないのであれば、それはデータストアの見直しか、検索エンジンのチューニングで頑張る方針です。



 　
### [<font color="Blue">さて、ここまでで準備はできたので、次回はいよいよ回答生成</font>](https://qiita.com/ooo0224jp/items/b1c7f55fd212cf541764)