Aracılığıyla paylaş


Öğretici: Azure Redis kullanarak Azure OpenAI eklemelerinde vektör benzerlik araması yapma

Bu öğreticide, temel vektör benzerliği arama kullanım örneğinde adım adım ilerleyeceğiz. En uygun eşleşmeyi bulmak için bir film veri kümesini sorgulamak için Azure OpenAI Hizmeti tarafından oluşturulan eklemeleri ve Azure Yönetilen Redis'in yerleşik vektör arama özelliklerini kullanırsınız.

Öğreticide, Wikipedia'dan 1901 ile 2017 yıllarını kapsayan 35.000'den fazla filmin çizim açıklamalarını içeren Wikipedia Film Çizimleri veri kümesi kullanılır. Veri kümesinde her film için bir çizim özeti, ayrıca filmin yayınlandığı yıl, yönetmenler, ana oyuncular ve tarz gibi meta veriler bulunur. Konu özetine dayalı yerleştirmeler oluşturmak ve karma sorgular çalıştırmak için diğer meta verileri kullanarak öğreticinin adımlarını izleyin.

Bu eğitimde şunları öğreniyorsunuz:

  • Vektör araması için yapılandırılmış bir Azure Yönetilen Redis örneği oluşturma
  • Azure OpenAI'yi ve diğer gerekli Python kitaplıklarını yükleyin.
  • Film veri kümesini indirin ve analiz için hazırlayın.
  • Eklemeler oluşturmak için text-embedding-ada-002 (Sürüm 2) modelini kullanın.
  • Azure Yönetilen Redis'te vektör dizini oluşturma
  • Arama sonuçlarını sıralamak için kosinüs benzerliğini kullanın.
  • Verileri önceden filtrelemek ve vektör aramasını daha da güçlü hale getirmek için RediSearch aracılığıyla karma sorgu işlevselliğini kullanın.

Önemli

Bu öğreticide Jupyter Not Defteri oluşturma adımları gösterilmektedir. Bu öğreticiyi bir Python kod dosyasıyla (.py) izleyebilir ve benzer sonuçlar alabilirsiniz, ancak bu öğreticideki tüm kod bloklarını dosyaya .py eklemeniz ve sonuçları görmek için bir kez yürütmeniz gerekir. Başka bir deyişle, hücreler yürütülürken Jupyter Notebook ara sonuçlar sağlar, ancak bu, bir Python kod dosyasında çalışırken beklemeniz gereken bir davranış değildir.

Önemli

Bunun yerine tamamlanmış bir Jupyter not defterini takip etmek isterseniz tutorial.ipynb adlı Jupyter not defteri dosyasını indirin ve yeni redis-vector klasörüne kaydedin.

Önkoşullar

Azure Yönetilen Redis Örneği Oluştur

  1. Hızlı Başlangıç: Önbellek oluşturmak için Azure Yönetilen Redis Örneği oluşturma kılavuzunu izleyin, ancak oluşturma sırasında RedisSearch modülünü eklediğinizden emin olun.

  2. Gelişmiş sayfasında RediSearch modülünü eklediğinizden ve Kurumsal Küme İlkesi'ni seçtiğinizden emin olun. Diğer tüm ayarlar, hızlı başlangıçta açıklanan varsayılan ayarlarla eşleşebilir.

    Önbelleğin oluşturulması birkaç dakika sürer. Bu arada bir sonraki adıma geçebilirsiniz.

Geliştirme ortamınızı ayarlama

  1. Yerel bilgisayarınızda, genellikle projelerinizi kaydettiğiniz konumda redis-vector adlı bir klasör oluşturun.

  2. Klasörde yeni bir python dosyası (tutorial.py) veya Jupyter not defteri (tutorial.ipynb) oluşturun.

  3. Gerekli Python paketlerini yükleyin:

    pip install "openai==1.6.1" num2words matplotlib plotly scipy scikit-learn pandas tiktoken redis langchain
    

Veri kümesini indirme

  1. Web tarayıcısında https://www.kaggle.com/datasets/jrobischon/wikipedia-movie-plots adresine gidin.

  2. Kaggle ile oturum açın veya kaydolun. Dosyayı indirmek için kayıt gereklidir.

  3. archive.zip dosyasını indirmek için Kaggle'da İndir bağlantısını seçin.

  4. archive.zip dosyasını ayıklayın ve wiki_movie_plots_deduped.csvredis-vector klasörüne taşıyın.

Kitaplıkları içeri aktarma ve bağlantı bilgilerini ayarlama

Azure OpenAI'ye karşı başarılı bir şekilde çağrı yapmak için bir uç nokta ve anahtar gerekir. Azure Yönetilen Redis'e bağlanmak için bir uç nokta ve anahtara da ihtiyacınız vardır.

  1. Azure portalında Azure OpenAI kaynağınıza gidin.

  2. Kaynak Yönetimi bölümünde Uç Nokta ve Anahtarlar'ı bulun. Api çağrılarınızın kimliğini doğrulamak için ihtiyacınız olacak şekilde uç noktanızı ve erişim anahtarınızı kopyalayın. Örnek uç nokta: https://docs-test-001.openai.azure.com. KEY1 veya KEY2 kullanabilirsiniz.

  3. Azure portalında Azure Yönetilen Redis kaynağınızın Genel Bakış sayfasına gidin. Uç noktanızı kopyalayın.

  4. Ayarlar bölümünde Erişim anahtarlarını bulun. Erişim anahtarınızı kopyalayın. Primary veya Secondary kullanabilirsiniz.

  5. Yeni bir kod hücresine aşağıdaki kodu ekleyin:

    # Code cell 2
    
    import re
    from num2words import num2words
    import os
    import pandas as pd
    import tiktoken
    from typing import List
    from langchain.embeddings import AzureOpenAIEmbeddings
    from langchain.vectorstores.redis import Redis as RedisVectorStore
    from langchain.document_loaders import DataFrameLoader
    
    API_KEY = "<your-azure-openai-key>"
    RESOURCE_ENDPOINT = "<your-azure-openai-endpoint>"
    DEPLOYMENT_NAME = "<name-of-your-model-deployment>"
    MODEL_NAME = "text-embedding-ada-002"
    REDIS_ENDPOINT = "<your-azure-redis-endpoint>"
    REDIS_PASSWORD = "<your-azure-redis-password>"
    
  6. API_KEY ve RESOURCE_ENDPOINT değerlerini Azure OpenAI dağıtımınızdaki anahtar ve uç nokta değerleriyle güncelleyin. DEPLOYMENT_NAME eklemeler modeli kullanılarak text-embedding-ada-002 (Version 2) dağıtımınızın adına ayarlanmalıdır ve MODEL_NAME kullanılan belirli eklemeler modeli olmalıdır.

  7. REDIS_ENDPOINT ve REDIS_PASSWORD öğelerini Azure Yönetilen Redis örneğinizdeki uç nokta ve anahtar değeriyle güncelleyin.

    Önemli

    API anahtarı, uç nokta ve dağıtım adı bilgilerini geçirmek için ortam değişkenlerini veya Azure Key Vault gibi bir gizli dizi yöneticisini kullanmanızı kesinlikle öneririz. Bu değişkenler basitlik adına burada düz metin olarak ayarlanmıştır.

  8. Kod hücresi 2'yi çalıştırın.

Veri kümesini pandas'a aktarma ve verileri işleme

Ardından csv dosyasını bir pandas DataFrame'de okuyacaksınız.

  1. Yeni bir kod hücresine aşağıdaki kodu ekleyin:

    # Code cell 3
    
    df=pd.read_csv(os.path.join(os.getcwd(),'wiki_movie_plots_deduped.csv'))
    df
    
  2. Kod hücresi 3'ü çalıştır. Aşağıdaki çıkışı görmeniz gerekir:

    Sekiz sütunun ve 10 veri satırının örneklemesinin görüntülendiği 3 numaralı kod hücresinin yürütülmesiyle eldeki sonuçların ekran görüntüsü.

  3. Ardından, dizin id ekleyerek, sütun başlıklarından boşlukları kaldırarak verileri işleyin ve filmleri yalnızca 1970'ten sonra ve İngilizce konuşan ülkelerden veya bölgelerden yapılan filmleri alacak şekilde filtreleyin. Bu filtreleme adımı, veri kümesindeki film sayısını azaltarak eklemeler oluşturmak için gereken maliyeti ve süreyi azaltır. Tercihlerinize göre filtre parametrelerini değiştirebilir veya kaldırabilirsiniz.

    Verileri filtrelemek için aşağıdaki kodu yeni bir kod hücresine ekleyin:

    # Code cell 4
    
    df.insert(0, 'id', range(0, len(df)))
    df['year'] = df['Release Year'].astype(int)
    df['origin'] = df['Origin/Ethnicity'].astype(str)
    del df['Release Year']
    del df['Origin/Ethnicity']
    df = df[df.year > 1970] # only movies made after 1970
    df = df[df.origin.isin(['American','British','Canadian'])] # only movies from English-speaking cinema
    df
    
  4. Kod hücresi 4'ü çalıştırın. Aşağıdaki sonuçları görmeniz gerekir:

    4. kod hücresi yürütülürken dokuz sütun ve 10 veri satırının örneklemesinin görüntülendiği sonuçların ekran görüntüsü.

  5. Boşluk ve noktalama işaretlerini kaldırarak verileri temizlemek için bir işlev oluşturun, ardından çizimi içeren veri çerçevesine karşı kullanın.

    Yeni bir kod hücresine aşağıdaki kodu ekleyin ve çalıştırın.

    # Code cell 5
    
    pd.options.mode.chained_assignment = None
    
    # s is input text
    def normalize_text(s, sep_token = " \n "):
        s = re.sub(r'\s+',  ' ', s).strip()
        s = re.sub(r". ,","",s)
    
        # remove all instances of multiple spaces
        s = s.replace("..",".")
        s = s.replace(". .",".")
        s = s.replace("\n", "")
        s = s.strip()
    
        return s
    
    df['Plot']= df['Plot'].apply(lambda x : normalize_text(x))
    
  6. Son olarak, ekleme modeli için çok uzun çizim açıklamaları içeren tüm girdileri kaldırın. (Başka bir deyişle, 8192 belirteç sınırından daha fazla belirteç gerektirir.) ve ardından ekleme oluşturmak için gereken belirteç sayısını hesaplayın. Bu, ekleme oluşturma fiyatlandırmasını da etkilemektedir.

    Yeni bir kod hücresine aşağıdaki kodu ekleyin:

    # Code cell 6
    
    tokenizer = tiktoken.get_encoding("cl100k_base")
    df['n_tokens'] = df["Plot"].apply(lambda x: len(tokenizer.encode(x)))
    df = df[df.n_tokens<8192]
    print('Number of movies: ' + str(len(df)))
    print('Number of tokens required:' + str(df['n_tokens'].sum()))
    
  7. 6 numaralı kod hücresini çalıştır. Şu çıktıyı görmelisiniz:

    Number of movies: 11125
    Number of tokens required:7044844
    

DataFrame'i LangChain'e yükleme

DataFrame'i DataFrameLoader sınıfını kullanarak LangChain'e yükleyin. Veriler LangChain belgelerine eklendikten sonra eklemeler oluşturmak ve benzerlik aramaları yapmak için LangChain kitaplıklarını kullanmak çok daha kolaydır. Çizim'i, eklemelerin bu sütunda oluşturulması için page_content_column olarak ayarlayın.

  1. Yeni bir kod hücresine aşağıdaki kodu ekleyin ve çalıştırın.

    # Code cell 7
    
    loader = DataFrameLoader(df, page_content_column="Plot" )
    movie_list = loader.load()
    

Eklemeler oluşturma ve bunları Redis'e yükleme

Artık veriler filtrelendiğine ve LangChain'e yüklendiğine göre, her filmin senaryosu üzerinde sorgulama yapabileceğiniz yerleştirmeler oluşturacaksınız. Aşağıdaki kod Azure OpenAI'yi yapılandırarak eklemeler oluşturur ve ekleme vektörlerini Azure Managed Redis'e yükler.

  1. Aşağıdaki kodu yeni bir kod hücresi ekleyin:

    # Code cell 8
    
    embedding = AzureOpenAIEmbeddings(
        deployment=DEPLOYMENT_NAME,
        model=MODEL_NAME,
        azure_endpoint=RESOURCE_ENDPOINT,
        openai_api_type="azure",
        openai_api_key=API_KEY,
        openai_api_version="2023-05-15",
        show_progress_bar=True,
        chunk_size=16 # current limit with Azure OpenAI service. This will likely increase in the future.
        )
    
    # name of the Redis search index to create
    index_name = "movieindex"
    
    # create a connection string for the Redis Vector Store. Uses Redis-py format: https://redis-py.readthedocs.io/en/stable/connections.html#redis.Redis.from_url
    # This example assumes TLS is enabled. If not, use "redis://" instead of "rediss://
    redis_url = "rediss://:" + REDIS_PASSWORD + "@"+ REDIS_ENDPOINT
    
    # create and load redis with documents
    vectorstore = RedisVectorStore.from_documents(
        documents=movie_list,
        embedding=embedding,
        index_name=index_name,
        redis_url=redis_url
    )
    
    # save index schema so you can reload in the future without re-generating embeddings
    vectorstore.write_schema("redis_schema.yaml")
    
  2. Kod hücresi 8'i çalıştır. Bu işlemin tamamlanması 30 dakikadan fazla sürebilir. Bir redis_schema.yaml dosya da oluşturulur. Eklemeleri yeniden oluşturmadan Azure Yönetilen Redis örneğindeki dizininize bağlanmak istiyorsanız bu dosya kullanışlıdır.

Önemli

Eklemelerin oluşturulma hızı, Azure OpenAI Modeli için kullanılabilir kotaya bağlıdır. Dakikada 240 bin belirteç kotasıyla, veri kümesindeki 7M belirteçlerin işlenmesi yaklaşık 30 dakika sürer.

Vektör arama sorgularını çalıştırma

Veri kümeniz, Azure OpenAI hizmet API'niz ve Redis örneğiniz ayarlandıktan sonra vektörleri kullanarak arama yapabilirsiniz. Bu örnekte, belirli bir sorgu için ilk 10 sonuç döndürülür.

  1. Python kod dosyanıza aşağıdaki kodu ekleyin:

    # Code cell 9
    
    query = "Spaceships, aliens, and heroes saving America"
    results = vectorstore.similarity_search_with_score(query, k=10)
    
    for i, j in enumerate(results):
        movie_title = str(results[i][0].metadata['Title'])
        similarity_score = str(round((1 - results[i][1]),4))
        print(movie_title + ' (Score: ' + similarity_score + ')')
    
  2. 9. kod hücresini çalıştır. Aşağıdaki çıkışı görmeniz gerekir:

    Independence Day (Score: 0.8348)
    The Flying Machine (Score: 0.8332)
    Remote Control (Score: 0.8301)
    Bravestarr: The Legend (Score: 0.83)
    Xenogenesis (Score: 0.8291)
    Invaders from Mars (Score: 0.8291)
    Apocalypse Earth (Score: 0.8287)
    Invasion from Inner Earth (Score: 0.8287)
    Thru the Moebius Strip (Score: 0.8283)
    Solar Crisis (Score: 0.828)
    

    Benzerlik puanı, filmlerin benzerliklere göre sıralı sıralamasıyla birlikte döndürülür. Daha belirli sorguların benzerlik puanlarının listede daha hızlı azaldığını göreceksiniz.

Karma aramalar

  1. RediSearch ayrıca vektör aramasının yanı sıra zengin arama işlevlerine de sahip olduğundan sonuçları film türü, yayın yılı veya yönetmen gibi veri kümesindeki meta verilere göre filtrelemek mümkündür. Bu durumda, türüne göre filtreleyin comedy.

    Yeni bir kod hücresine aşağıdaki kodu ekleyin:

    # Code cell 10
    
    from langchain.vectorstores.redis import RedisText
    
    query = "Spaceships, aliens, and heroes saving America"
    genre_filter = RedisText("Genre") == "comedy"
    results = vectorstore.similarity_search_with_score(query, filter=genre_filter, k=10)
    for i, j in enumerate(results):
        movie_title = str(results[i][0].metadata['Title'])
        similarity_score = str(round((1 - results[i][1]),4))
        print(movie_title + ' (Score: ' + similarity_score + ')')
    
  2. Kod hücresi 10'u çalıştır. Aşağıdaki çıkışı görmeniz gerekir:

    Remote Control (Score: 0.8301)
    Meet Dave (Score: 0.8236)
    Elf-Man (Score: 0.8208)
    Fifty/Fifty (Score: 0.8167)
    Mars Attacks! (Score: 0.8165)
    Strange Invaders (Score: 0.8143)
    Amanda and the Alien (Score: 0.8136)
    Suburban Commando (Score: 0.8129)
    Coneheads (Score: 0.8129)
    Morons from Outer Space (Score: 0.8121)
    

Azure Yönetilen Redis ve Azure OpenAI Hizmeti ile uygulamanıza güçlü arama özellikleri eklemek için eklemeleri ve vektör aramasını kullanabilirsiniz.

Kaynakları temizle

Bu makalede oluşturduğunuz kaynakları kullanmaya devam etmek istiyorsanız kaynak grubunu koruyun.

Aksi takdirde, kaynaklarla işiniz bittiyse ücretlerden kaçınmak için oluşturduğunuz Azure kaynak grubunu silebilirsiniz.

Önemli

Bir kaynak grubunu silmek geri alınamaz. Kaynak grubunu sildiğinizde, içindeki tüm kaynaklar kalıcı olarak silinir. Yanlış kaynak grubunu veya kaynakları yanlışlıkla silmediğinizden emin olun. Tutmak istediğiniz kaynakları içeren mevcut bir kaynak grubunun içinde kaynakları oluşturduysanız, kaynak grubunu silmek yerine her kaynağı tek tek silebilirsiniz.

Kaynak grubunu silmek için

  1. Azure portalında oturum açın ve Kaynak grupları’nı seçin.

  2. Silmek istediğiniz kaynak grubunu seçin.

    Çok sayıda kaynak grubu varsa Herhangi bir alan için filtre uygula... kutusunu kullanın, bu makale için oluşturduğunuz kaynak grubunuzun adını yazın. Sonuçlar listesinden kaynak grubunu seçin.

    Çalışma bölmesinde silinecek kaynak gruplarının listesini gösteren ekran görüntüsü.

  3. Kaynak grubunu sil seçeneğini seçin.

  4. Kaynak grubunun silinmesini onaylamanız istenir. Onaylamak için kaynak grubunuzun adını yazın ve ardından Sil’i seçin.

    Silme işlemini onaylamak için kaynak adını gerektiren formu gösteren ekran görüntüsü.

Birkaç dakika sonra kaynak grubu ve bu gruptaki kaynakların tümü silinir.