Дата публикации
ai_products

Пошаговый гид: как собрать RAG‑чат на Azure OpenAI и Azure DocumentDB (MongoDB) без лишних сервисов

Что нового

Microsoft предлагает довольно приземлённый, но полезный сценарий: собрать RAG‑чат (retrieval‑augmented generation) на Azure целиком из готовых сервисов, без отдельного векторного хранилища и сложной синхронизации.

Главные элементы конструктора:

  • Azure DocumentDB с совместимостью с MongoDB (Cosmos DB for MongoDB vCore)

    • Хранит обычные JSON‑документы и векторные эмбеддинги в одном кластере.
    • Поддерживает vector search по тем же данным.
    • Разворачивается как кластер MongoDB vCore, в гайде используется конфигурация M25, 2 vCore (Burstable), 32 GiB.
  • Azure OpenAI Service

    • Два развёртывания на одном ресурсе:
      • чат‑модель gpt‑35‑turbo, версия 0301;
      • эмбеддинги text‑embedding‑ada‑002, версия 2.
    • Через Azure OpenAI Studio можно управлять деплойментами, ключами и endpoint.
  • Azure App Service (Linux, Python 3.10)

    • Веб‑приложение для чата на Python.
    • Непрерывный деплой из GitHub‑репозитория.
    • Настройки приложения (environment variables) связывают App Service с Azure OpenAI и Cosmos DB.
  • Готовый пример RAG‑приложения

    • Репозиторий: github.com/john0isaac/rag-semantic-kernel-mongodb-vcore.
    • Включает скрипт scripts/add_data.py для загрузки данных и генерации эмбеддингов.
    • Позволяет сравнить ответы чата до и после подключения собственной базы знаний.

Никаких новых моделей или тарифов здесь нет — ценность в том, что Microsoft показывает полностью рабочий стек: от базы до фронта, с конкретными настройками и командами.

Как это работает

Сценарий простой: вы собираете корпоративный чат‑бот, который должен отвечать не только «по модели», но и по вашим документам. Для этого используется классическая схема RAG:

  1. Подготовка данных

    • Вы храните документы в Azure DocumentDB (Cosmos DB for MongoDB vCore) как обычные JSON.
    • Для каждого текста вызываете Azure OpenAI эмбеддинг‑деплоймент text-embedding-ada-002.
    • Вектор эмбеддинга сохраняете в том же документе (в отдельном поле массива чисел).
  2. Векторный поиск в DocumentDB

    • При пользовательском запросе приложение снова вызывает text-embedding-ada-002 для вопроса.
    • Полученный вектор используется в vector search по коллекции MongoDB в Azure DocumentDB.
    • База возвращает несколько наиболее близких документов по косинусной близости или похожей метрике.
  3. RAG‑оркестрация через LangChain

    • Приложение на Python использует LangChain как «клей» между сервисами:
      • коннектор к MongoDB (через строку подключения Cosmos DB);
      • цепочка, которая берёт релевантные документы и формирует prompt для чат‑модели;
      • вызов чат‑деплоймента gpt‑35‑turbo (0301) через Azure OpenAI SDK или REST.
  4. Генерация ответа

    • LangChain собирает контекст из найденных документов.
    • Отправляет его вместе с вопросом пользователя в чат‑модель gpt-35-turbo.
    • Модель отвечает с опорой на этот контекст.
  5. Хостинг и CI/CD

    • Веб‑приложение разворачивается на Azure App Service (Linux, Python 3.10).
    • App Service подключается к GitHub‑репозиторию и автоматически деплоит изменения из ветки main.
    • Переменные окружения в App Service хранят ключи и имена ресурсов Azure.

Под капотом всё выглядит как вполне стандартный стек: MongoDB‑совместимый кластер Cosmos DB с поддержкой векторного поиска + Azure OpenAI + Python‑приложение на App Service + LangChain как оркестратор.

Что это значит для вас

Если вы строите внутренний чат для компании, документацию‑бота или помощника службы поддержки, здесь есть несколько практических выгод.

Когда это полезно

  1. Вы уже в Azure

    • У вас есть подписка Azure и, возможно, уже используются Cosmos DB и App Service.
    • Тогда этот сценарий позволяет собрать RAG‑бота без добавления нового типа хранилища.
  2. Нужен RAG без поднятия собственной инфраструктуры

    • Не хотите управлять собственным кластером векторной БД (например, Qdrant или Milvus).
    • Azure DocumentDB берёт на себя хранение и векторный поиск, App Service — деплой.
  3. Нужен быстрый прототип для команды

    • Гайд даёт пошаговую инструкцию, как за один проход:
      • создать базу;
      • развернуть OpenAI‑ресурс;
      • подключить GitHub и запустить веб‑чат;
      • загрузить пример данных и проверить, как меняется ответ.
  4. Нужна связка LangChain + Azure OpenAI + MongoDB

    • Если вы строите пайплайн на LangChain, пример показывает, как его правильно «приземлить» на Azure‑сервисы.

Когда это может не подойти

  1. Нет доступа к Azure OpenAI

    • Azure OpenAI требует отдельного одобрения и недоступен из некоторых регионов, включая Россию, без обходных путей.
    • Для работы из России, скорее всего, понадобится VPN, а также юридическая возможность использовать зарубежный облачный сервис.
  2. Очень жёсткие требования к стоимости

    • В гайде используется план App Service Basic B1 и кластер Cosmos DB уровня M25.
    • Для продакшена это может быть слишком дорого или, наоборот, слабовато по нагрузке; придётся отдельно считать бюджет.
  3. Нужен полный on‑prem или локальный стек

    • Если ваша компания не может выносить данные в публичное облако, этот рецепт не подойдёт.
  4. Нужна поддержка русского языка и локальных моделей

    • Azure OpenAI с gpt‑35‑turbo умеет русский, но если вам нужны локальные модели в РФ или on‑prem — придётся смотреть в сторону других решений.

Практический совет

Если вы уже используете Azure и хотите быстро показать коллегам работающий RAG‑чат по вашим данным:

  • повторите шаги из гайда на тестовой подписке;
  • начните с минимального объёма документов;
  • оцените стоимость Cosmos DB и OpenAI по фактическому трафику;
  • только после этого масштабируйте конфигурацию под боевую нагрузку.

Место на рынке

В гайде нет прямых сравнений с другими облаками, но по роли в стеке можно сделать несколько выводов.

  • Azure DocumentDB (Cosmos DB for MongoDB vCore)

    • Функционально выполняет ту же задачу, что и специализированные векторные БД (Pinecone, Qdrant, Weaviate) — хранит эмбеддинги и даёт vector search.
    • Плюс: не нужно тянуть ещё один сервис, если у вас уже есть MongoDB‑совместимые приложения.
    • Минус: если вы уже живёте, например, в AWS или GCP, придётся заводить отдельную инфраструктуру в Azure ради этого сценария.
  • Azure OpenAI vs «чистый» OpenAI

    • Здесь используется gpt‑35‑turbo 0301 и text‑embedding‑ada‑002 v2 через Azure.
    • С точки зрения качества ответов это те же модели, что доступны через API OpenAI, но с биллингом и ограничениями Azure.
    • Плюс: проще интегрировать с другими Azure‑сервисами (ключи, приватные сети, RBAC).
  • App Service vs контейнеры / Kubernetes

    • App Service удобен для быстрого старта и прототипов: вы просто пушите код в GitHub, а Azure сам разворачивает приложение.
    • Для сложных продакшн‑нагрузок с микросервисами и кастомной сетью чаще используют AKS или другие оркестраторы.

Если вы уже платите за Azure и хотите собрать RAG‑приложение без дополнительной векторной БД, этот стек выглядит логичным. Если ваша инфраструктура в другом облаке, аналогичный сценарий придётся реализовывать на местных сервисах.

Как это работает по шагам

Ниже — сжатый, но полный план из гайда. Он рассчитан на то, что у вас есть:

  • подписка Azure (или бесплатный аккаунт / Azure for Students);
  • аккаунт GitHub.

1. Создание Azure DocumentDB (Cosmos DB for MongoDB vCore)

  1. Зайдите в Azure Portal и авторизуйтесь.
  2. В поиске вверху введите mongodb vcore и выберите Azure Cosmos DB for MongoDB (vCore).
  3. Нажмите Create.
  4. Заполните поля:
    • Subscription — нужная подписка (лучше одна и та же для всех ресурсов).
    • Resource groupCreate new, введите уникальное имя.
    • Cluster name — глобально уникальное имя.
    • Location — ближайший регион, в гайде используется UK South.
    • MongoDB version — последняя доступная.
  5. Нажмите Configure и задайте параметры кластера:
    • Cluster tierM25, 2 (Burstable) vCores.
    • Storage32 GiB.
  6. Нажмите Save.
  7. Задайте Admin Username и Password, сохраните их в менеджере паролей.
  8. Перейдите на вкладку сети (Next):
    • включите Allow Public Access from Azure services and resources within the Azure to this cluster;
    • нажмите Add current IP address, чтобы добавить свой IP в firewall.
  9. Нажмите Review + create, проверьте настройки и снова Create.

Развёртывание кластера может занять до 10 минут.

2. Создание Azure OpenAI и деплой моделей

2.1. Azure OpenAI ресурс

  1. В портале Azure введите в поиске openai и выберите Azure OpenAI.
  2. Нажмите Create.
  3. Заполните поля:
    • Subscription — та же, на которую вы запрашивали доступ к Azure OpenAI.
    • Resource group — тот же ресурсный набор, что и для Cosmos DB.
    • Region — например, UK South.
    • Name — глобально уникальное имя ресурса.
    • Pricing tierS0 (других в гайде нет).
  4. Нажимайте Next, подтверждая сеть и теги.
  5. Нажмите Create и дождитесь окончания деплоя.
  6. Нажмите Go to resource, чтобы увидеть endpoint и API‑ключи (раздел Keys and Endpoint).

2.2. Деплой чат‑модели и эмбеддингов

  1. В ресурсе Azure OpenAI нажмите Go to Azure OpenAI Studio.
  2. В студии выберите Create new deployment (вкладка Deployments).
  3. Нажмите + Create new deployment.
  4. Для чат‑модели:
    • Select a modelgpt-35-turbo.
    • Model version0301.
    • Deployment name — любое уникальное, например chat-model.
    • Нажмите Create.
  5. Снова + Create new deployment.
  6. Для эмбеддингов:
    • Select a modeltext-embedding-ada-002.
    • Model version2.
    • Deployment name — например, embedding-model.
    • Нажмите Create.

3. Форк репозитория с примером RAG‑приложения

  1. Откройте в браузере: https://github.com/john0isaac/rag-semantic-kernel-mongodb-vcore.
  2. Авторизуйтесь в GitHub.
  3. Нажмите Fork.
  4. Выберите владельца форка (личный аккаунт или организация).
  5. Нажмите Create fork.

4. Создание Azure App Service и привязка к GitHub

  1. В Azure Portal введите в поиске app service и выберите App Services.
  2. Нажмите Create Web App.
  3. В разделе Basics:
    • Subscription — та же.
    • Resource group — тот же, что и раньше.
    • Name — уникальное имя сайта, например rag-mongodb-demo.
    • PublishCode.
    • Runtime stackPython 3.10.
    • Operating SystemLinux.
    • RegionUK South (как и другие ресурсы).
  4. Настройка App Service Plan:
    • Linux Plan — существующий или создайте новый.
    • Pricing PlanBasic B1.
  5. Перейдите во вкладку Deployment:
    • Continuous deploymentEnable.
    • GitHub account — ваш аккаунт.
    • Organization — ваш аккаунт или организация.
    • Repositoryrag-semantic-kernel-mongodb-vcore (ваш форк).
    • Branchmain.
  6. Нажмите Review + create, проверьте настройки и нажмите Create.
  7. После деплоя нажмите Go to resource.

5. Настройка переменных окружения в App Service

  1. В ресурсе Web App откройте меню Configuration.

  2. В разделе Application settings нажмите + New application setting.

  3. Добавьте настройки для Azure OpenAI (значения — ваши):

    • AZURE_OPENAI_CHAT_DEPLOYMENT_NAME<chatModelDeploymentName>
    • AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME<embeddingModelDeploymentName>
    • AZURE_OPENAI_DEPLOYMENT_NAME<azureOpenAiResourceName>
    • AZURE_OPENAI_ENDPOINThttps://<azureOpenAiResourceName>.openai.azure.com/
    • AZURE_OPENAI_API_KEY<azureOpenAiResourceKey>

    Ключи берутся на странице ресурса Azure OpenAI, раздел Keys and Endpoint.

  4. Добавьте настройки для Cosmos DB for MongoDB vCore:

    • AZCOSMOS_APImongo-vcore
    • AZCOSMOS_CONNSTRmongodb+srv://<mongoAdminUser>:<mongoAdminPassword>@<mongoClusterName>.global.mongocluster.cosmos.azure.com/?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000

    Строку подключения можно скопировать на странице ресурса Cosmos DB (вкладка Connection strings). Обязательно подставьте свои пользователя и пароль.

  5. Добавьте настройки, которые создадутся приложением при старте (любые валидные имена):

    • AZCOSMOS_DATABASE_NAME<cosmosDatabaseName>
    • AZCOSMOS_CONTAINER_NAME<cosmosContainerName>
  6. Нажмите Save.

  7. Перейдите во вкладку General settings.

  8. В поле Startup command укажите:

    entrypoint.sh
    
  9. Сохраните изменения.

6. Настройка GitHub Workflow для деплоя

  1. Откройте свой форк репозитория на GitHub.

  2. Вкладка Actions покажет, что workflow падает.

  3. Зайдите в файл .github/workflows/main_ragmongodbdemo.yml.

  4. Нажмите на значок карандаша для редактирования.

  5. Измените строки 31 и 36 на:

    31 run: cd src && pip install -r ./requirements.txt
    36 run: cd src && zip ../release.zip ./* -r
    
  6. Нажмите Commit changes, при необходимости добавьте комментарий к коммиту.

  7. Перейдите во вкладку Actions и дождитесь успешного выполнения workflow.

7. Тестирование RAG‑чата до и после загрузки данных

  1. В Azure Portal откройте ресурс Web App.

  2. На вкладке Overview или в GitHub Actions найдите URL вашего сайта и перейдите по нему.

  3. В открывшемся чате отправьте сообщение:

    What is Azure Functions?

    На этом этапе бот должен ответить чем‑то вроде I don't know.

  4. Вернитесь в ресурс Web App в Azure и откройте SSH.

  5. Нажмите Go, чтобы открыть терминал.

  6. В терминале выполните команду:

    python ./scripts/add_data.py
    

    Скрипт загрузит данные в Cosmos DB и создаст эмбеддинги.

  7. Вернитесь на страницу сайта и снова задайте вопрос:

    What is Azure Functions?

    Теперь бот должен ответить уже на основе загруженной документации.

Установка / Как запустить

Ниже — сводная инструкция, если вы хотите просто повторить сценарий без лишних пояснений.

  1. Подготовьте аккаунты

    • Зарегистрируйте Azure (можно бесплатный аккаунт или Azure for Students).
    • Создайте/используйте аккаунт GitHub.
  2. Разверните Cosmos DB for MongoDB vCore

    • В Azure Portal: mongodb vcoreAzure Cosmos DB for MongoDB (vCore)Create.
    • Кластер: M25, 2 vCores (Burstable), 32 GiB, регион UK South.
    • Включите доступ из Azure и свой IP.
  3. Создайте Azure OpenAI ресурс

    • Поиск openaiAzure OpenAICreate.
    • Регион UK South, тариф S0.
  4. Деплойте модели

    • В Azure OpenAI Studio создайте два деплоймента:
      • gpt-35-turbo, версия 0301 (чат);
      • text-embedding-ada-002, версия 2 (эмбеддинги).
  5. Сделайте форк репозитория

    https://github.com/john0isaac/rag-semantic-kernel-mongodb-vcore
    
  6. Создайте App Service (Python 3.10, Linux)

    • Web App → Create Web App.
    • Runtime: Python 3.10, OS: Linux, план: Basic B1.
    • Включите Continuous deployment из вашего форка GitHub, ветка main.
  7. Настройте переменные окружения

    В разделе Configuration → Application settings добавьте:

    AZURE_OPENAI_CHAT_DEPLOYMENT_NAME=<chatModelDeploymentName>
    AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME=<embeddingModelDeploymentName>
    AZURE_OPENAI_DEPLOYMENT_NAME=<azureOpenAiResourceName>
    AZURE_OPENAI_ENDPOINT=https://<azureOpenAiResourceName>.openai.azure.com/
    AZURE_OPENAI_API_KEY=<azureOpenAiResourceKey>
    
    AZCOSMOS_API=mongo-vcore
    AZCOSMOS_CONNSTR=mongodb+srv://<mongoAdminUser>:<mongoAdminPassword>@<mongoClusterName>.global.mongocluster.cosmos.azure.com/?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000
    
    AZCOSMOS_DATABASE_NAME=<cosmosDatabaseName>
    AZCOSMOS_CONTAINER_NAME=<cosmosContainerName>
    

    В General settings задайте startup‑команду:

    entrypoint.sh
    
  8. Почините workflow в GitHub

    В .github/workflows/main_ragmongodbdemo.yml измените команды:

    run: cd src && pip install -r ./requirements.txt
    run: cd src && zip ../release.zip ./* -r
    
  9. Загрузите данные и протестируйте

    • Откройте сайт, спросите: What is Azure Functions? — бот не знает.

    • В SSH терминале App Service выполните:

      python ./scripts/add_data.py
      
    • Снова спросите What is Azure Functions? — бот отвечает уже по документации.

Что делать после экспериментов

Когда закончите тесты, чтобы не тратить деньги подписки, удалите ресурсы:

  • удалите весь Resource Group — тогда удалятся все связанные ресурсы;
  • или удалите Cosmos DB, App Service и OpenAI по отдельности.

Если сценарий показался полезным, дальше имеет смысл:

  • заменить примерные данные на ваши документы (в репозитории есть инструкция в README);
  • подстроить промпты и цепочки LangChain под ваш домен;
  • добавить авторизацию и логирование запросов для продакшена.

Читайте также