다음을 통해 공유


자습서: Azure Cache for Redis를 의미 체계 캐시로 사용

이 자습서에서는 AI 기반 LLM(대규모 언어 모델)을 사용하는 의미 체계 캐시로 Azure Cache for Redis를 사용합니다. Azure OpenAI Service를 사용하여 쿼리에 대한 LLM 응답을 생성하고 Azure Cache for Redis를 사용하여 해당 응답을 캐시하여 더 빠른 응답을 제공하고 비용을 절감합니다.

Azure Cache for Redis는 기본 제공 벡터 검색 기능을 제공하므로 의미 체계 캐싱을 수행할 수도 있습니다. 텍스트가 동일하지 않더라도 동일한 쿼리 및 의미가 유사한 쿼리에 대한 캐시된 응답을 반환할 수 있습니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • 의미 체계 캐싱을 위해 구성된 Azure Cache for Redis 인스턴스 만들기
  • LangChain의 다른 인기 있는 Python 라이브러리를 사용합니다.
  • Azure OpenAI 서비스를 사용하여 AI 모델에서 텍스트를 생성하고 결과를 캐시합니다.
  • LLM과 함께 캐싱을 사용하면 성능이 향상됩니다.

Important

이 자습서에서는 Jupyter Notebook 빌드 과정을 안내합니다. Python 코드 파일(.py)을 사용하여 이 자습서를 수행하고 비슷한 결과를 얻을 수 있지만, 이 자습서의 모든 코드 블록을 .py 파일에 추가하고 한 번 실행하여 결과를 확인해야 합니다. 즉, Jupyter Notebook은 셀을 실행할 때 중간 결과를 제공하지만 Python 코드 파일에서 작업할 때 예상되는 동작은 아닙니다.

Important

대신, 완성된 Jupyter Notebook을 따라 작업하려면 새 semanticcache 폴더에 semanticcache.ipynb라는 Jupyter Notebook 파일을 다운로드합니다.

필수 조건

  • Azure 구독 - 체험 구독 만들기

  • 현재 원하는 Azure 구독에서 Azure OpenAI에 부여된 액세스 권한으로, Azure OpenAI에 대한 액세스를 위해 적용해야 합니다. https://aka.ms/oai/access에서 양식을 작성하여 Azure OpenAI에 대한 액세스를 신청할 수 있습니다.

  • Python 3.11.6 이상 버전

  • Jupyter Notebook(선택 사항)

  • text-embedding-ada-002(버전 2)gpt-35-turbo-instruct 모델이 배포된 Azure OpenAI 리소스. 이러한 모델은 현재 특정 지역에서만 사용할 수 있습니다. 모델을 배포하는 방법에 대한 지침은 리소스 배포 가이드를 참조하세요.

Azure Cache for Redis 인스턴스 만들기

빠른 시작: Redis Enterprise 캐시 만들기 가이드를 따릅니다. 고급 페이지에서 RediSearch 모듈을 추가하고 엔터프라이즈 클러스터 정책을 선택했는지 확인합니다. 다른 모든 설정은 빠른 시작에 설명된 기본값과 일치할 수 있습니다.

캐시를 만드는 데 몇 분 정도 걸립니다. 그 동안 다음 단계로 이동할 수 있습니다.

Screenshot showing the Enterprise tier Basics tab filled out.

개발 환경 설정

  1. 일반적으로 로컬 컴퓨터에서 프로젝트를 저장하는 위치에 semanticcache라는 폴더를 만듭니다.

  2. 이 폴더에 새 python 파일(tutorial.py) 또는 Jupyter Notebook(tutorial.ipynb)을 만듭니다.

  3. 필요한 Python 패키지를 설치합니다.

    pip install openai langchain redis tiktoken
    

Azure OpenAI 모델 만들기

두 가지 모델을 Azure OpenAI 리소스에 배포했는지 확인합니다.

  • 텍스트 응답을 제공하는 LLM. 이 자습서에서는 GPT-3.5-turbo-instruct 모델을 사용합니다.

  • 쿼리를 이전 쿼리와 비교할 수 있도록 벡터로 변환하는 포함 모델입니다. 이 자습서에서는 text-embedding-ada-002(버전 2) 모델을 사용합니다.

자세한 지침은 모델 배포를 참조하세요. 각 모델 배포에 대해 선택한 이름을 기록합니다.

라이브러리 가져오기 및 연결 정보 설정

Azure OpenAI에 대해 성공적으로 호출하려면 엔드포인트가 필요합니다. 또한 Azure Cache for Redis에 연결하려면 엔드포인트가 필요합니다.

  1. Azure Portal에서 Azure OpenAI 리소스로 이동합니다.

  2. Azure OpenAI 리소스의 리소스 관리 섹션에서 엔드포인트 및 키를 찾습니다. API 호출을 인증하는 데 모두 필요하므로 엔드포인트 및 액세스 키를 복사합니다. 예제 엔드포인트는 https://docs-test-001.openai.azure.com입니다. KEY1 또는 KEY2를 사용할 수 있습니다.

  3. Azure Portal에서 Azure Cache for Redis 리소스의 개요 페이지로 이동합니다. 엔드포인트를 복사합니다.

  4. 설정 섹션에서 액세스 키를 찾습니다. 액세스 키를 복사합니다. 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. Azure OpenAI 배포의 키 및 엔드포인트 값으로 API_KEYRESOURCE_ENDPOINT 값을 업데이트합니다.

  7. LLM_DEPLOYMENT_NAMEEMBEDDINGS_DEPLOYMENT_NAME을 Azure OpenAI Service에 배포된 두 모델의 이름으로 설정합니다.

  8. REDIS_ENDPOINTREDIS_PASSWORD를 Azure Cache for Redis 인스턴스의 엔드포인트 및 키 값으로 업데이트합니다.

    Important

    환경 변수 또는 Azure Key Vault와 같은 비밀 관리자를 사용하여 API 키, 엔드포인트 및 배포 이름 정보를 전달하는 것이 좋습니다. 이러한 변수는 단순성을 위해 여기에서 일반 텍스트로 설정됩니다.

  9. 코드 셀 2를 실행합니다.

AI 모델 초기화

다음으로 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를 의미 체계 캐시로 설정

다음으로, LLM에 대한 의미 체계 캐시로 Redis를 지정합니다.

  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))
    

    Important

    score_threshold 매개 변수 값은 캐시된 결과를 반환하기 위해 두 쿼리가 얼마나 유사해야 하는지 결정합니다. 숫자가 낮을수록 쿼리가 더 비슷해야 합니다. 이 값을 사용하여 애플리케이션에 맞게 미세 조정할 수 있습니다.

  2. 코드 셀 4를 실행합니다.

LLM에서 응답 쿼리 및 가져오기

마지막으로 LLM을 쿼리하여 AI 생성 응답을 가져옵니다. Jupyter Notebook을 사용하는 경우 셀 맨 위에 %%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밀리초까지 5단계에 걸쳐 감소되는 것처럼 보입니다.

  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_threshold0.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 리소스 그룹을 삭제하여 요금이 부과되지 않도록 할 수 있습니다.

Important

리소스 그룹을 삭제하면 다시 되돌릴 수 없습니다. 리소스 그룹을 삭제하는 경우 그 안의 모든 리소스가 영구적으로 삭제됩니다. 잘못된 리소스 그룹 또는 리소스를 자동으로 삭제하지 않도록 해야 합니다. 유지하려는 리소스가 포함된 기존 리소스 그룹 내에서 리소스를 만든 경우 리소스 그룹을 삭제하는 대신, 각 리소스를 개별적으로 삭제할 수 있습니다.

리소스 그룹을 삭제하려면

  1. Azure Portal에 로그인한 다음, 리소스 그룹을 선택합니다.

  2. 삭제하려는 리소스 그룹을 선택합니다.

    리소스 그룹이 많은 경우 필드 필터링... 상자를 사용하여 이 문서에 대해 만든 리소스 그룹의 이름을 입력합니다. 결과 목록에서 리소스 그룹을 선택합니다.

    Screenshot showing a list of resource groups to delete in the working pane.

  3. 리소스 그룹 삭제를 선택합니다.

  4. 리소스 그룹 삭제를 확인하는 메시지가 표시됩니다. 리소스 그룹의 이름을 입력하여 확인한 다음, 삭제를 선택합니다.

    Screenshot showing a form that requires the resource name to confirm deletion.

잠시 후, 리소스 그룹 및 모든 해당 리소스가 삭제됩니다.