Azure OpenAI ServiceによるRAG実装ガイドを公開しました

みなさん、こんにちは。サイオステクノロジー武井です。今回は、Azure OpenAI ServiceによるRAG実装ガイドを公開しましたので、ご紹介させてください。

※ このブログでのご紹介ととも以下のイベントでもガイドに関する詳細なご説明や、ガイドにはないデモなどを実施しますので、ぜひご参加ください。

Azure OpenAI ServiceによるRAG実装ガイドを公開しました
https://tech-lab.connpass.com/event/315703

Azure OpenAI ServiceによるRAG実装ガイドとは?

以下のURLで公開しております。執筆しているうちに100ページ超の壮大なものとなってしまいました。

https://mk.sios.jp/aoai-rag-dev-guide-form

本ガイドの目的は、「シンプル」「強力」「すぐ動く」をモットーにしたRAGアプリケーションを実装するためのガイドであり、これらかRAGを始める人に参考にしてもらうべく一筆したためました。本ガイドではRAGのアーキテクチャのみならず「実際に動くコード」もご用意致しました。読者の皆様には、コードを動かしながらRAGをより深くご理解頂けることを一番の目的としております。

ガイドの中で解説しているソースコードは以下のGitリポジトリにあります。

https://github.com/noriyukitakei/aoai-rag-starter

RAGアプリケーション構成

詳しくは、本ガイドをご参照頂けるとよいかと思いますが、このブログではその概要をご紹介します。

RAGアプリケーションの構成図は以下のとおりです。

 

本ガイドでご紹介するRAGアプリケーションは、シンプルとはいえど機能は強力です。Azureの最先端の検索手法である「セマンティックハイブリッド検索」、Azure Static Web Apps、Azure Functionsによるフルサーバーレス構成といった最新技術が集結されています。

そして、さらにAzure Developer CLI、BicepによってIaC(Infrastructure as Code)を実現しており、コマンド一発でAzureにリソースがデプロイされて動くようになっています。

RAGアプリケーションが動作するプロセスを上図をもとにご紹介いたします。

① ドキュメント読み込み
PythonスクリプトがPDFドキュメントを読み込みます。本ガイドが提供するRAGアプリケーションは、外部データベースに登録する情報として、厚生労働省が提供する「モデル就業規則」を用います。これは、無料で利用できる就業規則のテンプレートになります。

外部データベース(本ガイドではAzure AI Searchを用います)にドキュメントを登録するスクリプトやプログラムを本ガイドでは「インデクサー」と呼ぶことにします。

インデクサーは外部データベースに登録する際に、そのままドキュメントを登録するのではなく「チャンク化」「オーバーラップ」等の処理を施します。これについては後ほど詳細を説明いたします。

② テキスト抽出
インデクサーがAzure AI Seacheにドキュメントを登録するときは、PDFなどのバイナリをそのまま登録するのではなく、テキストを登録する必要があります。PDFからのテキスト抽出にはDocument Intelligenceを用います。

Document Intelligenceは、機械学習モデルを用いてドキュメントの解析を行い、テキスト構造を抽出することができます。これを用いて、インデクサーがPDFファイルからテキストを抜き出します。

③ ドキュメントベクトル化依頼
本ガイドが提供するRAGアプリケーションは、@<secref>{02-azure_ai_search|セマンティックハイブリッド検索}で説明した「セマンティックハイブリッド検索」を用います。

セマンティックハイブリッド検索を行うためには、ドキュメントから抽出したテキストデータと、それをベクトル化したデータの2つが必要になります。ここではAzure OpenAI Serviceの埋め込みモデルを利用し、テキストデータのベクトル化をAzure OpenAI Serviceに依頼します。

④ ベクトルデータ返却
ベクトル化したドキュメントをインデクサーに返却します。

⑤ インデックス化
Document Intelligenceによって抽出したテキストデータと、埋め込みモデルによってベクトル化されたデータをAzure AI Searchにインデックスとして登録します。

⑥ 静的コンテンツの取得
本ガイドが提供するRAGアプリケーションは、フロントエンドはReactによるシングルページアプリケーションとなっております。フロントエンドで利用されるJava ScriptやHTMLファイル、画像ファイルなどの静的コンテンツをAzure Static Web Appsから取得します。

⑦ プロンプト入力
ユーザーが、アプリケーションから入力したプロンプト(有給は何日取得できる?)をAzure Functionsに渡します。

⑧ 検索クエリ生成依頼
Azure Functionsは、Azure OpenAI Serviceに対して、Azure AI Searchに投げるための検索クエリの生成を依頼します。先程ユーザーが入力した「有給は何日取得できる?」をもとに検索クエリの生成を依頼します。

⑨ 検索クエリ返却
Azure OpenAI Serviceによって生成された検索クエリ「有給取得日数 規定」をWebアプリケーションに返却します。

⑩ プロンプトベクトル化依頼
先ほど説明しましたように、セマンティックハイブリッド検索を行うためには、ドキュメントから抽出したテキストデータと、それをベクトル化したデータの2つが必要になります。そして、Azure AI Seachに問い合わせる際も、先ほど作成した「検索クエリ」と、ベクトル化したプロンプトが必要になります。そのために、プロンプトのベクトル化依頼をAzure OpenAI Serviceに対して行います。ドキュメントをベクトル化したときと同様に「埋め込みモデル」を使います。

⑪ ベクトルデータ返却
ベクトル化したプロンプトをAzure Functionsに返却します。

⑫ インデックス検索
ユーザーが入力したプロンプトと、そのプロンプトをベクトル化したデータをAzure AI Searchに渡して検索を行います。ここで、Azure AI Searchは、@<secref>{02-azure_ai_search|セマンティックハイブリッド検索}で説明した「セマンティックハイブリッド検索」を行います。

⑬ ドキュメント取得
先程の検索によって取得したドキュメントをAzure Functionsに返却します。ここでは、検索クエリ「有給取得日数 規定」というクエリの検索に対して、Azure AI Search内にあるドキュメント「…最低5日間は労働者が自由に取得できる日数として残し、5日を超える…」を取得して返却するとします。

⑭ ドキュメントをもとに回答生成依頼
「⑬ ドキュメント取得」で取得したドキュメントをもとにAzure OpenAI Serviceに回答依頼を生成します。ここがRAGの真骨頂です。以下のようなプロンプトをAzure OpenAI Serviceに投げます。

ぜひ読んでください!!

どうでしょうか?ぜひお手にとって読んでみたくなったかと思います。くどいようですが、本ガイドは以下のURLで公開しておりますので、ぜひ読んでくださいませm(_ _)m

https://dev.noriyukitakei.jp/docs/aoai-rag-dev-guide.pdf

本ガイドが、みなさまがRAGを実装する際の羅針盤のようなものとなれば幸いです。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

6人がこの投稿は役に立ったと言っています。

2 COMMENTS

Tommy

大変すばらしいドキュメントとソースコードをありがとうございます。
RAGを勉強をするために、何度もドキュメントを読み返しております。

ドキュメントに沿って実際にAzureで実行してみようとしたところ、
OpenAIのプロビジョニングで失敗してしまうのですが
何かアドバイスを頂けましたら幸いです。

—————————————————–
This operation require 80 new capacity in quota Tokens Per Minute (thousands) – GPT-35-Turbo, which is bigger than the current available capacity 1. The current quota usage is 0 and the quota limit is 1 for quota Tokens Per Minute (thousands) – GPT-35-Turbo. (コード: InsufficientQuota)

返信する
アバター画像 武井 宜行

本ガイドをご覧頂きありがとうございます!!

エラーメッセージからするに、おそらくGPT-35-Turboのクオーター不足かと思われます。ご存知でしたら恐縮ですが、Azure OpenAI Serviceは、モデルごとに割り当てられるクオーター(1分間あたりのトークン処理数)が決まっております。解決策としては、そのモデルを使っている同リージョンのデプロイを削除して、クオーターに空きを増やすか、別リージョンのモデルをご利用になるかだと思います。クオーターについては、手前味噌ですが、私のブログのを参照頂けたらと思います。
https://tech-lab.sios.jp/archives/36497#i-6

ちなみに宣伝にはなりますが、本ガイドを紹介するイベントを実施予定です。以下のURLからご参加頂けますと幸いです!!
https://tech-lab.connpass.com/event/315703/

返信する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です