Руководство. Использование Кэш Azure для Redis в качестве семантического кэша

В этом руководстве вы используете Кэш Azure для Redis в качестве семантического кэша с моделью большого языка на основе ИИ (LLM). Служба Azure OpenAI используется для создания ответов LLM на запросы и кэширования этих ответов с помощью Кэш Azure для Redis, предоставления более быстрых ответов и снижения затрат.

Так как Кэш Azure для Redis предлагает встроенные возможности поиска векторов, вы также можете выполнять семантические кэширования. Вы можете возвращать кэшированные ответы для идентичных запросов, а также для запросов, которые похожи в значении, даже если текст не совпадает.

В этом руководстве описано следующее:

  • Создание экземпляра Кэш Azure для Redis, настроенного для семантического кэширования
  • Используйте LangChain и другие популярные библиотеки Python.
  • Используйте службу Azure OpenAI для создания текста из моделей ИИ и результатов кэширования.
  • Узнайте, как повысить производительность при использовании кэширования с помощью LLM.

Внимание

В этом руководстве описывается создание Jupyter Notebook. Вы можете следовать этому руководству с файлом кода Python (.py) и получить аналогичные результаты, но вам нужно добавить все блоки кода в этом руководстве в .py файл и выполнить один раз, чтобы просмотреть результаты. Другими словами, Jupyter Notebook предоставляет промежуточные результаты при выполнении ячеек, но это не следует ожидать при работе в файле кода Python.

Внимание

Если вы хотите продолжить работу в завершенной записной книжке Jupyter, скачайте файл записной книжки Jupyter с именем semanticcache.ipynb и сохраните его в новой папке семантики.

Необходимые компоненты

Создание экземпляра кэша Azure для Redis

Следуйте инструкциям из краткого руководства по созданию кэша Redis Enterprise. На странице "Дополнительно" убедитесь, что вы добавили модуль RediSearch и выбрали политику корпоративного кластера. Все остальные параметры могут соответствовать умолчанию, описанному в кратком руководстве.

Создание кэша занимает несколько минут. Вы можете перейти к следующему шагу в то же время.

Снимок экрана: вкладка

Настройка среды разработки

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

  2. Создайте файл Python (tutorial.py) или записную книжку Jupyter (tutorial.ipynb) в папке.

  3. Установите необходимые пакеты Python:

    pip install openai langchain redis tiktoken
    

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

Убедитесь, что у вас есть две модели, развернутые в ресурсе Azure OpenAI:

  • LLM, предоставляющий текстовые ответы. Мы используем модель инструкции GPT-3.5-turbo-instruct для этого руководства.

  • Модель внедрения, которая преобразует запросы в векторы, чтобы их можно было сравнить с прошлыми запросами. Мы используем модель внедрения текста ada-002 (версия 2) для этого руководства.

Дополнительные инструкции см. в статье "Развертывание модели ". Запишите имя, выбранное для каждого развертывания модели.

Импорт библиотек и настройка сведений о подключении

Чтобы успешно выполнить вызов к Azure OpenAI, вам потребуется конечная точка и ключ. Для подключения к Кэш Azure для Redis также требуется конечная точка и ключ.

  1. Перейдите к ресурсу Azure OpenAI в портал Azure.

  2. Найдите конечную точку и ключи в разделе "Управление ресурсами" ресурса Azure OpenAI. Скопируйте конечную точку и ключ доступа, так как требуется для проверки подлинности вызовов API. Пример конечной точки: https://docs-test-001.openai.azure.com. Вы можете использовать KEY1 или KEY2.

  3. Перейдите на страницу обзора ресурса Кэш Azure для Redis в портал Azure. Скопируйте конечную точку.

  4. Найдите ключи Access в разделе "Параметры". Скопируйте ключ доступа. Вы можете использовать Primary или Secondary.

  5. Добавьте следующий код в новую ячейку кода:

       # Code cell 2
    
    import openai
    import redis
    import os
    import langchain
    from langchain.llms import AzureOpenAI
    from langchain.embeddings import AzureOpenAIEmbeddings
    from langchain.globals import set_llm_cache
    from langchain.cache import RedisSemanticCache
    import time
    
    
    AZURE_ENDPOINT=<your-openai-endpoint>
    API_KEY=<your-openai-key>
    API_VERSION="2023-05-15"
    LLM_DEPLOYMENT_NAME=<your-llm-model-name>
    LLM_MODEL_NAME="gpt-35-turbo-instruct"
    EMBEDDINGS_DEPLOYMENT_NAME=<your-embeddings-model-name>
    EMBEDDINGS_MODEL_NAME="text-embedding-ada-002"
    
    REDIS_ENDPOINT = <your-redis-endpoint>
    REDIS_PASSWORD = <your-redis-password>
    
    
  6. Обновите значение и значения ключей API_KEY RESOURCE_ENDPOINT и конечных точек из развертывания Azure OpenAI.

  7. Задайте и EMBEDDINGS_DEPLOYMENT_NAME укажите LLM_DEPLOYMENT_NAME имя двух моделей, развернутых в Службе OpenAI Azure.

  8. Обновите REDIS_ENDPOINT и REDIS_PASSWORD используя значение конечной точки и ключа из экземпляра Кэш Azure для Redis.

    Внимание

    Настоятельно рекомендуется использовать переменные среды или диспетчер секретов, например Azure Key Vault , чтобы передать сведения о ключе API, конечной точке и имени развертывания. Эти переменные задаются в виде открытого текста в целях простоты.

  9. Выполните ячейку кода 2.

Инициализация моделей ИИ

Затем вы инициализируете модели LLM и внедрения

  1. Добавьте следующий код в новую ячейку кода:

       # Code cell 3
    
    llm = AzureOpenAI(
        deployment_name=LLM_DEPLOYMENT_NAME,
        model_name="gpt-35-turbo-instruct",
        openai_api_key=API_KEY,
        azure_endpoint=AZURE_ENDPOINT,
        openai_api_version=API_VERSION,
    )
    embeddings = AzureOpenAIEmbeddings(
        azure_deployment=EMBEDDINGS_DEPLOYMENT_NAME,
        model="text-embedding-ada-002",
        openai_api_key=API_KEY,
        azure_endpoint=AZURE_ENDPOINT,
        openai_api_version=API_VERSION
    )
    
  2. Выполните ячейку кода 3.

Настройка Redis в качестве семантического кэша

Затем укажите Redis в качестве семантического кэша для LLM.

  1. Добавьте следующий код в новую ячейку кода:

       # Code cell 4
    
    redis_url = "rediss://:" + REDIS_PASSWORD + "@"+ REDIS_ENDPOINT
    set_llm_cache(RedisSemanticCache(redis_url = redis_url, embedding=embeddings, score_threshold=0.05))
    

    Внимание

    Значение score_threshold параметра определяет, как аналогичные два запроса должны быть для возврата кэшированного результата. Чем ниже число, тем более похожими должны быть запросы. Вы можете обойти это значение, чтобы точно настроить его в приложении.

  2. Выполните ячейку кода 4.

Запрос и получение ответов от LLM

Наконец, запросите LLM, чтобы получить созданный ИИ ответ. Если вы используете записную книжку Jupyter, можно добавить %%time в верхней части ячейки, чтобы вывести время, затраченное на выполнение кода.

  1. Добавьте следующий код в новую ячейку кода и выполните его:

    # Code cell 5
    %%time
    response = llm("Please write a poem about cute kittens.")
    print(response)
    

    Вы должны увидеть выходные данные и выходные данные, аналогичные следующему:

    Fluffy balls of fur,
    With eyes so bright and pure,
    Kittens are a true delight,
    Bringing joy into our sight.
    
    With tiny paws and playful hearts,
    They chase and pounce, a work of art,
    Their innocence and curiosity,
    Fills our hearts with such serenity.
    
    Their soft meows and gentle purrs,
    Are like music to our ears,
    They curl up in our laps,
    And take the stress away in a snap.
    
    Their whiskers twitch, they're always ready,
    To explore and be adventurous and steady,
    With their tails held high,
    They're a sight to make us sigh.
    
    Their tiny faces, oh so sweet,
    With button noses and paw-sized feet,
    They're the epitome of cuteness,
    ...
    Cute kittens, a true blessing,
    In our hearts, they'll always be reigning.
    CPU times: total: 0 ns
    Wall time: 2.67 s
    

    Отображается Wall time значение 2,67 секунды. Это то, сколько времени в реальном мире потребовалось для запроса LLM и для LLM, чтобы создать ответ.

  2. Снова выполните ячейку 5. Вы должны увидеть одинаковые выходные данные, но с меньшим временем стены:

    Fluffy balls of fur,
    With eyes so bright and pure,
    Kittens are a true delight,
    Bringing joy into our sight.
    
    With tiny paws and playful hearts,
    They chase and pounce, a work of art,
    Their innocence and curiosity,
    Fills our hearts with such serenity.
    
    Their soft meows and gentle purrs,
    Are like music to our ears,
    They curl up in our laps,
    And take the stress away in a snap.
    
    Their whiskers twitch, they're always ready,
    To explore and be adventurous and steady,
    With their tails held high,
    They're a sight to make us sigh.
    
    Their tiny faces, oh so sweet,
    With button noses and paw-sized feet,
    They're the epitome of cuteness,
    ...
    Cute kittens, a true blessing,
    In our hearts, they'll always be reigning.
    CPU times: total: 0 ns
    Wall time: 575 ms
    

    Время стены, как представляется, сокращается коэффициентом пяти-всех до 575 миллисекунда.

  3. Измените запрос на Please write a poem about cute kittens Write a poem about cute kittens и запустите ячейку 5 еще раз. Вы должны увидеть точно те же выходные данные и нижнее время стены, чем исходный запрос. Несмотря на то, что запрос изменился, семантический смысл запроса остался неизменным, поэтому возвращены те же кэшированные выходные данные. Это преимущество семантического кэширования!

Изменение порога сходства

  1. Попробуйте выполнить аналогичный запрос с другим значением, например Please write a poem about cute puppies. Обратите внимание, что кэшированный результат также возвращается здесь. Семантическое значение слова достаточно близко к слову puppies kittens , возвращаемого кэшируемым результатом.

  2. Порог сходства можно изменить, чтобы определить, когда семантический кэш должен возвращать кэшированный результат и когда он должен возвращать новые выходные данные из LLM. В ячейке кода 4 переход с score_threshold 0.05 0.01:

    # Code cell 4
    
    redis_url = "rediss://:" + REDIS_PASSWORD + "@"+ REDIS_ENDPOINT
    set_llm_cache(RedisSemanticCache(redis_url = redis_url, embedding=embeddings, score_threshold=0.01))
    
  3. Повторите запрос Please write a poem about cute puppies . Вы должны получить новые выходные данные, относящиеся к щенкам:

    Oh, little balls of fluff and fur
    With wagging tails and tiny paws
    Puppies, oh puppies, so pure
    The epitome of cuteness, no flaws
    
    With big round eyes that melt our hearts
    And floppy ears that bounce with glee
    Their playful antics, like works of art
    They bring joy to all they see
    
    Their soft, warm bodies, so cuddly
    As they curl up in our laps
    Their gentle kisses, so lovingly
    Like tiny, wet, puppy taps
    
    Their clumsy steps and wobbly walks
    As they explore the world anew
    Their curiosity, like a ticking clock
    Always eager to learn and pursue
    
    Their little barks and yips so sweet
    Fill our days with endless delight
    Their unconditional love, so complete
    ...
    For they bring us love and laughter, year after year
    Our cute little pups, in every way.
    CPU times: total: 15.6 ms
    Wall time: 4.3 s
    

    Скорее всего, необходимо точно настроить порог сходства на основе приложения, чтобы обеспечить правильную конфиденциальность при определении запросов для кэширования.

Очистка ресурсов

Если вы хотите продолжить использовать ресурсы, созданные в этой статье, сохраните группу ресурсов.

В противном случае, чтобы избежать расходов, связанных с ресурсами, при завершении использования ресурсов можно удалить созданную группу ресурсов Azure.

Предупреждение

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

Удаление группы ресурсов

  1. Войдите на портал Azure и щелкните Группы ресурсов.

  2. Выберите группу ресурсов для удаления.

    Если в фильтре для любого поля существует много групп ресурсов, введите имя созданной группы ресурсов для выполнения этой статьи. В списке результатов поиска выберите группу ресурсов.

    Снимок экрана: список групп ресурсов для удаления.

  3. Выберите команду Удалить группу ресурсов.

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

    Снимок экрана: поле, требующее ввода имени ресурса для подтверждения удаления.

В течение нескольких минут группа ресурсов и все его ресурсы удаляются.