asashiho / azure-search-openai-demo-csharp

A sample app for the Retrieval-Augmented Generation pattern running in Azure, using Azure Cognitive Search for retrieval and Azure OpenAI large language models to power ChatGPT-style and Q&A experiences.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ChatGPT + Enterprise data with Azure OpenAI and Cognitive Search

GitHub Workflow Status Open in GitHub - Codespaces Open in Remote - Containers

このサンプルでは、Retrieval Augmented Generation パターンを使用して、独自のデータで ChatGPT のような生成AIを活用したアプリケーションを開発します。ChatGPT モデル (gpt-35-turbo) へのアクセスには Azure OpenAI を使用し、データのインデックス化と検索には Azure Cognitive Search を使用します。

このリポジトリにはサンプルデータが含まれているので、エンドツーエンドで試すことができます。このサンプルアプリケーションでは、鉄道技術に関する架空の論文をデータとして使い、水素ハイブリット電車に関する技術的な質問に答えることができます。

RAG Architecture

このアプリケーションの開発の詳細については、こちらの記事をご参照ください:

サンプルアプリケーションの機能

  • ボイスチャット/文字チャット/Q&Aインターフェース
  • 引用やソースコンテンツの追跡など、ユーザーが回答の信頼性を評価するためのさまざまなオプション
  • データ準備、プロンプト構築、モデル(ChatGPT)と検索(Cognitive Search)間のオーケストレーション

Chat screen

サンプルアプリケーションの実行手順

💡注意💡
このサンプルをデプロイして実行するには、Azure OpenAIサービスへのアクセスを有効にしたAzureサブスクリプションが必要です。 申請はこちらです。また、Azureのサブスクリプション自体をお持ちでない方はこちらにアクセスして、Azureのトライアルを申請できます。

🚩警告🚩
デフォルトでは、このサンプルは、月額費用が発生する Azure App Service、Azure Static Web App、Azure Cognitive Search リソースと、ドキュメントページごとに費用が発生する Form Recognizer リソースを作成します。このコストを回避したい場合は、infra フォルダ下のパラメータファイルを変更することで、それぞれのリソースを無料版に切り替えることができます (ただし、考慮すべき制限もあります。たとえば、無料の Cognitive Search リソースは 1 サブスクリプションにつき 1 つまでで、無料の Form Recognizer リソースは各ドキュメントの最初の 2 ページのみしか分析できません)

前提条件

ローカルで実行する場合

  • Azure Developer CLI
  • .NET 7
  • Git
  • Powershell 7+ (pwsh) - For Windows ユーザのみ
    • 重要: PowerShell コマンドから pwsh.exe を実行できることを確認します。失敗した場合は、PowerShellをアップグレードする必要があります。
  • Docker
    • 重要: azd のプロビジョニング/デプロイコマンドを実行する前に、Docker が起動していることを確認してください。

💡注意💡
Azure アカウントには、User Access Administrator または Owner などの Microsoft.Authorization/roleAssignments/write 権限が必要です。

GitHubコードスペースまたはVS Codeリモートコンテナで実行する場合

GitHub Codespaces または Visual Studio Code Dev Container を利用できます。以下のボタンのいずれかをクリックして、このリポジトリを開いてください。

Open in GitHub - Codespaces Open in Remote - Containers

インストール

プロジェクトの初期化

  1. 新しいフォルダを作成し、ターミナルでそのフォルダに移動
  2. azd auth login 実行
  3. azd init -t azure-search-openai-demo-csharp 実行
    • このサンプルで使用されているモデルを現在サポートしている地域は、米国東部または米国南中部です。最新の地域とモデルのリストについては、 こちらをチェックしてください。

スクラッチから開始する場合

既存のAzureサービスがなく、新しいデプロイから始めたい場合は、以下のコマンドを実行します。

  1. azd up を実行 - Azure リソースをプロビジョニングし、このサンプルをそれらのリソースにデプロイします。

💡注意💡
このアプリケーションは text-davinci-003gpt-35-turbo のモデルを使用しています。どのリージョンにデプロイするかを選択する際には、そのリージョンで利用可能であることを確認してください(例: EastUS) 詳細については Azure OpenAI Service documentationを参照してください。

  1. アプリケーションが正常にデプロイされると、コンソールにURLが表示されます。 そのURLをクリックして、ブラウザでアプリケーションを開きます。

'Output from running azd up'

💡注意💡
アプリケーションが完全にデプロイされるまで数分かかる場合があります。

既存のリソースを利用する場合

  1. azd env set AZURE_OPENAI_SERVICE {既存のOpenAIのサービス名} を実行
  2. azd env set AZURE_OPENAI_RESOURCE_GROUP {OpenAIサービスがプロビジョニングされる既存のリソースグループ名} を実行
  3. azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT {既存のChatGPTデプロイメントの名前} を実行。※この手順はChatGPT デプロイメントがデフォルトの 'chat' でない場合にのみ必要
  4. azd env set AZURE_OPENAI_GPT_DEPLOYMENT {既存の GPT デプロイメントの名前} を実行します。※この手順はChatGPT デプロイメントがデフォルトの davinci でない場合のみ必要
  5. azd up を実行

📝メモ📝
既存の Search Account や Storage Account を利用することもできます。 既存のリソースを設定するために azd env set に渡す環境変数のリストについては ./infra/main.parameters.json を参照してください。

リポジトリのクローンのデプロイまたは再デプロイの場合

  • azd up の実行

4. App Spacesを使ってレポをデプロイする場合

📝メモ📝
リポジトリにazdがサポートするbicepファイルがあることを確認し、手動(初回デプロイ用)またはコード変更時(最新の変更で自動的に再デプロイ)にトリガーできる初期GitHub Actions Workflowファイルを追加します。 リポジトリをApp Spacesと互換性を持たせるには、AZDが適切なタグを持つ既存のリソースグループにデプロイできるように、メインのバイセップとメインのパラメーターファイルを変更する必要があります。

  1. メインパラメータファイルにAZURE_RESOURCE_GROUPを追加し、App SpacesがGitHub Actionsワークフローファイルに設定した環境変数の値を読み込むようにします。
    "resourceGroupName": {
       "value": "${AZURE_RESOURCE_GROUP}"
     }
  2. メインパラメータファイルにAZURE_TAGSを追加し、App SpacesがGitHub Actionsワークフローファイルに設定した環境変数から値を読み込むようにする。
    "tags": {
       "value": "${AZURE_TAGS}"
     }
  3. App Spacesによって設定されている値を読み取るために、メインのbicepファイルにリソースグループとタグのサポートを追加します。
    param resourceGroupName string = ''
    param tags string = ''
  4. azdによって設定されたデフォルトのタグと、App Spacesによって設定されたタグを組み合わせる。メインのbicepファイルのtags initializationを以下のように置き換えます
    var baseTags = { 'azd-env-name': environmentName }
    var updatedTags = union(empty(tags) ? {} : base64ToJson(tags), baseTags)
    Make sure to use "updatedTags" when assigning "tags" to resource group created in your bicep file and update the other resources to use "baseTags" instead of "tags". For example - 
    ```json
    resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = {
      name: !empty(resourceGroupName) ? resourceGroupName : '${abbrs.resourcesResourceGroups}${environmentName}'
      location: location
      tags: updatedTags
    }
    

ローカルでの実行の場合

  1. azd auth login の実行
  2. アプリケーションがデプロイされたら、環境変数 AZURE_KEY_VAULT_ENDPOINT を設定します。この値は .azure/YOUR-ENVIRONMENT-NAME/.env ファイルまたは Azure ポータルで確認
  3. 次のコマンドを実行して、ASP.NET Core Minimal API サーバー(クライアントホスト)を起動
    dotnet run --project ./app/backend/MinimalApi.csproj --urls=https://localhost:7181/
    

ブラウザでhttps://localhost:7181に移動し、アプリを試してみてください。

環境の共有

デプロイされた既存の環境へのアクセス権を他の人に与えたい場合は、以下を実行してください。

  1. Azure CLIのインストール
  2. azd init -t azure-search-openai-demo-csharp の実行
  3. azd env refresh -e {環境名} を実行
  • このコマンドを実行するには azd 環境名、サブスクリプション ID、リージョンが必要であることに注意してください。 これで、azd環境の.envファイルに、アプリをローカルで実行するために必要なすべての設定が入力されます。
  1. pwsh ./scripts/roles.ps1を実行
  • これは必要なロールをすべてユーザに割り当て、ローカルでアプリを実行できるようにします。 ユーザがサブスクリプションでロールを作成するのに必要な権限を持っていない場合は、このスクリプトを実行する必要があるかもしれません。azd.envファイルまたはシェルで、環境変数AZURE_PRINCIPAL_IDを自分のAzure IDに設定してください。

リソースのクリーンアップ

  1. azd downの実行

クイックスタート

  • Azure の場合: azd によってデプロイされた Azure Static Web App に移動する。URL は azd が完了したときに出力されるEndpointか、Azure ポータルで確認できます。

  • ローカルで実行する場合: クライアント・アプリはhttps://localhost:7181に、Open APIサーバーはhttps://localhost:7181/swaggerにアクセスしてください。

サンプルアプリの設定方法

  • 音声チャットページで、音声設定ダイアログを選択し、音声合成設定を行います。

    • [Blazor Clippy] と対話するためにメッセージを入力するか、[Speak] トグルボタンを選択して音声テキストを入力として使用することができます。
  • [Chat] または [Ask] のコンテキストでさまざまなトピックを試してみてください。チャットの場合は、フォローアップの質問、明確な説明、答えを簡単にしたり詳しく説明したりすることなどを試してみてください。

  • 引用と出典の設定

    • [設定] アイコンをクリックすると、さまざまなオプションを試したり、プロンプトを微調整したりできます。

参考情報

Note
The PDF documents used in this demo contain information generated using a language model (Azure OpenAI Service). The information contained in these documents is only for demonstration purposes and does not reflect the opinions or beliefs of Microsoft. Microsoft makes no representations or warranties of any kind, express or implied, about the completeness, accuracy, reliability, suitability or availability with respect to the information contained in this document. All rights reserved to Microsoft.

よくある質問

質問: Azure Cognitive Searchは大きな文書の検索をサポートしているのに、なぜPDFをチャンクに分割する必要があるのでしょうか?

回答: チャンクによって、トークンの制限のためにOpenAIに送信する情報量を制限できます。コンテンツを分割することで、OpenAIに注入できる潜在的なテキストのチャンクを見つけることができます。私たちが使っているチャンクの方法は、あるチャンクが終わると次のチャンクが始まるように、テキストのスライディングウィンドウを活用します。これにより、テキストの文脈が失われる可能性を減らすことが可能です。

About

A sample app for the Retrieval-Augmented Generation pattern running in Azure, using Azure Cognitive Search for retrieval and Azure OpenAI large language models to power ChatGPT-style and Q&A experiences.

License:MIT License


Languages

Language:C# 43.4%Language:Bicep 28.2%Language:HTML 14.8%Language:Jupyter Notebook 7.0%Language:Shell 2.2%Language:CSS 2.0%Language:JavaScript 1.1%Language:PowerShell 0.8%Language:Dockerfile 0.4%