はじめに
角川アスキー総合研究所と日本マイクロソフトが共催した「第2回 AI Challenge Day」というイベントに参加しました。
日時:2024年6月11日〜12日
場所:日本マイクロソフト 品川本社
このイベントは、生成AIを使った開発でよく使われる「RAGアーキテクチャ」を題材としたハッカソンで、パソナを含め10社が参加しました。
普段から生成AI案件に携わっているパソナのエンジニア5名で、2日間を戦い抜き、良い成績を収めたので、エンジニアたちの学びや工夫について紹介したいと思います。
お題について
今回のテーマは「世界遺産トラベルアシスタント」の開発でした。
このお題自体は、前回第1回と全く同じものでした。
お題についての詳細な説明はイベントの場で行われ、評価に使う画像データの量が前回と比較して増えた点が大きな変更点でした。
2日間の戦略
事前に以下のツールやサービスを使うことを決めていました。
- AI Search
- Prompt Flow
- Blob Storage
- Azure OpenAI (AOAI)
また、後に大きな働きをすることになりましたが、すでに業務で経験のあったContainer Appsでの構築も並行して進めることにしました。
具体的な開発ステップは以下の通りです。
- テキストのみの質問に応答し、評価スクリプトでスコアを取得(Prompt Flow上で実施)
- 画像とテキストの質問に基づき応答し、再度評価スクリプトでスコアを取得(Prompt Flow上で実施)
- 前処理やプロンプトを工夫してスコアを改善(Prompt Flow上で実施)
- 動くものをデプロイする(WebアプリケーションをPrompt FlowからWebアプリとして公開)
promptflowを活用してとにかく動くものを作り、徐々に精度を上げていく方針です。
実際に使用したpromptflowの画面はこのような感じでした。
構築したもの
最終的に以下の構成ができあがりました。
App Serviceの部分に×がついてしまいました。
こちらは、残念ながら、時間内にPromptFlowからWebアプリをデプロイすることが叶わず、UIを用意することができなかったからです。
しかし、ここで救世主が登場します。
それは並行開発していたContainer Appsでの構築です。
マルチモーダルや凝ったUI/UXに対応することはできませんでしたが、なんとか画面から回答が返ってくるところまで実現できました。
評価スクリプトの結果
評価スクリプトを流した点数は以下のように変遷し、最終的には 19.775点(25点満点)となりました。
1回目:17.375(文書 生データのみ)
2回目:15.125(文書 Document Intelligence)※対象ファイルを少なく設定してしまい点数が落ちた
3回目:18.27(文書 Document Intelligence + 画像)
4回目:19.775(文書 Document Intelligence + 画像 + プロンプト調整)
工夫した点
AI Searchの構成
提供されたデータのうち、jpg・pngは画像、その他は文書という扱いとし、文書用インデックスと画像用インデックスを別々に作成したことが第一の工夫点です。
文書用インデックスについては、①生データ ②Document Intelligenceを噛ませたデータ 2種類のインデックスを作成し、後者のほうが精度が上がることを確認しました。Document Inteligenceは、txtファイル以外(docx/pptx/pdfなど)の元データをOCR処理し、markdown形式にするという使い方をしています。
画像用インデックスについては、まずGPT-4oに画像を説明させて結果をJSON形式で出力、その後ファイル名をJSONに追加するという処理を行いました。
画像に写っている場所の名前(お寺の名前など)がそのままファイル名になっており、情報として有用と考えたため、このような手順をとっています。
Container Appsの準備
そもそも不測の事態に備えてContainer Appsの開発を進めていたのは良い戦略でした。
さらに、GitHub Actionsを整備してデプロイをスムーズにする構成をとるなど、本業であるSIとしての品質担保を意識した構築を行いました。
プロンプトの工夫
精度向上を狙って英語でプロンプトを作成しました。
また、評価に使う回答例のデータを確認したところ、建立年や文化財としての重要性といった情報が盛り込まれていたため、それらを含めて答えてくれるように調整をかけています。
Please answer in the language asked by the user.
Please answer the user’s question based on the content of the contexts.
When answering, please include information such as the year the World Heritage site was built and its importance as a cultural asset, and write an appealing answer.
苦労した点
Prompt Flowのデプロイ
Prompt Flowで構築したものをボタン1つでそのままアプリケーションとしてデプロイするつもりだったのですが、うまくデプロイできない状況が続きました。
どうやら、VMのリソースが足りないなど、いろいろな問題が発生していたようでした。
Microsoft社の方にもサポートいただき、さまざまな角度から解決を試みましたが、残念ながら時間切れとなってしまいました。
画像側の精度向上
画像がリクエストされたときのフローとしては、以下の流れを検討していました。
① GPT-4oでユーザーが投げた画像の解析をする
② ①の結果を使ってAI Searchの画像インデックスを検索する
③ ②の結果を使ってAI Searchの文書インデックスを検索する
④ ③の結果をcontextとし、GPT-4oにユーザーの質問を投げる
画像用インデックスと文書用インデックスを組み合わせたフローの検討です。
ところが、PromptFlowで構築してみたところ、単純に画像インデックスだけを使った時よりも精度が落ちてしまいました。これについては、GPT-4oの精度がとても良いということの証明でもあります。
そこで、ステップ②で検索した結果から画像のファイル名(=世界遺産名)のみを抽出すれば、ステップ③でより正しい情報が取得できると考えたのですが、残念ながらこの方針は構築しきれずに、時間切れとなってしまいました。
Pythonコード
パソナのエンジニアは普段PythonとLangChainを利用してAOAI関連のサービスを開発しています。
奥の手であるContainer Appsの構築でも同様の構成を取ろうとしたのですが、Azureポータルから設定したAI Searchに対して、LangChainを使ってアクセスしようとすると、うまくいきませんでした。
調査したところ、LangChainが想定しているフィールド名と実際のフィールド名が一致しない問題があり、急遽Azure SDKを使う方針に切り替えて実装を行いました。
結果、締め切りの1時間くらい前に動かすことができたのですが、なかなかスリリングな開発となりました。
反省点・改善できそうな点
チームメンバーからはこのような声が上がりました。
- 元データをそのままDocument Inteligenceに投げた結果の一部ファイルに不要な空白がたくさん入っているものがあったので、元データに前処理を加えるとより精度を上げることができたかもしれない
- 画像のファイル名を検索に使えていればより点数が上がったのではないか
- Prompt FlowをWebアプリとしてデプロイする経験をしておけば、動くものを用意して精度改善に注力できたかもしれない
- PythonからAI Searchへ接続するまでは当日までにやっておきたかった
- 点数の伸ばし方やデータの前処理の知識がもっとあると良かった
- アプリケーション周りは早急に作成し終え、閉域網によるセキュアなアプリ構築まで持って行きたかった
当日は初めて使う機能に手間取ってしまう部分もありましたが、普段の業務では触ったことのなかったサービスを使って実際に動くものを構築できたのは本当に貴重な経験でした。
また、ほかの参加企業の発表からは、丁寧な前処理がスコア向上の大きな鍵であると再確認することができました。Document Inteligenceにtxt以外のファイルをそのまま投げ込まず、拡張子別に1、2段階の前処理を加えることで点数が伸びていた印象です。
2日間で得た知見を引き出しとしてしっかり持ち、今後の開発に活かしていきたいと思います。
おわりに
評価スクリプトの点数や、SIとしてのコスト意識やセキュリティ意識を評価していただき、なんとASCII賞を受賞することができました!
当日はMicrosoft社のこのようなお部屋をお借りして開発していました。
とてもお洒落なオフィスだったのですが、開発のことで頭がいっぱいで楽しみきれなかったのが悔やまれます。
パソナでは、最新の生成AI導入支援サービスを提供しております。
Azure OpenAI Serviceなどを活用し、企業のDX(デジタルトランスフォーメーション)をサポートいたします。
生成AI技術の導入を検討されている企業様は、ぜひ以下サービスをご確認ください。