お仕事の話です。
先日、ASCIIならびにMicrosoft主催の「AI Challnge Day」に会社のメンバーと参加してきました。会場は神戸のMicrosoft AI Co-Innovation Labsでした。
イベントはコンペ形式で最後のプレゼンはYouTubeで配信されています。
結果としてはスコアは伸ばせず下位で終了してきました。
一応、自分が担当した部分の解説と振り返りを残そうと思います。
担当箇所とその振り返り
自分は今回の実装において、主に以下の2点を担当しました。
アプリケーション
ルール説明時にAzure上でホストしたアプリケーションという規約があったので、最低限のデモをできる状態を最初に作りました。
データ前処理パイプライン
メンバーから読めないPDFがあるという話を受けて、Azure Functionsで前処理パイプラインを作りました。
どちらの実装においても、これまでの業務ではあまり使っていないAzureサービスや機能を使おうという気持ちで開始しました。
アプリケーションについては初手にAzure Static Web Appsを使ってみました。ここで結構ハマり、最終的には使い慣れたApp Serviceに戻るという回り道をしました。
アプリケーション開発にはNuxtを利用していたのですが、Azure Static Web Appsにデプロイしたユニバーサルレンダリングのアプリケーションが全く動かず諦めました(すべてのルートが404になる)。
Azure Static Web Apps CLIのローカルエミュレータでは動作していたので、もう少し粘ればStatic Web Appsでもホストできた気はしますが、このあたりは検証ができたら別記事で紹介しようと思います。
データ前処理の部分についてはメンバーからスキャンされて文字情報がないPDFを読みたいとのことだったので、初手はAzure AI SearchのインデクサーのOCRスキルを使うアプローチから模索しました。
OCRスキルはPDFファイルには対応していなかったので、まずはPDFを画像に変換する処理から着手しました。この部分はBlobトリガーのAzure Functionsでさっと書けましたが、肝心のOCRスキルをAzure OpenAI Embeddingスキルなど他のスキルと併用する形でのスキルセットを利用したインデクサーを組むところでハマり、前処理はすべてAzure Funcitonsに寄せて実装しようとなりました。
結局、PDFファイル以外にWordファイルなども前処理が必要でAzure AI Document Intelligenceを追加したりとパイプラインの処理が増えたので、前処理ロジックをAzure Functions側に寄せたのは正解でした。
前処理パイプラインで全データをAzure AI Searchのインデックスに登録できるテキスト形式に変換できるところまで作って初日は終えました。
迎えた2日目、朝7時半に「継続していただけず残念です」というメールを見て、サブスクリプションが死んだことを察知し、少し早く会場に行きました。案の定サブスクリプションの予算オーバーですべてのリソースへのアクセスができない状態でした。
ここからはMicrosoftの担当者の方々に助けていただきたながら、代替のサブスクリプションで復旧作業を実施しました。
データはすべて吹き飛んだので、Azure AI Searchのインデックス作成からアプリケーションのデプロイなどの復旧作業が必要でしたが、自分が実装したアプリケーションと前処理パイプラインはどちらもDockerイメージがあったので、必要リソースをプロビジョニングができたら割とスムーズに復旧できました。
とは言え前処理後のデータやAzue AI Searchのインデックスなどは残っておらず、作り直しが必要だったので時間は溶かしました。
時間があればやりたかったこと
以下はコンペ中に時間があればやりたいと思ってたことです。この部分も検証ができたら別で記事を書こうと思います。
前処理パイプラインの完成度を上げること。
Azure AI Document Intelligenceでテキストの構造抽出をする。
前処理結果をAzure OpenAI Serviceで整形する。
Azure AI Searchへのクエリ部分の改善をすること。
シノニムの活用
Azure OpenAI Servcieでのリフレーミング処理
感想と反省
自分は普段のお仕事ではシステムアーキテクチャの設計、アプリケーション開発などがメインで、個別のデータに対してRAGの精度改善をするという業務をしている訳ではないので、今回のイベントはかなり新鮮でした。逆に案件で精度改善に携わっている同僚はこういうプレッシャーを感じながら実施しているのかという部分が知れる良い機会でした。
また他社のアプローチを聞けたのはとても勉強になりましたし、刺激にもなりました。個人的にはワークスアプリケーションズさんがSudachiを使って、きっちりと精度を上げていてカッコいいなと思いました。
反省としては色々浮かびますが、大きく2つかなと思っています。
評価を繰り返し回せなかったこと
ぶっちゃけこれに尽きると思います。個人的には良いスコアが得られなかったことよりも、各アプローチに対し、どの程度の効果があったかを評価するサイクルが回せなかった点が悔しいですね。
新しいものに挑戦しすぎたこと
せっかくの機会なのでということで色々と手を広げ過ぎて痛い目をみました。自分の場合、Static Web Apps、Azure AI Searchのインデクサーどちらもうまく活用できず普段の使い慣れたアプローチに戻るという結果になりただ時間を溶かしました。
さいごに
本イベントを主催してくださったASCIIならびにMictosoftの関係者の皆さま、本当にありがとうございました。自分たちのチームは事前準備、サブスクリプションの枯渇などで、ご迷惑をおかけしましたが懸命にサポートいただき感謝しています。
また本イベント参加中、自分たちの通常業務を回していただいたチームメンバーの同僚にも感謝でいっぱいです。結果は振るわなかったが、ここで得た知見などを業務で還元していきたいと思っています。Document Intelligenceでの前処理はプロダクトでもすぐに活かせそうです。
イベント終了後は会社の先輩にお肉を食べに連れていっていただきました。神戸牛めちゃくちゃ美味しかったです。
おわり。