|
1 |
| -# semantic_kernel_askq |
2 |
| -c# function app - upload docs with rest api, and another functino to process data, and another 2 to ask qs |
| 1 | +# Semantic Kernel and Azure OpenAI: Ask Questions on your document |
3 | 2 |
|
4 |
| -Create an Azure Function: c#, 6 Isolated LTS |
| 3 | +## Overview |
| 4 | + |
| 5 | +This solution provides an example of how to process your own documents and then use [Azure OpenAI](https://azure.microsoft.com/en-us/products/ai-services/openai-service) and [Semantic Kernel](https://learn.microsoft.com/en-us/semantic-kernel/overview/) to ask question specific to that document. |
| 6 | + |
| 7 | +## What's Included |
| 8 | + |
| 9 | + This solution consists of C# function app which has 4 functions: |
| 10 | + |
| 11 | + 1. `HttpTriggerUploadFile` - upload documents to an Azure Storage account via a REST Api |
| 12 | + 2. `BlobTriggerProcessFile` - detects the uploaded document and processes it through [Azure Cognitive Services Document Intelligence](https://learn.microsoft.com/en-us/azure/ai-services/document-intelligence/overview?view=doc-intel-3.1.0) into one or more JSON files (depending on the size of the document) |
| 13 | + 3. `HttpTriggerOpenAiSdkAskQuestion` - REST Api to ask questions about the document using the OpenAI SDK |
| 14 | + 4. `HttpTriggerSemanticKernelAskQuestion` - REST Api to ask questions about the document using Semantic Kernel SDK |
| 15 | + |
| 16 | +## Getting Started |
| 17 | + |
| 18 | +### Prerequisites |
| 19 | + |
| 20 | +Before deploying your solution, you will need access to an Azure OpenAI instance in the same subscription where you are going to deploy your solution and retrieve its `Endpoint` and a `Key` |
| 21 | + |
| 22 | +### Deploying |
| 23 | + |
| 24 | +Deployment is automated using PowerShell, the [Azure CLI](https://learn.microsoft.com/en-us/cli/azure/) and [Bicep](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/).\ |
| 25 | +To run the script, you will need to select an Azure location for deployment, the Azure Open AI endpoint and key and pick a name for the function (this must be a globally unique name and less than 10 characters). |
| 26 | + |
| 27 | +*NOTE:* The template assumes you have both `gpt-4-32k` and `text-embedding-ada-002` models deployed to your Azure OpenAI instance. If you want to use a different model, change the `openAIChatModel` and `openAIEmbeddingModel` default parameter values in `./infra/functions.bicep` file. Be aware, that using a different GPT model may result in max token violations with the example below. |
| 28 | + |
| 29 | +``` powershell |
| 30 | +# obtain an Azure access token |
| 31 | +az login |
| 32 | +
|
| 33 | +# deploy the solutin |
| 34 | +.\deploy.ps1 -functionAppName <function name> -openAiEndpoint <http endpoint value> -openAiKey <openai key> -location <azure location> |
| 35 | +``` |
| 36 | + |
| 37 | +If successful, this process will create: |
| 38 | + |
| 39 | +- Storage account with two blob containers (`raw` for uploaded documents and `extracted` for processed output) |
| 40 | +- Application Insights instance |
| 41 | +- Function app with 4 functions with system assigned managed identity |
| 42 | + - Role assigment for the function identity to access blob storage and call Azure OpenAI |
| 43 | +- Azure Cognitive Services account with system assigned managed identity |
| 44 | + - Role assigment for Cognitive Services identity for read access to `raw` container and write access to `extracted` container |
| 45 | + |
| 46 | +### Running Samples |
5 | 47 |
|
6 | 48 | We will have the following functions in our Function App:
|
7 | 49 |
|
8 |
| -1. BlobTriggerProcessFile |
9 |
| - - Takes data from raw container, processes it, into a json file. |
10 |
| - - ``` |
11 |
| - {"FileName":"Test2_output.pdf","blobName":"Test2_output/Test2_output_1.json","Content":"This document has been updated. Here is new content for the document.Here are the reasons that Megan is cool:"} |
12 |
| - ``` |
| 50 | +1. Upload a document using the `HttpTriggerUploadFile` REST API. \ |
| 51 | +For this example, download and use [US Declaration of Independence as a PDF file](https://uscode.house.gov/download/annualhistoricalarchives/pdf/OrganicLaws2006/decind.pdf) \ |
| 52 | +Once the file us uploaded, the `BlobTriggerProcessFile` will automatically trigger, process it with Document Intelligence and create a new folder called `decind` in the `extracted` blob container and save 3 JSON files. |
13 | 53 |
|
14 |
| -2. httpTriggerAskAboutADoc |
15 |
| - -Creates a post |
16 |
| - ``` |
17 |
| - { |
18 |
| - "filename": "Test2_output.pdf", |
19 |
| - "question": "who is cool?" |
20 |
| - } |
21 |
| - ``` |
| 54 | +2. Ask questions using the `HttpTriggerSemanticKernelAskQuestion` and/or `HttpTriggerOpenAiSdkAskQuestion` function - this uses semantic config to only load max of 2 pages to reduce tokens provided to Azure OpenAI. |
| 55 | + |
| 56 | + Question: |
| 57 | + |
| 58 | + ``` json |
| 59 | + { |
| 60 | + "filename": "decind.pdf", |
| 61 | + "question": "How many people signed this document" |
| 62 | + } |
| 63 | + ``` |
22 | 64 |
|
23 |
| -4. httpTriggerSemanticConfigAskQuestion - uses semantic config to only load max of 2 pages to reduce tokens provided to Azure OpenAI. |
| 65 | + Return: |
| 66 | + |
| 67 | + ``` text |
| 68 | + The document was signed by fifty-six signers. |
| 69 | + ``` |
| 70 | + |
| 71 | + Question: |
| 72 | + |
| 73 | + ``` json |
| 74 | + { |
| 75 | + "filename": "decind.pdf", |
| 76 | + "question": "summarize this document in two bulleted sentences" |
| 77 | + } |
24 | 78 | ```
|
25 |
| - {"filename": "Test2_output.pdf", "question": "who is cool?" } |
| 79 | + |
| 80 | + Return: |
| 81 | + |
| 82 | + ``` text |
| 83 | + - The Declaration of Independence was unanimously agreed upon by thirteen united states of America on July 4, 1776, to express their decision to dissolve their political connection with Great Britain and become independent due to numerous abuses and usurpations by the king. |
| 84 | + - The fundamental principles of their new government would be based on the belief that all men are created equal with certain unalienable rights including life, liberty, and the pursuit of happiness, and if any government becomes destructive of these ends, it is the right of the people to alter or abolish it, and to institute a new government. |
26 | 85 | ```
|
27 | 86 |
|
28 |
| -6. HttpTriggerUploadFile |
29 |
| - Post API to upload information |
30 |
| - |
| 87 | +### What's next? |
| 88 | + |
| 89 | +Try uploading your own documents and start asking questions! |
0 commit comments