signate ragコンペに参加してみた

## 1. 初めに

### 1.1 この記事の目的

signate開催のRAGコンペである「第3回金融データ活用チャレンジ( https://signate.jp/competitions/1515 )」に参加したので試したことなどを記載するために作成しました。

### 1.2 何故コンペに参加したのか

以下の理由で参加しました。

- RAGを実際に実装してみることで知見を深めるため
- コンペではGPT-4o mini, datarobot, dataikuなどのツールが無料で使えるので

### 1.3 RAGとは

RAGとは、Retrieval-Augumented Generationの略で、LLMが学習していない外部情報のドキュメントを検索し、LLMに入力することで回答品質を向上させる技術です。

下図は、RAGの概念図となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319102/e295a969-6eb4-4acf-8c14-5f8668387274.png)

## 2. コンペの概要

### 2.1 コンペ概要と評価方法

今回のコンペは、企業に関する情報が記載されたPDF情報に関する100問の質問に回答するRAGシステムを構築するコンペでした。

評価方法は、下記の通りです。

- 各回答をgpt-4oが以下のような評価基準で評価する

| 分類       | 得点  | 評価基準  |
|------------|------|----------------------------------------------------------------|
| Perfect    | 1    | 質問に対して正確に答え、虚偽の内容が含まれていない回答。 |
| Acceptable | 0.5  | 質問に対して有用な答えを提供しているが、答えの有用性を損なわない程度の軽微な誤りが含まれている回答。 |
| Missing    | 0    | 質問に対して「わかりません」「見つけられませんでした」などの具体的な答えがない回答。 |
| Incorrect  | -1   | 質問に対して間違った、または関連性のない回答。 |

- 全ての回答に対する得点の和を問題数(100)で割った平均値を評価指標とする

### 2.2 使用可能なデータ・リソース

使用可能なデータおよびリソースは下記となります。

- 企業情報が記載されたPDFデータ
- gpt-4o mini
- 有料API(gemini, claudeなど)
- ローカルLLM

## 3. アプローチ

### 3.1 大まかなアプローチ

RAGについて理解を深めることが目的でしたので、以下のような方針をとりました。

- なるべくスクラッチで実装する
- ベクトルデータベースは本質ではないので使用しない(ローカルにベクトル化した文書とそのペアを保存しておくことで対応)

### 3.2 基本的な構成

基本的な構成は、下記の通りです。

- 文書のベクトル化: azure text-embedding-3-large
- ベクトルDB: 未使用(ローカルにベクトルとチャンクのペアを保存しておき、ロードするようにした。)
- 回答生成: gpt-4o mini, gemini-2.0-flash

### 3.3 PDFの文書化

おそらく、今回最も難しい部分だと思われるのでPDFの特徴とその文書化方法について述べます。

#### PDFの文書化における課題

PDFの文書化には主に下記のような課題がありました。

- PDFの構成が通常の文書とは異なる

下図( https://cdn.clipkit.co/tenants/2641/item_files/assets/000/001/326/original/IR-Report2024.pdf より抜粋 )のようなページは、「表のようになっている」, 「文章の領域の特定が難しい」などの理由から文書化が難しいです。下図の例では、従業員数を文書化する必要がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319102/430c7137-ceba-4857-bb13-054db53fcefa.png)

- PDF中の図を読み取る必要がある

下図( https://www.suntory.co.jp/company/csr/data/report/2024/pdf/suntory_csr_2024.pdf より抜粋 )のようなページは、「画像の中に回答が存在する」, 「画像内のレイアウトが比較的複雑」などの理由から文書化が難しいです。下図の例では、天然水の森の面積を文書化する必要がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319102/e4f1eddc-cd12-4200-b480-351c74e7606d.png)

- 文中に少ししか記載されていない部分もある

下図( https://www.nissan-global.com/JP/SUSTAINABILITY/LIBRARY/SR/2024/ASSETS/PDF/DB24_J_All.pdf より抜粋 )のようなページでは、文書化は容易だが、文書の中に少ししか記載されていない部分をが必要になる場合もあります。このようなページは後述のマルチモーダルを使用したLLMでは見逃してしまう可能性が高いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319102/3600a8f0-0892-45f2-9857-24c6ebd8fee6.png)

#### PDFの文書化の戦略

PDFを文書化する際に当初は pdfplumber というライブラリを使用してPDFを直接文書化していました。

しかし、先ほどのサントリーの天然水の森のページを文書化した例を下記に示します。画像部分が全く抽出できていないことが分かります。

<details><summary>単純に文書化した例</summary>

```text
※1京都府⻑岡京市では、「⻄⼭森林整備推進協議会」のメンバーとして､地域の⽅々と協働して森林保全活動にあたっています。この活動の⾯積は「天然⽔の森」の総⾯積に算⼊して
いません
詳細は「サントリー天然⽔の森」をご覧ください
世界各地の「⽔」の取り組み
サントリーグループでは、事業を展開する世界各地で⾃然との共⽣を実践しています。私たちは、⽔のサステナビリティのグローバルトップランナーを⽬指し
て、これからもさまざまな取り組みを継続していきます。
アメリカ合衆国
貴重な天然資源である「⽔」を守るため、バーボン蒸溜所周辺の⽔源保全活動や森の⽣物多様性の向上をはじめとする⾃然環境の保全に⼒を⼊れてきました。
2016年に始まったメーカーズマーク「ナチュラル・ウォーターサンクチュアリ」プロジェクトでは、メーカーズマーク蒸溜所の33エーカー（約13ha）の⼟地で
アメリカホワイトオークの植樹を実施し、⽔源涵養の活動に取り組んできました。また、2018年にはジムビーム蒸溜所の⽔源である「バーンハイム・アーボリー
タム & リサーチ フォレスト（Bernheim Arboretum and Research Forest）」の15,625エーカー（約6,300ha）の⼟地の中に「ナチュラル・ウォーターサン
クチュアリ」を設定し、新たな環境保全活動を開始しました。
メキシコ
テキーラの主要ブランドのメーカーと連携し、流域管理のプロジェクトを⽴ち上げ、⽔源環境を保護するための整備活動を2020年から推進しています。セロ・ビ
エホ保護区にあるサンティアゴ川流域で、周辺に建設された⾼速道路で分断された⼲潟と森林の⽣態系のつながりを回復するための取り組みです。
36
```
</details>

この問題を解決するために**マルチモーダル入力のLLMに画像化したPDFの要約を生成させる**という戦略をとりました。

試したLLMのモデルは、以下の2つです。

- Qwen2.5-VL-7B-Instruct
- gemini-2.0-flash

それぞれのモデルにおけるサントリーの天然水の森のページをLLMに説明させた結果を下記に示します。

<details><summary>Qwen2.5-VL-7B-Instructの出力</summary>

```text

この画像は、サントリー天然水の森プロジェクトに関する情報です。以下に詳細な説明と内容の要約を行います。

---

### サントリー天然水の森プロジェクト

#### 背景と概要
- **対象地域**: 全国16都府県26カ所
- **対象面積**: 約12,000ha（2024年8月時点）

#### 主な活動内容
- **森林保全活動**: 地域の方々と協働して森林保全活動に取り組んでいます。
- **地域との連携**: 京都府長岡京市では、「西山森林整備推進協議会」のメンバーとして、地域の方々と協働しています。

#### 活動の詳細
- **東京大学大山研究林プロジェクト**
- **あいち犬山**
- **近江**
- **きょうと西山**
- **西山森林整備推進協議会**
- **おおさか島本**
- **天王山**
- **ひょうご西脇門柳山**
- **奥大山**
- **阿蘇**
- **きょうと南山城**
- **南アルプス**
- **しずおか小山**
- **多摩源流小管**

- **ぎふ東白川**
- **北アルプス**
- **子持山**
- **赤城**
- **日光霧降**
- **勢多農林高校の森プロジェクト**
- **栃木**
- **東京大学秩父演習林プロジェクト**
- **東京農業大学奥多摩演習林プロジェクト**
- **とうきょう秋川**
- **奥多摩**
- **とうきょう檜原**
- **丹沢**

#### アメリカ合衆国の取り組み
- **ナチュラル・ウォーターサンクチュアリプロジェクト**
  - 2016年に始まったプロジェクトで、メーカーズマーク蒸溜所周辺の水源保全活動や森の生物多様性向上に取り組んでいます。
  - アメリカホワイトオークの植樹を実施し、水源涵養の活動に取り組んでいます。
  - 2018年にはジェームビーム蒸溜所の水源である「バーンハイム・アーバリータム & リサーチフォレスト (Bernheim Arboretum and Research Forest)」の土地の中に「ナチュラル・ウォーターサンクチュアリ」を設定し、新たな環境保全活動を開始しました。

#### メキシコの取り組み
- **セロ・ピエロ保護区**
  - テキーラの主要ブランドのメーカーと連携し、流域管理のプロジェクトを立ち上げ、水源環境を保護するための整備活動を2020年から推進しています。
  - セロ・ピエロ保護区内にあるサンティアゴ川流域で、周辺に建設された高速道路で分断された干潟と森林の生態系のつながりを回復するための取り組みです。

---

このプロジェクトは、サントリーグループが事業展開する世界各地での自然との共生を実践する一環として行われています。特にアメリカ合衆国とメキシコにおける具体的な取り組みが紹介されており、それぞれの地域特性に応じた環境保全活動が行われています。
```

</details>

<details><summary>gemini-2.0-flashの出力</summary>

```text

はい、承知いたしました。以下に画像の詳細な説明を示します。

**全体概要:**
画像は、サントリー天然水の森に関する情報を提供しています。日本全国のプロジェクトの位置と面積を示した地図、および世界各地での水の取り組みに関する説明が含まれています。

**地図とプロジェクト:**
日本地図が中央に配置され、各プロジェクトの位置が点で示されています。各プロジェクト名と面積がリスト形式で地図の左右に記載されています。

*   **左側のプロジェクトリスト:**
    *   東京大学 犬山研究林プロジェクト: 約275ha
    *   あいち犬山: 約7ha
    *   近江: 約191ha
    *   きょうと西山: 約193ha
    *   西山森林整備推進協議会※1: 約353ha
    *   おおさか島本: 約21ha
    *   天王山: 約1,056ha
    *   ひょうご西脇門柳山: 約495ha
    *   奥大山: 約420ha
    *   阿蘇: 約870ha
    *   きょうと南山城: 約2,027ha
    *   南アルプス: 約162ha
    *   しずおか小山: 約102ha
    *   多摩源流小菅: 約631ha
*   **右側のプロジェクトリスト:**
    *   ぎふ東白川: 約441ha
    *   北アルプス: 約5ha
    *   子持山: 約1,310ha
    *   赤城: 約154ha
    *   日光霧降: 約79ha
    *   勢多農林高校の森プロジェクト: 約72ha
    *   栃木: 約2,502ha
    *   東京大学 秩父演習林プロジェクト: 約116ha
    *   東京農業大学 奥多摩演習林プロジェクト: 約81ha
    *   とうきょう秋川: 約67ha
    *   奥多摩: 約96ha
    *   とうきょう檜原: 約577ha
    *   丹沢:

**テキスト情報:**

*   **タイトル:** サントリー 天然水の森 全国 16都府県 26ヵ所 対象面積 約12,000ha (2024年8月時点)
*   **注釈:** ※1 京都府長岡京市では、「西山森林整備推進協議会」のメンバーとして、地域の方々と協働して森林保全活動にあたっています。この活動の面積は「天然水の森」の総面積に算入していません。
*   **詳細情報へのリンク:** 詳細は「サントリー天然水の森」をご覧ください
*   **世界各地の「水」の取り組み:**
    *   サントリーグループでは、事業を展開する世界各地で自然との共生を実践しています。私たちは、水のサステナビリティのグローバルトップランナーを目指して、これからもさまざまな取り組みを継続していきます。
    *   アメリカ合衆国: 貴重な天然資源である「水」を守るため、バーボン蒸溜所周辺の水源保全活動や森の生物多様性の向上をはじめとする自然環境の保全に力を入れてきました。2016年に始まったメーカーズマーク 「ナチュラル・ウォーターサンクチュアリ」 プロジェクトでは、メーカーズマーク蒸溜所の33エーカー (約13ha)の土地でアメリカホワイトオークの植樹を実施し、水源涵養の活動に取り組んできました。また、2018年にはジムビーム蒸溜所の水源である「バーンハイム・アーボリータム&リサーチ フォレスト (Bernheim Arboretum and Research Forest)」の15,625エーカー (約6,300ha) の土地の中に「ナチュラル・ウォーターサンクチュアリ」を設定し、新たな環境保全活動を開始しました。
    *   メキシコ: テキーラの主要ブランドのメーカーと連携し、流域管理のプロジェクトを立ち上げ、水源環境を保護するための整備活動を2020年から推進しています。セロ・ビエホ保護区にあるサンティアゴ川流域で、周辺に建設された高速道路で分断された干潟と森林の生態系のつながりを回復するための取り組みです。

**ページ番号:**
*   36

**フローチャート（概念）:**

```
[サントリー天然水の森]
  |
  +-- [日本地図]
  |    |
  |    +-- [各プロジェクトの位置 (点)]
  |
  +-- [プロジェクトリスト (左)]
  |    |
  |    +-- [プロジェクト名と面積]
  |
  +-- [プロジェクトリスト (右)]
  |    |
  |    +-- [プロジェクト名と面積]
  |
  +-- [世界各地の「水」の取り組み]
  |    |
  |    +-- [アメリカ合衆国]
  |    |    |
  |    |    +-- [プロジェクトの説明]
  |    |
  |    +-- [メキシコ]
  |         |
  |         +-- [プロジェクトの説明]
```

このフローチャートは、情報の構造を視覚的に表現したものです。サントリー天然水の森の全体像から、地図、プロジェクトリスト、そして世界各地の取り組みへと情報がどのように展開されているかを示しています。

```

</details>

両モデルを比較するとgemini-2.0-flashは一部抜け漏れがあるものの回答に必要な部分の文字列化には成功していることが分かります。

gemini系のモデルは無料利用枠があるのでPDFの文字列化はこちらを使用することにしました。

geminiには下記のようなシステムプロンプトを与えました。

```text
- この画像についてできるだけ詳細に説明してください。
- フローチャートやポンチ絵などがあれば流れがつかめるように詳細に説明してください。
- 含まれている文字もできるだけ書き起こすようにしてください。
- 背景に関する説明は不要です。
- 「～ようです。」などの推測は避けてください。
```

### 3.4 文書のチャンク化

geminiで文書化したPDFをチャンク化する必要があります。チャンク化とは、LLMが適切に文章を処理できるようにテキストを意味のある単位に分割することです。今回はgeminiの出力を以下の2通りでチャンクとして扱いました。

- ページ単位でチャンクする
- langchainのRecursiveCharacterTextSplitterなどを用いてさらに細かくチャンクする

リーダーボード上ではページ単位でチャンクするほうが性能が高かったのでページ単位のチャンクを採用しました。

## 4. その他の工夫

### 4.1 RAGフュージョン

入力クエリをLLMにより複数の別視点の質問に変換して、それらをリランクするような手法です。下図はそのイメージ図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319102/9923e289-0fe8-4590-b607-4a1ffc1fc7d1.png)

例えば、オリジナルの質問

IHIが燃料アンモニアバリューチェーン構築を支える強みとして挙げていることは何ですか。

に対して、下記のような出力を得ます。

```text
- IHIの燃料アンモニアバリューチェーンにおける技術的強みは何か？
- IHIが燃料アンモニアバリューチェーン構築において他社と差別化される要素は？
- IHIの燃料アンモニア関連プロジェクトにおける実績や成功事例はどのようなものか？
```

上記3つの質問それぞれに対して得られた外部情報をReciprocal Rank Fusionという手法でリランクします( 参考: https://zenn.dev/khisa/articles/ab79ad0a92a117#reciprocal-rank-fusion-(rrf)-%E3%81%AB%E3%82%88%E3%82%8B%E3%83%AA%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0 )。


### 4.2 最終的な回答を生成するLLMの変更

当初は、gpt-4o miniを使用していました。しかし、回答可能な情報を検索できているのにも関わらず、上手く回答できていない問題がありました。こちらの対処のためにgemini-2.0-flashを用いて回答を生成するようにしました。

### 4.3 PDFにメタデータ(企業名)を付与

PDFごとに企業名を付与し、検索時に不要なPDFがヒットしないようにした。企業名は、質問文からLLMを用いて抜き出すようにしていた。

## 5. 結果, 反省点, 試したかったこと

### 5.1 結果

最終的なスコアは0.3程度でした(155位)。

### 5.2 反省点

以下の点を反省点として挙げます。

- validationをしっかり実施すること

今回は時間があまりなかったということもあったので、リーダーボードを参考にコンペを進めていました。実際に最もスコアが高かった結果はリーダーボードにおいて、あまり高いスコアではないものでした。validationをしっかり実施することでこのようなことは防げたと考えています。

- 提出する結果を目視で確認を怠ったこと

実際に最も高いスコアだった結果(パブリックリーダーボード上では低いスコアの結果)はざっくりと目視で判断すると割と回答が出来ていました。こちらをもう少ししっかり実施することで、よりよい結果を選べたと考えています。

- 実験内容を確認しながら実験すること

後半は急いでいたことも手伝って、違う実験を実施しているつもりで同じ実験を実施してしまうというミスがありました。「Excelシートなどで実験を管理すること」や「変数をnotebookに記載せずに.pyにまとめておく」などの対処が有効かと考えています。

### 5.3 試したかったこと

以下を実施したかったです。

- PDFにおいて、LLMに説明させるべき場所を限定させる

PDF全体を直接画像としてLLMに説明させるのではなく、図を切り抜いたりすることでより正確な文章化を実施するとよかったのかもしれないです。

- PDFの説明にclaude 3.5 sonnetなどを試す

今回は無料にこだわりすぎたので、より品質が高いPDFの説明ができるモデルを試したかったです。

## 6. 今回のコンペで得られたこと

今回のコンペでは、

- マルチモーダルのLLMの知識
- RAGについての実践に近い知識
- RAGの発展手法

などを学ぶことができました。

とくにマルチモーダルのLLMはローカルでもかなりよい結果を生成できると感じたので勉強していきたいです。

## 7. ソースコード

ソースコードは下記にあります。

https://github.com/ryota0051/signate-rag-competiton

データ等はコンペ終了後にはダウンロードできないので再現はできないです。