Cet échantillon démontre quelques approches pour créer des expériences de type Chatgpt sur vos propres données en utilisant le modèle de génération augmenté de récupération. Il utilise le service Azure OpenAI pour accéder au modèle ChatGPT (GPT-35-Turbo), et Azure AI recherche l'indexation et la récupération des données.
Le repo comprend des exemples de données, il est donc prêt à essayer de bout en bout. Dans cet exemple d'application, nous utilisons une entreprise fictive appelée Contoso Real Estate, et l'expérience permet à ses clients de poser des questions d'assistance sur l'utilisation de ses produits. L'exemple de données comprend un ensemble de documents qui décrivent ses conditions d'utilisation, sa politique de confidentialité et un guide d'assistance.
L'application est faite à partir de plusieurs composants, notamment:
Regardez un aperçu vidéo de l'application
IMPORTANT: Afin de déployer et d'exécuter cet échantillon, vous aurez besoin:
Microsoft.Authorization/roleAssignments/write
, tels que l'administrateur de contrôle d'accès basé sur les rôles, l'administrateur d'accès utilisateur ou le propriétaire. Si vous n'avez pas d'autorisations de niveau d'abonnement, ils doivent vous être accordés avec RBAC pour un groupe de ressources existant et déployer dans ce groupe existant.Microsoft.Resources/deployments/write
au niveau d'abonnement. Les prix peuvent varier selon la région et l'utilisation. Les coûts exacts ne peuvent pas être estimés. Vous pouvez essayer la calculatrice de tarification Azure pour les ressources ci-dessous.
azd down --purge
.
Il existe plusieurs façons de configurer avec succès ce projet.
La façon la plus simple de commencer est avec GitHub Codespaces qui fournit des préconfigurations pour configurer tous les outils pour vous. Lire la suite ci-dessous. Vous pouvez également configurer votre environnement local à suivre les instructions ci-dessous.
Vous pouvez exécuter ce repo pratiquement en utilisant des codes GitHub, qui ouvriront un code VS basé sur le Web dans votre navigateur:
Une option similaire à Codespaces est des conteneurs distants de code contre le code, qui ouvriront le projet dans votre instance de code locale vs à l'aide de l'extension des conteneurs Dev:
pwsh.exe
à partir d'une commande PowerShell. Si cela échoue, vous devez probablement mettre à niveau PowerShell.Ensuite, obtenez le code du projet:
azd auth login
azd init -t azure-search-openai-javascript
Exécutez la commande suivante, si vous n'avez pas de services Azure préexistants et que vous souhaitez commencer à partir d'un nouveau déploiement.
azd up
- Cela provisionnera Azure Resources et déploiera cet échantillon sur ces ressources, y compris la création de l'index de recherche basé sur les fichiers trouvés dans le dossier ./data
.eastus2
. Vous pouvez définir un emplacement différent avec azd env set AZURE_OPENAI_RESOURCE_GROUP_LOCATION {location}
. Actuellement, seule une courte liste d'emplacements est acceptée. Cette liste de localisation est basée sur la table de disponibilité du modèle OpenAI et peut devenir dépassée à mesure que les changements de disponibilité.eastus2
. Vous pouvez définir un emplacement différent avec azd env set AZURE_WEBAPP_LOCATION {location}
. Actuellement, seule une courte liste d'emplacements est acceptée. Notez que l'application Web statique est un service global, et l'emplacement que vous choisissez n'affectera que l'application des fonctions gérées qui n'est pas utilisée dans cet échantillon.Cela ressemblera à ce qui suit:
Remarque: il peut prendre plus de 15 minutes pour que l'application soit entièrement déployée.
Si vous avez déjà des ressources Azure existantes, vous pouvez les réutiliser en définissant des valeurs d'environnement 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}
. Uniquement nécessaire si votre déploiement de chatppt n'est pas le «chat» par défaut.azd env set AZURE_OPENAI_EMBEDDING_DEPLOYMENT {Name of existing GPT embedding deployment}
. Uniquement nécessaire si votre déploiement d'intégration n'est pas la «intégration» par défaut. 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
, exécutez azd env set AZURE_SEARCH_SERVICE_LOCATION {Location of existing service}
azd env set AZURE_SEARCH_SERVICE_SKU {Name of SKU}
. Le niveau gratuit ne fonctionnera pas car il ne prend pas en charge l'identité gérée. (Voir d'autres valeurs possibles) Vous pouvez également utiliser un compte de stockage existant. Voir ./infra/main.parameters.json
pour la liste des variables d'environnement à passer à azd env set
pour configurer ces ressources existantes.
Vous pouvez maintenant exécuter azd up
, en suivant les étapes de déploiement à partir de zéro ci-dessus. Cela provisionnera les ressources et déploiera le code.
Si vous n'avez modifié que le code backend / frontend dans le dossier app
, vous n'avez pas besoin de procéder aux ressources Azure. Vous pouvez simplement courir:
azd deploy
Si vous avez modifié les fichiers d'infrastructure ( infra
dossier ou azure.yaml
), vous devrez provisser les ressources Azure. Vous pouvez le faire en fonctionnant:
azd up
Pour donner à quelqu'un d'autre un accès à un environnement complètement déployé et existant, vous ou vous pouvez suivre ces étapes:
azd init -t azure-search-openai-javascript
ou clone ce référentiel.azd env refresh -e {environment name}
Ils auront besoin du nom d'environnement AZD, de l'ID d'abonnement et de l'emplacement pour exécuter cette commande. Vous pouvez trouver ces valeurs dans votre fichier .azure/{env name}/.env
. Cela remplira le fichier .env
de leur environnement AZD avec tous les paramètres nécessaires pour exécuter l'application localement.AZURE_PRINCIPAL_ID
dans ce fichier .env
ou dans le shell actif sur leur ID Azure, qu'ils peuvent obtenir avec az ad signed-in-user show
../scripts/roles.ps1
ou ./scripts/roles.sh
pour attribuer tous les rôles nécessaires à l'utilisateur. S'ils n'ont pas l'autorisation nécessaire pour créer des rôles dans l'abonnement, vous devrez peut-être exécuter ce script pour eux. Une fois que le script s'exécute, ils devraient pouvoir exécuter l'application localement. Pour nettoyer toutes les ressources créées par cet échantillon:
azd down --purge
y
y
Le groupe de ressources et toutes les ressources seront supprimés.
Par défaut, l'application Web Azure déployée n'aura aucune restriction d'authentification ou d'accès activée, ce qui signifie que toute personne ayant un accès réseau routier à l'application Web peut discuter avec vos données indexées. Vous pouvez avoir besoin d'authentification à votre ID Azure ENTRA en suivant le didacticiel d'authentification Ajouter l'application et le définir par rapport à l'application Web déployée.
Pour limiter ensuite l'accès à un ensemble spécifique d'utilisateurs ou de groupes, vous pouvez suivre les étapes de restreindre votre application Azure ENTRA à un ensemble d'utilisateurs en modifiant "la mission requise?" Option sous l'application Enterprise, puis attribuer des utilisateurs / groupes à accès. Les utilisateurs non accordés à l'accès explicite recevront le message d'erreur -aadsts50105: votre administrateur a configuré l'application <app_name> pour bloquer les utilisateurs à moins qu'ils ne soient spécifiquement accordés («attribué») accès à l'application.
Nous vous recommandons de déployer des mécanismes de sécurité supplémentaires. Le cas échéant, envisagez de configurer un VNET ou de configurer une stratégie de proxy.
Par défaut, l'API de recherche déployée n'autorisera que les demandes de la même origine que l'origine de l'application Web déployée. Pour activer les CORS pour un frontend hébergé sur une origine différente, exécutez:
azd env set ALLOWED_ORIGIN https://<your-domain.com>
azd up
Vous ne pouvez fonctionner localement qu'après avoir réussi à exécuter la commande azd up
.
azd auth login
azd env get-values > .env
pour obtenir les variables d'environnement pour l'applicationaz login
npm start
ou exécutez la "Tâche VS Code: Démarrez l'application" pour démarrer le projet localement. Une fois dans l'application Web:
Le service API de recherche implémente le protocole HTTP pour les applications de chat AI. Il peut être échangé avec n'importe quel service qui implémente le même protocole, comme le client Backend Python dans ce référentiel au lieu de l'implémentation Node.js présenté dans ce référentiel.
Pour ce faire, suivez ces étapes:
azd env get-values | grep WEBAPP_URI
pour obtenir l'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>
. Si vous souhaitez utiliser l'application Web déployée, exécutez azd up
vers le redéploiement.
Si vous souhaitez utiliser l'application Web locale sur votre machine ou en codes, exécutez:
# 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=webapp
Cet échantillon est composé par deux applications: un service backend et une API, déployés sur les applications de conteneurs Azure, et une application frontal, déployée sur les applications Web statiques Azure. Par défaut, l'application Azure Container déployée n'aura aucune restriction d'authentification ou d'accès activée, ce qui signifie que toute personne ayant un accès réseau routable à l'application Container peut discuter avec vos données indexées. Vous pouvez avoir besoin d'authentification à votre ID Azure ENTRA en suivant le didacticiel Add Container App Authentication et le définir contre l'application Azure Container déployée.
Pour limiter l'accès à un ensemble spécifique d'utilisateurs ou de groupes, vous pouvez suivre les étapes de restreindre votre application Azure ENTRA à un ensemble d'utilisateurs en modifiant "Affectation requise?" Option sous l'application Enterprise, puis attribuer des utilisateurs / groupes à accès. Les utilisateurs non accordés à l'accès explicite recevront le message d'erreur -aadsts50105: votre administrateur a configuré l'application <app_name> pour bloquer les utilisateurs à moins qu'ils ne soient spécifiquement accordés («attribué») accès à l'application.
Cet échantillon est conçu pour être un point de départ pour votre propre application de production, mais vous devez faire un examen approfondi de la sécurité et des performances avant de se déployer en production. Voici quelques choses à considérer:
chatGptDeploymentCapacity
et embeddingDeploymentCapacity
dans infra/main.bicep
à la capacité maximale de votre compte. Vous pouvez également afficher l'onglet quotas dans Azure Openai Studio pour comprendre la capacité que vous avez.Standard_LRS
SKU. Pour améliorer votre résilience, nous vous recommandons d'utiliser Standard_ZRS
pour les déploiements de production, que vous pouvez spécifier à l'aide de la propriété sku
sous le module storage
dans infra/main.bicep
.Standard
avec l'option de recherche sémantique gratuite, qui vous donne 1000 requêtes gratuites par mois. En supposant que votre application éprouvera plus de 1000 questions, vous devez soit modifier semanticSearch
en "standard" ou désactiver entièrement la recherche sémantique dans les options de demande. Si vous voyez des erreurs sur le dépassement de la capacité de service de recherche, vous pouvez trouver utile d'augmenter le nombre de répliques en modifiant replicaCount
dans infra/core/search/search-services.bicep
ou en le faisant à l'échelle manuelle à partir du portail Azure.Le Chunking nous permet de limiter la quantité d'informations que nous envoyons à OpenAI en raison de limites de jetons. En cassant le contenu, il nous permet de trouver facilement des morceaux de texte potentiels que nous pouvons injecter dans OpenAI. La méthode de section que nous utilisons exploite une fenêtre de texte coulissante telle que les phrases qui terminent un morceau commencera la suivante. Cela nous permet de réduire les chances de perdre le contexte du texte.
Pour télécharger plus de documents, mettez-les dans les données / dossier et exécutez ./scripts/index-data.sh
ou ./scripts/index-data.ps1
.
Un autre référentiel populaire pour ce cas d'utilisation est ici: https://github.com/microsoft/sample-app-aoai-chatgpt/
Ce référentiel est conçu pour être utilisé par les clients utilisant Azure Openai Studio et Azure Portal pour la configuration. Il comprend également la prise en charge azd
aux gens qui souhaitent le déployer complètement à partir de zéro.
Les principales différences:
Comparaison des fonctionnalités:
Fonctionnalité | azur-search-openai-javascrip | échantillon-app-aoai-chatpt |
---|---|---|
Approche de chiffon | Plusieurs approches | Uniquement via l'API ChatCompletion Data_Sources |
Support vectoriel | ✅ Oui | ✅ Oui |
Ingestion de données | ✅ Oui (MD) | ✅ Oui (PDF, TXT, MD, HTML) |
Historique de chat persistant | Non (onglet du navigateur uniquement) | ✅ Oui, dans Cosmosdb |
Comparaison de la technologie:
Technologie | azur-search-openai-javascrip | échantillon-app-aoai-chatpt |
---|---|---|
L'extrémité avant | Réagir / allumé | Réagir |
Backend | Node.js (Fastify) | Python (flacon) |
Vector DB | Recherche Azure AI | Recherche Azure AI |
Déploiement | Développeur Azure CLI (AZD) | Azure Portal, AZ, AZD |
Exécutez ces commandes:
azd env set AZURE_OPENAI_CHATGPT_MODEL gpt-4
Vous devrez peut-être également ajuster la capacité dans le fichier infra/main.bicep
, selon la quantité de TPM que votre compte est autorisé.
L'onglet Chat utilise l'approche programmée dans le chat-read-reserieve-read.ts. L'onglet ASK utilise l'approche programmée dans Ask-Retrieve-then-read.ts. Il y a aussi une autre approche / Ask disponibles, [en utilisant un agent] (https://github.com/azure-samples/azure-search-openai-javascript/blob/main/packages/search/src/lib/approaches/ask-read-rereverieve-read.ts.
La commande azd up
provient du développeur Azure CLI et s'occupe à la fois de provisionner les ressources Azure et de déploier du code aux hôtes Azure sélectionnés.
La commande azd up
utilise le fichier azure.yaml
combiné avec les fichiers .bicep
d'infrastructure dans le dossier infra/
. Le fichier azure.yaml
pour ce projet déclare plusieurs "crochets" pour les étapes de pré-braquage et les étapes de postprovision. La commande up
exécute d'abord le crochet prepackage
qui installe les dépendances de nœuds et construit les fichiers JavaScript basés sur React.js. Il emballe ensuite tout le code (Frontend et Backend Services) dans un fichier zip qu'il déploiera plus tard.
Ensuite, il prévoit les ressources basées sur main.bicep
et main.parameters.json
. À ce stade, comme il n'y a pas de valeur par défaut pour l'emplacement des ressources OpenAI, il vous demande de choisir un emplacement à partir d'une courte liste des régions disponibles. Ensuite, il enverra des demandes à Azure pour provisionner toutes les ressources requises. Avec tout ce qui est fourni, il exécute le crochet postprovision
pour traiter les données locales et l'ajouter à un index de recherche Azure AI.
Enfin, il examine azure.yaml
pour déterminer l'hôte Azure (applications conteneur et applications Web statiques, dans ce cas) et télécharge le service Azure App sur Azure. La commande azd up
est maintenant terminée, mais il peut prendre quelques minutes pour que l'application soit entièrement disponible et fonctionne après le déploiement initial.
Les commandes connexes sont azd provision
pour simplement provisionner (si les fichiers infra changent) et azd deploy
pour le déploiement du code d'application mis à jour.
Voici les scénarios et solutions de défaillance les plus courants:
L'abonnement ( AZURE_SUBSCRIPTION_ID
) n'a pas accès au service Azure Openai. Veuillez vous assurer que AZURE_SUBSCRIPTION_ID
correspond à l'ID spécifié dans le processus de demande d'accès OpenAI.
Vous essayez de créer des ressources dans des régions non activées pour Azure Openai (par exemple, l'est des États-Unis 2 au lieu de l'est des États-Unis), ou où le modèle que vous essayez d'utiliser n'est pas activé. Voir cette matrice de la disponibilité du modèle.
Vous avez dépassé un quota, le plus souvent un nombre de ressources par région. Voir cet article sur les quotas et les limites.
Vous obtenez des conflits de «même nom de ressource non autorisé». C'est probablement parce que vous avez exécuté l'échantillon plusieurs fois et supprimé les ressources que vous avez créées à chaque fois, mais que vous oubliez de les purger. Azure conserve des ressources pendant 48 heures, sauf si vous purgez de la suppression douce. Voir cet article sur la purge des ressources.
Après avoir azd up
et visiter le site Web, vous voyez un «404 non trouvé» dans le navigateur. Attendez 10 minutes et réessayez, car cela pourrait être encore en train de commencer. Ensuite, essayez d'exécuter azd deploy
et attendez à nouveau. Si vous rencontrez toujours des erreurs avec l'application déployée, consultez ces conseils pour déboguer les déploiements d'applications d'application et déposer un problème si les journaux d'erreur ne vous aident pas à résoudre le problème.
Vous obtenez une erreur 401 Principal does not have access to API/Operation
lors de l'exécution du projet localement ou en essayant de se déployer. C'est probablement parce que vos variables d'environnement incluent AZURE_TENANT_ID
, AZURE_CLIENT_ID
et AZURE_CLIENT_SECRET
. Vous devez soit accorder des autorisations au directeur de service connexes, soit supprimer ces variables de votre environnement pour assurer un accès normal. Pour plus de détails, veuillez vous référer au SDK Azure Identity.
Remarque: Les documents utilisés dans cette démo contiennent des informations générées à l'aide d'un modèle de langue (service Azure OpenAI). Les informations contenues dans ces documents sont uniquement à des fins de démonstration et ne reflètent pas les opinions ou les croyances de Microsoft. Microsoft ne fait aucune représentation ou garantie d'aucune sorte, expresse ou implicite, sur l'exhaustivité, l'exactitude, la fiabilité, la pertinence ou la disponibilité en ce qui concerne les informations contenues dans ce document. Tous droits réservés à Microsoft.