FDUA 第３回金融データ活用チャレンジに参加してみた！ #3 精度向上 2/2

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

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

https://signate.jp/competitions/1515

さて、FDUA 第３回金融データ活用チャレンジに参加してみた！ #2回答生成に続いて #3精度向上です。
ここでは、精度を上げる為にいくつか実施したことについて書いてきたいと思います。

:::note alert
かなり具体的な内容を記載しています。
もし不都合がある場合はお知らせ頂けると幸いです。
:::


# プロンプトで解決
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006424/1ecee7d4-ae38-4921-8ad5-21c59ea13705.png)


## 質問分解について
プロンプトに ・ステップバイステップで考えて と指示しても若干の揺らぎが起こりましたので、自分で確実にステップ分けします。

```
質問:2024年3月期のC社のセグメント別売上高の中で、2番目に売上高が大きいセグメントの販売先を答えよ。
md:7.md
主語=2024年3月期のC社のセグメント別売上高
*3つに質問分解 内容は、{"question":"2024年3月期のC社のセグメント別売上高は？,その中で2番目に売上高が大きいセグメントは？,そのセグメントの販売先は？"}
**分解された質問=2024年3月期のC社のセグメント別売上高は？
{'7_5.md', '7_81.md', '7_80.md', '7_47.md', '7_17.md'}
====>わかりません
****************************************************
**分解された質問=その中で2番目に売上高が大きいセグメントは？
{'7_5.md', '7_81.md', '7_80.md', '7_47.md', '7_17.md'}
====>金融市場
****************************************************
**分解された質問=そのセグメントの販売先は？
{'7_26.md', '7_5.md', '7_28.md', '7_6.md', '7_11.md'}
====>国内の金融機関、OEM先等
****************************************************
```
そうそう、3つに分解してそれぞれ回答して欲しかった。
動かしたい通りに3つの質問に分解されてます。（他の質問で最大5つに分解されたのもあります）
何故か1つ目の質問に回答できていませんが（ちょっと見直しが必要かも？でも全体では意図した通りなので今回は追及してません）、2つめ、3つめは正確に回答してくれています。

質問分解のプロンプトはこのような内容です。
```
あなたは複雑な質問を単純な質問に分割するAIです。
    質問の分割はステップバイステップで考えて下さい。
    「質問」には「順番に情報収集する分割」と「複数の情報収集」及び「分割なし」があります。

    「順番に情報収集する分割」は以下の例です。
        例1:XXX社グループが2012年に立ち上げたチャネルの国内飲料事業の中での売上は何％
        分割の種類：順番に情報収集する分割
        1.XXX社グループが2012年に立ち上げたチャネルは？
        2そのチャネルの国内飲料事業の中での売上は何％

    「複数の情報収集」は以下の例です。
        例2:XXX社の製品ライフサイクル全体のCO2 排出量において2019年度と2020年度ではどちらの数値が大きいか
        分割の種類：複数の情報収集
        1.XXX社の製品ライフサイクル全体のCO2 排出量の2019年度は？
        2.XXX社の製品ライフサイクル全体のCO2 排出量の2020年度は？
        3.どちらの数値が大きいか？
        
    「分割なし」は以下の例です。
        例3:XXX社グループが掲げるVALUESはいくつありますか？
        分割の種類：分割なし

    
    「質問」に対して「補完情報」が与えられます、両方の情報を使うことができます。
    分割した質問は長くても50文字程度にして下さい。
    幾つかの質問が組み合わさっている場合は分解してより簡単な検索文を考えて下さい。
    分割するステップ複数になる場合があります。
    ひとつのステップは一つの質問にする必要があります。

    複数の年度や部門、会社、カテゴリ、セグメントがある場合はステップを分解する。
    「主語」に対して回答する内容が、1番目や2番目など順番、順位がある場合はステップを分解する。
    「主語」に対して回答する内容が、1番目や2番目など順番、順位がある場合はステップを分解する。

    質問の構造で段階や順序がある場合があり、順番や構造を変えないようにしてください。
    分割する場合、順番や順位の位置が誤っていないか注意する。
    分割する場合、全体に関わる主語は保持する。
    最終的に聞かれていることを充足しているか、最後まで考えて下さい。
    分割した質問はカンマ区切りでで出力する。

#質問 {question}
#補完情報 {分解した前の質問とその回答}
#主語 {質問の主語}
```
Few-shot（こんなふるまいをして欲しいという例）は、サンプルの質問から作成しています。

ここまででおおよそ暫定評価0.8～0.9の精度を出すことができました。





# 処理プロセスとプロンプトの再考
生成AIを自分でコントロールしたかったので、まずは「短いプロンプト」「明確なプロンプト」で意図した動きになることを目指しました。
プロンプトが長く複雑になると一つの変更による全体に与える影響が大きい、また、挙動が変わらないなんてことがある為、デバッグ・微妙な調整がしにくいためです。
細かく分けて意図した通りに動かないならその先もないなと。


とは言え、「より効率的」「より高速」「より安く」を求める必要があります。
今回テーマの質問分解も順番で実行するもの、並列で同時実行できるものがありますし、そもそも近しいこと(例えば営業利益率とROICなど）を聞いているなら同じPDFのページに両方書かれている可能性が高いので、わざわざ何度も検索して推論させなくても回答は導けます。

一定の精度がでましたので、本当は処理プロセスとプロンプトマージで60秒を30秒に、15秒にしていくのですが、これはまたの機会で実施しようと思ってます。今回のベースがあるので次は効率化から始められるかなと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006424/cecb50be-0b10-4056-b37c-916495706d88.png)


あれ、、、基本形に戻りました、応答性能10秒ぐらいを目指すと恐らくこの形にせざる負えません。通常のRAGに戻りましたが、処理を分けてプロンプトの挙動を把握しているのでマージは少しは楽になるかなと。
レビュー処理は残しておいてもいいかもしれませんが、回答レビューと言うより禁止ワードのフィルター処理としてが考えられます。

これ以上速めようとするとナレッジデータの根本的な見直しと、ファインチューニングにより特定のふるまいをさせるモデルを開発することになりそうです。



今回は以上、次回最後です。
[FDUA 第３回金融データ活用チャレンジに参加してみた！#4 OCR](https://qiita.com/ooo0224jp/items/215a861cd4c317281977) に続きます。