Этот образец демонстрирует несколько подходов к созданию CATGPT-подобного опыта по сравнению с вашими собственными данными, используя шаблон получения дополнительной генерации поиска. Он использует Azure Openai Service для доступа к модели CHATGPT (GPT-35-Turbo) и Azure AI Search для индексации и поиска данных.

Репо включает примеры данных, поэтому он готов попробовать закончить до конца. В этом примере приложения мы используем фиктивную компанию под названием Contoso Real Estate, и этот опыт позволяет его клиентам задавать вопросы поддержки об использовании своих продуктов. Пример данных включает в себя набор документов, которые описывают его условия обслуживания, политику конфиденциальности и руководство по поддержке.
Приложение сделано из нескольких компонентов, в том числе:


Посмотрите видео обзора приложения
ВАЖНО: Чтобы развернуть и запустить этот образец, вам понадобится:
Microsoft.Authorization/roleAssignments/write разрешения, такие как администратор управления доступа на основе ролей, администратор доступа пользователя или владелец. Если у вас нет разрешений на уровне подписки, они должны быть предоставлены вам с RBAC для существующей группы ресурсов и развертываться в этой существующей группе.Microsoft.Resources/deployments/write разрешения на уровень подписки. Цены могут варьироваться в зависимости от региона и использования. Точные затраты не могут быть оценены. Вы можете попробовать калькулятор ценообразования Azure для приведенных ниже ресурсов.
azd down --purge .
Есть несколько способов успешной настройки этого проекта.
Самый простой способ начать с кодами GitHub, которые предоставляют предварительные фигурации для настройки всех инструментов для вас. Подробнее читайте ниже. В качестве альтернативы вы можете настроить локальную среду, разыгрывая инструкции ниже.
Вы можете запустить это репо практически, используя GitHub Codespaces, который откроет веб-код VS в вашем браузере:
Аналогичным вариантом на Codespaces является удаленные контейнеры с кодом, которые откроют проект в вашем экземпляре кода локального VS с использованием расширения контейнеров Dev:
pwsh.exe от команды PowerShell. Если это не удается, вам, вероятно, нужно обновить PowerShell.Затем получите код проекта:
azd auth loginazd init -t azure-search-openai-javascriptВыполните следующую команду, если у вас нет ранее существовавших служб Azure и вы хотите начать с нового развертывания.
azd up - это предоставит Azure Resources и развернете этот образец для этих ресурсов, включая создание индекса поиска на основе файлов, найденных в папке ./data .eastus2 . Вы можете установить другое место с azd env set AZURE_OPENAI_RESOURCE_GROUP_LOCATION {location} . В настоящее время принимается только короткий список мест. Этот список местоположения основан на таблице доступности модели OpenAI и может устареть в качестве изменения доступности.eastus2 . Вы можете установить другое место с azd env set AZURE_WEBAPP_LOCATION {location} . В настоящее время принимается только короткий список мест. Обратите внимание, что статическое веб -приложение - это глобальный сервис, и выбранное вами местоположение повлияет только на приложение управляемых функций, которое не используется в этом образце.Это будет выглядеть следующим образом:

Примечание: для полного развертывания приложения может потребоваться более 15 минут.
Если у вас уже есть существующие ресурсы Azure, вы можете повторно использовать их, установив значения среды 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} . Требуется только в том случае, если ваше развертывание CHATGPT не является чатом по умолчанию.azd env set AZURE_OPENAI_EMBEDDING_DEPLOYMENT {Name of existing GPT embedding deployment} . Требуется только в том случае, если ваши внедрения не являются «внедрением» по умолчанию. 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 , то запустите azd env set AZURE_SEARCH_SERVICE_LOCATION {Location of existing service}azd env set AZURE_SEARCH_SERVICE_SKU {Name of SKU} . Бесплатный уровень не будет работать, поскольку он не поддерживает управляемую личность. (См. Другие возможные значения) Вы также можете использовать существующую учетную запись хранения. azd env set ./infra/main.parameters.json
Теперь вы можете запустить azd up , следуя шагам развертывания с нуля выше. Это будет обеспечить ресурсы и развернуть код.
Если вы только изменили код Backend/Frontend в папке app , вам не нужно повторно предоставлять ресурсы Azure. Вы можете просто бежать:
azd deploy
Если вы изменили файлы инфраструктуры ( infra Polder или azure.yaml ), вам нужно будет повторно предоставить ресурсы Azure. Вы можете сделать это, работая:
azd up
Чтобы дать кому -то еще доступ к полностью развернутой и существующей среде, либо вы, либо они можете выполнить эти шаги:
azd init -t azure-search-openai-javascript или клонировать этот репозиторий.azd env refresh -e {environment name} им понадобится имя среды AZD, идентификатор подписки и местоположение для запуска этой команды. Вы можете найти эти значения в вашем файле .azure/{env name}/.env . Это заполнит их файл .env Environment Environment со всеми настройками, необходимыми для запуска приложения локально.AZURE_PRINCIPAL_ID либо в этом файле .env , либо в активной оболочке на их идентификатор Azure, который они могут получить с az ad signed-in-user show ../scripts/roles.ps1 или ./scripts/roles.sh , чтобы назначить все необходимые роли пользователю. Если у них нет необходимого разрешения для создания ролей в подписке, вам может потребоваться запустить этот скрипт для них. Как только сценарий запускается, они должны быть в состоянии запустить приложение локально. Чтобы очистить все ресурсы, созданные этим образцом:
azd down --purgeyyРесурсная группа и все ресурсы будут удалены.
По умолчанию в развернутом веб -приложении Azure не будет включено ограничения на аутентификацию или доступ, то есть любой, у кого есть маршрутный сетевой доступ к веб -приложению, может общаться с вашими индексированными данными. Вы можете потребовать аутентификации на свой идентификатор Azure Entra, следуя учебному пособию Add App Authentication и настроив его на развернутое веб -приложение.
Чтобы затем ограничить доступ к конкретному набору пользователей или групп, вы можете выполнить шаги от ограничения приложения Azure Entra на набор пользователей путем изменения «требуемого назначения?» Опция в приложении Enterprise, а затем назначает доступ пользователям/группам. Пользователи, не предоставленные явным доступом, получат сообщение об ошибке -AADSTS50105: Ваш администратор настроил приложение <pplic_name> блокировать пользователей, если они не будут предоставлены («назначены») доступа к приложению .--
Мы рекомендуем развернуть дополнительные механизмы безопасности. Когда это применимо, рассмотрите возможность настройки VNET или настройку политики прокси.
По умолчанию развернутый поисковый API разрешит запросы только из того же происхождения, что и развернутое происхождение веб -приложения. Чтобы позволить Cors для фронта, размещенного на другом происхождении, запустите:
azd env set ALLOWED_ORIGIN https://<your-domain.com>azd up Вы можете запустить локально только после успешного запуска команды azd up .
azd auth loginazd env get-values > .env чтобы получить переменные среды для приложенияaz loginnpm start или запустите задачу «VS -код: запустить приложение», чтобы запустить проект локально. Однажды в веб -приложении:
Служба поиска API реализует протокол HTTP для приложений для AIT. Его можно поменять на любую службу, которая реализует тот же протокол, как и бэтэнд Python в этом хранилище, а не в реализации Node.js, представленной в этом репо.
Для этого следуйте этим шагам:
azd env get-values | grep WEBAPP_URI , чтобы получить 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> . Если вы хотите использовать развернутое веб -приложение, запустите azd up до RedPloy.
Если вы хотите использовать локальное веб -приложение на своей машине или в CodeSpaces, запустите:
# 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Этот образец состоит из двух приложений: бэкэнд -сервис и API, развернутые в приложениях Azure Container, и приложением Frontend, развернутое в Azure Static Web Apps. По умолчанию приложение для развернутого контейнера Azure не будет включено ограничения аутентификации или доступа, что означает, что любой, у кого есть маршрутизируемый сетевой доступ к приложению контейнера, может общаться с вашими индексированными данными. Вы можете потребовать аутентификации для вашего идентификатора Azure Entra, следуя учебному пособию по аутентификации приложения Add Container и настроив его на развернутое приложение Azure Container.
Чтобы ограничить доступ к конкретному набору пользователей или групп, вы можете выполнить шаги от ограничения вашего приложения Azure Entra до набора пользователей, изменяя «требуемое назначение?» Опция в приложении Enterprise, а затем назначает доступ пользователям/группам. Пользователи, не предоставленные явным доступом, получат сообщение об ошибке -AADSTS50105: Ваш администратор настроил приложение <pplic_name> блокировать пользователей, если они не будут предоставлены («назначены») доступа к приложению .--
Этот образец предназначен для того, чтобы стать отправной точкой для вашего собственного производственного приложения, но вы должны провести тщательный обзор безопасности и производительности перед тем, как развернуть до производства. Вот некоторые вещи, которые следует учитывать:
chatGptDeploymentCapacity и параметры embeddingDeploymentCapacity в infra/main.bicep до максимальной емкости вашей учетной записи. Вы также можете просмотреть вкладку квотов в Azure Openai Studio, чтобы понять, сколько у вас есть возможностей.Standard_LRS . Чтобы повысить вашу устойчивость, мы рекомендуем использовать Standard_ZRS для развертывания производства, которые вы можете указать, используя свойство sku в модуле storage в infra/main.bicep .Standard SKU с бесплатным параметром семантического поиска, который дает вам 1000 бесплатных запросов в месяц. Предполагая, что ваше приложение будет испытывать более 1000 вопросов, вы должны либо изменить semanticSearch на «стандартный», либо отключить семантический поиск полностью в вариантах запроса. Если вы видите ошибки по поводу превышения потенциала поиска, вам может быть полезным увеличить количество реплик, изменяя replicaCount в infra/core/search/search-services.bicepChunking позволяет нам ограничить объем информации, которую мы отправляем в OpenAI из -за пределов токенов. Разбивая контент, он позволяет нам легко найти потенциальные куски текста, которые мы можем ввести в OpenAI. Метод подсчета мы используем раздвижное окно текста, такое, что предложения, которые заканчивают один кусок, начнут следующее. Это позволяет нам уменьшить вероятность потерять контекст текста.
Чтобы загрузить больше документов, поместите их в папку данных и запустите ./scripts/index-data.sh или ./scripts/index-data.ps1 .
Еще один популярный репозиторий для этого варианта использования здесь: https://github.com/microsoft/sample-app-aoai-chatgpt/
Этот репозиторий предназначен для использования клиентами, использующими Azure Openai Studio и портал Azure для настройки. Это также включает в себя поддержку azd для людей, которые хотят полностью развернуть его с нуля.
Основные различия:
Сравнение функций:
| Особенность | Azure-Search-Openai-Javascript | Образец-ап-аай-чатгпт |
|---|---|---|
| Тряпичный подход | Несколько подходов | Только через api chatcomplotion data_sources |
| Векторная поддержка | ✅ Да | ✅ Да |
| Проглатывание данных | ✅ Да (MD) | ✅ Да (PDF, TXT, MD, HTML) |
| Постоянная история чата | Нет (только вкладка браузера) | ✅ Да, в Cosmosdb |
Сравнение технологий:
| Технический | Azure-Search-Openai-Javascript | Образец-ап-аай-чатгпт |
|---|---|---|
| Внешний интерфейс | Реагировать/горит | Реагировать |
| Бэкэнд | Node.js (Фордификация) | Питон (колба) |
| Вектор дБ | Azure AI Search | Azure AI Search |
| Развертывание | Разработчик Azure CLI (AZD) | Azure Portal, AZ, AZD |
Запустите эти команды:
azd env set AZURE_OPENAI_CHATGPT_MODEL gpt-4 Вам также может потребоваться скорректировать емкость в файле infra/main.bicep , в зависимости от того, сколько TPM разрешена ваша учетная запись.
Вкладка «Чат» использует подход, запрограммированный в чате-чтение-retreie-read.ts. Вкладка Ask использует подход, запрограммированный в Ask-retreief-then-read.ts. Существует также еще один подход к одному/ASK, [используя агента] (https://github.com/azure-samples/azure-search-openai-javascript/blob/main/packages/search/src/lib/appoachs/ask-retive-read-read.ts.
Команда azd up поступает от CLI Dazure Developer CLI и заботится как о предоставлении ресурсов Azure, так и для развертывания кода для выбранных хостов Azure.
Команда azd up использует файл azure.yaml в сочетании с файлами инфраструктуры как кода .bicep в infra/ папке. Файл azure.yaml для этого проекта объявляет несколько «крючков» для шага расфасования и шагов постпровидцы. Команда up сначала запускает крюк prepackage , который устанавливает зависимости узлов и создает файлы JavaScript на основе React.js. Затем он упаковывает весь код (как Frontend, так и на бэкэнд -службах) в zip -файл, который он будет развернуть позже.
Далее это предоставляет ресурсы, основанные на main.bicep и main.parameters.json . На этом этапе, поскольку для места для ресурса Openai нет значения по умолчанию, он просит вас выбрать место в коротком списке доступных регионов. Затем он отправит запросы в Azure, чтобы предоставить все необходимые ресурсы. Со всем, что подготовлено, он запускает крюк postprovision для обработки локальных данных и добавления его в индекс поиска Azure AI.
Наконец, он смотрит на azure.yaml , чтобы определить хост Azure (в данном случае приложения для контейнеров и статические веб -приложения) и загружает службу приложений Zip в Azure. Команда azd up теперь завершена, но для приложения может потребоваться несколько минут, чтобы приложение было полностью доступно и работало после первоначального развертывания.
Связанные команды являются azd provision для просто предоставления (если изменяются в инфра -файлах) и azd deploy для простого развертывания обновленного кода приложения.
Вот наиболее распространенные сценарии и решения неудачи:
Подписка ( AZURE_SUBSCRIPTION_ID ) не имеет доступа к службе Azure OpenAI. Пожалуйста, убедитесь, что AZURE_SUBSCRIPTION_ID соответствует идентификатору, указанному в процессе запроса на доступ к Openai.
Вы пытаетесь создать ресурсы в регионах, не включенных для Azure OpenAI (например, Eg East US 2 вместо восточного США), или где модель, которую вы пытаетесь использовать, не включена. Смотрите эту матрицу доступности модели.
Вы превысили квоту, чаще всего количество ресурсов на регион. Смотрите эту статью о квотах и ограничениях.
Вы получаете «то же имя ресурса, не разрешенное» конфликты. Это, вероятно, потому, что вы запускаете образец несколько раз и удаляли ресурсы, которые вы создавали каждый раз, но забываете их очистить. Azure сохраняет ресурсы в течение 48 часов, если вы не очистите от мягкого удаления. Смотрите эту статью о чистке ресурсов.
После запуска azd up и посещения веб -сайта вы видите «404 не найден» в браузере. Подождите 10 минут и попробуйте еще раз, так как это может быть все еще запускаться. Затем попробуйте запустить azd deploy и подождать снова. Если вы все еще сталкиваетесь с ошибками в приложении развернутого приложения, обратитесь к этим советам по отладке приложений приложения развертывания и подать проблему, если журналы ошибок не помогут вам решить проблему.
Вы получаете ошибку 401 Principal does not have access to API/Operation при запуске проекта локально или пытается развернуть. Вероятно, это потому, что переменные вашей среды включают AZURE_TENANT_ID , AZURE_CLIENT_ID и AZURE_CLIENT_SECRET . Вы должны либо предоставить разрешения соответствующему принципалу услуги , либо удалить эти переменные из вашей среды, чтобы обеспечить нормальный доступ. Для получения более подробной информации, пожалуйста, обратитесь к Azure Identity SDK.
ПРИМЕЧАНИЕ. Документы, используемые в этой демонстрации, содержат информацию, сформированную с использованием языковой модели (Azure Open Service). Информация, содержащаяся в этих документах, предназначена только для демонстрационных целей и не отражает мнения или убеждения Microsoft. Microsoft не делает никаких представлений или гарантий любого рода, явного или подразумеваемого, о полноте, точности, надежности, пригодности или доступности в отношении информации, содержащейся в этом документе. Все права защищены на Microsoft.