Blog Post

Core Infrastructure and Security Blog
6 MIN READ

Easily deploy an Azure Open AI instance with Documents

wernerrall's avatar
wernerrall
Icon for Microsoft rankMicrosoft
Aug 30, 2024

Introduction

Deploying an Azure OpenAI instance integrated with a Search Index and a Storage Account can significantly enhance your applications' capabilities. In this guide, I will walk you through the process step-by-step.

 

Prerequisites

  • An active Azure subscription
  • Azure CLI installed
  • Basic understanding of Azure services

 

Step 1: Setting Up the Azure OpenAI Instance

Create a Resource Group. In our case I called it DeployOpenAI.

 

 

 

 Next we will deploy the Open AI instance by going to All Services and Searching for Open AI 


 

Create the Instance by placing it in your same resource Group. Accept all the defaults and press next until Resource is deployed. 

 

 

 

Click "Go to resource" and Enable the System assigned Managed Identity. Copy the Object ID of the created managed identity for later use. 


 

 

Step 2: Setting Up the Azure Search Index

In All Services we are searching for AI Search

 


For this example we will be using the Basic pricing tier and a different region. We are using the basic pricing tier because it supports managed identities.
We are using UK South region at time of posting this article because Semantic Ranker is only available in certain regions. 


 

 

 Click "Go to resource" and ensure Semantic Ranker shows "Selected Plan"


 

Enable the use of RBAC and API keys by setting the Keys to both. 



Enable the System assigned Managed Identity. Copy the Object ID of the created managed identity for later use.

 

Step 3: Creating the Storage Account

In All Services we search for Storage

 

 

We can technically create the storage account anywhere but I prefer it close to my search index so I will choose UK South as my region. I then adjust the Redundancy to LRS to save some costs. We can keep the default settings for the rest of the Storage Account and go next until my resource is created. 

 

 

 

Go to Resource and click on Containers

 

 

Create a new container where we will be storing our knowledge documents or uploading our files

 

 

 

 

az ad signed-in-user show --query id -o tsv​

 

 

 

 

 

Upload a file you want the Language model to be able to interpret for you later. I will be uploading the Microsoft Azure SLA Documentation in PDF format. Supported Formats are: "Txt, .md, .html, .docx, .pptx, and .pdf"

 

 

Step 4: Granting Permissions

The permissions can sometimes be confusing, especially if you don't normally work in Azure. Copy the script from my GitHub Repository --> RallTheory/OpenAIBYODPermissions/OpenAIStudioPermissionsRequired.sh at main · WernerRall147/RallTheory (github.com)

 

 

 

# Variables
resourceGroup="#TODO"
userObjectId="#TODO"
managedIdentityObjectId1="#TODO"
managedIdentityObjectId2="#TODO"
subscriptionId="#TODO"

# Assign Cognitive Services OpenAI Contributor
az role assignment create --assignee $userObjectId --role "Cognitive Services OpenAI Contributor" --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroup
az role assignment create --assignee $managedIdentityObjectId1 --role "Cognitive Services OpenAI Contributor" --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroup
az role assignment create --assignee $managedIdentityObjectId2 --role "Cognitive Services OpenAI Contributor" --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroup

# Assign Cognitive Services Contributor
az role assignment create --assignee $userObjectId --role "Cognitive Services Contributor" --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroup
az role assignment create --assignee $managedIdentityObjectId1 --role "Cognitive Services Contributor" --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroup
az role assignment create --assignee $managedIdentityObjectId2 --role "Cognitive Services Contributor" --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroup

# Assign Search Index Data Reader
az role assignment create --assignee $userObjectId --role "Search Index Data Reader" --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroup
az role assignment create --assignee $managedIdentityObjectId1 --role "Search Index Data Reader" --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroup
az role assignment create --assignee $managedIdentityObjectId2 --role "Search Index Data Reader" --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroup

# Assign Storage Blob Data Contributor
az role assignment create --assignee $userObjectId --role "Storage Blob Data Contributor" --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroup
az role assignment create --assignee $managedIdentityObjectId1 --role "Storage Blob Data Contributor" --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroup
az role assignment create --assignee $managedIdentityObjectId2 --role "Storage Blob Data Contributor" --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroup

# Assign Search Service Contributor
az role assignment create --assignee $userObjectId --role "Search Service Contributor" --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroup
az role assignment create --assignee $managedIdentityObjectId1 --role "Search Service Contributor" --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroup
az role assignment create --assignee $managedIdentityObjectId2 --role "Search Service Contributor" --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroup

 

 

 

 

Only replace the Variables Section with the #TODO labels. The 2 Managed Identity Objects we copied from earlier steps. To get your own user Object Id you can run the below script by launching the Azure Cloud Shell. 

 

 

 

 

az ad signed-in-user show --query id -o tsv

 

 

 

 

Our variables should now look something like this (I have hidden some of the characters)

 

 

 

 

# Variables
resourceGroup="DeployOpenAI"
userObjectId="6167fxxxxxxxxxxxxxxxxxx"
managedIdentityObjectId1="f24cbcxxxxxxxxxxxxxxxxxxx"
managedIdentityObjectId2="542bxxxxxxxxxxxxxxxxxxxxxx"
subscriptionId="2910xxxxxxxxxxxxxxxxxxxxxxxxx"

 

 

 

 

Now we are ready to apply the permissions. Copy the entire script including the variables section and paste it as is in the Azure Cloud Shell. Then press Enter. Your output should look similar to below.

 

 

If all permissions applied successfully, we should have no problem in the Open AI Studio. 

 

Step 5: Open AI Studio Deployment

Head over to our Open AI deployment and click "Go to Azure OpenAI Studio"

 

 

On the landing page click on Deployments and Deploy Model

 

 

We will be deploying 2 models. The Base "text-embedding-ada-002" and the "gpt-4o" models. Let's start with text-embedding-ada-002. 

 

 

 

 

Next we deploy the GPT-4o model

 

 

 

You should now see both your deployments

 

 

Now we need to load our data from the Storage Account into the AI Search Index. In Chat, we can click "Add your data". 

 

 

 

We will use Hybrid + semantic search

 

 

Click next on System Assigned Managed Identity. If our permissions applied correctly, we shouldn't get any errors here and we can continue to Save and Close. 

 

 

 

You will see your data getting processed and Indexed. 

 

 

And lastly, we need to create a deployment to a Web App so we can interact with all of these pieces. Let's go to Chat and click "Deploy to a web app"

 

 

We can fill in all the details here. If this is the second or third time I am deploying I can also choose "Update an Existing Web App"

 

 

To see if my app is deploying, I can go back to the Azure Portal and take a look in the Resource Group under Deployments

 

 

Once my website is ready I can simply go to Web Apps or find my new Web App in the Resource Group. 

 

 

 

Now we can finally enjoy our newly deployed Large Language Model.

 

 

 

 

You might get this from time to time

 

 

To fix this we can either:

1. Increase our models Rate Limits or request more Quota, this may require a redeploy to your existing web app. If we still encounter the error, we can deploy other models with more quota available out-of-the-box or we can request quota for our required model from Azure Support. 

 

2. Decrease the size of our documents by converting them to easier formats like ".txt" or "md". Converting file formats like PDF to TXT can significantly help reduce token usage when working with Azure OpenAI or any other text-based AI model.

 

In this blog I chose to deploy gpt-4 as a different model to try assist in solving our problem

 

 

After adding some quota and redeploying the app with gpt-4 we are now getting better responses.

I hope this has been a helpful walkthrough!

 

Disclaimer

The sample scripts are not supported under any Microsoft standard support program or service. The sample scripts or Power BI Dashboards are provided AS IS without warranty of any kind. Microsoft further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. The entire risk arising out of the use or performance of the sample scripts and documentation remains with you. In no event shall Microsoft, its authors, or anyone else involved in the creation, production, or delivery of the scripts or Power BI Dashboards be liable for any damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) arising out of the use of or inability to use the sample scripts or documentation, even if Microsoft has been advised of the possibility of such damages. This blog post was written with the help of generative AI. 

 

Updated Aug 04, 2024
Version 1.0
No CommentsBe the first to comment