ASCII × Microsoft「 第2回AI Challenge Day」に参加して

## 初めに

　2024年6月11日から翌12日の2日間にわたる、ASCII社主催・日本マイクロソフト株式会社（以下、マイクロソフト社と記す）協賛の「第2回 AI Challenge Day」にTISインテックグループとして参加してきましたので、記憶がホットなうちに、その報告をまとめます。お気持ちが多めなので、技術的な振り返りは時間を取って、また別の機会にまとめられたらと思います。

　初めに、このような貴重な機会をいただき、ASCII、マイクロソフトでこの企画をしていただいた方々に感謝いたします。また、快くグループの看板を背負ってチャレンジに参加させていただいた上長にも感謝を述べたいと思います。2日間のタイトなスケジュールで夏休み最終日に宿題を追い込んでいたころを思い出しました。笑

### チャレンジの紹介

　まずは、このチャレンジのテーマから紹介します。詳細な内容は非公開なので、公開用の資料を貼り付けます。（本資料、いずれの画像も公開用資料を貼り付けています。）

**テーマ**
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213370/0238ebd0-6eca-ab4b-a19a-3b252f2c8cf2.png)

**課題**
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213370/bd210798-5c2e-b2ae-348f-69386a785920.png)

　今回は全国から10社がマイクロソフト社の品川オフィスに集まり、2日間で日本にある世界遺産についてAI、特にRAGと呼ばれる仕組みを使ったFAQのシステムを構築しました。文字を使ったFAQだけでなく、写真データから問題に答えるマルチモーダルな質問にも対応できる環境も構築が必要でした。
 
　デフォルメされていますが、古都のようなの街並みや帯留めのようなアイコンがあったり、日本語の文章のように見えるけど、和風ゲームの世界に入ったかのような気分にさせてくれますね。そう、チャレンジの世界に迷い込んでしまいました。

## チャレンジの詳細

　チャレンジとしては、当日にデータセットが与えられるので、その場でAzureサービスやプログラムを実装して、RAG（Retrieval Augmented Generation：検索拡張生成）のアプリケーションを構成する必要があります。（参加概要には「RAG アーキテクチャにおける実装経験があり独力でアプリケーションを開発できること」とありましたが、RAGについての説明はマイクロソフト社から説明がありました。）

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213370/cbdf6e67-5609-d5af-cfff-d352bb717f37.png)

　RAGを簡単に説明すると、右下に記載のある事前に構築された（構築時点のデータまでしか理解していない）LLMに対して、右上にある自分たちで用意したナレッジベースから取り出した検索結果を追加して、最終的な回答を生成してもらう仕組みのことです。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213370/3bfc8872-1027-1e1d-8ccc-1d686dde9117.png)

　生成AIに指示を出すテキストをプロンプトと呼びます。生成AIにプロンプトで質問すると回答が返ってくるわけですが、「ハルシネーション」と呼ばれる回答の誤りが起こり得るため、その精度を高めることが生成AIを利活用していく上では欠かせません。
 
　「精度」と言うからには「何をもって正しいか」についてを定めて評価する必要があります。今回のチャレンジではマイクロソフト社が評価方法を定義しているので、参加者はその評価が高くなるようにアプリケーションを構築していきます。ほかにもコンセプトなどについて審査員の評価が加わり、最終的な評価で順位を競います。

:::note info
**ゴール設定**
　実際のプロジェクトであれば「何が正解かを考えて、お客様と合意をとる必要がある」のだよなと漠然と考えていました。性質上ハルシネーションが起こりえるシステムをどのように評価するか、また、実際に利活用していく上で何をゴールと設定するかはベンダーの腕の見せ所ですね。
:::

### 我々の改善点

　次の資料にある通り、RAGの精度を高めるための手順はいくつかのポイントがありますが、我々は次のポイントのうち、1・2・4にそれぞれ取り組みました。構築の仕方が悪かったのか、インデックスの調整ができなかったのはさらに痛かったですね。ほかのチームでは出力の内容にもこだわっているところがあり、技術力の高さに驚きました！
 
 1. Data indestion ※
 2. Chunking ※
 3. Indexing 
 4. Prompting ※
 5. User Interface

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213370/a008e66b-dd4f-8406-9601-9999082f4e38.png)
 
### データの分析と対処

　まずは、どのようなデータがあるかを確認しました。テキストファイルだけでなく、Officeファイルや画像ファイルもたくさん含まれていました。ファイルの傾向がわかったので、一旦は何も対処することなくデータをインデックスに登録しました。

- テキストファイル
    - そのまま読み込み
- Officeファイル(Word、Power Point)
    - そのまま読み込み
    - unzipして読み込み
- PDF
    - Document Inteligenceで読み込み
- csv
    - そのまま読み込み
    - ファイルを分割して読み込み
- 画像
    - GPT-4oを利用して読み込み

　その後、csvファイルはほかの行の情報に引っ張られないように、一行ずつファイルを分けるように処理しました。そしてPDFファイルはDocument Inteligenceを利用して、文字に落とし込みました。各種の画像ファイルについては、GPT-4oの機能をそのまま使って、回答をしてもらえたので特段の工夫ではなかったです。メンバーとも「もうGPT-4oでいいじゃん！」と会話した記憶があります(笑)。

　一番の工夫としては、[分割スキル](https://learn.microsoft.com/ja-jp/azure/search/cognitive-search-skill-textsplit)と呼ばれる機能を利用して、チャンキングについて改善を試みたところです。あとは、生成AIの宿命ともいえるかいとうが揺れてしまうので、みんなでお祈りしながら都合の良いデータを取ってちょっとだけスコアを改善しました(笑)。

　また、当日は全然時間が取れませんでしたが、、プロンプトで質問するところやスコアを得るところなど、自動化できそうなところがたくさんありました。ほかのチームが利用していた[プロンプトフロー](https://learn.microsoft.com/ja-jp/azure/machine-learning/prompt-flow/overview-what-is-prompt-flow?view=azureml-api-2)では、そのあたりも自動化できたりするのでしょうか？AIを使いこなしていくためにもまだまだべ供することがたくさんあって、楽しみですね！

:::note 
**エンタープライズレベルについて**
　私自身SIerに努めてきた経験から、第一感ではMicrosoft社の製品・サービスの中で閉じた環境に新しいサービスを接続できれば、エンタープライズレベルのセキュリティが確保できますし、コンプライアンス対応や実際のサービス運用にも対応できるのではと考えていました。

　今回のRAG構成は、自分たちでサービスを立ち上げるイメージだったかと思うので、そのあたりは説明の中でギャップを感じ新鮮な気持ちになりました。もし文化遺産の代わりに「社内の情報をRAGで」という要望があったとき、ほかの発表者の内容でコンペをしたら、正直なところ失注するだろうなと思うので、我々の既存のお客様への提案ができるうちにしっかりと技術力をつけて提案していきたいですね。
:::

### 実際の得点

　大きなトラブルに終始した1日目でしたが、2日目からは方針を立て直し、できるところから着実に実装して、なんとかスコアを伸ばしていくことができました。最終的に25点満点中17.625点でフィニッシュとなりました！トラブルについてはRAGを高精度で組む今回のチャレンジの本質ではないので、この記事の最後の回想に概要だけまとめています。

- 素朴な実装
  - 6/12 深夜 15.599(質問①の30個のみ)
  - 6/12 12時 16.825(質問①の30個と質問②の10個はGPT-4oに画像とテキストの問題を与え、その出力を追加）
- RAGの改良
  - 6/12 14時  17.550(AI チャンキングを良しなにする。温度を0にする。)
  - 6/12 14:48 17.625(黒魔術的追い込み＝黒魔術的≒AIのガチャを回す＝RAGの宿命ですね）

　初めは何とか得点を得られる環境を構築して、課題の①だけを提出しました。その後、画像を含むマルチモーダルな課題②を含めて提出しました。それからRAGの改善ということを試みたのが14時ごろの提出です。

　また、本来は改善策を一つずつ実装して、どのように改善したか確認する必要があります。先のとおりトラブル続きで時間がなかったこともあり、複数の改善を一緒に取り込んでしまったので、どの取り組みがどれだけスコアに寄与したかが調べられなかったは残念でした。さらにお客様向けのサービスであれば、プロンプトを何回か実行して平均値（チャレンジでは最大値）をとったり、外れ値（回答してはいけないないようである場合には再実施するか、ユーザーに警告するような実装を想定）の処理も必要なのだと思いますが、無情にも時間はそんな我々チームを待ってくれず、時間切れでした。
 
## まとめ

　今回のチャレンジを通じて、企業内システムをよりサービスに近い形で提供することができるビジネスチャンスがあると感じました。それと同時に、B2Cのサービスを提供している企業が、企業内システムに近づいてくるということで、その構築の速さに正直なところ少々不安を抱いておりますが、これまでの企業向けのシステムを扱っているSIerならではの実績が問われるのではないかと考えています。

　そして、お客様の社内システムにRAGを構築していくためには、システムの評価の際にお客様の生データを利用する必要があるので、これまで以上に密な関係を築く必要があると思いました。SIerとして、これまでお客様と築いてきた信頼をもとに、さらに踏み込んだ提案をしていかなければならないと思っております。
 
---

## 回想

### 筆者感想

　TISインテックグループからは、インテックから4名とAGREXから1名の計5名で参加してきました。関東関西はもちろん、インテック創業の地である富山からも2名参加しました。メンバーも各地域から意欲的に参加を希望してきており、インテックの先端技術研究所に所属でいろいろな生成AIを取り扱っている方や、セキュリティなど厳しい条件のある金融業のお客様を相手にしている方もいました。

　私の所属するインテックにおける生成AIの話題をご紹介すると、提案活動も実を結び始め、「[DigiPoC TOYAMA](https://www.intec.co.jp/news/2024/0307_1.html)」という富山県の実証実験のコンペに参加し、採択もされております。また、[トランポリン日本代表選手らに姿勢推定技術でサポートする](https://www.intec.co.jp/news/2023/0216_1.html)など、独自のAI技術を持った会社です。

　発表の後は表彰があり、5社まで賞がありましたが、惜しくも獲得には至りませんでした。参加されていたほかの企業も一日二日で各社コンセプトを作って、実際に動くものを仕上げてくる実力がある企業で、今後、その方たちの参加報告もしっかりと呼んでみたいと思います。そして、参加企業のレベルが高いのであって落ち込む必要はない（と自分に言い聞かせ）、即席チームではありましたが、ゲームのレギュレーションに従って、自分たちにできるものを作り上げられたこと、そして最後まで走りきれたことを今回の収穫としたいと思います。

　発表技術は採点項目になかったですが、2日間の苦労を笑い飛ばす発表スタイルで会場を最も沸かせたと自負しておりますw。何とかTISインテックグループも生成AIに取り組んでいると爪痕が残せたのではないかと思います。

### 想定していたスケジュールと現実

　事前にメンバーで顔合わせをして想定していたスケジュールは、1日目午前にルール理解、RAG環境で1つの回答を作成してゼロでない得点を得る。1日目午後から改善を行い得点を改善していくことを考えていました。また、Power Appsを利用して社内からアクセスすることのできるシステムを構築する予定でしたが、門外不出の手順だったのか（？）チャレンジの会場から構築のための情報に何故かアクセスできなかったため、Azure AI Studioから直接Webアプリケーションを構築することにしました。
 
 　方針変更後も、いろいろとトラブルを引き当てました！RAG環境を構築する段階で想定しない動作となり、デバッグに1日目の時間の大半を消費しました…。Previewの機能で想定していない動作となったため、何が悪いのかが特定できず、マイクロソフトの方に我々の想定で合っているか確認してもらいました。こちらの対処に時間をとってしまいました。最新の技術に触れているなと改めて実感しました。若手のチームメンバーが、同じことを行うことができる別のページでは、想定の動作になることを発見してくれて、一筋の光明が差しました。想定としている動作と違うということが確信に変わったので、日ごろからマイクロソフトのサポートへ問い合わせをしていることですね。「自分たちが何を実現したいのか」「そのために何を実装する（した）のか」「実際にはどのような状態で」といったところをマイクロソフトの方※に動作を確認していただきました。

:::note warn
**※Azure AI Studioでの動作について**
　先のとおり方針としてAI StudioのWeb画面で環境構築をしようという話になりました。Indexを作成するタイミング、UI的にこんな感じだろ！と思っていた手順が実は、親切にも新しいリソースを作成する動作になっており、別途記事にまとめようと思います。それにしても、「Azure OpenAI ServiceではじめるChatGPT/LLMシステム構築入門」の著者の一人である花ケ﨑さんに話しかけることができるなんて！ちょっと興奮しました笑
:::

### 今後コンテストに参加をご検討の方へ

　当然かもしれませんが、一度はAzure OpenAIのリソースを作成してみることをお勧めします。チャレンジの参加者はAOAIについての知識は前提としていたように思います。また以下の点は、RAGの本質に入る前の障壁なので、ちゃんと整えておきましょう。各社で評価環境は用意する必要があるので、事前に確認しておきましょう。

- **社内環境は注意しよう**：会社から持ち出した端末の場合、Proxyなどがかかっている可能性があります。「いつもは動くのに、、、」ということがないように調整しておきましょう。
- **提出用スクリプトとReadmeはちゃんと読もう**：どうやって使うか、何を期待しているかなど、評価基準は開始後すぐに確認しましょう。
- **Pythonは読めるようにしておこう**：評価スクリプトはコマンドラインからキックするので、うまく動かない場合、自分たちでデバッグが必要です。今回のチャレンジではPythonコードで実行していたので、読めたほうが無難だと思います。

---

※本記事は投稿者の見解であり、現在所属する会社の公式見解ではありません。