Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AOAI RAG Workshop 2023/12/15

Ayumu Inaba
December 15, 2023

AOAI RAG Workshop 2023/12/15

本資料は Azure OpenAI Samples Japan の 5章 企業内向けChatと社内文書検索の構築 Workshop の補助資料です​。
リポジトリはこちら。
https://github.com/Azure-Samples/jp-azureopenai-samples/tree/main/5.internal-document-search

必要なソフトウェアのインストールや詳細な構築手順等は リポジトリのドキュメント を参照してください​。またサンプルアプリの修正やデバッグ等には Visual Studio Code を利用しますのでインストールをお勧めします。(構築だけで良ければ不要です)

Ayumu Inaba

December 15, 2023
Tweet

More Decks by Ayumu Inaba

Other Decks in Technology

Transcript

  1. Agenda Azure OpenAI Service 概要 Retrieval-Augmented Generation Workshop で利用するツール紹介 サンプルアプリのデプロイと動作確認

    チャットアプリ側の処理内容 インデックス生成側の処理内容 サンプルアプリのカスタマイズ インデックスの更新 AZD 環境の管理 2 本資料は Azure OpenAI Samples Japan の 5章 企業内向けChatと社内文書検索の構築 Workshop の補助資料です 必要なソフトウェアのインストールや詳細な構築手順等は リポジトリのドキュメント を参照してください サンプルアプリの修正やデバッグ等には Visual Studio Code を利用します(構築だけで良ければ不要です)
  2. Azure OpenAI Service の概要 4 APIでOpenAIの 推論機能を提供 エンドポイントへのリクエストを投げるだけで 推論結果が得られます。AIを動作させるインフラを新たに準備・開発する 必要はありません。API仕様やライブラリも基本は共通。(REST

    API, Python SDKから呼び出しが可能。) SLA・サポート付きの 提供 99.9%以上の稼働率を保証するSLAを既定し、 Azureのサポートサービスが利用可能。 Azureのセキュリティ 機能が統合 Microsoft Entra IDと連携した認証、プライベートネットワークでの利用、 データの暗号化、コンテンツフィルタリングなど、企業がAIを使うリスクを軽 減するセキュリティをカバーします。 Azure OpenAI Service データ+ リクエスト システム エンドポイント AzureはOpenAIのモデルを展開する唯一のパブリッククラウドサービス。 エンタープライズ向けの データ管理 マイクロソフトのモデルのトレーニングにお客様データを利用しない。デフォルトでは入 出力データは悪用/誤用の監視目的で30日間保持され、承認されたマイクロソフト 社員が不正利用時にレビューする可能性があるが、 監視のためのログ保存プロセス はオプトアウト申請が可能で、承認されればログは保持されない。 GPT Data, privacy, and security for Azure OpenAI Service - Azure AI Services | Microsoft Learn
  3. モデルとWeb API Azure OpenAI 用のアカウントリソースに対して各種モデルをデプロイ、 対応する API を呼び出して推論を行う 開発者や管理者向けのツール(図の右側)も提供されているが、ユーザー向けにはカスタムアプリ(左側)を実 装する必要がある

    HTTPS ベースの Web API なので任意のツールや言語が利用可能だが、通常は SDK やライブラリを利用し て呼び出す 利用するリージョン、デプロイ可能なモデルとバージョン、対応する API にばらつきがあるため注意すること 5 AOAI アカウント GPT-3.5 モデル Embedding モデル DALL-E モデル Preview Azure プラットフォーム Azure Portal / CLI / Bicep / etc.. ARM AOAI Studio GPT-4 モデル Completions API Chat Completions API Embeddings API Image generation API アプリケーション
  4. GPT 単体で利用する際の注意点 6 文脈から推定しにくいトークン 正しい答えが決まっていないデータ 違いが判別しづらい学習データ 学習データが少ないマイナーな事象 GPT単体の弱点 日本語 文章中の数字、例えば「昨年と比べ売上◦◦%低下」などは正確な数字と

    文脈が紐づかないことがあり精度が落ちることがある。 料理のレシピなど、人によって材料や分量が違うケースなどは正誤が安定しない。 逆に物理法則など普遍的な事象の解説では安定する。 正しい事実関係の出現確率を高めるほどの学習ができておらず 間違えやすい。「1998年の日本プロ野球の2軍について教えて」など。 注意の概要・具体例 GPT-4で多少改善はしたが、言語格差が見られる。一般的にGPTの多くは英語 の文章の方が多く学習されているため日本語より精度が高い。 地理・交通を加味した最適経路計算 データの解釈 乗換案内のように、路線図情報や駅間所要時間のデータや確立された解法に よって本来は答えが導かれているものは言語モデルには推定しにくい。 最新情報やドメイン固有情報の記述 GPTには膨大なデータが学習されているが、GPTは最新モデルでも2021年9月 のもの。最新情報を聞かれると不正確な回答に。
  5. Fine tuning と Prompt Engineering 精度向上の主要作業の優先度は Prompt Engineering 側へシフト 7

    獲得される効果 (一部主観) 言語能力・長期記憶 (永続的だがあくまで基礎の言語生成能力や知識を強化) 使用上の懸念点 膨大なリソースおよびデータ準備コスト かなり高度なLLM学習の知識 (GPT-3.5, GPT-4では機能提供されていない) セキュリティ・品質 注意点 学習データへの機密情報混入 アノテーション品質 使いどころ (一部主観) 新しいタスクの獲得もしくは完成度向上 出力フォーマットの限定 (量が膨大な場合のみ)ドメイン知識・最新知識の獲得 情報参照 (より強く言語生成に影響するが揮発性) プロンプトのトークン入力制限 プロンプトインジェクションなどの攻撃 問いかけに対する適切な情報引き出し ドメイン知識・最新知識の補助 タスクの指示 出力フォーマットの指定 Prompt Engineering Fine tuning
  6. RAG : Retrieval Augmented Generation GPT単体では得られない情報を加味した回答を生成するために外部 情報を活用する Retrieval : (情報などを)検索する、読みだす

    Augmented : 増大、増加、拡張、増音された 9 GPT 2023年のWBC優勝国はどこ? ユーザ Web検索 bing APIなど ①チャット内容 ④クエリ「WBC 2023 優勝国」 ⑤検索結果 バックエンド プログラム ⑥質問+検索結果 ⑦回答 2023年のWBC優勝国は日本でした。 ユーザへの 返答作成 ②チャット内容 ③クエリ化結果 LLMと外部情報は独立して管理・活用する
  7. Web 検索を元にした RAG の例 内部仕様が公開されているわけではないが、Microsoft Copilot の挙 動からある程度の予測は可能 ユーザーの発言から検索キーワードを生成して Web

    の情報を検索、その結果をもとに回答を生成している 素の Azure OpenAI モデルが事前に学習したデータだけを根拠にしているわけではないので、最新情報への 対応が可能になっている 10 素の Azure OpenAI Service の回答 (gpt-35-turbo のトレーニングデータは 2021 年9月まで) Microsoft Copilot の回答
  8. 社内データを元にした RAG 社内ドキュメントなどは外部情報の取得元となる検索サービスを別 途構築する必要がある 11 LLMと外部情報を 独立して管理 Azure で ChatGPT

    × AI Search を使ったエンター プライズサーチを実現 - Qiita 外部データをRetrievalしてLLM活用する上での課題 と対策案 - ABEJA Tech Blog Azure で ChatGPT × AI Search を使ったエンター プライズサーチに履歴機能を付ける - Qiita プロンプトの一部と して外部情報を LLM に提供
  9. Azure Cognitive Search 全文検索機能を提供する PaaS 型の検索サービス 検索の専門的な知識なしで、検索システムの構築・利用が可能 豊富な検索機能をシンプルなプロトコルと API で利用可能

    フルマネージドサービス & スケーラブル 充実した自然言語解析、ランキング調整機能 事前構成/カスタム構成の AI 連携 12 事前に社内データを投入してインデックスを構築、 ChatGPT が学習していないデータを保持させる
  10. 文書のインデックス化 ファイルの実体そのものではなく、テキストなど検索に必要な 情報を抽出すること AI Searchでは様々な抽出に対応しており、単純なクエリとの類似度だけでない情報を検索 対象にできる 13 検索エンジン (AI Searchなど)

    ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~~~~~~~~~~~ ~ ➢ ファイルへのリンク ➢ 文書中のテキスト ➢ テキストのベクトル化結果 ➢ テキストの翻訳結果 ➢ テキストの要約 ➢ 画像内のテキストや画像キャプション ➢ ファイルのメタデータ ➢ トピック ➢ キーワード、固有表現 ➢ 言語 ➢ その他 事前に Index化 初心者 バット クエリ
  11. インデックス チャンク戦略 既存の PDF ファイルなど大規模なデータを含む場合にはそのまま インデックスを構築せずにチャンク化(断片化)を行う 文章をそのまま与えるとトークン上限に引っかかったり、ピンポイントに有益な情報を得られない 14 検索エンジン (AI

    Searchなど) クエリ ~~~~~~ ~~~~~~ ~~~~~~ ~~~~~~ ~~~~~~ ~~~~~~ ~~~~~~ ~~~~~~ … … ~~~~~~ ~~~~~~ ~~~~~~ ~~~~~~ ~~~~~~ ~~~~~~ ~~~~~~ ~~~~~~ … … オリジナル テキスト抽出& チャンク分割 メタデータと共に インデックスに登録 Azure OpenAI 検索にヒットしたデータを プロンプトに含める 生成結果 サービス提供 事前準備
  12. 補足 : トークン制限について RAG を実施する際に注意すべきトークン制限は以下の2つ 最大要求トークン 1回のプロンプトに含められるトークンの上限 システムメッセージ + ユーザー入力

    + 検索結果のデータ Azure OpenAI Service モデル 各モデルの仕様として制限されているため、チャンクサイズ、 チャンク数、会話履歴を調整して収める必要がある 各要求のトークンが大きいほど下記 TPM にも抵触しやすい 1分あたりのトークン (TPM) 各リージョンおよびサブスクリプションで共有するクォータ モデルデプロイ単位で指定する Azure OpenAI Service のクォータと制限 特に1つのサブスクリプションで複数の PoC やトレーニングを 行う際には抵触しやすいので注意 実運用環境で不足する場合にはアプリケーションから複数の リージョンやサブスクリプションを束ねて利用するか、 PTU と呼ばれる専有環境を利用する 15 < 16K ※ 東日本リージョン の gpt-35-turbo-16k モデル の場合 < 16K < 16K < 300K TPM
  13. 補足 : RAG に使用する検索エンジン 回答の根拠となるデータをプロンプトに含められれば良いので、必 ずしも Azure Cognitive Search を使う必要はない

    トークン制限に抵触しないデータサイズという前提は変わらないが、ユーザー入力に関連する情報を “検索” できればよい OpenAIとMicrosoft Graph Search APIでM365の組織内データを検索するRAGアプリを作る (zenn.dev) Azure AI Search の標準機能でチャンク分割やベクトル化が可 能になったため、構築は今後容易になる可能性がある サンプルコードでは PDF から文字列の抽出(Form Recognizer)、チャンク分割、 Search インデッ クスへドキュメントチャンクの Push といった一連の処理を Python スクリプトで実装 本機能は現時点でプレビュー機能の段階であるため本格的には利用できない Azure AI Search(旧: Cognitive Search)のチャンク分割+ベクトル化が簡単になったので試す! (1/2) #Azure – Qiita 16
  14. Azure CLI Azure に接続して Azure リソースの構築・設定変更・削除な どの管理コマンドを実行することが出来る Azure CLI とは

    | Microsoft Learn 各種シェルで対話形式で使用することも、シェルスクリプトを使用して呼び出すことも可能 既存環境に対して差分をデプロイする時には存在チェックなどの工夫が必要 アプリのビルドやデプロイは別のコマンドラインツールと組み合わせて利用する 18 # リソースグループの作成 az group create -n demo-rg -l japaneast # OpenAI アカウントの作成 az cognitiveservices account create -n aoaiName –g demo-rg –l japaneast # モデルのデプロイ az cognitiveservices account deployment create -n aoaiName –g demo-rg --model-name gpt-35-turbo --model-version 0301
  15. Bicep (Infrastructure as Code) 宣言型の構文を使用して Azure リソースをデプロイするドメイン固 有言語(DSL) JSON 形式の

    ARM テンプレートよりも構文が簡潔で可読性が高い アプリのデプロイや初期データの投入といったデータプレーン操作には不向き 19 Azure Resource Manager Template (.bicep) Parameter リソースのデプロイと構成 az deployment group create -f infra.bicep -p name=hoge Shell Script (.sh/.ps1) 多数のコマンド 実行順序の制御 反復実行に不向き 必要なリソースと 設定を宣言 Azure リソースをデプロイするための Bicep 言語 アプリやデータのデプロイは別途
  16. Azure Developer CLI Azure リソースだけでなくアプリのビルドやデプロイ、カスタム スクリプトの実行を一括して行うことが出来る Azure Developer CLI とは

    | Microsoft Learn yaml 形式で宣言的に環境とアプリを定義するためコマンド実行数が少なく、開発者によるス クラップ&ビルドやクローン環境の構築が用意 Azure リソースのデプロイは IaC 技術(Bicep など)を利用する(azd provision) Bicep デプロイした Compute リソースに対してアプリケーションをデプロイ (azd deploy) 一連の処理の途中のイベントをフックしてカスタムスクリプトを実行可能 20 # 環境の初期化 azd init # 環境の構築(各種定義ファイルを読み取って実行される) # azd up は azd provision と azd deploy がまとめて実施される azd up azure .yaml .env .bicep Source Code Scripts
  17. 必要ソフトウェアのインストール(Windows) Windows 端末では winget を使用して各種ソフトウェアのイ ンストールおよびバージョン確認が可能です 各サイトからインストーラをダウンロードしてインストールしても構いません 21 # Visual

    Studio Code winget install Microsoft.VisualStudioCode code --version # Git Winget install Git.Git git --version # PowerShell 7 のインストール(Windows の場合) winget install Microsoft.PowerShell pwsh --version # Azure CLI winget install Microsoft.AzureCLI az --version # Azure Developer CLI winget install Microsoft.Azd azd version # Node.js のインストール winget install OpenJS.NodeJS.LTS node --version # Python 3 winget install Python.Python.3.11 python --version
  18. Visual Studio Code + Dev Container 開発に必要な資源をコンテナとして定義することで、環境の再現性 を高め、端末の構成管理を容易にする 安定したチーム開発にはソースコードの共有だけでなくランタイムや SDK

    等の統一が重要 コンテナテクノロジによる再現性と分離性を活用し、Visual Studio Code から利用する ソースコードと一緒にコンテナの定義をリポジトリで管理することで常に最新の環境を共有 22 Windows / MacOS Visual Studio Code Linux Container ソースコード + 環境定義 Remote Container Extension ローカル ストレージ マウント push/pull 同一の開発環境を再現 GitHub Codespaces VSCode or Web Browser Developing inside a Container using Visual Studio Code Remote Development クラウド開発 コンテナで複数の環境を分離(端末環境を汚さない)
  19. Dev Container 環境のセットアップ Visual Studio Code と Docker Desktop を組み合わせて

    開発に必要なソフトウェアをコンテナで準備することも可能 Developing inside a Container using Visual Studio Code Remote Development 23 # Visual Studio Code winget install Microsoft.VisualStudioCode code --version # Visual Studio Code Remote Container Extension code --install-extension ms-vscode-remote.remote-containers code --list-extensions --show-versions # Git winget install Git.Git git --version # Windows Subsystem for Linux (WSL2) wsl --install –d Ubuntu wsl --version # Docker Desktop for windows winget install Docker.DockerDesktop docker --version Windows 端末ローカル
  20. Dev Container 定義ファイルの例 リポジトリ内に配置しておくことで、アプリの開発に必要なツー ル群を定義・共有することが可能 24 { "name": "internal document

    search", "image": "mcr.microsoft.com/devcontainers/python:1-3.11-bullseye", "features": { "ghcr.io/devcontainers/features/azure-cli:1": {}, "ghcr.io/devcontainers/features/node:1": {}, "ghcr.io/devcontainers/features/powershell:1": {}, "ghcr.io/azure/azure-dev/azd:0": {} }, "customizations": { "vscode": { "extensions": [ "ms-azuretools.vscode-bicep", "ms-python.python", "GitHub.copilot", "GitHub.copilot-chat" ] } } } devcontainer.json
  21. Azure Developer CLI によるセットアップ azd up の実行後、以下の3つの入力が必要になる 使用する Azure サブスクリプション

    デプロイ対象の Azure リージョン Windows VM のパスワード(本 Workshop では使用しないため空入力で良い) 26 20分程度
  22. サンプルアプリの動作確認 azd up 完了後に Azure App Service を開くと以下の2つ の機能を試すことが可能です 企業内向け

    Chat タブ : Azure OpenAI Service と直接チャットするための画面 社内文書検索 タブ : data ディレクトリ内の文書に基づいたチャットをするための画面
  23. App Service Easy Auth による Entra ID 認証 App Service

    の「認証」画面から ID プロバイダーとして Microsoft Entra ID を追加 自動的に Entra ID にユーザー認証が可能なアプリとして登録 される ユーザーの “認証” が行われるだけなので、きめ細かなアクセ ス制御は別途必要 App Service における Microsoft Entra ID 認証ユーザーに対するア クセス制御 (ayuina.github.io) 29
  24. App Service のクライアント IP アドレス制限 App Service の「アクセス制限」画 面からクライアント IP

    制限をかける 企業のインターネット エッジが利用する IP アドレスは 別途特定すること https://ifconfig.io など 30
  25. アーキテクチャの確認 32 Blob Storage 参照用文書 Azure App Services Web Browser

    Azure Active Directory 1 データソースとなるPDFを分割し、 Blob Storageにアップロード 2 分割したPDFからCognitive Searchの インデックスを作成 1 URLを開く 問い合わせ 3 4 問い合わせからCognitive Search の検索クエリを生成 (Davinciモデルを使用) 5 2 認証 7 Azure OpenAI で回答生成 (GPT-35-Turboモデルを使用) PDF 文書検索の準備 Azure OpenAI と ナレッジベースによる アプリケーション Azure OpenAI Service Davinci/GPT-35-Turbo/(GPT-4) pdf Azure Cognitive Search Index (gptkbindex) Cognitive Searchで文書を検 索 7 必要に応じて引用元文書をプレ ビュー/ダウンロード 6 プロンプトをCosmos DBに保存 Azure Cosmos DB
  26. 最終的な回答の生成 ユーザーの発言と検索結果をを組み合わせて回答を生成 ソースコードでは chatreadretrieveread.py の STEP3 に該当 36 # システムメッセージの例

    ソースに記載されている事実のみを使用してユー ザーの質問に回答してください。 # ユーザーメッセージの例 就業規則とは何ですか? ソース: (目的) 第1条 この就業規則(以下「規則」とい う。 )は、労働基準法(以下「労基法」とい う。 )第89 条に基づき、 ・・・・
  27. アーキテクチャの確認 39 Blob Storage 参照用文書 Azure App Services Web Browser

    Azure Active Directory 1 データソースとなるPDFを分割し、 Blob Storageにアップロード 2 分割したPDFからCognitive Searchの インデックスを作成 1 URLを開く 問い合わせ 3 4 問い合わせからCognitive Search の検索クエリを生成 (Davinciモデルを使用) 5 2 認証 7 Azure OpenAI で回答生成 (GPT-35-Turboモデルを使用) PDF 文書検索の準備 Azure OpenAI と ナレッジベースによる アプリケーション Azure OpenAI Service Davinci/GPT-35-Turbo/(GPT-4) pdf Azure Cognitive Search Index (gptkbindex) Cognitive Searchで文書を検 索 7 必要に応じて引用元文書をプレ ビュー/ダウンロード 6 プロンプトをCosmos DBに保存 Azure Cosmos DB
  28. OCR : 光学文字認識による PDF のテキスト化 Form Recognizer の OCR 処理によって

    PDF ファイル内の 文字列を抽出 Document Intelligence Studio テキスト全量をインデックス に登録してしまうと、トークン 制限に引っかかってしまう > チャンク化
  29. 検索対象データの変更 社内文書を検索可能にするためには Cognitive Search イ ンデックスを更新する 削除済みのインデックス(gptkbindex)を削除 Data ディレクトリ内の PDF

    を削除 Data ディレクトリに社内文書 PDF を追加 インデックス準備スクリプトの実行 44 Azure PDF git pull OCR チャンク化ドキュメント # PDF ファイルの分割/Blob アップロード/OCR処理/チャンク生成/インデックスへの ドキュメント Push を行うスクリプト ./scripts/prepdocs.ps1 PowerShell
  30. Web アプリのローカル デバッグ サンプルアプリのカスタマイズおよびデプロイを行うために、ま ずはローカル実行とデバッグの準備を整える Web アプリ(backend)がアクセスする、Cognitive Search、Cosmos DB、OpenAI など

    のサービスは Bicep デプロイしたものを使用する 各種サービスのエンドポイントは .env ファイルに記載されており、認証情報は azd login し たユーザーアカウントを使用する Azure src ローカル実行 git pull デプロイ (azd deploy) ユーザー利用
  31. Web アプリ用の Python デバッガのセットアップ Visual Studio Code の Python Extension

    をインストー ルし、デバッグ実行のための設定ファイルを作成する Python - Visual Studio Marketplace Run メニュー > Add Configuration を選択 デバッガーとして Python 、デバッグ設定として Python Fileを選択 .vscode/launch.json ファイルを編集 47 { "version": "0.2.0", "configurations": [ { "name": "Python: Current File", "type": "python", "request": "launch", "program": "${workspaceFolder}/src/backend/app.py", "envFile": "${workspaceFolder}/.azure/YOUR_ENVIRONMENT_NAME/.env", "console": "integratedTerminal", "justMyCode": true } ] } launch.json azd init 時に指定した名前
  32. Web アプリのデバッグ実行 F5 実行するとローカルで Web サーバーが起動、デバッガが Python プロセスにアタッチされる Web ブラウザーを開き

    http://localhost:5000 にアクセスすると確認できる 適宜ブレークポイントを設定してカスタマイズ作業を進める 48
  33. 補足 : Application Insights の設定 本ドキュメント作成時のソースコードではローカル実行時にエ ラーが発生する .env ファイルに Application

    Insights の接続文字列が設定されてないため Azure Portal 等から接続文字列を取得して追加しておく 49 APPLICATIONINSIGHTS_CONNECTION_STRING="{Azure Portal から取得した文字列}" .env
  34. Web アプリのデプロイ カスタマイズ作業が完了したら azd deploy コマンドで新し いアプリをデプロイします azd up とは異なり、インフラの構築を行う

    azd provision 相当の処理が行われません デプロイの履歴は App Service のデプロイセンターからも確認できる 50
  35. 環境の追加 複数の環境を作成したい場合は azd env new コマンドを使用し て追加することが出来る 異なる用途や別のリージョンやサブスクリプションにも環境を作りたい場合などに利用する 各 azd

    コマンドは defaultEnvironment の設定を用いて動作するため、環境の切り替えや指定を 忘れないように注意すること 52 # 環境の追加 PS> azd env new 新しい環境名 # 環境の一覧と既定値の確認 PS> azd env list NAME DEFAULT LOCAL REMOTE aoai-prep1215 false true false aoai-ws1214 true true false # 既定の環境の切り替え PS> azd env select 既定にする環境名 # 既定値でない環境に対する操作 PS> azd up --environment 環境名 PowerShell 現在の環境は .azure/config.json で指定されている 各環境固有の値は .azure/環境名 ディレクトリで管理 ※ .azure ディレクトリや .env ファイルは .gitignore 指定することでリポジトリには登録せず、他の開発者とは共有しない
  36. 環境の削除 AZD で構築した環境は azd down コマンドで削除できる 前述の方法で複数環境を構築している場合は、対象環境名を明示するか、環境の切り替え を忘れずに実行すること デプロイしたリソースは1つのリソースグループにまとまっているため、Azure Portal

    や CLI で削除しても良い 53 # Default 環境の削除 PS> azd down # 環境を指定した削除 PS> azd down --environment 環境名 # コマンド実行後に本当に削除して良いか、データも Purge してよいか 確認される # Purge をしない場合、サブスクリプションのクォータを確保し続けてしま うため注意が必要 PowerShell 環境名のついたリソース グループを削除 ※ Azure 側で削除した場合、ローカルに残っている .azure/config.json や .azure/環境名 ディレクトリと状態が乖離するため、そちらも削除しておくこと