Esta amostra demonstra algumas abordagens para criar experiências do tipo ChatGPT sobre seus próprios dados usando o padrão de geração aumentada de recuperação. Ele usa o serviço Azure OpenAI para acessar o modelo ChatGPT (GPT-35-Turbo) e o Azure AI busca indexação e recuperação de dados.

O repositório inclui dados de amostra, por isso está pronto para tentar o final para terminar. Neste aplicativo de amostra, usamos uma empresa fictícia chamada contoso imobiliário, e a experiência permite que seus clientes façam perguntas de suporte sobre o uso de seus produtos. Os dados de amostra incluem um conjunto de documentos que descrevem seus termos de serviço, política de privacidade e um guia de suporte.
O aplicativo é feito de vários componentes, incluindo:


Assista a uma visão geral do aplicativo
Importante: Para implantar e executar esta amostra, você precisará:
Microsoft.Authorization/roleAssignments/write , como administrador de controle de acesso baseado em função, administrador de acesso ao usuário ou proprietário. Se você não tiver permissões de nível de assinatura, elas devem ser concedidas a você com o RBAC para um grupo de recursos existentes e implantar para esse grupo existente.Microsoft.Resources/deployments/write em um nível de assinatura. Os preços podem variar por região e uso. Os custos exatos não podem ser estimados. Você pode experimentar a calculadora de preços do Azure para os recursos abaixo.
azd down --purge .
Existem várias maneiras de configurar com sucesso este projeto.
A maneira mais fácil de começar é com o Github Codespaces que fornece pré -configurações para configurar todas as ferramentas para você. Leia mais abaixo. Como alternativa, você pode configurar seu ambiente local seguindo as instruções abaixo.
Você pode executar este repositório virtualmente usando os espaços de código do Github, que abrirão um código VS baseado na Web no seu navegador:
Uma opção semelhante aos espaços de codificina é o código VS Code Remote Containers, que abrirá o projeto em sua instância local de código vs usando a extensão de contêineres de dev:
pwsh.exe a partir de um comando PowerShell. Se isso falhar, você provavelmente precisará atualizar o PowerShell.Em seguida, obtenha o código do projeto:
azd auth loginazd init -t azure-search-openai-javascriptExecute o seguinte comando, se você não tiver nenhum serviço do Azure pré-existente e deseja começar com uma nova implantação.
azd up - isso fornecerá recursos do Azure e implantará esse exemplo nesses recursos, incluindo a criação do índice de pesquisa com base nos arquivos encontrados na pasta ./data .eastus2 . Você pode definir um local diferente com azd env set AZURE_OPENAI_RESOURCE_GROUP_LOCATION {location} . Atualmente, apenas uma pequena lista de locais é aceita. Essa lista de localização é baseada na tabela de disponibilidade do modelo OpenAI e pode ficar desatualizada como alterações de disponibilidade.eastus2 . Você pode definir um local diferente com azd env set AZURE_WEBAPP_LOCATION {location} . Atualmente, apenas uma pequena lista de locais é aceita. Observe que o aplicativo estático da Web é um serviço global e o local escolhido afetará apenas o aplicativo de funções gerenciadas que não é usado nesta amostra.Parece o seguinte:

NOTA: Pode levar mais de 15 minutos para que o aplicativo seja totalmente implantado.
Se você já possui recursos do Azure existente, pode reutilizá-los definindo valores de ambiente azd .
azd env set AZURE_RESOURCE_GROUP {Name of existing resource group}azd env set AZURE_LOCATION {Location of existing resource group} azd env set AZURE_OPENAI_SERVICE {Name of existing OpenAI service}azd env set AZURE_OPENAI_RESOURCE_GROUP {Name of existing resource group that OpenAI service is provisioned to}azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT {Name of existing ChatGPT deployment} . Somente necessária se a sua implantação de chatgpt não for o 'bate -papo' padrão.azd env set AZURE_OPENAI_EMBEDDING_DEPLOYMENT {Name of existing GPT embedding deployment} . Somente necessária se a implantação de incorporação não for a 'incorporação' padrão. azd env set AZURE_SEARCH_SERVICE {Name of existing Azure AI Search service}azd env set AZURE_SEARCH_SERVICE_RESOURCE_GROUP {Name of existing resource group with ACS service}azd up , execute azd env set AZURE_SEARCH_SERVICE_LOCATION {Location of existing service}azd env set AZURE_SEARCH_SERVICE_SKU {Name of SKU} . A camada gratuita não funciona, pois não suporta identidade gerenciada. (Veja outros valores possíveis) Você também pode usar uma conta de armazenamento existente. Veja ./infra/main.parameters.json para obter a lista de variáveis de ambiente para passar para azd env set para configurar esses recursos existentes.
Agora você pode executar azd up , seguindo as etapas na implantação do zero acima. Isso irá provisionar recursos e implantar o código.
Se você alterou apenas o código de back-end/front-end na pasta app , não precisará re-providar os recursos do Azure. Você pode simplesmente correr:
azd deploy
Se você alterou os arquivos de infraestrutura (pasta infra ou azure.yaml ), precisará re-providar os recursos do Azure. Você pode fazer isso executando:
azd up
Para dar a outra pessoa acesso a um ambiente completamente implantado e existente, você ou eles podem seguir estas etapas:
azd init -t azure-search-openai-javascript ou clone este repositório.azd env refresh -e {environment name} Eles precisarão do nome do ambiente AZD, ID da assinatura e localização para executar este comando. Você pode encontrar esses valores em seu arquivo .azure/{env name}/.env . Isso preencherá o arquivo .env do ambiente AZD com todas as configurações necessárias para executar o aplicativo localmente.AZURE_PRINCIPAL_ID nesse arquivo .env ou no shell ativo para o ID do Azure, que eles podem obter com az ad signed-in-user show ../scripts/roles.ps1 ou ./scripts/roles.sh para atribuir todas as funções necessárias ao usuário. Se eles não tiverem a permissão necessária para criar funções na assinatura, talvez seja necessário executar esse script para elas. Depois que o script é executado, eles poderão executar o aplicativo localmente. Para limpar todos os recursos criados por esta amostra:
azd down --purgeyyO grupo de recursos e todos os recursos serão excluídos.
Por padrão, o aplicativo Web do Azure implantado não terá restrições de autenticação ou acesso ativado, o que significa que qualquer pessoa com acesso de rede rotável ao aplicativo da Web pode conversar com seus dados indexados. Você pode precisar de autenticação ao seu ID do Azure ENTRA seguindo o tutorial de autenticação ADD APP e configure -o no aplicativo Web implantado.
Para limitar o acesso a um conjunto específico de usuários ou grupos, você pode seguir as etapas de restringir seu aplicativo Azure ENTRA a um conjunto de usuários alterando "a atribuição necessária?" Opção no aplicativo corporativo e, em seguida, atribuindo aos usuários/grupos de acesso. Os usuários não concedidos pelo acesso explícito receberão a mensagem de erro -Adsts50105: seu administrador configurou o aplicativo <Pap_Name> para bloquear os usuários, a menos que sejam concedidos especificamente ('atribuídos') acesso ao aplicativo.-
Recomendamos implantar mecanismos de segurança adicionais. Quando aplicável, considere configurar uma VNET ou configurar uma política de proxy.
Por padrão, a API de pesquisa implantada permitirá apenas solicitações da mesma origem que a origem do aplicativo da Web implantada. Para ativar os CORs para um front -end hospedado em uma origem diferente, execute:
azd env set ALLOWED_ORIGIN https://<your-domain.com>azd up Você só pode ser executado localmente depois de executar com sucesso o comando azd up .
azd auth loginazd env get-values > .env para obter as variáveis de ambiente para o aplicativoaz loginnpm start ou executar a "Tarefa de código vs: Iniciar o aplicativo" para iniciar o projeto localmente. Uma vez no aplicativo da web:
O Serviço de API de pesquisa implementa o protocolo HTTP para aplicativos de bate -papo de IA. Ele pode ser trocado por qualquer serviço que implemente o mesmo protocolo, como o cliente de back -end do Python neste repositório, em vez da implementação do Node.js apresentada neste repositório.
Para fazer isso, siga estas etapas:
azd env get-values | grep WEBAPP_URI para obter o URL.http://localhost:5173 .https://<your_codespace_base_url>-5173.app.github.dev .azd env set ALLOWED_ORIGIN <your_frontend_url> .azd env get-values | grep BACKEND_URI .azd env set BACKEND_URI <your_backend_url> . Se você deseja usar o aplicativo web implantado, execute azd up para reimplementar.
Se você deseja usar o aplicativo da web local em sua máquina ou em codespaces, execute:
# Export the environment variable.
# The syntax may be different depending on your shell or if you're using Windows.
export BACKEND_URI= < your_backend_url >
# Start the app
npm start --workspace=webappEsta amostra é composta por dois aplicativos: um serviço de back -end e API, implantado em aplicativos de contêineres do Azure e um aplicativo front -end, implantado em aplicativos da Web estática do Azure. Por padrão, o aplicativo de contêiner do Azure implantado não terá restrições de autenticação ou acesso ativado, o que significa que qualquer pessoa com acesso de rede rotável ao aplicativo de contêiner pode conversar com seus dados indexados. Você pode exigir autenticação ao seu ID do Azure ENTRA seguindo o Tutorial de Autenticação de App Add Container e configure -o no aplicativo de contêiner do Azure implantado.
Para limitar o acesso a um conjunto específico de usuários ou grupos, você pode seguir as etapas de restringir seu aplicativo Azure ENTRA a um conjunto de usuários alterando "a atribuição necessária?" Opção no aplicativo corporativo e, em seguida, atribuindo aos usuários/grupos de acesso. Os usuários não concedidos pelo acesso explícito receberão a mensagem de erro -Adsts50105: seu administrador configurou o aplicativo <Pap_Name> para bloquear os usuários, a menos que sejam concedidos especificamente ('atribuídos') acesso ao aplicativo.-
Esta amostra foi projetada para ser um ponto de partida para seu próprio aplicativo de produção, mas você deve fazer uma revisão completa da segurança e desempenho antes de implantar na produção. Aqui estão algumas coisas a considerar:
chatGptDeploymentCapacity e embeddingDeploymentCapacity em infra/main.bicep na capacidade máxima da sua conta. Você também pode visualizar a guia Cotas no Azure Openai Studio para entender quanta capacidade você tem.Standard_LRS SKU. Para melhorar sua resiliência, recomendamos o uso de Standard_ZRS para implantações de produção, que você pode especificar usando a propriedade sku no módulo storage em infra/main.bicep .Standard com a opção de pesquisa semântica gratuita, que oferece 1000 consultas gratuitas por mês. Supondo que seu aplicativo experimente mais de 1000 perguntas, você deve alterar semanticSearch para "padrão" ou desativar a pesquisa semântica inteiramente nas opções de solicitação. Se você vir erros sobre a capacidade do serviço de pesquisa sendo excedida, poderá achar útil aumentar o número de réplicas alterando replicaCount em infra/core/search/search-services.bicep ou escalando manualmente no portal do Azure.O Chunkking nos permite limitar a quantidade de informações que enviamos ao OpenAI devido a limites de token. Ao interromper o conteúdo, ele nos permite encontrar facilmente pedaços em potencial de texto que podemos injetar no OpenAI. O método de Chunking que usamos alavanca uma janela deslizante de texto, de modo que frases que terminam um pedaço iniciarão o próximo. Isso nos permite reduzir a chance de perder o contexto do texto.
Para fazer upload de mais documentos, coloque-os na pasta/pasta e execute ./scripts/index-data.sh ou ./scripts/index-data.ps1 .
Outro repositório popular para este caso de uso está aqui: https://github.com/microsoft/sample-app-apoai-chatgpt/
Esse repositório foi projetado para uso por clientes que usam o Azure OpenAi Studio e o Azure Portal para configuração. Ele também inclui suporte azd para pessoas que desejam implantá -lo completamente do zero.
As principais diferenças:
Comparação de recursos:
| Recurso | Azure-Search-Openai-Javascript | amostra-app-aai-chatgpt |
|---|---|---|
| Abordagem de pano | Múltiplas abordagens | Somente via chatcompletion API Data_sources |
| Suporte ao vetor | ✅ Sim | ✅ Sim |
| Ingestão de dados | ✅ Sim (MD) | ✅ Sim (pdf, txt, md, html) |
| História persistente de bate -papo | Não (apenas guia do navegador) | ✅ Sim, em cosmosdb |
Comparação de tecnologia:
| Tecnologia | Azure-Search-Openai-Javascript | amostra-app-aai-chatgpt |
|---|---|---|
| Front-end | Reaja/iluminado | Reagir |
| Back -end | Node.js (Fastify) | Python (balão) |
| Vector DB | Azure AI Search | Azure AI Search |
| Implantação | Desenvolvedor do Azure CLI (AZD) | Azure Portal, AZ, AZD |
Execute estes comandos:
azd env set AZURE_OPENAI_CHATGPT_MODEL gpt-4 Você também pode precisar ajustar a capacidade no arquivo infra/main.bicep , dependendo da quantidade de TPM sua conta é permitida.
A guia de bate-papo usa a abordagem programada no chat-lervieve-let.ts. A guia Ask usa a abordagem programada em Ask-Rieve-then-lead.ts. Há também outra abordagem de uma/pergunta disponível, [usando um agente] (https://github.com/azure-samples/azure-search-openai-javascript/blob/main/packages/search/src/lib/approaches/ask-read-rerieve-read.ts.
O comando azd up vem da CLI do desenvolvedor do Azure e cuida de ambos os recursos do Azure e implantando código para os hosts do Azure selecionados.
O comando azd up usa o arquivo azure.yaml combinado com os arquivos .bicep infraestrutura como código .bicep na infra/ pasta. O arquivo azure.yaml para este projeto declara vários "ganchos" para as etapas da etapa de pré -embalagem e pós -provisão. O comando up primeiro executa o gancho prepackage que instala dependências do nó e cria os arquivos JavaScript baseados em React.js. Em seguida, ele empacota todo o código (serviços de front -end e backend) em um arquivo zip que ele implantará posteriormente.
Em seguida, provisões os recursos baseados no main.bicep e main.parameters.json . Nesse ponto, como não há valor padrão para o local do recurso OpenAI, ele solicita que você escolha um local em uma pequena lista de regiões disponíveis. Em seguida, enviará solicitações ao Azure para provisionar todos os recursos necessários. Com tudo provisionado, ele executa o gancho postprovision para processar os dados locais e adicioná -los a um índice de pesquisa do Azure AI.
Por fim, ele analisa o azure.yaml para determinar o host do Azure (aplicativos de contêineres e aplicativos estáticos da Web, neste caso) e carrega o serviço de aplicativo ZIP para o Azure. O comando azd up agora está completo, mas pode levar alguns minutos para que o aplicativo esteja totalmente disponível e funcionando após a implantação inicial.
Os comandos relacionados são azd provision para apenas provisionamento (se os arquivos infra mudarem) e azd deploy para implantar o código do aplicativo atualizado.
Aqui estão os cenários e soluções de falha mais comuns:
A assinatura ( AZURE_SUBSCRIPTION_ID ) não tem acesso ao serviço do Azure Openai. Verifique se AZURE_SUBSCRIPTION_ID corresponde ao ID especificado no processo de solicitação de acesso do OpenAI.
Você está tentando criar recursos em regiões não ativadas para o Azure Openai (por exemplo, o leste dos EUA 2 em vez do leste dos EUA) ou onde o modelo que você está tentando usar não está ativado. Veja esta matriz de disponibilidade do modelo.
Você excedeu uma cota, na maioria das vezes o número de recursos por região. Veja este artigo sobre cotas e limites.
Você está recebendo conflitos "o mesmo nome de recurso não permitidos". É provável que você tenha executado a amostra várias vezes e excluiu os recursos que está criando a cada vez, mas está esquecendo de expulsá -los. O Azure mantém os recursos por 48 horas, a menos que você limpe a Delete Soft. Veja este artigo sobre Recursos de Purging.
Depois de executar azd up e visitar o site, você vê um '404 não encontrado' no navegador. Aguarde 10 minutos e tente novamente, pois ainda pode estar começando. Em seguida, tente executar azd deploy e aguarde novamente. Se você ainda encontrar erros no aplicativo implantado, consulte essas dicas para depurar implantações de aplicativos de aplicativos e arquivar um problema se os logs de erro não ajudarem a resolver o problema.
Você está recebendo um erro 401 Principal does not have access to API/Operation ao executar o projeto localmente ou tentar implantar. É provável que suas variáveis de ambiente incluam AZURE_TENANT_ID , AZURE_CLIENT_ID e AZURE_CLIENT_SECRET . Você deve conceder permissões ao principal de serviço relacionado ou remover essas variáveis do seu ambiente para garantir o acesso normal. Para mais detalhes, consulte o Azure Identity SDK.
Nota: Os documentos usados nesta demonstração contêm informações geradas usando um modelo de idioma (serviço do Azure OpenAI). As informações contidas nesses documentos são apenas para fins de demonstração e não refletem as opiniões ou crenças da Microsoft. A Microsoft não faz representações ou garantias de qualquer tipo, expressa ou implícita, sobre a integridade, precisão, confiabilidade, adequação ou disponibilidade em relação às informações contidas neste documento. Todos os direitos reservados para a Microsoft.