【Microsoft×生成AI連載】【やってみた】AI Challenge Dayに参加しました

【Microsoft×生成AI連載】寺澤です。私からはASCII×Microsoft主催の「AI Challenge Day」というイベントについてご紹介したいと思います。

先日、ASCII×Microsoft主催の「AI Challenge Day」というイベントに参加しました。

このイベントは生成AIを活用して質問に対する回答を生成する方法を勉強、競うイベントです。

今回、私のチームは「日本ビジネスシステムズ株式会社」と「株式会社ネクストスケープ」の合同で参加しました。

メンバーは今回が初の顔合わせでしたが、協力して課題に取り組むことができました。

この記事では、イベントの概要、実装内容、感想をご紹介します。

これまでの連載

これまでの連載記事一覧はこちらの記事にまとめておりますので、過去の連載を確認されたい方はこちらの記事をご参照ください。

blog.jbs.co.jp

イベント概要

まずは、本イベントの概要をご紹介します。

スケジュールと会場

  • スケジュール
    • : 2024 年 4 月 18日(木)、19日(金)
      • 開発:4/18 11:00~ 4/19 13:00
      • 発表:4/19 13:00~
  • 会場
    • Microsoft AI Co-Innovation Lab 神戸

内容   

生成 AI でRAG(Retrieval Augmented Generation) アーキテクチャの実装を特定題材を元にしたコンテスト形式で競い、学びあう Learning Eventです。

※ RAGについては本記事の「補足:RAG アーキテクチャとは」の章をご覧ください。

このイベントでは、題材のデータファイル(csv, pdf, word, excel, pptx)を検索対象として、検索精度、アイディア、カスタマーストーリー、エンタープライズグレード(セキュリティ、性能等)、Copilot要素で評価しました。

テーマ:世界遺産トラベルアシスタント

運営が用意した世界遺産について記載された資料をデータソースとして検索、質問するアプリを作成しました。

アプリには下記の2種類の検索方法を実装する必要がありました。

  1. 質疑応答FAQアシスタント

  2. マルチモーダルアシスタント

採点方法

回答の精度の評価は、運営が用意したツールを使用したChatGPTによる類似度評価で点数を付けました。

また、回答の精度だけでなくカスタマーストーリーやセキュリティも評価対象になりました。

補足:RAG アーキテクチャとは

RAG は、大規模言語モデル (LLM) と外部知識検索を組み合わせる生成 AI 設計パターンです。 リアルタイム データを生成 AI アプリケーションに接続するために必要です。

これにより、推論時にデータがコンテキストとして LLM に提供されるため、アプリケーションの精度と品質が向上します。

参照元:

learn.microsoft.com

基本的なRAGの流れは下記のとおりです。

  1. ユーザーが質問する

  2. 質問に関連するデータをデータベース等から取得する

  3. 1の質問と2のデータをもとにLLM(Large Language Model)で回答を生成する

実装内容

ここからは、実際に課題に対してどのように実装したかを解説します。

アーキテクチャ&役割分担

下記の要素で分けて実装しました。

  • フロントエンド
    • ユーザーが質問を入力し、ChatGPTが返答した内容を表示する画面の実装
  • バックエンド
    • ユーザーが入力した内容の整形、APIの実行(ドキュメント検索、チャットGPTから回答を取得)の実装
  • インフラストラクチャー
    • 必要なリソース(Azure AI Search, Azure Open AI, Blobストレージ, Azure AI Document Intelligence, Cosmos DB)の作成
  • データ整形
    • Azure AI Document Intelligenceを使用して正確に読み取れないファイルを読み取れる形式に整形
  • プロンプトエンジニアリング
    • ドキュメント検索、チャットGPTからほしい情報を得やすいプロンプトを検討

実装のポイント

回答精度が良くなるように下記の点を工夫しました。

取得できないデータの整形

今回はBlobストレージにデータソースとなるファイルを保存し、Azure AI Searchでインデックスを作成しました。このインデックスに対して検索して回答の元となる情報を取得します。

ただ今回提供された検索対象のデータにはうまく読み取れず情報が取得できないファイルがありました(スキャンされた画像形式のPDF等)。

これらのファイルに対して検索できるようにデータ整形する必要がありました。

スキャンされた画像形式のPDFファイルに対してAzure AI Document IntelligenceのOCRでテキスト化を行いました。

下記画像のような画像PDFの内容をOCRすることによりテキスト化することができます。テキスト化したファイルをインデックス化(検索対象)にすることで情報を取得できるようにしました。

Azureポータル上で実施する場合、Azure AI Document Intelligence>Document Intelligence Studioで「Layout」モデルを選択します。その後で対象のファイルをアップロードしOCRを実行します。

コード(Python)を使用してテキスト化する場合、下記のコードを参考にしました。

from azure.core.credentials import AzureKeyCredential
from azure.ai.formrecognizer import DocumentAnalysisClient

#環境情報を格納
endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
key = os.environ["AZURE_FORM_RECOGNIZER_KEY"]

#クライアント作成
document_analysis_client = DocumentAnalysisClient(
       endpoint=endpoint, credential=AzureKeyCredential(key)
   )

#ファイルパス
path_to_sample_documents = "ファイルパス.pdf"

#レイアウトモデルを使用してOCR
with open(path_to_sample_documents, "rb") as f:
       poller = document_analysis_client.begin_analyze_document(
           "prebuilt-layout", document=f
       )
result = poller.result()

参照元:azure.ai.formrecognizer.DocumentAnalysisClient class | Microsoft Learn

プロンプトエンジニアリング

データソース取得時のプロンプト回答を生成する際のプロンプトを工夫しました。

データソース検索時は下記のことをするように指示しています。

  • ユーザーが質問した文章から世界遺産に関連するキーワードを抽出すること
  • 検索時に使用するクエリに「+」などの特殊文字、ファイル名、ドキュメント名が含まれていないことを確認すること
  • ユーザーの検索意図を理解すること
  • 指定した形式以外で出力しないこと:形式=キーワード1 キーワード2 キーワードn

こうすることで。ユーザーが入力した質問の書き方の影響を減らし、正しいデータソースを取得する可能性を上げています。

また、回答生成時のプロンプトでは下記のことを指示しています。

  • アシスタントは、会社の従業員の仕事に関する質問や規則に関する質問をサポートすること
  • 提供された情報源のリストに基づいて、ユーザーの質問に対する簡潔で正確な回答を作成すること
  • 回答は、ユーザーの質問に直接対応するものにすること
  • 情報がデータソースから得られない場合は、「わからない」と述べること
  • 表形式のデータにはHTMLの表形式を使用すること。マークダウンは使用しないこと
  • 英語でない場合は、質問と同じ言語で回答すること
  • 思考プロセスは英語で、回答は日本語ですること

データソースの情報を元に正確な回答を生成することを意図しています。

実際のプロンプトは下記のとおりになりました。

使用するタイミング

プロンプト

データソース取得

Generate a search query that anticipate the document file name focused on Japan's World Heritage sites, based on the new question from the user.

Extract relevant keywords related to the specific World Heritage site discussed and ensure the query is free from filenames, document names, and special characters like '+'. 

Familiarize yourself with the user's search intent.

Do not include any description other than the output format.

Also, be sure to output only the output format.

If output, the earth will be ruined.

Lang;japanese

Output Format:

keyword1 keyword2 keyword3 keywordn

 

回答生成

Assistant helps the company employees with questions about their work and questions about rules and regulations.

Your primary task is to generate a concise and accurate answer to the user's question based on the list of sources provided.

Your answer should directly address the user's question. If the information is not available in the sources, state that you don't know.

Use HTML table format for tabular data. No markdown. Answer in the same language as the question if it's not in English.

Your thought process should be in English, but your responses should be in Japanese.

 

画像データのテキスト化

GPT-4 with Visionを使用して、画像ファイル(写真)について説明した文章を生成し、その結果のインデックスを作成しました。

下記の赤い枠で囲われた部分を追加して、検索に結果に表示されるようにしています。

結果

最終結果のスコアは16.777となりました。

うまく取得できなかったデータソースに対して精度改善に取り組むことができれば、もう少しスコアを伸ばすことができたと考えています。

感想

このイベントに参加する以前は生成された回答の精度をどのように評価するかを難しく感じていました。どのくらい正確な回答なのかを判断する際に主観になってしまい、できるだけ主観ではない方法はないかと考えていました。

そこで、今回使用した方法の場合、ある程度一定の基準で精度を数値化することができるため、1つの測定方法として使用する事ができると感じました。、

また、今回のコンテストでは高得点を取るためには評価する仕組みをどれだけ早く作り、点数の低い質問/回答に対してどれほど改善できるかがポイントだったと考えています。

今回のイベントの中でプロンプトフローを使用することで構築~評価の仕組みを素早く作成することができるとお話があったので、今後使い方を勉強しようと思いました。

他には、うまく読み取れないファイルに対してAzure AI Document Intelligenceを使用することが、1つの解決方法だと学びました。

関連情報

各社の発表時の映像です。

主催者のASCIIによる記事です。

ascii.jp

執筆担当者プロフィール
寺澤 滉

寺澤 滉(日本ビジネスシステムズ株式会社)

Csol本部 DAPf部所属。AI関連(Azure OpenAIやCopilot Studioなど)を勉強中です。

担当記事一覧