こんにちは、セキュリティチームのぐっちーです。生成AIをやる場合でも、そうでない場合でもQ&A(よくある質問集≒FAQ)をWordやPDF等のドキュメントから大量生成したいニーズはよくあるものだと思います。生成AIの文脈でいうと、Fine-tuning用のデータとして活用したり、RAGの検索データにしたりなどが考えられます。
今回は、Azureの各種機能を使って、ドキュメントからQ&Aをサクッと作れるフローを作りました。もちろん、Q&Aの大量生成の手段はたくさん存在しますが、「ローコードでサードパーティの怪しいツールを使わずに実装できる」をコンセプトにやっていきたいと思います。
実装方針
Teamsをフロントにドキュメントを受け取り
フロント側はTeamsを使う形で実装しました。フロントは本当に何でも良いのですが、最近の担当のお客様がTeamsが多いのでTeamsにしています。要件によっては、Slackにしたり、独自のフロントを作ったりなども考えられます。
Azure AI Document Intelligence を使って文字起こし
今回インプットとして使うファイルはWordやPDFなどいくつかの型式となることを想定しています。そこで、Azure AI Document Intelligence を使ってコンテンツの中身(文字起こし)を取得します。Azure AI Document Intelligence 1は、機械学習などの技術を使って、テキスト、KeyとValueのペア、テーブル、構造をドキュメントから自動的に抽出する AI サービスです。文書処理フローの最初に噛ませることで、生成AIが扱いやすい形にデータを変換するような役割としても使うことができます。生成AIの価値を最大化するにあたって、個人的にアツいソリューションの1つです。
最初から200文字ずつ取得し、Function-CallingでQ&Aを作成しまくる
Azure AI Document Intelligence を使って文字起こしを最初から200文字ずつ順番に取得し、Function-Calling2でQ&Aを作成しまくります。具体的には、Logic Apps の Do Until のアクションを利用し、200文字ずつ順番に生成AIで文書のコンテンツをQ&Aの型式に変換します。200文字と言う部分に関しては、文書の長さや結果を見ながら変えてもいいと思いますが、今回サンプルとした文章の内容的に200文字ぐらいがちょうど良さそうだったので、エイヤーで200文字にしています。
フローの中身
ここからは、実際のフローの中身を解説します。まず、Azure AI Document Intelligence を利用するには、Blob ストレージに文書があると処理しやすいので、ファイル情報を取得して、Blobストレージに格納します。その後、HTTPリクエストでAzure AI Document Intelligence を実行して、文書を処理していきます。
続いて、取得した文字列を200文字ずつ取得して、AIに投げていきます。変数をいくつか定義しつつ、Do Until アクションを利用して、繰り返し処理を実施します。
動作確認
動作確認として、Teams上に召喚したボットにWordの情報を渡します。処理に3分程度時間がかかるのですが、このドキュメントの内容を読み取って、Q&A型式に変更してくれました。
今回作成したフローでは、Teamsに直接Q&Aをcsv型式で返す形にしました。もちろん、結果をどこに格納するかは、作り込み次第で柔軟に対応することができます。JSONL型式などで返せば、Fine-tuning用のデータとしてもすぐ利用することができます。
別の手段
冒頭に述べた通り、この手のQ&A生成は様々な手段があります。例えば、別の手段として、OpenAI の Batch API というものもおすすめではあります。Batch API はリアルタイムにAIの実行結果が取得できない分、大量データ処理を安くできるのが特徴です。
あるいは、マイクロソフトさんがQ&A生成のサンプルを出していたりしますので、上級者であればこちらを試してみるのも良いかと思いました。
応用
今回のフローのエッセンスを応用すれば、Q&Aの生成の他、以下のようなシーンでも活用することができそうだと考えています。
- ドキュメントからテスト問題の生成
- ドキュメントからトークスクリプトの生成
終わりに
プログラマーであれば、こんなことをしなくても、コードを書いて実現しちゃうと思いますが、コードを書くのが苦手な人などは是非このようなアプローチでQ&Aの大量生成にチャレンジしていただけたら幸いです。今回のフローはエラーハンドリング等はあまりやっていなくて、さっくりしたフローとなっていますが、参考になればと思います。