Öğretici: Azure DocumentDB ve Azure OpenAI ile yapay zeka tanıtımları oluşturma

Bu öğreticide, dinamik, kişiselleştirilmiş reklam içeriği oluşturmak için Azure DocumentDB ve OpenAI kullanarak yapay zeka destekli bir reklam oluşturucu oluşturacaksınız. Uygulama, envanter öğelerini reklam konularıyla eşleştirmek için vektör benzerlik araması kullanır, ardından Heelie adlı bir yapay zeka yardımcısı aracılığıyla ilgi çekici reklam kopyaları ve görüntüler oluşturmak için GPT-4 ve DALL-E 3 kullanır.

Uygulama, ürün açıklamalarının anlamsal anlamını yakalayan OpenAI eklemelerini kullanarak stok açıklamaları için vektör eklemeleri oluşturarak çalışır. Bu vektörler Azure DocumentDB'de depolanır ve dizinlenir ve güçlü vektör benzerliği aramalarına olanak tanır. Bir reklam oluşturmanız gerektiğinde, uygulama vektör araması aracılığıyla en iyi eşleşen envanter öğelerini bulmak için reklam konusunu vektörleştirir. Ardından, en iyi eşleşmeleri OpenAI'ye göndermek için, akılda kalıcı sloganlar ve gerçekçi görüntüler de dahil olmak üzere ilgi çekici reklam içeriği oluşturan bir geri getirme destekli üretim (RAG) süreci kullanır.

Bu eğitimde, siz:

  • Python ortamınızı gerekli paketlerle ayarlama
  • Azure OpenAI ve Azure DocumentDB istemcilerini yapılandırma
  • Ürün açıklamalarından vektör eklemeleri oluşturma
  • Vektör dizinleme ile Azure DocumentDB veritabanı ayarlama
  • İlgili ürünleri bulmak için vektör benzerliği araması uygulama
  • GPT-4 ve DALL-E 3 kullanarak reklam içeriği oluşturma
  • Gradio ile etkileşimli bir web arabirimi oluşturma

Eğer bir Azure aboneliğiniz yoksa, başlamadan önce ücretsiz bir hesap oluşturun.

Prerequisites

  • Mevcut bir Azure DocumentDB kümesi

Örnek verileri alma

Bu öğreticide, ürün açıklamalarını ve önceden derlenmiş vektör eklemelerini içeren ayakkabı ürünleri veri kümesiyle çalışacaksınız. Örnek veriler, uygulamanın vektör benzerliği arama ve tanıtım oluşturmayı göstermek için kullandığı envanter bilgilerini içerir.

  1. GitHub deposundan örnek veri dosyasını indirin:

    curl -o data/shoes_with_vectors.json https://raw.githubusercontent.com/jayanta-mondal/ignite-demo/main/data/shoes_with_vectors.json
    
  2. Proje dizininizde bir data klasör oluşturun ve dosyayı içine kaydedin shoes_with_vectors.json . Dosya, anlamsal arama işlevselliğini sağlayan adlar, açıklamalar, fiyatlar ve vektör eklemeleri gibi ürün bilgilerini içerir.

Python ortamınızı ayarlama

Python ortamınızı gerekli paketlerle ayarlayın ve OpenAI API'sine ve Azure hizmetlerine yönelik isteklerin kimliğini doğrulamak için Azure istemcilerinizi yapılandırın.

  1. Terminalinizi açın ve gerekli Python paketlerini yükleyin:

    pip install numpy
    pip install openai==1.2.3
    pip install pymongo
    pip install python-dotenv
    pip install azure-core
    pip install azure-cosmos
    pip install tenacity
    pip install gradio
    
  2. OpenAI paketi yüklemesini doğrulayın:

    pip show openai
    
  3. Projeniz için yeni bir Python dosyası oluşturun (örneğin, ad_generator.py).

  4. Gerekli kitaplıkları içeri aktarmak ve Azure OpenAI istemcisini yapılandırmak için aşağıdaki kodu ekleyin:

    import json
    import time
    import openai
    
    from dotenv import dotenv_values
    from openai import AzureOpenAI
    
    # Configure the API to use Azure as the provider
    openai.api_type = "azure"
    openai.api_key = "<AZURE_OPENAI_API_KEY>"  # Replace with your actual Azure OpenAI API key
    openai.api_base = "https://<OPENAI_ACCOUNT_NAME>.openai.azure.com/"  # Replace with your OpenAI account name
    openai.api_version = "2023-06-01-preview"
    
    # Initialize the AzureOpenAI client with your API key, version, and endpoint
    client = AzureOpenAI(
        api_key=openai.api_key,
        api_version=openai.api_version,
        azure_endpoint=openai.api_base
    )
    
  5. Yer tutucu değerlerini gerçek Azure OpenAI kimlik bilgilerinizle değiştirin:

    • <AZURE_OPENAI_API_KEY>: Önkoşullardan Azure OpenAI API anahtarınız
    • <OPENAI_ACCOUNT_NAME>: Azure OpenAI hesabınızın adı

Vektör eklemeleri oluşturma

Makinelerin anlayıp işleyebileceği bir biçimde anlamsal anlamlarını yakalamak için ürün açıklamalarından vektör eklemeleri oluşturun. Aşağıdaki diyagramda çözüm mimarisi gösterilmektedir:

Reklam oluşturma için OpenAI ile Azure DocumentDB vektör arama tümleştirmesini gösteren çözüm mimarisinin ekran görüntüsü.

  1. Python dosyanıza aşağıdaki işlevi ekleyerek Azure OpenAI kullanarak vektör eklemeleri oluşturun:

    import openai
    
    def generate_embeddings(text):
        try:
            response = client.embeddings.create(
                input=text, model="text-embedding-ada-002")
            embeddings = response.data[0].embedding
            return embeddings
        except Exception as e:
            print(f"An error occurred: {e}")
            return None
    

    Bu işlev bir metin girişi alır ve vektör ekleme oluşturmak için yöntemini kullanır client.embeddings.create . Model, text-embedding-ada-002 metni anlamsal anlamı yakalayan yüksek boyutlu bir vektöre dönüştürür.

  2. Ekleme işlevinizi örnek bir ürün açıklamasıyla test edin:

    embeddings = generate_embeddings("Shoes for San Francisco summer")
    
    if embeddings is not None:
        print(embeddings)
    

    Başarılı olursa, işlev oluşturulan eklemeleri yazdırır; aksi takdirde, bir hata iletisi yazdırarak özel durumları işler.

Azure DocumentDB'ye bağlanma

Eklemelerinizi vektör benzerliği aramasını destekleyen bir veritabanında depolamak ve dizine eklemek için Azure DocumentDB'ye bağlantı kurun.

  1. Azure DocumentDB kümenizle bağlantı kurmak için aşağıdaki kodu ekleyin:

    import pymongo
    
    # Replace <username>, <password>, and <cluster-name> with your actual credentials
    mongo_conn = "mongodb+srv://<username>:<password>@<cluster-name>.mongocluster.cosmos.azure.com/?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000"
    mongo_client = pymongo.MongoClient(mongo_conn)
    
  2. Yer tutucu değerlerini önkoşullardan gerçek MongoDB kimlik bilgilerinizle değiştirin:

    • <username>: MongoDB kullanıcı adınız
    • <password>: MongoDB parolanız
    • <cluster-name>: vCore kümenizin adı

Bir veritabanı ve koleksiyon oluşturun

Azure DocumentDB örneğinizde bir veritabanı ve koleksiyon oluşturarak reklam verilerini ve ürün envanterini depolayın.

  1. Veritabanı ve koleksiyon oluşturmak için aşağıdaki kodu ekleyin:

    DATABASE_NAME = "AdgenDatabase"
    COLLECTION_NAME = "AdgenCollection"
    
    mongo_client.drop_database(DATABASE_NAME)
    db = mongo_client[DATABASE_NAME]
    collection = db[COLLECTION_NAME]
    
    if COLLECTION_NAME not in db.list_collection_names():
        # Creates a unsharded collection that uses the database's shared throughput
        db.create_collection(COLLECTION_NAME)
        print("Created collection '{}'.\n".format(COLLECTION_NAME))
    else:
        print("Using collection: '{}'.\n".format(COLLECTION_NAME))
    
  2. Bu kod, veritabanı ve koleksiyon adlarını tanımlar, temiz bir kurulum için aynı ada sahip tüm mevcut veritabanlarını bırakır, yeni bir veritabanı ve koleksiyon oluşturur ve onay iletilerini yazdırır.

Vektör dizini oluşturma

Koleksiyonunuz içinde verimli vektör benzerliği aramalarını etkinleştirmek için bir vektör dizini oluşturun. Azure DocumentDB farklı vektör dizin türlerini destekler: Ters Dosya Dizini (IVF) ve Hiyerarşik Gezinilebilir Küçük Dünya (HNSW).

  1. Küme katmanınıza göre dizin oluşturma algoritmanızı seçin:

    • IVF: Tüm küme katmanlarında çalışan, yaklaşık en yakın komşular (ANN) yaklaşımını kullanan varsayılan algoritma
    • HNSW: Graf tabanlı yapı, daha yüksek doğrulukla daha hızlı, yalnızca M40 küme katmanlarında ve daha yüksek katmanlarda kullanılabilir
  2. IVF dizini oluşturmak için aşağıdaki komutu çalıştırın:

    db.runCommand({
      'createIndexes': 'AdgenCollection',
      'indexes': [
        {
          'name': 'vectorSearchIndex',
          'key': {
            "contentVector": "cosmosSearch"
          },
          'cosmosSearchOptions': {
            'kind': 'vector-ivf',
            'numLists': 1,
            'similarity': 'COS',
            'dimensions': 1536
          }
        }
      ]
    });
    
  3. (İsteğe bağlı) M40 küme katmanı veya üzeri bir katman kullanıyorsanız, bunun yerine bir HNSW dizini oluşturabilirsiniz:

    db.runCommand({
        "createIndexes": "AdgenCollection",
        "indexes": [
            {
                "name": "VectorSearchIndex",
                "key": {
                    "contentVector": "cosmosSearch"
                },
                "cosmosSearchOptions": { 
                    "kind": "vector-hnsw", 
                    "m": 16,
                    "efConstruction": 64,
                    "similarity": "COS", 
                    "dimensions": 1536
                } 
            } 
        ]
    })
    

Important

Vektör özelliği başına yalnızca bir dizin oluşturabilirsiniz. Dizin türünü değiştirmek istiyorsanız (örneğin, IVF'den HNSW'ye), yeni bir dizin oluşturmadan önce dizini bırakmanız gerekir.

Envanter verilerini yükleme

Ürün açıklamalarını ve bunlara karşılık gelen vektör eklemelerini içeren envanter verilerini koleksiyonunuz içine ekleyin.

  1. Verileri yüklemek ve koleksiyonunuza eklemek için aşağıdaki kodu ekleyin:

    data_file = open(file="./data/shoes_with_vectors.json", mode="r") 
    data = json.load(data_file)
    data_file.close()
    
    result = collection.insert_many(data)
    
    print(f"Number of data points added: {len(result.inserted_ids)}")
    
  2. Bu kod JSON dosyasını açar, verileri yükler, kullanarak insert_many()tüm belgeleri koleksiyona ekler ve eklenen belge sayısını yazdırır.

Sorguya göre en uygun öğeleri bulmak için vektör aramasını kullanın. Oluşturduğunuz vektör dizini, veri kümesi içinde anlamsal aramalara olanak tanır.

  1. Vektör benzerliği aramaları yapmak için aşağıdaki işlevi ekleyin:

    def vector_search(query, num_results=3):
    
        query_vector = generate_embeddings(query)
    
        embeddings_list = []
        pipeline = [
            {
                '$search': {
                    "cosmosSearch": {
                        "vector": query_vector,
                        "numLists": 1,
                        "path": "contentVector",
                        "k": num_results
                    },
                    "returnStoredSource": True }},
            {'$project': { 'similarityScore': { '$meta': 'searchScore' }, 'document' : '$$ROOT' } }
        ]
        results = collection.aggregate(pipeline)
        return results
    

    Bu işlev arama sorgusu için bir vektör ekleme oluşturur, Azure DocumentDB'nin $search işlevselliğini kullanan bir toplama işlem hattı oluşturur, vektör benzerliğine göre en yakın eşleşen öğeleri bulur ve benzerlik puanlarına sahip sonuçlar döndürür.

  2. Vektör arama işlevinizi örnek bir sorguyla test edin:

    query = "Shoes for Seattle sweater weather"
    results = vector_search(query, 3)
    
    print("\nResults:\n")
    for result in results: 
        print(f"Similarity Score: {result['similarityScore']}")  
        print(f"Title: {result['document']['name']}")  
        print(f"Price: {result['document']['price']}")  
        print(f"Material: {result['document']['material']}") 
        print(f"Image: {result['document']['img_url']}") 
        print(f"Purchase: {result['document']['purchase_url']}\n")
    

    Bu kod bir vektör araması yürütür ve benzerlik puanları ve ayrıntılarıyla en çok eşleşen üç ürünü görüntüler.

Reklam içeriği oluşturma

OpenAI'nin metin için GPT-4 ve resimler için DALL-E 3 kullanarak ilgi çekici reklamlar oluşturmak için tüm bileşenleri birleştirin.

  1. GPT-4 kullanarak akılda kalıcı tanıtım başlıkları oluşturmak için aşağıdaki işlevi ekleyin:

    from openai import OpenAI
    
    def generate_ad_title(ad_topic):
        system_prompt = '''
        You are Heelie, an intelligent assistant for generating witty and captivating taglines for online advertisements.
            - The ad campaign taglines that you generate are short and typically under 100 characters.
        '''
    
        user_prompt = f'''Generate a catchy, witty, and short sentence (less than 100 characters) 
                        for an advertisement for selling shoes for {ad_topic}'''
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt},
        ]
    
        response = client.chat.completions.create(
            model="gpt-4",
            messages=messages
        )
    
        return response.choices[0].message.content
    
  2. DALL-E 3 kullanarak tanıtım görüntüleri oluşturmak için aşağıdaki işlevi ekleyin:

    def generate_ad_image(ad_topic):
        daliClient = OpenAI(
            api_key="<DALI_API_KEY>"
        )
    
        image_prompt = f'''
            Generate a photorealistic image of an ad campaign for selling {ad_topic}. 
            The image should be clean, with the item being sold in the foreground with an easily identifiable landmark of the city in the background.
            The image should also try to depict the weather of the location for the time of the year mentioned.
            The image should not have any generated text overlay.
        '''
    
        response = daliClient.images.generate(
            model="dall-e-3",
            prompt= image_prompt,
            size="1024x1024",
            quality="standard",
            n=1,
            )
    
        return response.data[0].url
    
  3. değerini OpenAI API anahtarınız ile değiştirin <DALI_API_KEY> .

  4. Tüm öğeleri eksiksiz bir HTML tanıtımında birleştirmek için aşağıdaki işlevi ekleyin:

    def render_html_page(ad_topic):
    
        # Find the matching shoes from the inventory
        results = vector_search(ad_topic, 4)
    
        ad_header = generate_ad_title(ad_topic)
        ad_image_url = generate_ad_image(ad_topic)
    
    
        with open('./data/ad-start.html', 'r', encoding='utf-8') as html_file:
            html_content = html_file.read()
    
        html_content += f'''<header>
                <h1>{ad_header}</h1>
            </header>'''    
    
        html_content += f'''
                <section class="ad">
                <img src="{ad_image_url}" alt="Base Ad Image" class="ad-image">
            </section>'''
    
        for result in results: 
            html_content += f''' 
            <section class="product">
                <img src="{result['document']['img_url']}" alt="{result['document']['name']}" class="product-image">
                <div class="product-details">
                    <h3 class="product-title" color="gray">{result['document']['name']}</h2>
                    <p class="product-price">{"$"+str(result['document']['price'])}</p>
                    <p class="product-description">{result['document']['description']}</p>
                    <a href="{result['document']['purchase_url']}" class="buy-now-button">Buy Now</a>
                </div>
            </section>
            '''
    
        html_content += '''</article>
                        </body>
                        </html>'''
    
        return html_content
    

    Bu işlev eşleşen ürünleri bulmak için vektör araması yapar, GPT-4 kullanarak bir reklam başlığı oluşturur, DALL-E 3 kullanarak bir tanıtım görüntüsü oluşturur ve her şeyi ürün listeleriyle bir HTML sayfasında birleştirir.

Etkileşimli arabirim oluşturma

Kullanıcıların tanıtım konularını girişine olanak tanıyan etkileşimli bir web arabirimi oluşturun ve sonuçta elde edilen reklamları dinamik olarak oluşturup görüntüler.

  1. Web arabirimini oluşturmak için aşağıdaki kodu ekleyin:

    import gradio as gr
    
    css = """
        button { background-color: purple; color: red; }
        <style>
        </style>
    """
    
    with gr.Blocks(css=css, theme=gr.themes.Default(spacing_size=gr.themes.sizes.spacing_sm, radius_size="none")) as demo:
        subject = gr.Textbox(placeholder="Ad Keywords", label="Prompt for Heelie!!")
        btn = gr.Button("Generate Ad")
        output_html = gr.HTML(label="Generated Ad HTML")
    
        btn.click(render_html_page, [subject], output_html)
    
        btn = gr.Button("Copy HTML")
    
    if __name__ == "__main__":
        demo.launch()   
    
  2. Python dosyanızı kaydedin (örneğin, ad_generator.py).

  3. Uygulamayı terminalinizden çalıştırın:

    python ad_generator.py
    
  4. Web tarayıcınızı açın ve terminalde görüntülenen URL'ye gidin (genellikle http://localhost:7860).

  5. Reklam anahtar sözcükleri girin ve Yapay zeka tarafından oluşturulan reklamınızı görmek için Reklam Oluştur'a tıklayın.

  6. Oluşturulan reklamı gözlemleyin. Oluşturulan reklam, ilgi çekici ve kişiselleştirilmiş bir reklam oluşturmak için vektör arama sonuçlarını yapay zeka tarafından oluşturulan içerikle birleştirir. Uygulama sizin için birkaç şey oluşturur. İlk olarak, yapay zeka kullanarak akılda kalıcı bir etiket çizgisi oluşturur. Ardından DALL-E 3 ile gerçekçi bir reklam görüntüsü oluşturur. Ayrıca vektör arama kullanarak konunuzla eşleşen ürünleri de bulur. Son olarak, bunları satın almak için resimler, açıklamalar ve bağlantılar içeren tüm ürün ayrıntılarını gösterir.

    Örnek oluşturulan tanıtım sonucunun ekran görüntüsü.

Kaynakları temizle

Bu öğretici için özel olarak kaynaklar oluşturduysanız ve bunlara artık ihtiyacınız yoksa ücret yansıtılmasını önlemek için bunları silin.

  1. Azure portalında Azure DocumentDB kaynağınıza gidip Veri Gezgini'ni seçerek, öğesine sağ tıklayıp AdgenDatabaseVeritabanını Sil'i seçerek Azure DocumentDB veritabanını silin.

  2. (İsteğe bağlı) Azure portalında Azure OpenAI kaynağınıza gidip Model dağıtımları'nı seçerek ve GPT-4 ve text-embedding-ada-002 dağıtımlarını yalnızca bu öğretici için oluşturduysanız silerek Azure OpenAI dağıtımlarını silin.

  3. (İsteğe bağlı) Bu öğretici için ayrılmış bir kaynak grubu oluşturduysanız, ilişkili tüm kaynakları kaldırmak için kaynak grubunun tamamını silin.